@@ -312,20 +312,31 @@ func (c *client) CheckLimits(
312
312
return nil
313
313
}
314
314
315
- func (c * client ) isIpAvailableInNetwork ( ip , networkID string ) (bool , error ) {
315
+ func (c * client ) listPublicIPsInNetwork ( networkID , ip string ) ([] * cloudstack. PublicIpAddress , error ) {
316
316
params := c .cs .Address .NewListPublicIpAddressesParams ()
317
317
params .SetNetworkid (networkID )
318
- params .SetIpaddress (ip )
319
318
params .SetAllocatedonly (false )
320
319
params .SetForvirtualnetwork (false )
321
320
params .SetListall (true )
321
+ if ip != "" {
322
+ params .SetIpaddress (ip )
323
+ }
322
324
323
325
resp , err := c .cs .Address .ListPublicIpAddresses (params )
324
326
if err != nil {
325
- return false , errors .Wrapf (err , "failed to list public IP addresses for network %q" , networkID )
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
326
337
}
327
338
328
- for _ , addr := range resp . PublicIpAddresses {
339
+ for _ , addr := range publicIPs {
329
340
if addr .State == "Free" {
330
341
return true , nil
331
342
}
@@ -335,18 +346,12 @@ func (c *client) isIpAvailableInNetwork(ip, networkID string) (bool, error) {
335
346
}
336
347
337
348
func (c * client ) hasFreeIPInNetwork (resolvedNet * cloudstack.Network ) (bool , error ) {
338
- params := c .cs .Address .NewListPublicIpAddressesParams ()
339
- params .SetNetworkid (resolvedNet .Id )
340
- params .SetAllocatedonly (false )
341
- params .SetForvirtualnetwork (false )
342
- params .SetListall (true )
343
-
344
- resp , err := c .cs .Address .ListPublicIpAddresses (params )
349
+ publicIPs , err := c .listPublicIPsInNetwork (resolvedNet .Id , "" )
345
350
if err != nil {
346
- return false , errors . Wrapf ( err , "failed to check free IPs for network %q" , resolvedNet . Id )
351
+ return false , err
347
352
}
348
353
349
- for _ , addr := range resp . PublicIpAddresses {
354
+ for _ , addr := range publicIPs {
350
355
if addr .State == "Free" {
351
356
return true , nil
352
357
}
@@ -355,13 +360,14 @@ func (c *client) hasFreeIPInNetwork(resolvedNet *cloudstack.Network) (bool, erro
355
360
return false , nil
356
361
}
357
362
358
- func (c * client ) buildStaticIPEntry (ip , networkID string , resolvedNet * cloudstack.Network ) (map [string ]string , error ) {
363
+ func (c * client ) buildStaticIPEntry (ip string , resolvedNet * cloudstack.Network ) (map [string ]string , error ) {
364
+ networkID := resolvedNet .Id
359
365
if err := c .validateIPInCIDR (ip , resolvedNet , networkID ); err != nil {
360
366
return nil , err
361
367
}
362
368
363
369
if resolvedNet .Type == "Shared" {
364
- isAvailable , err := c .isIpAvailableInNetwork (ip , networkID )
370
+ isAvailable , err := c .isIPAvailableInNetwork (ip , networkID )
365
371
if err != nil {
366
372
return nil , err
367
373
}
@@ -407,14 +413,14 @@ func (c *client) buildIPToNetworkList(csMachine *infrav1.CloudStackMachine) ([]m
407
413
var ipToNetworkList []map [string ]string
408
414
409
415
for _ , net := range csMachine .Spec .Networks {
410
- networkID , resolvedNet , err := c .resolveNetworkReference (net )
416
+ resolvedNet , err := c .resolveNetwork (net )
411
417
if err != nil {
412
418
return nil , err
413
419
}
414
420
415
421
var entry map [string ]string
416
422
if net .IP != "" {
417
- entry , err = c .buildStaticIPEntry (net .IP , networkID , resolvedNet )
423
+ entry , err = c .buildStaticIPEntry (net .IP , resolvedNet )
418
424
if err != nil {
419
425
return nil , err
420
426
}
@@ -431,27 +437,19 @@ func (c *client) buildIPToNetworkList(csMachine *infrav1.CloudStackMachine) ([]m
431
437
return ipToNetworkList , nil
432
438
}
433
439
434
- func (c * client ) resolveNetworkReference (net infrav1.NetworkSpec ) (string , * cloudstack.Network , error ) {
440
+ func (c * client ) resolveNetwork (net infrav1.NetworkSpec ) (* cloudstack.Network , error ) {
435
441
if net .ID == "" {
436
- resolvedNet , err := c .resolveNetworkByName (net .Name )
437
- if err != nil {
438
- return "" , nil , err
439
- }
440
- return resolvedNet .Id , resolvedNet , nil
442
+ return c .resolveNetworkByName (net .Name )
441
443
}
442
444
443
445
resolvedNet , _ , err := c .cs .Network .GetNetworkByID (net .ID , cloudstack .WithProject (c .user .Project .ID ))
444
446
if err != nil {
445
- return "" , nil , errors .Wrapf (err , "failed to get network %q by ID" , net .ID )
447
+ return nil , errors .Wrapf (err , "failed to get network %q by ID" , net .ID )
446
448
}
447
- return net . ID , resolvedNet , nil
449
+ return resolvedNet , nil
448
450
}
449
451
450
452
func (c * client ) validateIPInCIDR (ipStr string , net * cloudstack.Network , netID string ) error {
451
- if net == nil {
452
- return errors .Errorf ("network details not found for validation" )
453
- }
454
-
455
453
ip := netpkg .ParseIP (ipStr )
456
454
if ip == nil {
457
455
return errors .Errorf ("invalid IP address %q" , ipStr )
0 commit comments