@@ -34,6 +34,7 @@ type NetworkIface interface {
34
34
ResolveLoadBalancerRuleDetails (* infrav1.CloudStackCluster ) error
35
35
GetOrCreateLoadBalancerRule (* infrav1.CloudStackCluster ) error
36
36
GetOrCreateIsolatedNetwork (* infrav1.CloudStackCluster ) error
37
+ AssociatePublicIPAddress (* infrav1.CloudStackCluster ) error
37
38
}
38
39
39
40
const (
@@ -136,7 +137,7 @@ func (c *client) CreateIsolatedNewtork(csCluster *infrav1.CloudStackCluster) (re
136
137
if err != nil {
137
138
return err
138
139
}
139
- c .addClusterTags ( csCluster , zoneStatus .Network , addCreatedByTag )
140
+ c .AddClusterTag ( ResourceTypeNetwork , zoneStatus .Network . Id , csCluster , addCreatedByTag )
140
141
141
142
// Update Zone/Network status accordingly.
142
143
netStatus .Id = resp .Id
@@ -163,8 +164,7 @@ func (c *client) ResolveNetworkStatuses(csCluster *infrav1.CloudStackCluster) (r
163
164
for zoneName , zoneStatus := range csCluster .Status .Zones {
164
165
if retErr = c .ResolveNetwork (csCluster , & zoneStatus .Network ); retErr == nil { // Found network
165
166
csCluster .Status .Zones [zoneName ] = zoneStatus
166
- //zone.Network = zoneStatus.DeepCopy().Network
167
- c .addClusterTags (csCluster , zoneStatus .Network , doNotAddCreatedByTag )
167
+ c .AddClusterTag (ResourceTypeNetwork , zoneStatus .Network .Id , csCluster , doNotAddCreatedByTag )
168
168
} else if ! strings .Contains (retErr .Error (), "No match found" ) { // Some other error.
169
169
return retErr
170
170
} // Network not found, so create it.
@@ -173,40 +173,17 @@ func (c *client) ResolveNetworkStatuses(csCluster *infrav1.CloudStackCluster) (r
173
173
return nil
174
174
}
175
175
176
- func (c * client ) addClusterTags (csCluster * infrav1.CloudStackCluster , net infrav1.Network , addCreatedBy bool ) error {
177
- clusterTagName := generateNetworkTagName (csCluster )
178
- newTags := map [string ]string {}
179
-
180
- existingTags , err := c .GetNetworkTags (net .Id )
181
- if err != nil {
182
- return err
183
- }
184
-
185
- if existingTags [clusterTagName ] == "" {
186
- newTags [clusterTagName ] = "1"
187
- }
188
-
189
- if addCreatedBy && existingTags [createdByCapcTagName ] == "" {
190
- newTags [createdByCapcTagName ] = "1"
191
- }
192
-
193
- if len (newTags ) > 0 {
194
- return c .AddNetworkTags (net .Id , newTags )
195
- }
196
-
197
- return nil
198
- }
199
-
200
176
func (c * client ) RemoveClusterTagFromNetwork (csCluster * infrav1.CloudStackCluster , net infrav1.Network ) (retError error ) {
201
- tags , err := c .GetNetworkTags (net .Id )
177
+
178
+ tags , err := c .GetTags (ResourceTypeNetwork , net .Id )
202
179
if err != nil {
203
180
return err
204
181
}
205
- sourceNAT := publicIP != nil && publicIP .Issourcenat
182
+ // sourceNAT := publicIP != nil && publicIP.Issourcenat
206
183
207
184
clusterTagName := generateNetworkTagName (csCluster )
208
185
if tagValue := tags [clusterTagName ]; tagValue != "" {
209
- if err = c .DeleteNetworkTags ( net .Id , map [string ]string {clusterTagName : tagValue }); err != nil {
186
+ if err = c .DeleteTags ( ResourceTypeNetwork , net .Id , map [string ]string {clusterTagName : tagValue }); err != nil {
210
187
return err
211
188
}
212
189
}
@@ -215,7 +192,7 @@ func (c *client) RemoveClusterTagFromNetwork(csCluster *infrav1.CloudStackCluste
215
192
}
216
193
217
194
func (c * client ) DeleteNetworkIfNotInUse (csCluster * infrav1.CloudStackCluster , net infrav1.Network ) (retError error ) {
218
- tags , err := c .GetNetworkTags ( net .Id )
195
+ tags , err := c .GetTags ( ResourceTypeNetwork , net .Id )
219
196
if err != nil {
220
197
return err
221
198
}
@@ -227,7 +204,7 @@ func (c *client) DeleteNetworkIfNotInUse(csCluster *infrav1.CloudStackCluster, n
227
204
}
228
205
}
229
206
230
- if clusterTagCount == 0 && tags [createdByCapcTagName ] != "" {
207
+ if clusterTagCount == 0 && tags [createdByCAPCTagName ] != "" {
231
208
return c .DestroyNetwork (net )
232
209
}
233
210
@@ -299,6 +276,38 @@ func (c *client) OpenFirewallRules(csCluster *infrav1.CloudStackCluster) (retErr
299
276
return retErr
300
277
}
301
278
279
+ func (c * client ) DisassociatePublicIPAddress (csCluster * infrav1.CloudStackCluster ) (retErr error ) {
280
+ // Remove the CAPC creation tag, so it won't be there the next time this address is associated.
281
+ retErr = c .DeleteCreatedByCAPCTag (ResourceTypeIPAddress , csCluster .Status .PublicIPID )
282
+ if retErr != nil {
283
+ return retErr
284
+ }
285
+
286
+ p := c .cs .Address .NewDisassociateIpAddressParams (csCluster .Status .PublicIPID )
287
+ _ , retErr = c .cs .Address .DisassociateIpAddress (p )
288
+ return retErr
289
+ }
290
+
291
+ func (c * client ) DisassociatePublicIPAddressIfNotInUse (csCluster * infrav1.CloudStackCluster ) (retError error ) {
292
+ tagsAllowDisposal , err := c .DoClusterTagsAllowDisposal (ResourceTypeIPAddress , csCluster .Status .PublicIPID )
293
+ if err != nil {
294
+ return err
295
+ }
296
+
297
+ // Can't disassociate an address if it's the source NAT address.
298
+ publicIP , _ , err := c .cs .Address .GetPublicIpAddressByID (csCluster .Status .PublicIPID )
299
+ if err != nil {
300
+ return err
301
+ }
302
+ sourceNAT := publicIP != nil && publicIP .Issourcenat
303
+
304
+ if tagsAllowDisposal && ! sourceNAT {
305
+ return c .DisassociatePublicIPAddress (csCluster )
306
+ }
307
+
308
+ return nil
309
+ }
310
+
302
311
func (c * client ) ResolveLoadBalancerRuleDetails (csCluster * infrav1.CloudStackCluster ) (retErr error ) {
303
312
p := c .cs .LoadBalancer .NewListLoadBalancerRulesParams ()
304
313
p .SetPublicipid (csCluster .Status .PublicIPID )
@@ -377,7 +386,7 @@ func (c *client) GetOrCreateIsolatedNetwork(csCluster *infrav1.CloudStackCluster
377
386
}
378
387
379
388
if csCluster .Status .PublicIPID == "" { // Don't try to get public IP again it's already been fetched.
380
- if err := c .AssociatePublicIpAddress (csCluster ); err != nil {
389
+ if err := c .AssociatePublicIPAddress (csCluster ); err != nil {
381
390
return err
382
391
}
383
392
}
0 commit comments