Skip to content

Commit adfaabc

Browse files
authored
Merge pull request #4617 from willie-yao/aks-preview-v3
Expose AKS preview features
2 parents 7ca752c + ae1e38d commit adfaabc

31 files changed

+807
-132
lines changed

api/v1beta1/azuremanagedcontrolplane_webhook.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ func (mw *azureManagedControlPlaneWebhook) Default(ctx context.Context, obj runt
8181
setDefault[*Identity](&m.Spec.Identity, &Identity{
8282
Type: ManagedControlPlaneIdentityTypeSystemAssigned,
8383
})
84+
setDefault[*bool](&m.Spec.EnablePreviewFeatures, ptr.To(false))
8485
m.Spec.Version = setDefaultVersion(m.Spec.Version)
8586
m.Spec.SKU = setDefaultSku(m.Spec.SKU)
8687
m.Spec.AutoScalerProfile = setDefaultAutoScalerProfile(m.Spec.AutoScalerProfile)

api/v1beta1/azuremanagedcontrolplane_webhook_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ func TestDefaultingWebhook(t *testing.T) {
7777
g.Expect(amcp.Spec.DNSPrefix).NotTo(BeNil())
7878
g.Expect(*amcp.Spec.DNSPrefix).To(Equal(amcp.Name))
7979
g.Expect(amcp.Spec.Extensions[0].Plan.Name).To(Equal("fooName-test-product"))
80+
g.Expect(amcp.Spec.EnablePreviewFeatures).NotTo(BeNil())
81+
g.Expect(*amcp.Spec.EnablePreviewFeatures).To(BeFalse())
8082

8183
t.Logf("Testing amcp defaulting webhook with baseline")
8284
netPlug := "kubenet"
@@ -106,6 +108,7 @@ func TestDefaultingWebhook(t *testing.T) {
106108
IntervalHours: ptr.To(48),
107109
},
108110
}
111+
amcp.Spec.EnablePreviewFeatures = ptr.To(true)
109112

110113
err = mcpw.Default(context.Background(), amcp)
111114
g.Expect(err).NotTo(HaveOccurred())
@@ -129,6 +132,8 @@ func TestDefaultingWebhook(t *testing.T) {
129132
g.Expect(amcp.Spec.SecurityProfile.ImageCleaner).NotTo(BeNil())
130133
g.Expect(amcp.Spec.SecurityProfile.ImageCleaner.IntervalHours).NotTo(BeNil())
131134
g.Expect(*amcp.Spec.SecurityProfile.ImageCleaner.IntervalHours).To(Equal(48))
135+
g.Expect(amcp.Spec.EnablePreviewFeatures).NotTo(BeNil())
136+
g.Expect(*amcp.Spec.EnablePreviewFeatures).To(BeTrue())
132137

133138
t.Logf("Testing amcp defaulting webhook with overlay")
134139
amcp = &AzureManagedControlPlane{

api/v1beta1/azuremanagedcontrolplanetemplate_default.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
func (mcp *AzureManagedControlPlaneTemplate) setDefaults() {
2626
setDefault[*string](&mcp.Spec.Template.Spec.NetworkPlugin, ptr.To(AzureNetworkPluginName))
2727
setDefault[*string](&mcp.Spec.Template.Spec.LoadBalancerSKU, ptr.To("Standard"))
28+
setDefault[*bool](&mcp.Spec.Template.Spec.EnablePreviewFeatures, ptr.To(false))
2829

2930
if mcp.Spec.Template.Spec.Version != "" && !strings.HasPrefix(mcp.Spec.Template.Spec.Version, "v") {
3031
mcp.Spec.Template.Spec.Version = setDefaultVersion(mcp.Spec.Template.Spec.Version)

api/v1beta1/azuremanagedcontrolplanetemplate_webhook_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func TestControlPlaneTemplateDefaultingWebhook(t *testing.T) {
4141
g.Expect(amcpt.Spec.Template.Spec.VirtualNetwork.Subnet.Name).To(Equal("fooName"))
4242
g.Expect(amcpt.Spec.Template.Spec.VirtualNetwork.Subnet.CIDRBlock).To(Equal(defaultAKSNodeSubnetCIDR))
4343
g.Expect(amcpt.Spec.Template.Spec.SKU.Tier).To(Equal(FreeManagedControlPlaneTier))
44+
g.Expect(*amcpt.Spec.Template.Spec.EnablePreviewFeatures).To(BeFalse())
4445

4546
t.Logf("Testing amcp defaulting webhook with baseline")
4647
netPlug := "kubenet"
@@ -53,6 +54,7 @@ func TestControlPlaneTemplateDefaultingWebhook(t *testing.T) {
5354
amcpt.Spec.Template.Spec.VirtualNetwork.Name = "fooVnetName"
5455
amcpt.Spec.Template.Spec.VirtualNetwork.Subnet.Name = "fooSubnetName"
5556
amcpt.Spec.Template.Spec.SKU.Tier = PaidManagedControlPlaneTier
57+
amcpt.Spec.Template.Spec.EnablePreviewFeatures = ptr.To(true)
5658

5759
err = mcptw.Default(context.Background(), amcpt)
5860
g.Expect(err).NotTo(HaveOccurred())
@@ -63,6 +65,7 @@ func TestControlPlaneTemplateDefaultingWebhook(t *testing.T) {
6365
g.Expect(amcpt.Spec.Template.Spec.VirtualNetwork.Name).To(Equal("fooVnetName"))
6466
g.Expect(amcpt.Spec.Template.Spec.VirtualNetwork.Subnet.Name).To(Equal("fooSubnetName"))
6567
g.Expect(amcpt.Spec.Template.Spec.SKU.Tier).To(Equal(StandardManagedControlPlaneTier))
68+
g.Expect(*amcpt.Spec.Template.Spec.EnablePreviewFeatures).To(BeTrue())
6669
}
6770

6871
func TestControlPlaneTemplateUpdateWebhook(t *testing.T) {

api/v1beta1/types_class.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,10 @@ type AzureManagedControlPlaneClassSpec struct {
242242
// operation is possible.
243243
// +optional
244244
ASOManagedClusterPatches []string `json:"asoManagedClusterPatches,omitempty"`
245+
246+
// EnablePreviewFeatures enables preview features for the cluster.
247+
// +optional
248+
EnablePreviewFeatures *bool `json:"enablePreviewFeatures,omitempty"`
245249
}
246250

247251
// ManagedClusterAutoUpgradeProfile defines the auto upgrade profile for a managed cluster.

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/converters/managedagentpool.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package converters
1818

1919
import (
20+
asocontainerservicev1preview "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20230202preview"
2021
asocontainerservicev1 "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20231001"
2122
"k8s.io/utils/ptr"
2223
)
@@ -59,3 +60,44 @@ func AgentPoolToManagedClusterAgentPoolProfile(pool *asocontainerservicev1.Manag
5960
}
6061
return agentPool
6162
}
63+
64+
// AgentPoolToManagedClusterAgentPoolPreviewProfile converts an AgentPoolSpec to an Azure SDK ManagedClusterAgentPoolPreviewProfile used in managedcluster reconcile.
65+
func AgentPoolToManagedClusterAgentPoolPreviewProfile(pool *asocontainerservicev1preview.ManagedClustersAgentPool) asocontainerservicev1preview.ManagedClusterAgentPoolProfile {
66+
properties := pool.Spec
67+
68+
// Populate the same properties as the stable version since the patcher will handle the preview-only fields.
69+
agentPool := asocontainerservicev1preview.ManagedClusterAgentPoolProfile{
70+
Name: ptr.To(pool.AzureName()),
71+
VmSize: properties.VmSize,
72+
OsType: properties.OsType,
73+
OsDiskSizeGB: properties.OsDiskSizeGB,
74+
Count: properties.Count,
75+
Type: properties.Type,
76+
OrchestratorVersion: properties.OrchestratorVersion,
77+
VnetSubnetReference: properties.VnetSubnetReference,
78+
Mode: properties.Mode,
79+
EnableAutoScaling: properties.EnableAutoScaling,
80+
MaxCount: properties.MaxCount,
81+
MinCount: properties.MinCount,
82+
NodeTaints: properties.NodeTaints,
83+
AvailabilityZones: properties.AvailabilityZones,
84+
MaxPods: properties.MaxPods,
85+
OsDiskType: properties.OsDiskType,
86+
NodeLabels: properties.NodeLabels,
87+
EnableUltraSSD: properties.EnableUltraSSD,
88+
EnableNodePublicIP: properties.EnableNodePublicIP,
89+
NodePublicIPPrefixReference: properties.NodePublicIPPrefixReference,
90+
ScaleSetPriority: properties.ScaleSetPriority,
91+
ScaleDownMode: properties.ScaleDownMode,
92+
SpotMaxPrice: properties.SpotMaxPrice,
93+
Tags: properties.Tags,
94+
KubeletDiskType: properties.KubeletDiskType,
95+
LinuxOSConfig: properties.LinuxOSConfig,
96+
EnableFIPS: properties.EnableFIPS,
97+
EnableEncryptionAtHost: properties.EnableEncryptionAtHost,
98+
}
99+
if properties.KubeletConfig != nil {
100+
agentPool.KubeletConfig = properties.KubeletConfig
101+
}
102+
return agentPool
103+
}

azure/converters/managedagentpool_test.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package converters
1919
import (
2020
"testing"
2121

22+
asocontainerservicev1preview "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20230202preview"
2223
asocontainerservicev1 "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20231001"
2324
"github.com/Azure/azure-service-operator/v2/pkg/genruntime"
2425
. "github.com/onsi/gomega"
@@ -107,3 +108,86 @@ func Test_AgentPoolToManagedClusterAgentPoolProfile(t *testing.T) {
107108
})
108109
}
109110
}
111+
112+
func Test_AgentPoolToManagedClusterAgentPoolPreviewProfile(t *testing.T) {
113+
cases := []struct {
114+
name string
115+
pool *asocontainerservicev1preview.ManagedClustersAgentPool
116+
expect func(*GomegaWithT, asocontainerservicev1preview.ManagedClusterAgentPoolProfile)
117+
}{
118+
{
119+
name: "Should set all values correctly",
120+
pool: &asocontainerservicev1preview.ManagedClustersAgentPool{
121+
Spec: asocontainerservicev1preview.ManagedClusters_AgentPool_Spec{
122+
AzureName: "agentpool1",
123+
VmSize: ptr.To("Standard_D2s_v3"),
124+
OsType: ptr.To(asocontainerservicev1preview.OSType_Linux),
125+
OsDiskSizeGB: ptr.To[asocontainerservicev1preview.ContainerServiceOSDisk](100),
126+
Count: ptr.To(2),
127+
Type: ptr.To(asocontainerservicev1preview.AgentPoolType_VirtualMachineScaleSets),
128+
OrchestratorVersion: ptr.To("1.22.6"),
129+
VnetSubnetReference: &genruntime.ResourceReference{
130+
ARMID: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-123/providers/Microsoft.Network/virtualNetworks/vnet-123/subnets/subnet-123",
131+
},
132+
Mode: ptr.To(asocontainerservicev1preview.AgentPoolMode_User),
133+
EnableAutoScaling: ptr.To(true),
134+
MaxCount: ptr.To(5),
135+
MinCount: ptr.To(2),
136+
NodeTaints: []string{"key1=value1:NoSchedule"},
137+
AvailabilityZones: []string{"zone1"},
138+
MaxPods: ptr.To(60),
139+
OsDiskType: ptr.To(asocontainerservicev1preview.OSDiskType_Managed),
140+
NodeLabels: map[string]string{
141+
"custom": "default",
142+
},
143+
Tags: map[string]string{
144+
"custom": "default",
145+
},
146+
EnableFIPS: ptr.To(true),
147+
EnableEncryptionAtHost: ptr.To(true),
148+
},
149+
},
150+
151+
expect: func(g *GomegaWithT, result asocontainerservicev1preview.ManagedClusterAgentPoolProfile) {
152+
g.Expect(result).To(Equal(asocontainerservicev1preview.ManagedClusterAgentPoolProfile{
153+
Name: ptr.To("agentpool1"),
154+
VmSize: ptr.To("Standard_D2s_v3"),
155+
OsType: ptr.To(asocontainerservicev1preview.OSType_Linux),
156+
OsDiskSizeGB: ptr.To[asocontainerservicev1preview.ContainerServiceOSDisk](100),
157+
Count: ptr.To(2),
158+
Type: ptr.To(asocontainerservicev1preview.AgentPoolType_VirtualMachineScaleSets),
159+
OrchestratorVersion: ptr.To("1.22.6"),
160+
VnetSubnetReference: &genruntime.ResourceReference{
161+
ARMID: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-123/providers/Microsoft.Network/virtualNetworks/vnet-123/subnets/subnet-123",
162+
},
163+
Mode: ptr.To(asocontainerservicev1preview.AgentPoolMode_User),
164+
EnableAutoScaling: ptr.To(true),
165+
MaxCount: ptr.To(5),
166+
MinCount: ptr.To(2),
167+
NodeTaints: []string{"key1=value1:NoSchedule"},
168+
AvailabilityZones: []string{"zone1"},
169+
MaxPods: ptr.To(60),
170+
OsDiskType: ptr.To(asocontainerservicev1preview.OSDiskType_Managed),
171+
NodeLabels: map[string]string{
172+
"custom": "default",
173+
},
174+
Tags: map[string]string{
175+
"custom": "default",
176+
},
177+
EnableFIPS: ptr.To(true),
178+
EnableEncryptionAtHost: ptr.To(true),
179+
}))
180+
},
181+
},
182+
}
183+
184+
for _, c := range cases {
185+
c := c
186+
t.Run(c.name, func(t *testing.T) {
187+
t.Parallel()
188+
g := NewGomegaWithT(t)
189+
result := AgentPoolToManagedClusterAgentPoolPreviewProfile(c.pool)
190+
c.expect(g, result)
191+
})
192+
}
193+
}

azure/scope/managedcontrolplane.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ import (
2424
"time"
2525

2626
asocontainerservicev1preview "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20230315preview"
27-
asocontainerservicev1 "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20231001"
2827
asokubernetesconfigurationv1 "github.com/Azure/azure-service-operator/v2/api/kubernetesconfiguration/v1api20230501"
2928
asonetworkv1api20201101 "github.com/Azure/azure-service-operator/v2/api/network/v1api20201101"
3029
asonetworkv1api20220701 "github.com/Azure/azure-service-operator/v2/api/network/v1api20220701"
3130
asoresourcesv1 "github.com/Azure/azure-service-operator/v2/api/resources/v1api20200601"
31+
"github.com/Azure/azure-service-operator/v2/pkg/genruntime"
3232
"github.com/pkg/errors"
3333
"golang.org/x/mod/semver"
3434
"gopkg.in/yaml.v3"
@@ -528,6 +528,11 @@ func (s *ManagedControlPlaneScope) IsManagedVersionUpgrade() bool {
528528
return isManagedVersionUpgrade(s.ControlPlane)
529529
}
530530

531+
// IsPreviewEnabled checks if the preview feature is enabled.
532+
func (s *ManagedControlPlaneScope) IsPreviewEnabled() bool {
533+
return ptr.Deref(s.ControlPlane.Spec.EnablePreviewFeatures, false)
534+
}
535+
531536
func isManagedVersionUpgrade(managedControlPlane *infrav1.AzureManagedControlPlane) bool {
532537
return managedControlPlane.Spec.AutoUpgradeProfile != nil &&
533538
managedControlPlane.Spec.AutoUpgradeProfile.UpgradeChannel != nil &&
@@ -536,7 +541,7 @@ func isManagedVersionUpgrade(managedControlPlane *infrav1.AzureManagedControlPla
536541
}
537542

538543
// ManagedClusterSpec returns the managed cluster spec.
539-
func (s *ManagedControlPlaneScope) ManagedClusterSpec() azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedCluster] {
544+
func (s *ManagedControlPlaneScope) ManagedClusterSpec() azure.ASOResourceSpecGetter[genruntime.MetaObject] {
540545
managedClusterSpec := managedclusters.ManagedClusterSpec{
541546
Name: s.ControlPlane.Name,
542547
ResourceGroup: s.ControlPlane.Spec.ResourceGroupName,
@@ -559,6 +564,7 @@ func (s *ManagedControlPlaneScope) ManagedClusterSpec() azure.ASOResourceSpecGet
559564
NetworkPluginMode: s.ControlPlane.Spec.NetworkPluginMode,
560565
DNSPrefix: s.ControlPlane.Spec.DNSPrefix,
561566
Patches: s.ControlPlane.Spec.ASOManagedClusterPatches,
567+
Preview: ptr.Deref(s.ControlPlane.Spec.EnablePreviewFeatures, false),
562568
}
563569

564570
if s.ControlPlane.Spec.SSHPublicKey != nil {
@@ -726,9 +732,9 @@ func (s *ManagedControlPlaneScope) getManagedClusterSecurityProfile() *managedcl
726732
}
727733

728734
// GetAllAgentPoolSpecs gets a slice of azure.AgentPoolSpec for the list of agent pools.
729-
func (s *ManagedControlPlaneScope) GetAllAgentPoolSpecs() ([]azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedClustersAgentPool], error) {
735+
func (s *ManagedControlPlaneScope) GetAllAgentPoolSpecs() ([]azure.ASOResourceSpecGetter[genruntime.MetaObject], error) {
730736
var (
731-
ammps = make([]azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedClustersAgentPool], 0, len(s.ManagedMachinePools))
737+
ammps = make([]azure.ASOResourceSpecGetter[genruntime.MetaObject], 0, len(s.ManagedMachinePools))
732738
foundSystemPool = false
733739
)
734740
for _, pool := range s.ManagedMachinePools {

azure/scope/managedcontrolplane_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import (
2121
"reflect"
2222
"testing"
2323

24-
asocontainerservicev1 "github.com/Azure/azure-service-operator/v2/api/containerservice/v1api20231001"
2524
asokubernetesconfigurationv1 "github.com/Azure/azure-service-operator/v2/api/kubernetesconfiguration/v1api20230501"
2625
asonetworkv1 "github.com/Azure/azure-service-operator/v2/api/network/v1api20220701"
2726
asoresourcesv1 "github.com/Azure/azure-service-operator/v2/api/resources/v1api20200601"
27+
"github.com/Azure/azure-service-operator/v2/pkg/genruntime"
2828
. "github.com/onsi/gomega"
2929
corev1 "k8s.io/api/core/v1"
3030
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -141,7 +141,7 @@ func TestManagedControlPlaneScope_PoolVersion(t *testing.T) {
141141
cases := []struct {
142142
Name string
143143
Input ManagedControlPlaneScopeParams
144-
Expected []azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedClustersAgentPool]
144+
Expected []azure.ASOResourceSpecGetter[genruntime.MetaObject]
145145
Err string
146146
}{
147147
{
@@ -176,7 +176,7 @@ func TestManagedControlPlaneScope_PoolVersion(t *testing.T) {
176176
},
177177
},
178178
},
179-
Expected: []azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedClustersAgentPool]{
179+
Expected: []azure.ASOResourceSpecGetter[genruntime.MetaObject]{
180180
&agentpools.AgentPoolSpec{
181181
Name: "pool0",
182182
AzureName: "pool0",
@@ -221,7 +221,7 @@ func TestManagedControlPlaneScope_PoolVersion(t *testing.T) {
221221
},
222222
},
223223
},
224-
Expected: []azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedClustersAgentPool]{
224+
Expected: []azure.ASOResourceSpecGetter[genruntime.MetaObject]{
225225
&agentpools.AgentPoolSpec{
226226
Name: "pool0",
227227
AzureName: "pool0",
@@ -428,7 +428,7 @@ func TestManagedControlPlaneScope_OSType(t *testing.T) {
428428
cases := []struct {
429429
Name string
430430
Input ManagedControlPlaneScopeParams
431-
Expected []azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedClustersAgentPool]
431+
Expected []azure.ASOResourceSpecGetter[genruntime.MetaObject]
432432
Err string
433433
}{
434434
{
@@ -472,7 +472,7 @@ func TestManagedControlPlaneScope_OSType(t *testing.T) {
472472
},
473473
},
474474
},
475-
Expected: []azure.ASOResourceSpecGetter[*asocontainerservicev1.ManagedClustersAgentPool]{
475+
Expected: []azure.ASOResourceSpecGetter[genruntime.MetaObject]{
476476
&agentpools.AgentPoolSpec{
477477
Name: "pool0",
478478
AzureName: "pool0",

0 commit comments

Comments
 (0)