Skip to content

Commit ecd2964

Browse files
authored
Merge pull request #3132 from spectrocloud/subnet-name-ammp
Add subnetName support to ammp
2 parents 1d6c199 + 8f5ec54 commit ecd2964

15 files changed

+361
-1
lines changed

api/v1alpha3/azuremanagedmachinepool_conversion.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func (src *AzureManagedMachinePool) ConvertTo(dstRaw conversion.Hub) error {
5555
if restored.Spec.KubeletConfig != nil {
5656
dst.Spec.KubeletConfig = restored.Spec.KubeletConfig
5757
}
58+
dst.Spec.SubnetName = restored.Spec.SubnetName
5859

5960
dst.Status.LongRunningOperationStates = restored.Status.LongRunningOperationStates
6061
dst.Status.Conditions = restored.Status.Conditions

api/v1alpha3/zz_generated.conversion.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha4/azuremanagedmachinepool_conversion.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func (src *AzureManagedMachinePool) ConvertTo(dstRaw conversion.Hub) error {
5555
if restored.Spec.KubeletConfig != nil {
5656
dst.Spec.KubeletConfig = restored.Spec.KubeletConfig
5757
}
58+
dst.Spec.SubnetName = restored.Spec.SubnetName
5859

5960
dst.Status.LongRunningOperationStates = restored.Status.LongRunningOperationStates
6061
dst.Status.Conditions = restored.Status.Conditions

api/v1alpha4/zz_generated.conversion.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/azuremanagedmachinepool_types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,9 @@ type AzureManagedMachinePoolSpec struct {
458458
// LinuxOSConfig specifies the custom Linux OS settings and configurations.
459459
// +optional
460460
LinuxOSConfig *LinuxOSConfig `json:"linuxOSConfig,omitempty"`
461+
// SubnetName specifies the Subnet where the MachinePool will be placed
462+
// +optional
463+
SubnetName *string `json:"subnetName,omitempty"`
461464
}
462465

463466
// ManagedMachinePoolScaling specifies scaling options.

api/v1beta1/azuremanagedmachinepool_webhook.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ func (mw *azureManagedMachinePoolWebhook) ValidateCreate(ctx context.Context, ob
106106
m.validateEnableNodePublicIP,
107107
m.validateKubeletConfig,
108108
m.validateLinuxOSConfig,
109+
m.validateSubnetName,
109110
}
110111

111112
var errs []error
@@ -166,6 +167,13 @@ func (mw *azureManagedMachinePoolWebhook) ValidateUpdate(ctx context.Context, ol
166167
allErrs = append(allErrs, err)
167168
}
168169

170+
if err := webhookutils.ValidateImmutable(
171+
field.NewPath("Spec", "SubnetName"),
172+
old.Spec.SubnetName,
173+
m.Spec.SubnetName); err != nil && old.Spec.SubnetName != nil {
174+
allErrs = append(allErrs, err)
175+
}
176+
169177
// custom headers are immutable
170178
oldCustomHeaders := maps.FilterByKeyPrefix(old.ObjectMeta.Annotations, CustomHeaderPrefix)
171179
newCustomHeaders := maps.FilterByKeyPrefix(m.ObjectMeta.Annotations, CustomHeaderPrefix)
@@ -392,6 +400,18 @@ func (m *AzureManagedMachinePool) validateEnableNodePublicIP() error {
392400
return nil
393401
}
394402

403+
func (m *AzureManagedMachinePool) validateSubnetName() error {
404+
if m.Spec.SubnetName != nil {
405+
subnetRegex := "^[a-zA-Z0-9][a-zA-Z0-9-]{0,78}[a-zA-Z0-9]$"
406+
regex := regexp.MustCompile(subnetRegex)
407+
if success := regex.MatchString(pointer.StringDeref(m.Spec.SubnetName, "")); !success {
408+
return field.Invalid(field.NewPath("Spec", "SubnetName"), m.Spec.SubnetName,
409+
fmt.Sprintf("name of subnet doesn't match regex %s", subnetRegex))
410+
}
411+
}
412+
return nil
413+
}
414+
395415
// validateKubeletConfig enforces the AKS API configuration for KubeletConfig.
396416
// See: https://learn.microsoft.com/en-us/azure/aks/custom-node-configuration.
397417
func (m *AzureManagedMachinePool) validateKubeletConfig() error {

api/v1beta1/azuremanagedmachinepool_webhook_test.go

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,48 @@ func TestAzureManagedMachinePoolUpdatingWebhook(t *testing.T) {
543543
},
544544
wantErr: true,
545545
},
546+
{
547+
name: "Can't update SubnetName with error",
548+
new: &AzureManagedMachinePool{
549+
Spec: AzureManagedMachinePoolSpec{
550+
SubnetName: pointer.StringPtr("my-subnet"),
551+
},
552+
},
553+
old: &AzureManagedMachinePool{
554+
Spec: AzureManagedMachinePoolSpec{
555+
SubnetName: pointer.StringPtr("my-subnet-1"),
556+
},
557+
},
558+
wantErr: true,
559+
},
560+
{
561+
name: "Can update SubnetName if subnetName is empty",
562+
new: &AzureManagedMachinePool{
563+
Spec: AzureManagedMachinePoolSpec{
564+
SubnetName: pointer.StringPtr("my-subnet"),
565+
},
566+
},
567+
old: &AzureManagedMachinePool{
568+
Spec: AzureManagedMachinePoolSpec{
569+
SubnetName: nil,
570+
},
571+
},
572+
wantErr: false,
573+
},
574+
{
575+
name: "Can't update SubnetName without error",
576+
new: &AzureManagedMachinePool{
577+
Spec: AzureManagedMachinePoolSpec{
578+
SubnetName: pointer.StringPtr("my-subnet"),
579+
},
580+
},
581+
old: &AzureManagedMachinePool{
582+
Spec: AzureManagedMachinePoolSpec{
583+
SubnetName: pointer.StringPtr("my-subnet"),
584+
},
585+
},
586+
wantErr: false,
587+
},
546588
}
547589
var client client.Client
548590
for _, tc := range tests {
@@ -604,6 +646,112 @@ func TestAzureManagedMachinePool_ValidateCreate(t *testing.T) {
604646
wantErr: true,
605647
errorLen: 1,
606648
},
649+
{
650+
name: "invalid subnetname",
651+
ammp: &AzureManagedMachinePool{
652+
Spec: AzureManagedMachinePoolSpec{
653+
SubnetName: pointer.StringPtr("1+subnet"),
654+
},
655+
},
656+
wantErr: true,
657+
errorLen: 1,
658+
},
659+
{
660+
name: "invalid subnetname",
661+
ammp: &AzureManagedMachinePool{
662+
Spec: AzureManagedMachinePoolSpec{
663+
SubnetName: pointer.StringPtr("1"),
664+
},
665+
},
666+
wantErr: true,
667+
errorLen: 1,
668+
},
669+
{
670+
name: "invalid subnetname",
671+
ammp: &AzureManagedMachinePool{
672+
Spec: AzureManagedMachinePoolSpec{
673+
SubnetName: pointer.StringPtr("-a_b-c"),
674+
},
675+
},
676+
wantErr: true,
677+
errorLen: 1,
678+
},
679+
{
680+
name: "invalid subnetname",
681+
ammp: &AzureManagedMachinePool{
682+
Spec: AzureManagedMachinePoolSpec{
683+
SubnetName: pointer.StringPtr("E-a_b-c"),
684+
},
685+
},
686+
wantErr: true,
687+
errorLen: 1,
688+
},
689+
{
690+
name: "invalid subnetname",
691+
ammp: &AzureManagedMachinePool{
692+
Spec: AzureManagedMachinePoolSpec{
693+
SubnetName: pointer.StringPtr("-_-_"),
694+
},
695+
},
696+
wantErr: true,
697+
errorLen: 1,
698+
},
699+
{
700+
name: "invalid subnetname",
701+
ammp: &AzureManagedMachinePool{
702+
Spec: AzureManagedMachinePoolSpec{
703+
SubnetName: pointer.StringPtr("abc@#$"),
704+
},
705+
},
706+
wantErr: true,
707+
errorLen: 1,
708+
},
709+
{
710+
name: "invalid subnetname with character length 81",
711+
ammp: &AzureManagedMachinePool{
712+
Spec: AzureManagedMachinePoolSpec{
713+
SubnetName: pointer.StringPtr("3DgIb8EZMkLs0KlyPaTcNxoJU9ufmW6jvXrweqz1hVp5nS4RtH2QY7AFOiC5nS4RtH2QY7AFOiC3DgIb8"),
714+
},
715+
},
716+
wantErr: true,
717+
errorLen: 1,
718+
},
719+
{
720+
name: "valid subnetname with character length 80",
721+
ammp: &AzureManagedMachinePool{
722+
Spec: AzureManagedMachinePoolSpec{
723+
SubnetName: pointer.StringPtr("3DgIb8EZMkLs0KlyPaTcNxoJU9ufmW6jvXrweqz1hVp5nS4RtH2QY7AFOiC5nS4RtH2QY7AFOiC3DgIb"),
724+
},
725+
},
726+
wantErr: false,
727+
},
728+
{
729+
name: "valid subnetname",
730+
ammp: &AzureManagedMachinePool{
731+
Spec: AzureManagedMachinePoolSpec{
732+
SubnetName: pointer.StringPtr("1abc"),
733+
},
734+
},
735+
wantErr: false,
736+
},
737+
{
738+
name: "valid subnetname",
739+
ammp: &AzureManagedMachinePool{
740+
Spec: AzureManagedMachinePoolSpec{
741+
SubnetName: pointer.StringPtr("1-a-b-c"),
742+
},
743+
},
744+
wantErr: false,
745+
},
746+
{
747+
name: "valid subnetname",
748+
ammp: &AzureManagedMachinePool{
749+
Spec: AzureManagedMachinePoolSpec{
750+
SubnetName: pointer.StringPtr("my-subnet"),
751+
},
752+
},
753+
wantErr: false,
754+
},
607755
{
608756
name: "too few MaxPods",
609757
ammp: &AzureManagedMachinePool{

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

azure/scope/managedmachinepool.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,23 @@ func (s *ManagedMachinePoolScope) Name() string {
134134
return s.InfraMachinePool.Name
135135
}
136136

137+
// SetSubnetName updates AzureManagedMachinePool.SubnetName if AzureManagedMachinePool.SubnetName is empty with s.ControlPlane.Spec.VirtualNetwork.Subnet.Name.
138+
func (s *ManagedMachinePoolScope) SetSubnetName() {
139+
s.InfraMachinePool.Spec.SubnetName = getAgentPoolSubnet(s.ControlPlane, s.InfraMachinePool)
140+
}
141+
137142
// AgentPoolSpec returns an azure.ResourceSpecGetter for currently reconciled AzureManagedMachinePool.
138143
func (s *ManagedMachinePoolScope) AgentPoolSpec() azure.ResourceSpecGetter {
139144
return buildAgentPoolSpec(s.ControlPlane, s.MachinePool, s.InfraMachinePool, s.AgentPoolAnnotations())
140145
}
141146

147+
func getAgentPoolSubnet(controlPlane *infrav1.AzureManagedControlPlane, infraMachinePool *infrav1.AzureManagedMachinePool) *string {
148+
if infraMachinePool.Spec.SubnetName == nil {
149+
return pointer.StringPtr(controlPlane.Spec.VirtualNetwork.Subnet.Name)
150+
}
151+
return infraMachinePool.Spec.SubnetName
152+
}
153+
142154
func buildAgentPoolSpec(managedControlPlane *infrav1.AzureManagedControlPlane,
143155
machinePool *expv1.MachinePool,
144156
managedMachinePool *infrav1.AzureManagedMachinePool,
@@ -166,7 +178,7 @@ func buildAgentPoolSpec(managedControlPlane *infrav1.AzureManagedControlPlane,
166178
managedControlPlane.Spec.SubscriptionID,
167179
managedControlPlane.Spec.VirtualNetwork.ResourceGroup,
168180
managedControlPlane.Spec.VirtualNetwork.Name,
169-
managedControlPlane.Spec.VirtualNetwork.Subnet.Name,
181+
pointer.StringDeref(getAgentPoolSubnet(managedControlPlane, managedMachinePool), ""),
170182
),
171183
Mode: managedMachinePool.Spec.Mode,
172184
MaxPods: managedMachinePool.Spec.MaxPods,

0 commit comments

Comments
 (0)