@@ -19,6 +19,7 @@ package cloud
1919import (
2020 "encoding/base64"
2121 "fmt"
22+ "net"
2223 "strconv"
2324 "strings"
2425
@@ -31,8 +32,6 @@ import (
3132 "github.com/pkg/errors"
3233 corev1 "k8s.io/api/core/v1"
3334 infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta3"
34-
35- netpkg "net"
3635)
3736
3837type VMIface interface {
@@ -339,7 +338,7 @@ func (c *client) isFreeIPAvailable(networkID, ip string) (bool, error) {
339338
340339func (c * client ) buildIPEntry (resolvedNet * cloudstack.Network , ip string ) (map [string ]string , error ) {
341340 if ip != "" {
342- if err := c . validateIPInCIDR (ip , resolvedNet , resolvedNet . Id ); err != nil {
341+ if err := validateIPInCIDR (ip , resolvedNet . Cidr ); err != nil {
343342 return nil , err
344343 }
345344 }
@@ -417,21 +416,51 @@ func (c *client) resolveNetwork(net infrav1.NetworkSpec) (*cloudstack.Network, e
417416 return resolvedNet , nil
418417}
419418
420- func ( c * client ) validateIPInCIDR (ipStr string , net * cloudstack. Network , netID string ) error {
421- ip := netpkg .ParseIP (ipStr )
419+ func validateIPInCIDR (ipStr , cidrStr string ) error {
420+ ip := net .ParseIP (ipStr )
422421 if ip == nil {
423422 return errors .Errorf ("invalid IP address %q" , ipStr )
424423 }
425424
426- _ , cidr , err := netpkg .ParseCIDR (net . Cidr )
425+ _ , cidr , err := net .ParseCIDR (cidrStr )
427426 if err != nil {
428- return errors .Wrapf (err , "invalid CIDR %q for network %q " , net . Cidr , netID )
427+ return errors .Wrapf (err , "invalid CIDR %q" , cidrStr )
429428 }
430429
431430 if ! cidr .Contains (ip ) {
432- return errors .Errorf ("IP %q is not within network CIDR %q" , ipStr , net .Cidr )
431+ return errors .Errorf ("IP %q is not within network CIDR %q" , ipStr , cidrStr )
432+ }
433+
434+ return nil
435+ }
436+
437+ func (c * client ) configureNetworkParams (
438+ p * cloudstack.DeployVirtualMachineParams ,
439+ csMachine * infrav1.CloudStackMachine ,
440+ fd * infrav1.CloudStackFailureDomain ,
441+ ) error {
442+ if len (csMachine .Spec .Networks ) == 0 && fd .Spec .Zone .Network .ID != "" {
443+ p .SetNetworkids ([]string {fd .Spec .Zone .Network .ID })
444+ return nil
445+ }
446+
447+ firstNetwork := csMachine .Spec .Networks [0 ]
448+ zoneNet := fd .Spec .Zone .Network
449+
450+ // Validate match between zone network and first template network.
451+ if zoneNet .ID != "" && firstNetwork .ID != "" && firstNetwork .ID != zoneNet .ID {
452+ return errors .Errorf ("first network ID %q does not match zone network ID %q" , firstNetwork .ID , zoneNet .ID )
453+ }
454+ if zoneNet .Name != "" && firstNetwork .Name != "" && firstNetwork .Name != zoneNet .Name {
455+ return errors .Errorf ("first network name %q does not match zone network name %q" , firstNetwork .Name , zoneNet .Name )
456+ }
457+
458+ ipToNetworkList , err := c .buildIPToNetworkList (csMachine )
459+ if err != nil {
460+ return err
433461 }
434462
463+ p .SetIptonetworklist (ipToNetworkList )
435464 return nil
436465}
437466
@@ -456,24 +485,8 @@ func (c *client) DeployVM(
456485
457486 p := c .cs .VirtualMachine .NewDeployVirtualMachineParams (offering .Id , templateID , fd .Spec .Zone .ID )
458487
459- if len (csMachine .Spec .Networks ) == 0 && fd .Spec .Zone .Network .ID != "" {
460- p .SetNetworkids ([]string {fd .Spec .Zone .Network .ID })
461- } else {
462- firstNetwork := csMachine .Spec .Networks [0 ]
463- zoneNet := fd .Spec .Zone .Network
464-
465- if zoneNet .ID != "" && firstNetwork .ID != "" && firstNetwork .ID != zoneNet .ID {
466- return errors .Errorf ("first network ID %q does not match zone network ID %q" , firstNetwork .ID , zoneNet .ID )
467- }
468- if zoneNet .Name != "" && firstNetwork .Name != "" && firstNetwork .Name != zoneNet .Name {
469- return errors .Errorf ("first network name %q does not match zone network name %q" , firstNetwork .Name , zoneNet .Name )
470- }
471-
472- ipToNetworkList , err := c .buildIPToNetworkList (csMachine )
473- if err != nil {
474- return err
475- }
476- p .SetIptonetworklist (ipToNetworkList )
488+ if err := c .configureNetworkParams (p , csMachine , fd ); err != nil {
489+ return err
477490 }
478491
479492 setIfNotEmpty (csMachine .Name , p .SetName )
0 commit comments