Skip to content

Commit 079219a

Browse files
committed
IP address tagging and clean up is working
1 parent 84c16da commit 079219a

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

pkg/cloud/network.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,19 @@ func (c *client) GetOrCreateNetwork(csCluster *infrav1.CloudStackCluster) (retEr
9090
}
9191

9292
func (c *client) DisassociatePublicIPAddressIfNotInUse(csCluster *infrav1.CloudStackCluster) (retError error) {
93-
okayToDelete, err := c.DoClusterTagsAllowDisposal(ResourceTypeIPAddress, csCluster.Status.PublicIPID)
93+
tagsAllowDisposal, err := c.DoClusterTagsAllowDisposal(ResourceTypeIPAddress, csCluster.Status.PublicIPID)
9494
if err != nil {
9595
return err
9696
}
9797

98-
if okayToDelete {
98+
// Can't disassociate an address if it's the source NAT address.
99+
publicIP, _, err := c.cs.Address.GetPublicIpAddressByID(csCluster.Status.PublicIPID)
100+
if err != nil {
101+
return err
102+
}
103+
sourceNAT := publicIP != nil && publicIP.Issourcenat
104+
105+
if tagsAllowDisposal && !sourceNAT {
99106
return c.DisassociatePublicIPAddress(csCluster)
100107
}
101108

@@ -152,11 +159,11 @@ func (c *client) AssociatePublicIPAddress(csCluster *infrav1.CloudStackCluster)
152159

153160
csCluster.Spec.ControlPlaneEndpoint.Host = publicAddress.Ipaddress
154161
csCluster.Status.PublicIPID = publicAddress.Id
155-
allocatedByCapc := publicAddress.Allocated == ""
162+
alreadyAllocated := publicAddress.Allocated != ""
156163

157-
if publicAddress.Allocated != "" && publicAddress.Associatednetworkid == csCluster.Status.NetworkID {
164+
if alreadyAllocated && publicAddress.Associatednetworkid == csCluster.Status.NetworkID {
158165
// Address already allocated to network. Allocated is a timestamp -- not a boolean.
159-
return c.AddClusterTag(ResourceTypeIPAddress, publicAddress.Id, csCluster, allocatedByCapc)
166+
return c.AddClusterTag(ResourceTypeIPAddress, publicAddress.Id, csCluster, false)
160167
} // Address not yet allocated. Allocate now.
161168

162169
// Public IP found, but not yet allocated to network.
@@ -168,10 +175,13 @@ func (c *client) AssociatePublicIPAddress(csCluster *infrav1.CloudStackCluster)
168175
if _, err := c.cs.Address.AssociateIpAddress(p); err != nil {
169176
return err
170177
}
171-
return c.AddClusterTag(ResourceTypeIPAddress, publicAddress.Id, csCluster, allocatedByCapc)
178+
return c.AddClusterTag(ResourceTypeIPAddress, publicAddress.Id, csCluster, !alreadyAllocated)
172179
}
173180

174181
func (c *client) DisassociatePublicIPAddress(csCluster *infrav1.CloudStackCluster) (retErr error) {
182+
// Remove the CAPC creation tag, so it won't be there the next time this address is associated.
183+
c.DeleteCreatedByCAPCTag(ResourceTypeIPAddress, csCluster.Status.PublicIPID)
184+
175185
p := c.cs.Address.NewDisassociateIpAddressParams(csCluster.Status.PublicIPID)
176186
_, retErr = c.cs.Address.DisassociateIpAddress(p)
177187
return retErr

pkg/cloud/tags.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
type TagIface interface {
2525
AddClusterTag(resourceType ResourceType, resourceID string, csCluster *infrav1.CloudStackCluster, addCreatedByCAPCTag bool) error
2626
DeleteClusterTag(resourceType ResourceType, resourceID string, csCluster *infrav1.CloudStackCluster) error
27+
DeleteCreatedByCAPCTag(resourceType ResourceType, resourceID string) error
2728
DoClusterTagsAllowDisposal(resourceType ResourceType, resourceID string) (bool, error)
2829
AddTags(resourceType ResourceType, resourceID string, tags map[string]string) error
2930
GetTags(resourceType ResourceType, resourceID string) (map[string]string, error)
@@ -71,7 +72,20 @@ func (c *client) DeleteClusterTag(resourceType ResourceType, resourceID string,
7172

7273
clusterTagName := generateClusterTagName(csCluster)
7374
if tagValue := tags[clusterTagName]; tagValue != "" {
74-
return c.DeleteTags(resourceType, csCluster.Status.NetworkID, map[string]string{clusterTagName: tagValue})
75+
return c.DeleteTags(resourceType, resourceID, map[string]string{clusterTagName: tagValue})
76+
}
77+
78+
return nil
79+
}
80+
81+
func (c *client) DeleteCreatedByCAPCTag(resourceType ResourceType, resourceID string) error {
82+
tags, err := c.GetTags(resourceType, resourceID)
83+
if err != nil {
84+
return err
85+
}
86+
87+
if tagValue := tags[createdByCAPCTagName]; tagValue != "" {
88+
return c.DeleteTags(resourceType, resourceID, map[string]string{createdByCAPCTagName: tagValue})
7589
}
7690

7791
return nil

0 commit comments

Comments
 (0)