@@ -92,9 +92,15 @@ func fillCreateConfig(createConfig *linodego.InstanceCreateOptions, machineScope
9292 if createConfig .InterfaceGeneration == linodego .GenerationLegacyConfig {
9393 // Supported only for legacy network interfaces.
9494 createConfig .PrivateIP = true
95+ }
96+ }
97+ // networkHelper is only applicable for Linode interfaces.
98+ // legacy interfaces have nework helper configured in reconcilePreflightConfigure at the instance level.
99+ if createConfig .InterfaceGeneration == linodego .GenerationLinode {
100+ if machineScope .LinodeMachine .Spec .NetworkHelper != nil {
101+ createConfig .NetworkHelper = machineScope .LinodeMachine .Spec .NetworkHelper
95102 } else {
96- // Network Helper is not supported for the new network interfaces.
97- createConfig .NetworkHelper = nil
103+ createConfig .NetworkHelper = ptr .To (true )
98104 }
99105 }
100106
@@ -631,7 +637,7 @@ func getVPCLinodeInterfaceConfig(ctx context.Context, machineScope *scope.Machin
631637 for _ , subnet := range linodeVPC .Spec .Subnets {
632638 if subnet .Label == subnetName {
633639 subnetID = subnet .SubnetID
634- ipv6Config = getVPCInterfaceIPv6Config (machineScope , len (subnet .IPv6 ))
640+ ipv6Config = getVPCLinodeInterfaceIPv6Config (machineScope , len (subnet .IPv6 ))
635641 break
636642 }
637643 }
@@ -641,7 +647,7 @@ func getVPCLinodeInterfaceConfig(ctx context.Context, machineScope *scope.Machin
641647 }
642648 } else {
643649 subnetID = linodeVPC .Spec .Subnets [0 ].SubnetID // get first subnet if nothing specified
644- ipv6Config = getVPCInterfaceIPv6Config (machineScope , len (linodeVPC .Spec .Subnets [0 ].IPv6 ))
650+ ipv6Config = getVPCLinodeInterfaceIPv6Config (machineScope , len (linodeVPC .Spec .Subnets [0 ].IPv6 ))
645651 }
646652
647653 if subnetID == 0 {
@@ -731,7 +737,7 @@ func getVPCLinodeInterfaceConfigFromDirectID(ctx context.Context, machineScope *
731737 for _ , subnet := range vpc .Subnets {
732738 if subnet .Label == subnetName {
733739 subnetID = subnet .ID
734- ipv6Config = getVPCInterfaceIPv6Config (machineScope , len (subnet .IPv6 ))
740+ ipv6Config = getVPCLinodeInterfaceIPv6Config (machineScope , len (subnet .IPv6 ))
735741 break
736742 }
737743 }
@@ -740,7 +746,7 @@ func getVPCLinodeInterfaceConfigFromDirectID(ctx context.Context, machineScope *
740746 }
741747 } else {
742748 subnetID = vpc .Subnets [0 ].ID
743- ipv6Config = getVPCInterfaceIPv6Config (machineScope , len (vpc .Subnets [0 ].IPv6 ))
749+ ipv6Config = getVPCLinodeInterfaceIPv6Config (machineScope , len (vpc .Subnets [0 ].IPv6 ))
744750 }
745751
746752 // Check if a VPC interface already exists
@@ -890,12 +896,12 @@ func getMachineIPv6Config(machineScope *scope.MachineScope, numIPv6RangesInSubne
890896 return intfOpts
891897}
892898
893- // getVPCInterfaceIPv6Config returns the IPv6 configuration for a LinodeMachine.
899+ // getVPCLinodeInterfaceIPv6Config returns the IPv6 configuration for a LinodeMachine.
894900// It checks the LinodeMachine's IPv6Options for SLAAC and Ranges settings.
895901// If `EnableSLAAC` is set, it will enable SLAAC with the default IPv6 CIDR range.
896902// If `EnableRanges` is set, it will enable IPv6 ranges with the default IPv6 CIDR range.
897903// If `IsPublicIPv6` is set, it will be used to determine if the IPv6 range should be publicly routable or not.
898- func getVPCInterfaceIPv6Config (machineScope * scope.MachineScope , numIPv6RangesInSubnet int ) * linodego.VPCInterfaceIPv6CreateOptions {
904+ func getVPCLinodeInterfaceIPv6Config (machineScope * scope.MachineScope , numIPv6RangesInSubnet int ) * linodego.VPCInterfaceIPv6CreateOptions {
899905 intfOpts := & linodego.VPCInterfaceIPv6CreateOptions {}
900906
901907 // If there are no IPv6 ranges in the subnet or if IPv6 options are not specified, return nil.
@@ -928,8 +934,6 @@ func getVPCInterfaceIPv6Config(machineScope *scope.MachineScope, numIPv6RangesIn
928934
929935// Unfortunately, this is necessary since DeepCopy can't be generated for linodego.LinodeInterfaceCreateOptions
930936// so here we manually create the options for Linode interfaces.
931- //
932- //nolint:gocognit,cyclop,gocritic,nestif,nolintlint // Also, unfortunately, this cannot be made any reasonably simpler with how complicated the linodego struct is
933937func constructLinodeInterfaceCreateOpts (createOpts []infrav1alpha2.LinodeInterfaceCreateOptions ) []linodego.LinodeInterfaceCreateOptions {
934938 linodeInterfaces := make ([]linodego.LinodeInterfaceCreateOptions , len (createOpts ))
935939 for idx , iface := range createOpts {
@@ -943,91 +947,11 @@ func constructLinodeInterfaceCreateOpts(createOpts []infrav1alpha2.LinodeInterfa
943947 }
944948 // Handle VPC
945949 if iface .VPC != nil {
946- var (
947- ipv4Addrs []linodego.VPCInterfaceIPv4AddressCreateOptions
948- ipv4Ranges []linodego.VPCInterfaceIPv4RangeCreateOptions
949- ipv6Ranges []linodego.VPCInterfaceIPv6RangeCreateOptions
950- ipv6SLAAC []linodego.VPCInterfaceIPv6SLAACCreateOptions
951- ipv6IsPublic bool
952- )
953- if iface .VPC .IPv4 != nil {
954- for _ , addr := range iface .VPC .IPv4 .Addresses {
955- ipv4Addrs = append (ipv4Addrs , linodego.VPCInterfaceIPv4AddressCreateOptions {
956- Address : addr .Address ,
957- Primary : addr .Primary ,
958- NAT1To1Address : addr .NAT1To1Address ,
959- })
960- }
961- for _ , rng := range iface .VPC .IPv4 .Ranges {
962- ipv4Ranges = append (ipv4Ranges , linodego.VPCInterfaceIPv4RangeCreateOptions {
963- Range : rng .Range ,
964- })
965- }
966- } else {
967- // If no IPv4 addresses are specified, we set a default NAT1To1 address to "any"
968- ipv4Addrs = []linodego.VPCInterfaceIPv4AddressCreateOptions {
969- {
970- Primary : ptr .To (true ),
971- NAT1To1Address : ptr .To ("auto" ),
972- Address : "auto" , // Default to auto-assigned address
973- },
974- }
975- }
976- if iface .VPC .IPv6 != nil {
977- for _ , slaac := range iface .VPC .IPv6 .SLAAC {
978- ipv6SLAAC = append (ipv6SLAAC , linodego.VPCInterfaceIPv6SLAACCreateOptions {
979- Range : slaac .Range ,
980- })
981- }
982- for _ , rng := range iface .VPC .IPv6 .Ranges {
983- ipv6Ranges = append (ipv6Ranges , linodego.VPCInterfaceIPv6RangeCreateOptions {
984- Range : rng .Range ,
985- })
986- }
987- ipv6IsPublic = iface .VPC .IPv6 .IsPublic
988- }
989- ifaceCreateOpts .VPC = & linodego.VPCInterfaceCreateOptions {
990- SubnetID : iface .VPC .SubnetID ,
991- IPv4 : & linodego.VPCInterfaceIPv4CreateOptions {
992- Addresses : ipv4Addrs ,
993- Ranges : ipv4Ranges ,
994- },
995- IPv6 : & linodego.VPCInterfaceIPv6CreateOptions {
996- SLAAC : ipv6SLAAC ,
997- Ranges : ipv6Ranges ,
998- IsPublic : ipv6IsPublic ,
999- },
1000- }
950+ ifaceCreateOpts .VPC = constructLinodeInterfaceVPC (iface )
1001951 }
1002952 // Handle Public Interface
1003953 if iface .Public != nil {
1004- var (
1005- ipv4Addrs []linodego.PublicInterfaceIPv4AddressCreateOptions
1006- ipv6Ranges []linodego.PublicInterfaceIPv6RangeCreateOptions
1007- )
1008- if iface .Public .IPv4 != nil {
1009- for _ , addr := range iface .Public .IPv4 .Addresses {
1010- ipv4Addrs = append (ipv4Addrs , linodego.PublicInterfaceIPv4AddressCreateOptions {
1011- Address : addr .Address ,
1012- Primary : addr .Primary ,
1013- })
1014- }
1015- }
1016- if iface .Public .IPv6 != nil {
1017- for _ , rng := range iface .Public .IPv6 .Ranges {
1018- ipv6Ranges = append (ipv6Ranges , linodego.PublicInterfaceIPv6RangeCreateOptions {
1019- Range : rng .Range ,
1020- })
1021- }
1022- }
1023- ifaceCreateOpts .Public = & linodego.PublicInterfaceCreateOptions {
1024- IPv4 : & linodego.PublicInterfaceIPv4CreateOptions {
1025- Addresses : ipv4Addrs ,
1026- },
1027- IPv6 : & linodego.PublicInterfaceIPv6CreateOptions {
1028- Ranges : ipv6Ranges ,
1029- },
1030- }
954+ ifaceCreateOpts .Public = constructLinodeInterfacePublic (iface )
1031955 }
1032956 // Handle Default Route
1033957 if iface .DefaultRoute != nil {
@@ -1044,6 +968,96 @@ func constructLinodeInterfaceCreateOpts(createOpts []infrav1alpha2.LinodeInterfa
1044968 return linodeInterfaces
1045969}
1046970
971+ // constructLinodeInterfaceVPC constructs a Linode VPC interface configuration from the provided LinodeInterfaceCreateOptions.
972+ func constructLinodeInterfaceVPC (iface infrav1alpha2.LinodeInterfaceCreateOptions ) * linodego.VPCInterfaceCreateOptions {
973+ var (
974+ ipv4Addrs []linodego.VPCInterfaceIPv4AddressCreateOptions
975+ ipv4Ranges []linodego.VPCInterfaceIPv4RangeCreateOptions
976+ ipv6Ranges []linodego.VPCInterfaceIPv6RangeCreateOptions
977+ ipv6SLAAC []linodego.VPCInterfaceIPv6SLAACCreateOptions
978+ ipv6IsPublic bool
979+ )
980+ if iface .VPC .IPv4 != nil {
981+ for _ , addr := range iface .VPC .IPv4 .Addresses {
982+ ipv4Addrs = append (ipv4Addrs , linodego.VPCInterfaceIPv4AddressCreateOptions {
983+ Address : addr .Address ,
984+ Primary : addr .Primary ,
985+ NAT1To1Address : addr .NAT1To1Address ,
986+ })
987+ }
988+ for _ , rng := range iface .VPC .IPv4 .Ranges {
989+ ipv4Ranges = append (ipv4Ranges , linodego.VPCInterfaceIPv4RangeCreateOptions {
990+ Range : rng .Range ,
991+ })
992+ }
993+ } else {
994+ // If no IPv4 addresses are specified, we set a default NAT1To1 address to "any"
995+ ipv4Addrs = []linodego.VPCInterfaceIPv4AddressCreateOptions {
996+ {
997+ Primary : ptr .To (true ),
998+ NAT1To1Address : ptr .To ("auto" ),
999+ Address : "auto" , // Default to auto-assigned address
1000+ },
1001+ }
1002+ }
1003+ if iface .VPC .IPv6 != nil {
1004+ for _ , slaac := range iface .VPC .IPv6 .SLAAC {
1005+ ipv6SLAAC = append (ipv6SLAAC , linodego.VPCInterfaceIPv6SLAACCreateOptions {
1006+ Range : slaac .Range ,
1007+ })
1008+ }
1009+ for _ , rng := range iface .VPC .IPv6 .Ranges {
1010+ ipv6Ranges = append (ipv6Ranges , linodego.VPCInterfaceIPv6RangeCreateOptions {
1011+ Range : rng .Range ,
1012+ })
1013+ }
1014+ ipv6IsPublic = iface .VPC .IPv6 .IsPublic
1015+ }
1016+ return & linodego.VPCInterfaceCreateOptions {
1017+ SubnetID : iface .VPC .SubnetID ,
1018+ IPv4 : & linodego.VPCInterfaceIPv4CreateOptions {
1019+ Addresses : ipv4Addrs ,
1020+ Ranges : ipv4Ranges ,
1021+ },
1022+ IPv6 : & linodego.VPCInterfaceIPv6CreateOptions {
1023+ SLAAC : ipv6SLAAC ,
1024+ Ranges : ipv6Ranges ,
1025+ IsPublic : ipv6IsPublic ,
1026+ },
1027+ }
1028+ }
1029+
1030+ // constructLinodeInterfacePublic constructs a Linode Public interface configuration from the provided LinodeInterfaceCreateOptions.
1031+ func constructLinodeInterfacePublic (iface infrav1alpha2.LinodeInterfaceCreateOptions ) * linodego.PublicInterfaceCreateOptions {
1032+ var (
1033+ ipv4Addrs []linodego.PublicInterfaceIPv4AddressCreateOptions
1034+ ipv6Ranges []linodego.PublicInterfaceIPv6RangeCreateOptions
1035+ )
1036+ if iface .Public .IPv4 != nil {
1037+ for _ , addr := range iface .Public .IPv4 .Addresses {
1038+ ipv4Addrs = append (ipv4Addrs , linodego.PublicInterfaceIPv4AddressCreateOptions {
1039+ Address : addr .Address ,
1040+ Primary : addr .Primary ,
1041+ })
1042+ }
1043+ }
1044+ if iface .Public .IPv6 != nil {
1045+ for _ , rng := range iface .Public .IPv6 .Ranges {
1046+ ipv6Ranges = append (ipv6Ranges , linodego.PublicInterfaceIPv6RangeCreateOptions {
1047+ Range : rng .Range ,
1048+ })
1049+ }
1050+ }
1051+ return & linodego.PublicInterfaceCreateOptions {
1052+ IPv4 : & linodego.PublicInterfaceIPv4CreateOptions {
1053+ Addresses : ipv4Addrs ,
1054+ },
1055+ IPv6 : & linodego.PublicInterfaceIPv6CreateOptions {
1056+ Ranges : ipv6Ranges ,
1057+ },
1058+ }
1059+ }
1060+
10471061// For converting LinodeMachineSpec to linodego.InstanceCreateOptions. Any defaulting should be done in fillCreateConfig instead
10481062func linodeMachineSpecToInstanceCreateConfig (machineSpec infrav1alpha2.LinodeMachineSpec , machineTags []string ) * linodego.InstanceCreateOptions {
10491063 instCreateOpts := & linodego.InstanceCreateOptions {
0 commit comments