Skip to content

Commit 8f5ec54

Browse files
committed
add subnetName support to ammp
1 parent 632516c commit 8f5ec54

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
@@ -80,6 +80,7 @@ func (m *AzureManagedMachinePool) ValidateCreate(client client.Client) error {
8080
m.validateEnableNodePublicIP,
8181
m.validateKubeletConfig,
8282
m.validateLinuxOSConfig,
83+
m.validateSubnetName,
8384
}
8485

8586
var errs []error
@@ -133,6 +134,13 @@ func (m *AzureManagedMachinePool) ValidateUpdate(oldRaw runtime.Object, client c
133134
allErrs = append(allErrs, err)
134135
}
135136

137+
if err := webhookutils.ValidateImmutable(
138+
field.NewPath("Spec", "SubnetName"),
139+
old.Spec.SubnetName,
140+
m.Spec.SubnetName); err != nil && old.Spec.SubnetName != nil {
141+
allErrs = append(allErrs, err)
142+
}
143+
136144
// custom headers are immutable
137145
oldCustomHeaders := maps.FilterByKeyPrefix(old.ObjectMeta.Annotations, CustomHeaderPrefix)
138146
newCustomHeaders := maps.FilterByKeyPrefix(m.ObjectMeta.Annotations, CustomHeaderPrefix)
@@ -356,6 +364,18 @@ func (m *AzureManagedMachinePool) validateEnableNodePublicIP() error {
356364
return nil
357365
}
358366

367+
func (m *AzureManagedMachinePool) validateSubnetName() error {
368+
if m.Spec.SubnetName != nil {
369+
subnetRegex := "^[a-zA-Z0-9][a-zA-Z0-9-]{0,78}[a-zA-Z0-9]$"
370+
regex := regexp.MustCompile(subnetRegex)
371+
if success := regex.MatchString(pointer.StringDeref(m.Spec.SubnetName, "")); !success {
372+
return field.Invalid(field.NewPath("Spec", "SubnetName"), m.Spec.SubnetName,
373+
fmt.Sprintf("name of subnet doesn't match regex %s", subnetRegex))
374+
}
375+
}
376+
return nil
377+
}
378+
359379
// validateKubeletConfig enforces the AKS API configuration for KubeletConfig.
360380
// See: https://learn.microsoft.com/en-us/azure/aks/custom-node-configuration.
361381
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
@@ -535,6 +535,48 @@ func TestAzureManagedMachinePoolUpdatingWebhook(t *testing.T) {
535535
},
536536
wantErr: true,
537537
},
538+
{
539+
name: "Can't update SubnetName with error",
540+
new: &AzureManagedMachinePool{
541+
Spec: AzureManagedMachinePoolSpec{
542+
SubnetName: pointer.StringPtr("my-subnet"),
543+
},
544+
},
545+
old: &AzureManagedMachinePool{
546+
Spec: AzureManagedMachinePoolSpec{
547+
SubnetName: pointer.StringPtr("my-subnet-1"),
548+
},
549+
},
550+
wantErr: true,
551+
},
552+
{
553+
name: "Can update SubnetName if subnetName is empty",
554+
new: &AzureManagedMachinePool{
555+
Spec: AzureManagedMachinePoolSpec{
556+
SubnetName: pointer.StringPtr("my-subnet"),
557+
},
558+
},
559+
old: &AzureManagedMachinePool{
560+
Spec: AzureManagedMachinePoolSpec{
561+
SubnetName: nil,
562+
},
563+
},
564+
wantErr: false,
565+
},
566+
{
567+
name: "Can't update SubnetName without error",
568+
new: &AzureManagedMachinePool{
569+
Spec: AzureManagedMachinePoolSpec{
570+
SubnetName: pointer.StringPtr("my-subnet"),
571+
},
572+
},
573+
old: &AzureManagedMachinePool{
574+
Spec: AzureManagedMachinePoolSpec{
575+
SubnetName: pointer.StringPtr("my-subnet"),
576+
},
577+
},
578+
wantErr: false,
579+
},
538580
}
539581
var client client.Client
540582
for _, tc := range tests {
@@ -593,6 +635,112 @@ func TestAzureManagedMachinePool_ValidateCreate(t *testing.T) {
593635
wantErr: true,
594636
errorLen: 1,
595637
},
638+
{
639+
name: "invalid subnetname",
640+
ammp: &AzureManagedMachinePool{
641+
Spec: AzureManagedMachinePoolSpec{
642+
SubnetName: pointer.StringPtr("1+subnet"),
643+
},
644+
},
645+
wantErr: true,
646+
errorLen: 1,
647+
},
648+
{
649+
name: "invalid subnetname",
650+
ammp: &AzureManagedMachinePool{
651+
Spec: AzureManagedMachinePoolSpec{
652+
SubnetName: pointer.StringPtr("1"),
653+
},
654+
},
655+
wantErr: true,
656+
errorLen: 1,
657+
},
658+
{
659+
name: "invalid subnetname",
660+
ammp: &AzureManagedMachinePool{
661+
Spec: AzureManagedMachinePoolSpec{
662+
SubnetName: pointer.StringPtr("-a_b-c"),
663+
},
664+
},
665+
wantErr: true,
666+
errorLen: 1,
667+
},
668+
{
669+
name: "invalid subnetname",
670+
ammp: &AzureManagedMachinePool{
671+
Spec: AzureManagedMachinePoolSpec{
672+
SubnetName: pointer.StringPtr("E-a_b-c"),
673+
},
674+
},
675+
wantErr: true,
676+
errorLen: 1,
677+
},
678+
{
679+
name: "invalid subnetname",
680+
ammp: &AzureManagedMachinePool{
681+
Spec: AzureManagedMachinePoolSpec{
682+
SubnetName: pointer.StringPtr("-_-_"),
683+
},
684+
},
685+
wantErr: true,
686+
errorLen: 1,
687+
},
688+
{
689+
name: "invalid subnetname",
690+
ammp: &AzureManagedMachinePool{
691+
Spec: AzureManagedMachinePoolSpec{
692+
SubnetName: pointer.StringPtr("abc@#$"),
693+
},
694+
},
695+
wantErr: true,
696+
errorLen: 1,
697+
},
698+
{
699+
name: "invalid subnetname with character length 81",
700+
ammp: &AzureManagedMachinePool{
701+
Spec: AzureManagedMachinePoolSpec{
702+
SubnetName: pointer.StringPtr("3DgIb8EZMkLs0KlyPaTcNxoJU9ufmW6jvXrweqz1hVp5nS4RtH2QY7AFOiC5nS4RtH2QY7AFOiC3DgIb8"),
703+
},
704+
},
705+
wantErr: true,
706+
errorLen: 1,
707+
},
708+
{
709+
name: "valid subnetname with character length 80",
710+
ammp: &AzureManagedMachinePool{
711+
Spec: AzureManagedMachinePoolSpec{
712+
SubnetName: pointer.StringPtr("3DgIb8EZMkLs0KlyPaTcNxoJU9ufmW6jvXrweqz1hVp5nS4RtH2QY7AFOiC5nS4RtH2QY7AFOiC3DgIb"),
713+
},
714+
},
715+
wantErr: false,
716+
},
717+
{
718+
name: "valid subnetname",
719+
ammp: &AzureManagedMachinePool{
720+
Spec: AzureManagedMachinePoolSpec{
721+
SubnetName: pointer.StringPtr("1abc"),
722+
},
723+
},
724+
wantErr: false,
725+
},
726+
{
727+
name: "valid subnetname",
728+
ammp: &AzureManagedMachinePool{
729+
Spec: AzureManagedMachinePoolSpec{
730+
SubnetName: pointer.StringPtr("1-a-b-c"),
731+
},
732+
},
733+
wantErr: false,
734+
},
735+
{
736+
name: "valid subnetname",
737+
ammp: &AzureManagedMachinePool{
738+
Spec: AzureManagedMachinePoolSpec{
739+
SubnetName: pointer.StringPtr("my-subnet"),
740+
},
741+
},
742+
wantErr: false,
743+
},
596744
{
597745
name: "too few MaxPods",
598746
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)