@@ -312,20 +312,31 @@ func (c *client) CheckLimits(
312312 return nil
313313}
314314
315- func (c * client ) isIpAvailableInNetwork ( ip , networkID string ) (bool , error ) {
315+ func (c * client ) listPublicIPsInNetwork ( networkID , ip string ) ([] * cloudstack. PublicIpAddress , error ) {
316316 params := c .cs .Address .NewListPublicIpAddressesParams ()
317317 params .SetNetworkid (networkID )
318- params .SetIpaddress (ip )
319318 params .SetAllocatedonly (false )
320319 params .SetForvirtualnetwork (false )
321320 params .SetListall (true )
321+ if ip != "" {
322+ params .SetIpaddress (ip )
323+ }
322324
323325 resp , err := c .cs .Address .ListPublicIpAddresses (params )
324326 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
326337 }
327338
328- for _ , addr := range resp . PublicIpAddresses {
339+ for _ , addr := range publicIPs {
329340 if addr .State == "Free" {
330341 return true , nil
331342 }
@@ -335,18 +346,12 @@ func (c *client) isIpAvailableInNetwork(ip, networkID string) (bool, error) {
335346}
336347
337348func (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 , "" )
345350 if err != nil {
346- return false , errors . Wrapf ( err , "failed to check free IPs for network %q" , resolvedNet . Id )
351+ return false , err
347352 }
348353
349- for _ , addr := range resp . PublicIpAddresses {
354+ for _ , addr := range publicIPs {
350355 if addr .State == "Free" {
351356 return true , nil
352357 }
@@ -355,13 +360,14 @@ func (c *client) hasFreeIPInNetwork(resolvedNet *cloudstack.Network) (bool, erro
355360 return false , nil
356361}
357362
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
359365 if err := c .validateIPInCIDR (ip , resolvedNet , networkID ); err != nil {
360366 return nil , err
361367 }
362368
363369 if resolvedNet .Type == "Shared" {
364- isAvailable , err := c .isIpAvailableInNetwork (ip , networkID )
370+ isAvailable , err := c .isIPAvailableInNetwork (ip , networkID )
365371 if err != nil {
366372 return nil , err
367373 }
@@ -407,14 +413,14 @@ func (c *client) buildIPToNetworkList(csMachine *infrav1.CloudStackMachine) ([]m
407413 var ipToNetworkList []map [string ]string
408414
409415 for _ , net := range csMachine .Spec .Networks {
410- networkID , resolvedNet , err := c .resolveNetworkReference (net )
416+ resolvedNet , err := c .resolveNetwork (net )
411417 if err != nil {
412418 return nil , err
413419 }
414420
415421 var entry map [string ]string
416422 if net .IP != "" {
417- entry , err = c .buildStaticIPEntry (net .IP , networkID , resolvedNet )
423+ entry , err = c .buildStaticIPEntry (net .IP , resolvedNet )
418424 if err != nil {
419425 return nil , err
420426 }
@@ -431,27 +437,19 @@ func (c *client) buildIPToNetworkList(csMachine *infrav1.CloudStackMachine) ([]m
431437 return ipToNetworkList , nil
432438}
433439
434- func (c * client ) resolveNetworkReference (net infrav1.NetworkSpec ) (string , * cloudstack.Network , error ) {
440+ func (c * client ) resolveNetwork (net infrav1.NetworkSpec ) (* cloudstack.Network , error ) {
435441 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 )
441443 }
442444
443445 resolvedNet , _ , err := c .cs .Network .GetNetworkByID (net .ID , cloudstack .WithProject (c .user .Project .ID ))
444446 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 )
446448 }
447- return net . ID , resolvedNet , nil
449+ return resolvedNet , nil
448450}
449451
450452func (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-
455453 ip := netpkg .ParseIP (ipStr )
456454 if ip == nil {
457455 return errors .Errorf ("invalid IP address %q" , ipStr )
0 commit comments