From 465f015ea7d6e063bbf293d101bb3addbbdad33a Mon Sep 17 00:00:00 2001 From: Neth Botheju Date: Tue, 10 Mar 2026 11:51:37 +1000 Subject: [PATCH 1/3] Added CLI support for customer control plane scaling specs --- src/aks-preview/azext_aks_preview/_help.py | 20 +++ src/aks-preview/azext_aks_preview/_params.py | 14 ++ src/aks-preview/azext_aks_preview/custom.py | 4 +- .../managed_cluster_decorator.py | 60 +++++++ .../tests/latest/test_aks_commands.py | 47 ++++++ .../latest/test_managed_cluster_decorator.py | 154 ++++++++++++++++++ .../azure_mgmt_preview_aks/models/__init__.py | 2 + .../models/_models_py3.py | 38 +++++ 8 files changed, 338 insertions(+), 1 deletion(-) diff --git a/src/aks-preview/azext_aks_preview/_help.py b/src/aks-preview/azext_aks_preview/_help.py index 1c4864b09cf..782b871cb4b 100644 --- a/src/aks-preview/azext_aks_preview/_help.py +++ b/src/aks-preview/azext_aks_preview/_help.py @@ -702,6 +702,14 @@ - name: --enable-hosted-system type: bool short-summary: Create a cluster with fully hosted system components. This applies only when creating a new automatic cluster. + - name: --control-plane-scaling-size + type: string + short-summary: (PREVIEW) The control plane scaling size for the cluster. + long-summary: | + Provides scaled and performance-guaranteed control plane capacity for AKS clusters. + Enables customers to select a control plane scaling size that delivers higher API server throughput, + increased etcd capacity, and faster pod scheduling rates. Available values are 'H2', 'H4', and 'H8'. + Requires Kubernetes version >= 1.33.0 and Azure CNI Overlay networking. examples: - name: Create a Kubernetes cluster with an existing SSH public key. text: az aks create -g MyResourceGroup -n MyManagedCluster --ssh-key-value /path/to/publickey @@ -793,6 +801,8 @@ text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-managed-system-pool - name: Create a kubernetes cluster with a managed installation of Gateway API CRDs from the standard release channel. text: az aks create -g MyResourceGroup -n MyManagedCluster --enable-gateway-api + - name: Create a kubernetes cluster with control plane scaling size H4. + text: az aks create -g MyResourceGroup -n MyManagedCluster --network-plugin azure --network-plugin-mode overlay --pod-cidr 10.244.0.0/16 --control-plane-scaling-size H4 - name: Create an automatic cluster with hosted system components enabled. text: az aks create -g MyResourceGroup -n MyManagedCluster --sku automatic --enable-hosted-system @@ -1430,6 +1440,14 @@ - name: --disable-application-load-balancer type: bool short-summary: Disable Application Load Balancer (Application Gateway for Containers) addon. + - name: --control-plane-scaling-size + type: string + short-summary: (PREVIEW) The control plane scaling size for the cluster. + long-summary: | + Provides scaled and performance-guaranteed control plane capacity for AKS clusters. + Enables customers to select a control plane scaling size that delivers higher API server throughput, + increased etcd capacity, and faster pod scheduling rates. Available values are 'H2', 'H4', and 'H8'. + Requires Kubernetes version >= 1.33.0 and Azure CNI Overlay networking. examples: - name: Reconcile the cluster back to its current state. text: az aks update -g MyResourceGroup -n MyManagedCluster @@ -1513,6 +1531,8 @@ text: az aks update -g MyResourceGroup -n MyManagedCluster --enable-opentelemetry-logs --opentelemetry-logs-port 4317 - name: Disable OpenTelemetry metrics collection on an existing cluster text: az aks update -g MyResourceGroup -n MyManagedCluster --disable-opentelemetry-metrics + - name: Update a kubernetes cluster's control plane scaling size. + text: az aks update -g MyResourceGroup -n MyManagedCluster --control-plane-scaling-size H8 - name: Disable OpenTelemetry logs collection on an existing cluster text: az aks update -g MyResourceGroup -n MyManagedCluster --disable-opentelemetry-logs """ diff --git a/src/aks-preview/azext_aks_preview/_params.py b/src/aks-preview/azext_aks_preview/_params.py index 31007557c39..b03e4749618 100644 --- a/src/aks-preview/azext_aks_preview/_params.py +++ b/src/aks-preview/azext_aks_preview/_params.py @@ -1201,6 +1201,13 @@ def load_arguments(self, _): help="Enable managed installation of Gateway API CRDs from the standard release channel." ) c.argument("enable_hosted_system", action="store_true", is_preview=True) + c.argument( + "control_plane_scaling_size", + arg_type=get_enum_type(["H2", "H4", "H8"]), + is_preview=True, + help="The control plane scaling size. Provides scaled and performance-guaranteed control plane capacity. " + "Available values are 'H2', 'H4', and 'H8'.", + ) with self.argument_context("aks update") as c: # managed cluster paramerters @@ -1779,6 +1786,13 @@ def load_arguments(self, _): is_preview=True, help="Disable Application Load Balancer (Application Gateway for Containers)." ) + c.argument( + "control_plane_scaling_size", + arg_type=get_enum_type(["H2", "H4", "H8"]), + is_preview=True, + help="The control plane scaling size. Provides scaled and performance-guaranteed control plane capacity. " + "Available values are 'H2', 'H4', and 'H8'.", + ) with self.argument_context("aks upgrade") as c: c.argument("kubernetes_version", completer=get_k8s_upgrades_completion_list) diff --git a/src/aks-preview/azext_aks_preview/custom.py b/src/aks-preview/azext_aks_preview/custom.py index 3b4f1ceb1b6..70f2ae1f689 100644 --- a/src/aks-preview/azext_aks_preview/custom.py +++ b/src/aks-preview/azext_aks_preview/custom.py @@ -1160,7 +1160,8 @@ def aks_create( enable_upstream_kubescheduler_user_configuration=False, # managed gateway installation enable_gateway_api=False, - enable_hosted_system=False + enable_hosted_system=False, + control_plane_scaling_size=None, ): # DO NOT MOVE: get all the original parameters and save them as a dictionary raw_parameters = locals() @@ -1404,6 +1405,7 @@ def aks_update( # application load balancer enable_application_load_balancer=False, disable_application_load_balancer=False, + control_plane_scaling_size=None, ): # DO NOT MOVE: get all the original parameters and save them as a dictionary raw_parameters = locals() diff --git a/src/aks-preview/azext_aks_preview/managed_cluster_decorator.py b/src/aks-preview/azext_aks_preview/managed_cluster_decorator.py index 5674a78ab22..7b0b265c5b9 100644 --- a/src/aks-preview/azext_aks_preview/managed_cluster_decorator.py +++ b/src/aks-preview/azext_aks_preview/managed_cluster_decorator.py @@ -3767,6 +3767,28 @@ def get_enable_hosted_system(self) -> bool: raise RequiredArgumentMissingError('"--enable-hosted-system" requires "--sku automatic".') return enable_hosted_system + def get_control_plane_scaling_size(self) -> Union[str, None]: + """Obtain the value of control_plane_scaling_size. + + :return: str or None + """ + # try to read from raw parameters first + control_plane_scaling_size = self.raw_param.get("control_plane_scaling_size") + + # for update scenarios, read from existing mc if raw parameter not set + if ( + control_plane_scaling_size is None and + self.decorator_mode == DecoratorMode.UPDATE + ): + if ( + self.mc and + self.mc.control_plane_scaling_profile is not None and + self.mc.control_plane_scaling_profile.scaling_size is not None + ): + control_plane_scaling_size = self.mc.control_plane_scaling_profile.scaling_size + + return control_plane_scaling_size + # pylint: disable=too-many-public-methods class AKSPreviewManagedClusterCreateDecorator(AKSManagedClusterCreateDecorator): @@ -4796,6 +4818,23 @@ def set_up_bootstrap_profile(self, mc: ManagedCluster) -> ManagedCluster: return mc + def set_up_control_plane_scaling_profile(self, mc: ManagedCluster) -> ManagedCluster: + """Set up the control plane scaling profile for the ManagedCluster object. + + :return: the ManagedCluster object + """ + self._ensure_mc(mc) + + control_plane_scaling_size = self.context.get_control_plane_scaling_size() + if control_plane_scaling_size is not None: + mc.control_plane_scaling_profile = ( + self.models.ManagedClusterControlPlaneScalingProfile( # pylint: disable=no-member + scaling_size=control_plane_scaling_size, + ) + ) + + return mc + def set_up_static_egress_gateway(self, mc: ManagedCluster) -> ManagedCluster: self._ensure_mc(mc) @@ -4918,6 +4957,8 @@ def construct_mc_profile_preview(self, bypass_restore_defaults: bool = False) -> mc = self.set_up_agentpool_profile_ssh_access(mc) # set up bootstrap profile mc = self.set_up_bootstrap_profile(mc) + # set up control plane scaling profile + mc = self.set_up_control_plane_scaling_profile(mc) # set up static egress gateway profile mc = self.set_up_static_egress_gateway(mc) # set up imds restriction(a property in network profile) @@ -7102,6 +7143,23 @@ def update_bootstrap_profile(self, mc: ManagedCluster) -> ManagedCluster: return mc + def update_control_plane_scaling_profile(self, mc: ManagedCluster) -> ManagedCluster: + """Update the control plane scaling profile for the ManagedCluster object. + + :return: the ManagedCluster object + """ + self._ensure_mc(mc) + + control_plane_scaling_size = self.context.get_control_plane_scaling_size() + if control_plane_scaling_size is not None: + if mc.control_plane_scaling_profile is None: + mc.control_plane_scaling_profile = ( + self.models.ManagedClusterControlPlaneScalingProfile() # pylint: disable=no-member + ) + mc.control_plane_scaling_profile.scaling_size = control_plane_scaling_size + + return mc + def update_static_egress_gateway(self, mc: ManagedCluster) -> ManagedCluster: """Update static egress gateway addon for the ManagedCluster object. @@ -7550,6 +7608,8 @@ def update_mc_profile_preview(self) -> ManagedCluster: mc = self.update_node_provisioning_profile(mc) # update bootstrap profile mc = self.update_bootstrap_profile(mc) + # update control plane scaling profile + mc = self.update_control_plane_scaling_profile(mc) # update static egress gateway mc = self.update_static_egress_gateway(mc) # update imds restriction diff --git a/src/aks-preview/azext_aks_preview/tests/latest/test_aks_commands.py b/src/aks-preview/azext_aks_preview/tests/latest/test_aks_commands.py index f7bd3c1f4a1..89b92026b8c 100644 --- a/src/aks-preview/azext_aks_preview/tests/latest/test_aks_commands.py +++ b/src/aks-preview/azext_aks_preview/tests/latest/test_aks_commands.py @@ -9685,6 +9685,53 @@ def test_aks_create_with_windows_gmsa( checks=[self.is_empty()], ) + @AllowLargeResponse() + @AKSCustomResourceGroupPreparer( + random_name_length=17, + name_prefix="clitest", + location="centraluseuap", + ) + def test_aks_create_with_control_plane_scaling_profile( + self, resource_group, resource_group_location + ): + # reset the count so in replay mode the random names will start with 0 + self.test_resources_count = 0 + # kwargs for string formatting + aks_name = self.create_random_name("cliakstest", 16) + self.kwargs.update( + { + "resource_group": resource_group, + "name": aks_name, + "location": resource_group_location, + "resource_type": "Microsoft.ContainerService/ManagedClusters", + "ssh_key_value": self.generate_ssh_keys(), + } + ) + + # create with control plane scaling size H4 + create_cmd = ( + "aks create --resource-group={resource_group} --name={name} --location={location} " + "--network-plugin azure --network-plugin-mode overlay --pod-cidr 10.244.0.0/16 " + "--ssh-key-value={ssh_key_value} --node-count 1 " + "--control-plane-scaling-size H4 " + "--aks-custom-headers AKSHTTPCustomFeatures=Microsoft.ContainerService/ControlPlaneScalingProfilePreview" + ) + self.cmd( + create_cmd, + checks=[ + self.check("provisioningState", "Succeeded"), + self.check("networkProfile.networkPlugin", "azure"), + self.check("networkProfile.networkPluginMode", "overlay"), + self.check("controlPlaneScalingProfile.scalingSize", "H4"), + ], + ) + + # delete + self.cmd( + "aks delete -g {resource_group} -n {name} --yes --no-wait", + checks=[self.is_empty()], + ) + @AllowLargeResponse() @AKSCustomResourceGroupPreparer( random_name_length=17, diff --git a/src/aks-preview/azext_aks_preview/tests/latest/test_managed_cluster_decorator.py b/src/aks-preview/azext_aks_preview/tests/latest/test_managed_cluster_decorator.py index 3449f312c51..0380c63490e 100644 --- a/src/aks-preview/azext_aks_preview/tests/latest/test_managed_cluster_decorator.py +++ b/src/aks-preview/azext_aks_preview/tests/latest/test_managed_cluster_decorator.py @@ -5002,6 +5002,60 @@ def test_get_disable_default_domain(self): disable_default_domain_3 = ctx_3.get_disable_default_domain() self.assertEqual(disable_default_domain_3, False) + def test_get_control_plane_scaling_size(self): + # default value - None + ctx_1 = AKSPreviewManagedClusterContext( + self.cmd, + AKSManagedClusterParamDict({}), + self.models, + decorator_mode=DecoratorMode.CREATE, + ) + self.assertIsNone(ctx_1.get_control_plane_scaling_size()) + + # custom value - H4 + ctx_2 = AKSPreviewManagedClusterContext( + self.cmd, + AKSManagedClusterParamDict({"control_plane_scaling_size": "H4"}), + self.models, + decorator_mode=DecoratorMode.CREATE, + ) + self.assertEqual(ctx_2.get_control_plane_scaling_size(), "H4") + + # update mode - reads from existing mc when raw param not set + ctx_3 = AKSPreviewManagedClusterContext( + self.cmd, + AKSManagedClusterParamDict({}), + self.models, + decorator_mode=DecoratorMode.UPDATE, + ) + from azext_aks_preview.vendored_sdks.azure_mgmt_preview_aks.models import ( + ManagedClusterControlPlaneScalingProfile, + ) + mc_3 = self.models.ManagedCluster( + location="test_location", + control_plane_scaling_profile=ManagedClusterControlPlaneScalingProfile( + scaling_size="H8", + ), + ) + ctx_3.attach_mc(mc_3) + self.assertEqual(ctx_3.get_control_plane_scaling_size(), "H8") + + # update mode - raw param overrides existing mc + ctx_4 = AKSPreviewManagedClusterContext( + self.cmd, + AKSManagedClusterParamDict({"control_plane_scaling_size": "H2"}), + self.models, + decorator_mode=DecoratorMode.UPDATE, + ) + mc_4 = self.models.ManagedCluster( + location="test_location", + control_plane_scaling_profile=ManagedClusterControlPlaneScalingProfile( + scaling_size="H8", + ), + ) + ctx_4.attach_mc(mc_4) + self.assertEqual(ctx_4.get_control_plane_scaling_size(), "H2") + class AKSPreviewManagedClusterCreateDecoratorTestCase(unittest.TestCase): def setUp(self): # manually register CUSTOM_MGMT_AKS_PREVIEW @@ -7454,6 +7508,56 @@ def test_get_enable_azure_monitor_logs_create_mode_succeeds(self): result = ctx_1.get_enable_azure_monitor_logs() self.assertTrue(result) + def test_set_up_control_plane_scaling_profile(self): + # Not specified case - profile should not be set + dec_0 = AKSPreviewManagedClusterCreateDecorator( + self.cmd, + self.client, + {}, + CUSTOM_MGMT_AKS_PREVIEW, + ) + mc_0 = self.models.ManagedCluster(location="test_location") + dec_0.context.attach_mc(mc_0) + dec_mc_0 = dec_0.set_up_control_plane_scaling_profile(mc_0) + self.assertIsNone(dec_mc_0.control_plane_scaling_profile) + + # H4 specified - profile should be set + dec_1 = AKSPreviewManagedClusterCreateDecorator( + self.cmd, + self.client, + { + "control_plane_scaling_size": "H4", + }, + CUSTOM_MGMT_AKS_PREVIEW, + ) + mc_1 = self.models.ManagedCluster(location="test_location") + dec_1.context.attach_mc(mc_1) + dec_mc_1 = dec_1.set_up_control_plane_scaling_profile(mc_1) + from azext_aks_preview.vendored_sdks.azure_mgmt_preview_aks.models import ( + ManagedClusterControlPlaneScalingProfile, + ) + ground_truth_mc_1 = self.models.ManagedCluster( + location="test_location", + control_plane_scaling_profile=ManagedClusterControlPlaneScalingProfile( + scaling_size="H4", + ), + ) + self.assertEqual(dec_mc_1, ground_truth_mc_1) + + # H8 specified - profile should be set + dec_2 = AKSPreviewManagedClusterCreateDecorator( + self.cmd, + self.client, + { + "control_plane_scaling_size": "H8", + }, + CUSTOM_MGMT_AKS_PREVIEW, + ) + mc_2 = self.models.ManagedCluster(location="test_location") + dec_2.context.attach_mc(mc_2) + dec_mc_2 = dec_2.set_up_control_plane_scaling_profile(mc_2) + self.assertEqual(dec_mc_2.control_plane_scaling_profile.scaling_size, "H8") + class AKSPreviewManagedClusterUpdateDecoratorTestCase(unittest.TestCase): def setUp(self): @@ -13795,5 +13899,55 @@ def test_update_agentpool_profile_with_empty_agent_pool_profiles(self): with self.assertRaises(UnknownError): dec_4.update_agentpool_profile(mc_4) + def test_update_control_plane_scaling_profile(self): + from azext_aks_preview.vendored_sdks.azure_mgmt_preview_aks.models import ( + ManagedClusterControlPlaneScalingProfile, + ) + + # Not specified case - profile should remain None + dec_0 = AKSPreviewManagedClusterUpdateDecorator( + self.cmd, + self.client, + {}, + CUSTOM_MGMT_AKS_PREVIEW, + ) + mc_0 = self.models.ManagedCluster(location="test_location") + dec_0.context.attach_mc(mc_0) + dec_mc_0 = dec_0.update_control_plane_scaling_profile(mc_0) + self.assertIsNone(dec_mc_0.control_plane_scaling_profile) + + # Specified with no existing profile - should create profile + dec_1 = AKSPreviewManagedClusterUpdateDecorator( + self.cmd, + self.client, + { + "control_plane_scaling_size": "H4", + }, + CUSTOM_MGMT_AKS_PREVIEW, + ) + mc_1 = self.models.ManagedCluster(location="test_location") + dec_1.context.attach_mc(mc_1) + dec_mc_1 = dec_1.update_control_plane_scaling_profile(mc_1) + self.assertEqual(dec_mc_1.control_plane_scaling_profile.scaling_size, "H4") + + # Specified with existing profile - should update profile + dec_2 = AKSPreviewManagedClusterUpdateDecorator( + self.cmd, + self.client, + { + "control_plane_scaling_size": "H8", + }, + CUSTOM_MGMT_AKS_PREVIEW, + ) + mc_2 = self.models.ManagedCluster( + location="test_location", + control_plane_scaling_profile=ManagedClusterControlPlaneScalingProfile( + scaling_size="H4", + ), + ) + dec_2.context.attach_mc(mc_2) + dec_mc_2 = dec_2.update_control_plane_scaling_profile(mc_2) + self.assertEqual(dec_mc_2.control_plane_scaling_profile.scaling_size, "H8") + if __name__ == "__main__": unittest.main() diff --git a/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/__init__.py b/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/__init__.py index 30bba0c7944..d2ceb325f22 100644 --- a/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/__init__.py +++ b/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/__init__.py @@ -130,6 +130,7 @@ ManagedClusterAzureMonitorProfileKubeStateMetrics, ManagedClusterAzureMonitorProfileMetrics, ManagedClusterBootstrapProfile, + ManagedClusterControlPlaneScalingProfile, ManagedClusterCostAnalysis, ManagedClusterHTTPProxyConfig, ManagedClusterHostedSystemProfile, @@ -469,6 +470,7 @@ "ManagedClusterAzureMonitorProfileKubeStateMetrics", "ManagedClusterAzureMonitorProfileMetrics", "ManagedClusterBootstrapProfile", + "ManagedClusterControlPlaneScalingProfile", "ManagedClusterCostAnalysis", "ManagedClusterHTTPProxyConfig", "ManagedClusterHostedSystemProfile", diff --git a/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/_models_py3.py b/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/_models_py3.py index b9db088be41..2de8aff3407 100644 --- a/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/_models_py3.py +++ b/src/aks-preview/azext_aks_preview/vendored_sdks/azure_mgmt_preview_aks/models/_models_py3.py @@ -5583,6 +5583,9 @@ class ManagedCluster(TrackedResource): :ivar node_provisioning_profile: Node provisioning settings that apply to the whole cluster. :vartype node_provisioning_profile: ~azure.mgmt.containerservice.models.ManagedClusterNodeProvisioningProfile + :ivar control_plane_scaling_profile: Control plane scaling profile for the managed cluster. + :vartype control_plane_scaling_profile: + ~azure.mgmt.containerservice.models.ManagedClusterControlPlaneScalingProfile :ivar bootstrap_profile: Profile of the cluster bootstrap configuration. :vartype bootstrap_profile: ~azure.mgmt.containerservice.models.ManagedClusterBootstrapProfile :ivar scheduler_profile: Profile of the pod scheduler configuration. @@ -5690,6 +5693,10 @@ class ManagedCluster(TrackedResource): "key": "properties.nodeProvisioningProfile", "type": "ManagedClusterNodeProvisioningProfile", }, + "control_plane_scaling_profile": { + "key": "properties.controlPlaneScalingProfile", + "type": "ManagedClusterControlPlaneScalingProfile", + }, "bootstrap_profile": {"key": "properties.bootstrapProfile", "type": "ManagedClusterBootstrapProfile"}, "scheduler_profile": {"key": "properties.schedulerProfile", "type": "SchedulerProfile"}, "hosted_system_profile": {"key": "properties.hostedSystemProfile", "type": "ManagedClusterHostedSystemProfile"}, @@ -5742,6 +5749,7 @@ def __init__( # pylint: disable=too-many-locals metrics_profile: Optional["_models.ManagedClusterMetricsProfile"] = None, ai_toolchain_operator_profile: Optional["_models.ManagedClusterAIToolchainOperatorProfile"] = None, node_provisioning_profile: Optional["_models.ManagedClusterNodeProvisioningProfile"] = None, + control_plane_scaling_profile: Optional["_models.ManagedClusterControlPlaneScalingProfile"] = None, bootstrap_profile: Optional["_models.ManagedClusterBootstrapProfile"] = None, scheduler_profile: Optional["_models.SchedulerProfile"] = None, hosted_system_profile: Optional["_models.ManagedClusterHostedSystemProfile"] = None, @@ -5878,6 +5886,10 @@ def __init__( # pylint: disable=too-many-locals :keyword node_provisioning_profile: Node provisioning settings that apply to the whole cluster. :paramtype node_provisioning_profile: ~azure.mgmt.containerservice.models.ManagedClusterNodeProvisioningProfile + :keyword control_plane_scaling_profile: Control plane scaling profile for the managed + cluster. + :paramtype control_plane_scaling_profile: + ~azure.mgmt.containerservice.models.ManagedClusterControlPlaneScalingProfile :keyword bootstrap_profile: Profile of the cluster bootstrap configuration. :paramtype bootstrap_profile: ~azure.mgmt.containerservice.models.ManagedClusterBootstrapProfile @@ -5941,6 +5953,7 @@ def __init__( # pylint: disable=too-many-locals self.metrics_profile = metrics_profile self.ai_toolchain_operator_profile = ai_toolchain_operator_profile self.node_provisioning_profile = node_provisioning_profile + self.control_plane_scaling_profile = control_plane_scaling_profile self.bootstrap_profile = bootstrap_profile self.scheduler_profile = scheduler_profile self.hosted_system_profile = hosted_system_profile @@ -7474,6 +7487,31 @@ def __init__(self, *, enabled: Optional[bool] = None, **kwargs: Any) -> None: self.enabled = enabled +class ManagedClusterControlPlaneScalingProfile(_serialization.Model): + """Control plane scaling profile for a managed cluster. Provides scaled and performance-guaranteed + control plane capacity. + + :ivar scaling_size: The scaling size for the control plane. Determines the level of guaranteed + API server throughput, etcd capacity, and pod scheduling rates. Known values are: "H2", "H4", + and "H8". + :vartype scaling_size: str + """ + + _attribute_map = { + "scaling_size": {"key": "scalingSize", "type": "str"}, + } + + def __init__(self, *, scaling_size: Optional[str] = None, **kwargs: Any) -> None: + """ + :keyword scaling_size: The scaling size for the control plane. Determines the level of + guaranteed API server throughput, etcd capacity, and pod scheduling rates. Known values are: + "H2", "H4", and "H8". + :paramtype scaling_size: str + """ + super().__init__(**kwargs) + self.scaling_size = scaling_size + + class ManagedClusterAPIServerAccessProfile(_serialization.Model): """Access profile for managed cluster API server. From 142c9c9b41fce706d10b851fc9daf5b673db4ef7 Mon Sep 17 00:00:00 2001 From: nethbtju Date: Wed, 11 Mar 2026 10:37:16 +1000 Subject: [PATCH 2/3] Bump VERSION to 19.0.0b25 and update HISTORY.rst for control plane scaling profile --- src/aks-preview/HISTORY.rst | 5 +++++ src/aks-preview/setup.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/aks-preview/HISTORY.rst b/src/aks-preview/HISTORY.rst index a53baf9a877..69dd889725b 100644 --- a/src/aks-preview/HISTORY.rst +++ b/src/aks-preview/HISTORY.rst @@ -12,6 +12,11 @@ To release a new version, please select a new version number (usually plus 1 to Pending +++++++ +19.0.0b25 ++++++++ +* Vendor new SDK and bump API version to 2026-01-02-preview. +* `az aks create/update`: Add `--control-plane-scaling-size` parameter to configure control plane scaling profile with available sizes 'H2', 'H4', and 'H8'. + 19.0.0b23 +++++++ * `az aks update`: Fix `--enable-secret-rotation`, `--disable-secret-rotation`, and `--rotation-poll-interval` flags being silently ignored when updating Azure Key Vault Secrets Provider addon configuration. diff --git a/src/aks-preview/setup.py b/src/aks-preview/setup.py index 1e0fbca9d4c..541174f9afb 100644 --- a/src/aks-preview/setup.py +++ b/src/aks-preview/setup.py @@ -9,7 +9,7 @@ from setuptools import find_packages, setup -VERSION = "19.0.0b23" +VERSION = "19.0.0b25" CLASSIFIERS = [ "Development Status :: 4 - Beta", From 58dfcd833d092d2777394e118963a9592524cbd5 Mon Sep 17 00:00:00 2001 From: nethbtju Date: Wed, 11 Mar 2026 11:49:09 +1000 Subject: [PATCH 3/3] Add --cp-scaling-size short alias to fix linter option_length_too_long --- src/aks-preview/azext_aks_preview/_help.py | 4 ++-- src/aks-preview/azext_aks_preview/_params.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/aks-preview/azext_aks_preview/_help.py b/src/aks-preview/azext_aks_preview/_help.py index 782b871cb4b..da1675689c9 100644 --- a/src/aks-preview/azext_aks_preview/_help.py +++ b/src/aks-preview/azext_aks_preview/_help.py @@ -702,7 +702,7 @@ - name: --enable-hosted-system type: bool short-summary: Create a cluster with fully hosted system components. This applies only when creating a new automatic cluster. - - name: --control-plane-scaling-size + - name: --control-plane-scaling-size --cp-scaling-size type: string short-summary: (PREVIEW) The control plane scaling size for the cluster. long-summary: | @@ -1440,7 +1440,7 @@ - name: --disable-application-load-balancer type: bool short-summary: Disable Application Load Balancer (Application Gateway for Containers) addon. - - name: --control-plane-scaling-size + - name: --control-plane-scaling-size --cp-scaling-size type: string short-summary: (PREVIEW) The control plane scaling size for the cluster. long-summary: | diff --git a/src/aks-preview/azext_aks_preview/_params.py b/src/aks-preview/azext_aks_preview/_params.py index b03e4749618..0caf4fab61b 100644 --- a/src/aks-preview/azext_aks_preview/_params.py +++ b/src/aks-preview/azext_aks_preview/_params.py @@ -1203,6 +1203,7 @@ def load_arguments(self, _): c.argument("enable_hosted_system", action="store_true", is_preview=True) c.argument( "control_plane_scaling_size", + options_list=["--control-plane-scaling-size", "--cp-scaling-size"], arg_type=get_enum_type(["H2", "H4", "H8"]), is_preview=True, help="The control plane scaling size. Provides scaled and performance-guaranteed control plane capacity. " @@ -1788,6 +1789,7 @@ def load_arguments(self, _): ) c.argument( "control_plane_scaling_size", + options_list=["--control-plane-scaling-size", "--cp-scaling-size"], arg_type=get_enum_type(["H2", "H4", "H8"]), is_preview=True, help="The control plane scaling size. Provides scaled and performance-guaranteed control plane capacity. "