@@ -36,6 +36,7 @@ type NetworkIface interface {
3636 GetOrCreateLoadBalancerRule (* capcv1.CloudStackCluster ) error
3737 GetOrCreateIsolatedNetwork (* capcv1.CloudStackCluster ) error
3838 AssociatePublicIPAddress (* capcv1.CloudStackCluster ) error
39+ DeleteNetwork (capcv1.Network ) error
3940}
4041
4142const (
@@ -132,14 +133,14 @@ func (c *client) CreateIsolatedNetwork(csCluster *capcv1.CloudStackCluster) (ret
132133 setIfNotEmpty (csCluster .Status .DomainID , p .SetDomainid )
133134 resp , err := c .cs .Network .CreateNetwork (p )
134135 if err != nil {
135- return err
136+ return errors . Wrapf ( err , "error encountered when creating network with name: %s" , netStatus . Name )
136137 }
137138
138139 // Update Zone/Network status accordingly.
139140 netStatus .ID = resp .Id
140141 netStatus .Type = resp .Type
141142 zoneStatus .Network = netStatus
142- csCluster .Status .Zones [zoneStatus .Name ] = zoneStatus
143+ csCluster .Status .Zones [zoneStatus .ID ] = zoneStatus
143144
144145 if err := c .AddCreatedByCAPCTag (ResourceTypeNetwork , zoneStatus .Network .ID ); err != nil {
145146 return err
@@ -193,7 +194,7 @@ func (c *client) DeleteNetworkIfNotInUse(csCluster *capcv1.CloudStackCluster, ne
193194 }
194195
195196 if clusterTagCount == 0 && tags [CreatedByCAPCTagName ] != "" {
196- return c .DestroyNetwork (net )
197+ return c .DeleteNetwork (net )
197198 }
198199
199200 return nil
@@ -209,9 +210,7 @@ func (c *client) FetchPublicIP(csCluster *capcv1.CloudStackCluster) (*cloudstack
209210 p .SetZoneid (zoneStatus .ID )
210211 setIfNotEmpty (csCluster .Spec .Account , p .SetAccount )
211212 setIfNotEmpty (csCluster .Status .DomainID , p .SetDomainid )
212- if ip != "" {
213- p .SetIpaddress (ip )
214- }
213+ setIfNotEmpty (ip , p .SetIpaddress )
215214 publicAddresses , err := c .cs .Address .ListPublicIpAddresses (p )
216215
217216 if err != nil {
@@ -234,25 +233,37 @@ func (c *client) FetchPublicIP(csCluster *capcv1.CloudStackCluster) (*cloudstack
234233func (c * client ) AssociatePublicIPAddress (csCluster * capcv1.CloudStackCluster ) (retErr error ) {
235234 publicAddress , err := c .FetchPublicIP (csCluster )
236235 if err != nil {
237- return err
236+ return errors . Wrapf ( err , "error encountered while fetching a public IP address" )
238237 }
239238
240239 csCluster .Spec .ControlPlaneEndpoint .Host = publicAddress .Ipaddress
241240 csCluster .Status .PublicIPID = publicAddress .Id
242241
242+ // Check if the address is already associated with the network.
243243 zoneStatus := csCluster .Status .Zones .GetOne ()
244+ if publicAddress .Associatednetworkid == zoneStatus .Network .ID {
245+ return nil
246+ }
244247
245- // Public IP found, but not yet allocated to network.
248+ // Public IP found, but not yet associated with network -- associate it .
246249 p := c .cs .Address .NewAssociateIpAddressParams ()
247250 p .SetIpaddress (csCluster .Spec .ControlPlaneEndpoint .Host )
248251 p .SetNetworkid (zoneStatus .Network .ID )
249252 setIfNotEmpty (csCluster .Spec .Account , p .SetAccount )
250253 setIfNotEmpty (csCluster .Status .DomainID , p .SetDomainid )
251254 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 )
253258 }
254259 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 )
256267 }
257268 return nil
258269}
@@ -343,9 +354,9 @@ func (c *client) GetOrCreateLoadBalancerRule(csCluster *capcv1.CloudStackCluster
343354 return nil
344355}
345356
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 )
349360}
350361
351362func (c * client ) AssignVMToLoadBalancerRule (csCluster * capcv1.CloudStackCluster , instanceID string ) (retErr error ) {
@@ -374,21 +385,17 @@ func (c *client) GetOrCreateIsolatedNetwork(csCluster *capcv1.CloudStackCluster)
374385 onlyNetStatus := csCluster .Status .Zones .GetOne ().Network
375386 if ! NetworkExists (onlyNetStatus ) { // create isolated network.
376387 if err := c .CreateIsolatedNetwork (csCluster ); err != nil {
377- return err
388+ return errors . Wrap ( err , "error encountered while creating a new isolated network." )
378389 }
379390 }
380391 networkID := csCluster .Status .Zones .GetOne ().Network .ID
381392 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 )
383394 }
384395
385396 if csCluster .Status .PublicIPID == "" { // Don't try to get public IP again it's already been fetched.
386397 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" )
392399 }
393400 }
394401 if err := c .GetOrCreateLoadBalancerRule (csCluster ); err != nil {
0 commit comments