@@ -36,6 +36,7 @@ type NetworkIface interface {
36
36
GetOrCreateLoadBalancerRule (* capcv1.CloudStackCluster ) error
37
37
GetOrCreateIsolatedNetwork (* capcv1.CloudStackCluster ) error
38
38
AssociatePublicIPAddress (* capcv1.CloudStackCluster ) error
39
+ DeleteNetwork (capcv1.Network ) error
39
40
}
40
41
41
42
const (
@@ -132,14 +133,14 @@ func (c *client) CreateIsolatedNetwork(csCluster *capcv1.CloudStackCluster) (ret
132
133
setIfNotEmpty (csCluster .Status .DomainID , p .SetDomainid )
133
134
resp , err := c .cs .Network .CreateNetwork (p )
134
135
if err != nil {
135
- return err
136
+ return errors . Wrapf ( err , "error encountered when creating network with name: %s" , netStatus . Name )
136
137
}
137
138
138
139
// Update Zone/Network status accordingly.
139
140
netStatus .ID = resp .Id
140
141
netStatus .Type = resp .Type
141
142
zoneStatus .Network = netStatus
142
- csCluster .Status .Zones [zoneStatus .Name ] = zoneStatus
143
+ csCluster .Status .Zones [zoneStatus .ID ] = zoneStatus
143
144
144
145
if err := c .AddCreatedByCAPCTag (ResourceTypeNetwork , zoneStatus .Network .ID ); err != nil {
145
146
return err
@@ -193,7 +194,7 @@ func (c *client) DeleteNetworkIfNotInUse(csCluster *capcv1.CloudStackCluster, ne
193
194
}
194
195
195
196
if clusterTagCount == 0 && tags [CreatedByCAPCTagName ] != "" {
196
- return c .DestroyNetwork (net )
197
+ return c .DeleteNetwork (net )
197
198
}
198
199
199
200
return nil
@@ -209,9 +210,7 @@ func (c *client) FetchPublicIP(csCluster *capcv1.CloudStackCluster) (*cloudstack
209
210
p .SetZoneid (zoneStatus .ID )
210
211
setIfNotEmpty (csCluster .Spec .Account , p .SetAccount )
211
212
setIfNotEmpty (csCluster .Status .DomainID , p .SetDomainid )
212
- if ip != "" {
213
- p .SetIpaddress (ip )
214
- }
213
+ setIfNotEmpty (ip , p .SetIpaddress )
215
214
publicAddresses , err := c .cs .Address .ListPublicIpAddresses (p )
216
215
217
216
if err != nil {
@@ -234,25 +233,37 @@ func (c *client) FetchPublicIP(csCluster *capcv1.CloudStackCluster) (*cloudstack
234
233
func (c * client ) AssociatePublicIPAddress (csCluster * capcv1.CloudStackCluster ) (retErr error ) {
235
234
publicAddress , err := c .FetchPublicIP (csCluster )
236
235
if err != nil {
237
- return err
236
+ return errors . Wrapf ( err , "error encountered while fetching a public IP address" )
238
237
}
239
238
240
239
csCluster .Spec .ControlPlaneEndpoint .Host = publicAddress .Ipaddress
241
240
csCluster .Status .PublicIPID = publicAddress .Id
242
241
242
+ // Check if the address is already associated with the network.
243
243
zoneStatus := csCluster .Status .Zones .GetOne ()
244
+ if publicAddress .Associatednetworkid == zoneStatus .Network .ID {
245
+ return nil
246
+ }
244
247
245
- // Public IP found, but not yet allocated to network.
248
+ // Public IP found, but not yet associated with network -- associate it .
246
249
p := c .cs .Address .NewAssociateIpAddressParams ()
247
250
p .SetIpaddress (csCluster .Spec .ControlPlaneEndpoint .Host )
248
251
p .SetNetworkid (zoneStatus .Network .ID )
249
252
setIfNotEmpty (csCluster .Spec .Account , p .SetAccount )
250
253
setIfNotEmpty (csCluster .Status .DomainID , p .SetDomainid )
251
254
if _ , err := c .cs .Address .AssociateIpAddress (p ); err != nil {
252
- return err
255
+ return errors .Wrapf (err ,
256
+ "error encountered while associating public IP address with ID: %s to netowrk with ID: %s" ,
257
+ publicAddress .Id , zoneStatus .Network .ID )
253
258
}
254
259
if err := c .AddClusterTag (ResourceTypeIPAddress , publicAddress .Id , csCluster ); err != nil {
255
- return err
260
+ return errors .Wrapf (err ,
261
+ "error encountered while adding tag to public IP address with ID: %s" , publicAddress .Id )
262
+ }
263
+ // Add created by CAPC tag to public IP.
264
+ if err := c .AddCreatedByCAPCTag (ResourceTypeIPAddress , csCluster .Status .PublicIPID ); err != nil {
265
+ return errors .Wrapf (err ,
266
+ "error encountered while adding tag to public IP address with ID: %s" , publicAddress .Id )
256
267
}
257
268
return nil
258
269
}
@@ -343,9 +354,9 @@ func (c *client) GetOrCreateLoadBalancerRule(csCluster *capcv1.CloudStackCluster
343
354
return nil
344
355
}
345
356
346
- func (c * client ) DestroyNetwork (net capcv1.Network ) ( retErr error ) {
347
- _ , retErr = c .cs .Network .DeleteNetwork (c .cs .Network .NewDeleteNetworkParams (net .ID ))
348
- return retErr
357
+ func (c * client ) DeleteNetwork (net capcv1.Network ) error {
358
+ _ , err : = c .cs .Network .DeleteNetwork (c .cs .Network .NewDeleteNetworkParams (net .ID ))
359
+ return errors . Wrapf ( err , "error encountered while deleting network with id: %s" , net . ID )
349
360
}
350
361
351
362
func (c * client ) AssignVMToLoadBalancerRule (csCluster * capcv1.CloudStackCluster , instanceID string ) (retErr error ) {
@@ -374,21 +385,17 @@ func (c *client) GetOrCreateIsolatedNetwork(csCluster *capcv1.CloudStackCluster)
374
385
onlyNetStatus := csCluster .Status .Zones .GetOne ().Network
375
386
if ! NetworkExists (onlyNetStatus ) { // create isolated network.
376
387
if err := c .CreateIsolatedNetwork (csCluster ); err != nil {
377
- return err
388
+ return errors . Wrap ( err , "error encountered while creating a new isolated network." )
378
389
}
379
390
}
380
391
networkID := csCluster .Status .Zones .GetOne ().Network .ID
381
392
if err := c .AddClusterTag (ResourceTypeNetwork , networkID , csCluster ); err != nil {
382
- return err
393
+ return errors . Wrapf ( err , "error encountered while tagging network with id: %s" , networkID )
383
394
}
384
395
385
396
if csCluster .Status .PublicIPID == "" { // Don't try to get public IP again it's already been fetched.
386
397
if err := c .AssociatePublicIPAddress (csCluster ); err != nil {
387
- return err
388
- }
389
- // Add created by CAPC tag to public IP.
390
- if err := c .AddCreatedByCAPCTag (ResourceTypeIPAddress , csCluster .Status .PublicIPID ); err != nil {
391
- return err
398
+ return errors .Wrapf (err , "error encountered when associating public IP address to csCluster" )
392
399
}
393
400
}
394
401
if err := c .GetOrCreateLoadBalancerRule (csCluster ); err != nil {
0 commit comments