@@ -312,46 +312,23 @@ func (c *client) CheckLimits(
312312 return nil
313313}
314314
315- func (c * client ) listPublicIPsInNetwork (networkID , ip string ) ([] * cloudstack. PublicIpAddress , error ) {
315+ func (c * client ) isFreeIPAvailable (networkID , ip string ) (bool , error ) {
316316 params := c .cs .Address .NewListPublicIpAddressesParams ()
317317 params .SetNetworkid (networkID )
318318 params .SetAllocatedonly (false )
319319 params .SetForvirtualnetwork (false )
320320 params .SetListall (true )
321+
321322 if ip != "" {
322323 params .SetIpaddress (ip )
323324 }
324325
325326 resp , err := c .cs .Address .ListPublicIpAddresses (params )
326327 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 )
352329 }
353330
354- for _ , addr := range publicIPs {
331+ for _ , addr := range resp . PublicIpAddresses {
355332 if addr .State == "Free" {
356333 return true , nil
357334 }
@@ -360,42 +337,33 @@ func (c *client) hasFreeIPInNetwork(resolvedNet *cloudstack.Network) (bool, erro
360337 return false , nil
361338}
362339
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 {
372343 return nil , err
373344 }
374- if ! isAvailable {
375- return nil , errors .Errorf ("IP %q is already allocated in network %q or out of range" , ip , networkID )
376- }
377345 }
378346
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 ) {
386347 if resolvedNet .Type == "Shared" {
387- freeIPExists , err := c .hasFreeIPInNetwork (resolvedNet )
348+ isAvailable , err := c .isFreeIPAvailable (resolvedNet . Id , ip )
388349 if err != nil {
389350 return nil , err
390351 }
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+ }
392356 return nil , errors .Errorf ("no free IPs available in network %q" , resolvedNet .Id )
393357 }
394358 }
395359
396- return map [string ]string {
360+ entry := map [string ]string {
397361 "networkid" : resolvedNet .Id ,
398- }, nil
362+ }
363+ if ip != "" {
364+ entry ["ip" ] = ip
365+ }
366+ return entry , nil
399367}
400368
401369func (c * client ) resolveNetworkByName (name string ) (* cloudstack.Network , error ) {
@@ -420,12 +388,12 @@ func (c *client) buildIPToNetworkList(csMachine *infrav1.CloudStackMachine) ([]m
420388
421389 var entry map [string ]string
422390 if net .IP != "" {
423- entry , err = c .buildStaticIPEntry ( net .IP , resolvedNet )
391+ entry , err = c .buildIPEntry ( resolvedNet , net .IP )
424392 if err != nil {
425393 return nil , err
426394 }
427395 } else {
428- entry , err = c .buildDynamicIPEntry (resolvedNet )
396+ entry , err = c .buildIPEntry (resolvedNet , "" )
429397 if err != nil {
430398 return nil , err
431399 }
0 commit comments