@@ -312,46 +312,23 @@ func (c *client) CheckLimits(
312
312
return nil
313
313
}
314
314
315
- func (c * client ) listPublicIPsInNetwork (networkID , ip string ) ([] * cloudstack. PublicIpAddress , error ) {
315
+ func (c * client ) isFreeIPAvailable (networkID , ip string ) (bool , error ) {
316
316
params := c .cs .Address .NewListPublicIpAddressesParams ()
317
317
params .SetNetworkid (networkID )
318
318
params .SetAllocatedonly (false )
319
319
params .SetForvirtualnetwork (false )
320
320
params .SetListall (true )
321
+
321
322
if ip != "" {
322
323
params .SetIpaddress (ip )
323
324
}
324
325
325
326
resp , err := c .cs .Address .ListPublicIpAddresses (params )
326
327
if err != nil {
327
- return nil , errors .Wrapf (err , "failed to list public IP addresses for network %q" , networkID )
328
- }
329
-
330
- return resp .PublicIpAddresses , nil
331
- }
332
-
333
- func (c * client ) isIPAvailableInNetwork (ip , networkID string ) (bool , error ) {
334
- publicIPs , err := c .listPublicIPsInNetwork (networkID , ip )
335
- if err != nil {
336
- return false , err
337
- }
338
-
339
- for _ , addr := range publicIPs {
340
- if addr .State == "Free" {
341
- return true , nil
342
- }
343
- }
344
-
345
- return false , nil
346
- }
347
-
348
- func (c * client ) hasFreeIPInNetwork (resolvedNet * cloudstack.Network ) (bool , error ) {
349
- publicIPs , err := c .listPublicIPsInNetwork (resolvedNet .Id , "" )
350
- if err != nil {
351
- return false , err
328
+ return false , errors .Wrapf (err , "failed to list public IP addresses for network %q" , networkID )
352
329
}
353
330
354
- for _ , addr := range publicIPs {
331
+ for _ , addr := range resp . PublicIpAddresses {
355
332
if addr .State == "Free" {
356
333
return true , nil
357
334
}
@@ -360,42 +337,33 @@ func (c *client) hasFreeIPInNetwork(resolvedNet *cloudstack.Network) (bool, erro
360
337
return false , nil
361
338
}
362
339
363
- func (c * client ) buildStaticIPEntry (ip string , resolvedNet * cloudstack.Network ) (map [string ]string , error ) {
364
- networkID := resolvedNet .Id
365
- if err := c .validateIPInCIDR (ip , resolvedNet , networkID ); err != nil {
366
- return nil , err
367
- }
368
-
369
- if resolvedNet .Type == "Shared" {
370
- isAvailable , err := c .isIPAvailableInNetwork (ip , networkID )
371
- if err != nil {
340
+ func (c * client ) buildIPEntry (resolvedNet * cloudstack.Network , ip string ) (map [string ]string , error ) {
341
+ if ip != "" {
342
+ if err := c .validateIPInCIDR (ip , resolvedNet , resolvedNet .Id ); err != nil {
372
343
return nil , err
373
344
}
374
- if ! isAvailable {
375
- return nil , errors .Errorf ("IP %q is already allocated in network %q or out of range" , ip , networkID )
376
- }
377
345
}
378
346
379
- return map [string ]string {
380
- "networkid" : networkID ,
381
- "ip" : ip ,
382
- }, nil
383
- }
384
-
385
- func (c * client ) buildDynamicIPEntry (resolvedNet * cloudstack.Network ) (map [string ]string , error ) {
386
347
if resolvedNet .Type == "Shared" {
387
- freeIPExists , err := c .hasFreeIPInNetwork (resolvedNet )
348
+ isAvailable , err := c .isFreeIPAvailable (resolvedNet . Id , ip )
388
349
if err != nil {
389
350
return nil , err
390
351
}
391
- if ! freeIPExists {
352
+ if ! isAvailable {
353
+ if ip != "" {
354
+ return nil , errors .Errorf ("IP %q is already allocated in network %q or out of range" , ip , resolvedNet .Id )
355
+ }
392
356
return nil , errors .Errorf ("no free IPs available in network %q" , resolvedNet .Id )
393
357
}
394
358
}
395
359
396
- return map [string ]string {
360
+ entry := map [string ]string {
397
361
"networkid" : resolvedNet .Id ,
398
- }, nil
362
+ }
363
+ if ip != "" {
364
+ entry ["ip" ] = ip
365
+ }
366
+ return entry , nil
399
367
}
400
368
401
369
func (c * client ) resolveNetworkByName (name string ) (* cloudstack.Network , error ) {
@@ -420,12 +388,12 @@ func (c *client) buildIPToNetworkList(csMachine *infrav1.CloudStackMachine) ([]m
420
388
421
389
var entry map [string ]string
422
390
if net .IP != "" {
423
- entry , err = c .buildStaticIPEntry ( net .IP , resolvedNet )
391
+ entry , err = c .buildIPEntry ( resolvedNet , net .IP )
424
392
if err != nil {
425
393
return nil , err
426
394
}
427
395
} else {
428
- entry , err = c .buildDynamicIPEntry (resolvedNet )
396
+ entry , err = c .buildIPEntry (resolvedNet , "" )
429
397
if err != nil {
430
398
return nil , err
431
399
}
0 commit comments