From 33073a8d79c380bcfb98bfb16b663695de5528ab Mon Sep 17 00:00:00 2001 From: weiliu2 Date: Fri, 1 May 2026 13:34:26 +1200 Subject: [PATCH 1/4] add osdisk full cache feature --- src/aks-preview/HISTORY.rst | 1 + src/aks-preview/azext_aks_preview/_help.py | 16 +++ src/aks-preview/azext_aks_preview/_params.py | 15 +++ .../azext_aks_preview/_validators.py | 19 +++- .../azext_aks_preview/agentpool_decorator.py | 23 ++++ src/aks-preview/azext_aks_preview/custom.py | 2 + .../tests/latest/test_agentpool_decorator.py | 106 +++++++++++++++++- .../tests/latest/test_aks_commands.py | 93 +++++++++++++++ 8 files changed, 272 insertions(+), 3 deletions(-) diff --git a/src/aks-preview/HISTORY.rst b/src/aks-preview/HISTORY.rst index 8c4a8a623d3..938c1731d04 100644 --- a/src/aks-preview/HISTORY.rst +++ b/src/aks-preview/HISTORY.rst @@ -26,6 +26,7 @@ Pending * `az aks nodepool update --crg-id`: Allow updating `--crg-id` to associate an existing Capacity Reservation Group with a nodepool not currently associated with one. * Update the minimum required cli core version to `2.76.0` (actually since `20.0.0b3`). * `az aks upgrade`: Add `--k8s-support-plan` and `--tier` flag support to allow cluster support plan and tier configuration during cluster upgrade. +* `az aks create` and `az aks nodepool add`: Add `--enable-os-disk-full-caching` (preview) to enable the full-cache ephemeral OS disk feature for a node pool. Requires AFEC registration `Microsoft.ContainerService/FullCachePreview`. Property is immutable after node pool creation. 20.0.0b6 ++++++ diff --git a/src/aks-preview/azext_aks_preview/_help.py b/src/aks-preview/azext_aks_preview/_help.py index 1e0d5cd50c8..0dc4e8c28b8 100644 --- a/src/aks-preview/azext_aks_preview/_help.py +++ b/src/aks-preview/azext_aks_preview/_help.py @@ -55,6 +55,14 @@ - name: --node-osdisk-type type: string short-summary: OS disk type to be used for machines in a given agent pool. Defaults to 'Ephemeral' when possible in conjunction with VM size and OS disk size. May not be changed for this pool after creation. ('Ephemeral' or 'Managed') + - name: --enable-os-disk-full-caching --enable-osdisk-fc + type: bool + short-summary: Enable the full-cache ephemeral OS disk feature for the default node pool. + long-summary: |- + When enabled, the entire operating system is cached on the local + ephemeral OS disk to mitigate E17 events caused by network failures. + Requires Ephemeral OS disk and a VM size with sufficient cache. + This property is immutable after the node pool is created. - name: --node-osdisk-diskencryptionset-id -d type: string short-summary: ResourceId of the disk encryption set to use for enabling encryption at rest on agent node os disk. @@ -2106,6 +2114,14 @@ - name: --node-osdisk-type type: string short-summary: OS disk type to be used for machines in a given agent pool. Defaults to 'Ephemeral' when possible in conjunction with VM size and OS disk size. May not be changed for this pool after creation. ('Ephemeral' or 'Managed') + - name: --enable-os-disk-full-caching --enable-osdisk-fc + type: bool + short-summary: Enable the full-cache ephemeral OS disk feature for the node pool. + long-summary: |- + When enabled, the entire operating system is cached on the local + ephemeral OS disk to mitigate E17 events caused by network failures. + Requires Ephemeral OS disk and a VM size with sufficient cache. + This property is immutable after the node pool is created. - name: --max-pods -m type: int short-summary: The maximum number of pods deployable to a node. diff --git a/src/aks-preview/azext_aks_preview/_params.py b/src/aks-preview/azext_aks_preview/_params.py index c92c6a36199..892c323592e 100644 --- a/src/aks-preview/azext_aks_preview/_params.py +++ b/src/aks-preview/azext_aks_preview/_params.py @@ -240,6 +240,7 @@ validate_force_upgrade_disable_and_enable_parameters, validate_azure_service_mesh_revision, validate_artifact_streaming, + validate_os_disk_full_caching, validate_custom_endpoints, validate_bootstrap_container_registry_resource_id, validate_gateway_prefix_size, @@ -899,6 +900,13 @@ def load_arguments(self, _): ) c.argument("node_osdisk_type", arg_type=get_enum_type(node_os_disk_types)) c.argument("node_osdisk_size", type=int) + c.argument( + "enable_os_disk_full_caching", + options_list=["--enable-os-disk-full-caching", "--enable-osdisk-fc"], + action="store_true", + validator=validate_os_disk_full_caching, + is_preview=True, + ) c.argument("max_pods", type=int, options_list=["--max-pods", "-m"]) c.argument("vm_set_type", validator=validate_vm_set_type) c.argument( @@ -2067,6 +2075,13 @@ def load_arguments(self, _): c.argument("node_taints", validator=validate_nodepool_taints) c.argument("node_osdisk_type", arg_type=get_enum_type(node_os_disk_types)) c.argument("node_osdisk_size", type=int) + c.argument( + "enable_os_disk_full_caching", + options_list=["--enable-os-disk-full-caching", "--enable-osdisk-fc"], + action="store_true", + validator=validate_os_disk_full_caching, + is_preview=True, + ) # upgrade strategy c.argument("upgrade_strategy", arg_type=get_enum_type(upgrade_strategies)) # rolling upgrade params diff --git a/src/aks-preview/azext_aks_preview/_validators.py b/src/aks-preview/azext_aks_preview/_validators.py index aa43b9052a2..f3e13c7a7d1 100644 --- a/src/aks-preview/azext_aks_preview/_validators.py +++ b/src/aks-preview/azext_aks_preview/_validators.py @@ -21,7 +21,8 @@ CONST_MANAGED_CLUSTER_SKU_TIER_STANDARD, CONST_NETWORK_POD_IP_ALLOCATION_MODE_DYNAMIC_INDIVIDUAL, CONST_NETWORK_POD_IP_ALLOCATION_MODE_STATIC_BLOCK, - CONST_NODEPOOL_MODE_GATEWAY, CONST_OS_SKU_AZURELINUX, + CONST_NODEPOOL_MODE_GATEWAY, CONST_OS_DISK_TYPE_MANAGED, + CONST_OS_SKU_AZURELINUX, CONST_OS_SKU_CBLMARINER, CONST_OS_SKU_MARINER) from azext_aks_preview._helpers import _fuzzy_match from azure.cli.core import keys @@ -953,6 +954,22 @@ def validate_asm_egress_name(namespace): ) +def validate_os_disk_full_caching(namespace): + """Reject --enable-os-disk-full-caching when OS disk type is explicitly Managed. + + Full-cache OS disk requires Ephemeral storage; failing fast at the CLI gives + a clearer error than waiting for an ARM round-trip. + """ + if not getattr(namespace, "enable_os_disk_full_caching", False): + return + node_osdisk_type = getattr(namespace, "node_osdisk_type", None) + if node_osdisk_type == CONST_OS_DISK_TYPE_MANAGED: + raise ArgumentUsageError( + "--enable-os-disk-full-caching requires Ephemeral OS disk; " + "it cannot be used with --node-osdisk-type Managed." + ) + + def validate_artifact_streaming(namespace): """Validates artifact streaming flags for mutual exclusivity and OS support.""" enable_artifact_streaming = getattr(namespace, "enable_artifact_streaming", False) diff --git a/src/aks-preview/azext_aks_preview/agentpool_decorator.py b/src/aks-preview/azext_aks_preview/agentpool_decorator.py index 6bd791e383f..0959a89ff6a 100644 --- a/src/aks-preview/azext_aks_preview/agentpool_decorator.py +++ b/src/aks-preview/azext_aks_preview/agentpool_decorator.py @@ -606,6 +606,19 @@ def get_enable_artifact_streaming(self) -> bool: ) return enable_artifact_streaming + def get_enable_os_disk_full_caching(self) -> bool: + """Obtain the value of enable_os_disk_full_caching. + :return: bool + """ + enable_os_disk_full_caching = self.raw_param.get("enable_os_disk_full_caching") + if self.decorator_mode == DecoratorMode.CREATE: + if ( + self.agentpool and + self.agentpool.enable_os_disk_full_caching is not None + ): + enable_os_disk_full_caching = self.agentpool.enable_os_disk_full_caching + return enable_os_disk_full_caching + def get_enable_managed_gpu(self) -> Union[bool, None]: """Obtain the value of enable_managed_gpu. :return: bool @@ -1327,6 +1340,14 @@ def set_up_artifact_streaming(self, agentpool: AgentPool) -> AgentPool: agentpool.artifact_streaming_profile.enabled = True return agentpool + def set_up_os_disk_full_caching(self, agentpool: AgentPool) -> AgentPool: + """Set up enable_os_disk_full_caching property for the AgentPool object.""" + self._ensure_agentpool(agentpool) + + if self.context.get_enable_os_disk_full_caching(): + agentpool.enable_os_disk_full_caching = True + return agentpool + def set_up_managed_gpu(self, agentpool: AgentPool) -> AgentPool: """Set up managed GPU property for the AgentPool object.""" self._ensure_agentpool(agentpool) @@ -1606,6 +1627,8 @@ def construct_agentpool_profile_preview(self) -> AgentPool: agentpool = self.set_up_init_taints(agentpool) # set up artifact streaming agentpool = self.set_up_artifact_streaming(agentpool) + # set up os disk full caching + agentpool = self.set_up_os_disk_full_caching(agentpool) # set up managed gpu agentpool = self.set_up_managed_gpu(agentpool) # set up skip_gpu_driver_install diff --git a/src/aks-preview/azext_aks_preview/custom.py b/src/aks-preview/azext_aks_preview/custom.py index e9ec61aecd3..a2b2134e398 100644 --- a/src/aks-preview/azext_aks_preview/custom.py +++ b/src/aks-preview/azext_aks_preview/custom.py @@ -1066,6 +1066,7 @@ def aks_create( nodepool_initialization_taints=None, node_osdisk_type=None, node_osdisk_size=0, + enable_os_disk_full_caching=False, vm_set_type=None, zones=None, ppg=None, @@ -1936,6 +1937,7 @@ def aks_agentpool_add( node_taints=None, node_osdisk_type=None, node_osdisk_size=0, + enable_os_disk_full_caching=False, max_surge=None, drain_timeout=None, node_soak_duration=None, diff --git a/src/aks-preview/azext_aks_preview/tests/latest/test_agentpool_decorator.py b/src/aks-preview/azext_aks_preview/tests/latest/test_agentpool_decorator.py index e51e73c6c20..529211235bd 100644 --- a/src/aks-preview/azext_aks_preview/tests/latest/test_agentpool_decorator.py +++ b/src/aks-preview/azext_aks_preview/tests/latest/test_agentpool_decorator.py @@ -258,6 +258,61 @@ def common_get_enable_artifact_streaming(self): ctx_2.attach_agentpool(agentpool_2) self.assertEqual(ctx_2.get_enable_artifact_streaming(), None) + def common_get_enable_os_disk_full_caching(self): + # default: store_true flag not provided -> raw is False + ctx_1 = AKSPreviewAgentPoolContext( + self.cmd, + AKSAgentPoolParamDict({"enable_os_disk_full_caching": False}), + self.models, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, + ) + self.assertEqual(ctx_1.get_enable_os_disk_full_caching(), False) + # CREATE: value on attached agentpool overrides default False + agentpool_1 = self.create_initialized_agentpool_instance( + enable_os_disk_full_caching=True + ) + ctx_1.attach_agentpool(agentpool_1) + self.assertEqual(ctx_1.get_enable_os_disk_full_caching(), True) + + # explicit True from raw param, no attached agentpool + ctx_2 = AKSPreviewAgentPoolContext( + self.cmd, + AKSAgentPoolParamDict({"enable_os_disk_full_caching": True}), + self.models, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, + ) + self.assertEqual(ctx_2.get_enable_os_disk_full_caching(), True) + + # priority: raw True is overridden by attached agentpool False in CREATE mode + ctx_3 = AKSPreviewAgentPoolContext( + self.cmd, + AKSAgentPoolParamDict({"enable_os_disk_full_caching": True}), + self.models, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, + ) + agentpool_3 = self.create_initialized_agentpool_instance( + enable_os_disk_full_caching=False + ) + ctx_3.attach_agentpool(agentpool_3) + self.assertEqual(ctx_3.get_enable_os_disk_full_caching(), False) + + # UPDATE mode gate: attached agentpool MUST NOT override raw_param + ctx_4 = AKSPreviewAgentPoolContext( + self.cmd, + AKSAgentPoolParamDict({"enable_os_disk_full_caching": False}), + self.models, + DecoratorMode.UPDATE, + self.agentpool_decorator_mode, + ) + agentpool_4 = self.create_initialized_agentpool_instance( + enable_os_disk_full_caching=True + ) + ctx_4.attach_agentpool(agentpool_4) + self.assertEqual(ctx_4.get_enable_os_disk_full_caching(), False) + def common_get_disable_artifact_streaming(self): # default ctx_1 = AKSPreviewAgentPoolContext( @@ -1155,6 +1210,9 @@ def test_get_workload_runtime(self): def test_get_enable_artifact_streaming(self): self.common_get_enable_artifact_streaming() + def test_get_enable_os_disk_full_caching(self): + self.common_get_enable_os_disk_full_caching() + def test_get_disable_artifact_streaming(self): self.common_get_disable_artifact_streaming() @@ -1257,7 +1315,10 @@ def test_get_workload_runtime(self): def test_get_enable_artifact_streaming(self): self.common_get_enable_artifact_streaming() - + + def test_get_enable_os_disk_full_caching(self): + self.common_get_enable_os_disk_full_caching() + def test_get_enable_managed_gpu(self): self.common_get_enable_managed_gpu() @@ -1583,6 +1644,41 @@ def common_set_up_artifact_streaming(self): ) self.assertEqual(dec_agentpool_1, ground_truth_agentpool_1) + def common_set_up_os_disk_full_caching(self): + # default: store_true flag not provided -> raw is False -> field stays unset + dec_default = AKSPreviewAgentPoolAddDecorator( + self.cmd, + self.client, + {"enable_os_disk_full_caching": False}, + self.resource_type, + self.agentpool_decorator_mode, + ) + with self.assertRaises(CLIInternalError): + dec_default.set_up_os_disk_full_caching(None) + agentpool_default = self.create_initialized_agentpool_instance(restore_defaults=False) + dec_default.context.attach_agentpool(agentpool_default) + dec_agentpool_default = dec_default.set_up_os_disk_full_caching(agentpool_default) + dec_agentpool_default = self._restore_defaults_in_agentpool(dec_agentpool_default) + ground_truth_default = self.create_initialized_agentpool_instance() + self.assertEqual(dec_agentpool_default, ground_truth_default) + + # explicit True -> field set to True + dec_true = AKSPreviewAgentPoolAddDecorator( + self.cmd, + self.client, + {"enable_os_disk_full_caching": True}, + self.resource_type, + self.agentpool_decorator_mode, + ) + agentpool_true = self.create_initialized_agentpool_instance(restore_defaults=False) + dec_true.context.attach_agentpool(agentpool_true) + dec_agentpool_true = dec_true.set_up_os_disk_full_caching(agentpool_true) + dec_agentpool_true = self._restore_defaults_in_agentpool(dec_agentpool_true) + ground_truth_true = self.create_initialized_agentpool_instance( + enable_os_disk_full_caching=True + ) + self.assertEqual(dec_agentpool_true, ground_truth_true) + def common_set_up_managed_gpu(self): dec_1 = AKSPreviewAgentPoolAddDecorator( self.cmd, @@ -2157,6 +2253,9 @@ def test_set_up_gpu_propertes(self): def test_set_up_artifact_streaming(self): self.common_set_up_artifact_streaming() + def test_set_up_os_disk_full_caching(self): + self.common_set_up_os_disk_full_caching() + def test_set_up_managed_gpu(self): self.common_set_up_managed_gpu() @@ -2305,7 +2404,10 @@ def test_set_up_gpu_propertes(self): def test_set_up_artifact_streaming(self): self.common_set_up_artifact_streaming() - + + def test_set_up_os_disk_full_caching(self): + self.common_set_up_os_disk_full_caching() + def test_set_up_managed_gpu(self): self.common_set_up_managed_gpu() 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 4e58beb3d5a..19a8cc5b549 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 @@ -7198,6 +7198,99 @@ def test_aks_nodepool_add_with_artifact_streaming( checks=[self.is_empty()], ) + # full-cache ephemeral OS disk feature is gated by AFEC FullCachePreview and + # an RP-side toggle, so the scenario can only be exercised in live mode. + @live_only() + @AllowLargeResponse() + @AKSCustomResourceGroupPreparer( + random_name_length=17, name_prefix="clitest", location="eastus" + ) + def test_aks_create_with_os_disk_full_caching( + 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 + aks_name = self.create_random_name("cliakstest", 16) + self.kwargs.update( + { + "resource_group": resource_group, + "name": aks_name, + "location": resource_group_location, + "ssh_key_value": self.generate_ssh_keys(), + } + ) + + # create with --enable-osdisk-full-caching on the default node pool + create_cmd = ( + "aks create --resource-group={resource_group} --name={name} " + "--ssh-key-value={ssh_key_value} " + "--node-vm-size Standard_D8ds_v5 " + "--node-osdisk-type Ephemeral " + "--enable-osdisk-full-caching " + "--aks-custom-headers=AKSHTTPCustomFeatures=Microsoft.ContainerService/FullCachePreview " + ) + + self.cmd( + create_cmd, + checks=[ + self.check("provisioningState", "Succeeded"), + self.check("agentPoolProfiles[0].enableOSDiskFullCaching", True), + ], + ) + + # delete + self.cmd( + "aks delete -g {resource_group} -n {name} --yes --no-wait", + checks=[self.is_empty()], + ) + + @live_only() + @AllowLargeResponse() + @AKSCustomResourceGroupPreparer( + random_name_length=17, name_prefix="clitest", location="eastus" + ) + def test_aks_nodepool_add_with_os_disk_full_caching( + self, resource_group, resource_group_location + ): + self.test_resources_count = 0 + aks_name = self.create_random_name("cliakstest", 16) + self.kwargs.update( + { + "resource_group": resource_group, + "name": aks_name, + "location": resource_group_location, + "nodepool2_name": "np2", + "ssh_key_value": self.generate_ssh_keys(), + } + ) + + # create base cluster + self.cmd( + "aks create --resource-group={resource_group} --name={name} " + "--ssh-key-value={ssh_key_value} ", + checks=[ + self.check("provisioningState", "Succeeded"), + ], + ) + + # add nodepool with --enable-osdisk-full-caching + self.cmd( + "aks nodepool add --resource-group={resource_group} --cluster-name={name} --name={nodepool2_name} " + "--node-vm-size Standard_D8ds_v5 --node-osdisk-type Ephemeral " + "--enable-osdisk-full-caching " + "--aks-custom-headers=AKSHTTPCustomFeatures=Microsoft.ContainerService/FullCachePreview", + checks=[ + self.check("provisioningState", "Succeeded"), + self.check("enableOSDiskFullCaching", True), + ], + ) + + # delete + self.cmd( + "aks delete -g {resource_group} -n {name} --yes --no-wait", + checks=[self.is_empty()], + ) + @live_only() @AllowLargeResponse() @AKSCustomResourceGroupPreparer( From 2902a1717d20e690d1ba30235349ce67f13be0e3 Mon Sep 17 00:00:00 2001 From: weiliu2 Date: Fri, 15 May 2026 16:19:02 +1200 Subject: [PATCH 2/4] remove to pending section --- src/aks-preview/HISTORY.rst | 2 +- src/aks-preview/azext_aks_preview/_help.py | 4 ++-- src/aks-preview/azext_aks_preview/_params.py | 4 ++-- src/aks-preview/azext_aks_preview/_validators.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/aks-preview/HISTORY.rst b/src/aks-preview/HISTORY.rst index 938c1731d04..5e2f258ba37 100644 --- a/src/aks-preview/HISTORY.rst +++ b/src/aks-preview/HISTORY.rst @@ -11,6 +11,7 @@ To release a new version, please select a new version number (usually plus 1 to Pending +++++++ +* `az aks create` and `az aks nodepool add`: Add `--enable-osdisk-full-caching` (preview) to enable the full-cache ephemeral OS disk feature for a node pool. Requires AFEC registration `Microsoft.ContainerService/FullCachePreview`. Property is immutable after node pool creation. 20.0.0b8 +++++++ @@ -26,7 +27,6 @@ Pending * `az aks nodepool update --crg-id`: Allow updating `--crg-id` to associate an existing Capacity Reservation Group with a nodepool not currently associated with one. * Update the minimum required cli core version to `2.76.0` (actually since `20.0.0b3`). * `az aks upgrade`: Add `--k8s-support-plan` and `--tier` flag support to allow cluster support plan and tier configuration during cluster upgrade. -* `az aks create` and `az aks nodepool add`: Add `--enable-os-disk-full-caching` (preview) to enable the full-cache ephemeral OS disk feature for a node pool. Requires AFEC registration `Microsoft.ContainerService/FullCachePreview`. Property is immutable after node pool creation. 20.0.0b6 ++++++ diff --git a/src/aks-preview/azext_aks_preview/_help.py b/src/aks-preview/azext_aks_preview/_help.py index 0dc4e8c28b8..1b99e5f83ab 100644 --- a/src/aks-preview/azext_aks_preview/_help.py +++ b/src/aks-preview/azext_aks_preview/_help.py @@ -55,7 +55,7 @@ - name: --node-osdisk-type type: string short-summary: OS disk type to be used for machines in a given agent pool. Defaults to 'Ephemeral' when possible in conjunction with VM size and OS disk size. May not be changed for this pool after creation. ('Ephemeral' or 'Managed') - - name: --enable-os-disk-full-caching --enable-osdisk-fc + - name: --enable-osdisk-full-caching --enable-osdisk-fc type: bool short-summary: Enable the full-cache ephemeral OS disk feature for the default node pool. long-summary: |- @@ -2114,7 +2114,7 @@ - name: --node-osdisk-type type: string short-summary: OS disk type to be used for machines in a given agent pool. Defaults to 'Ephemeral' when possible in conjunction with VM size and OS disk size. May not be changed for this pool after creation. ('Ephemeral' or 'Managed') - - name: --enable-os-disk-full-caching --enable-osdisk-fc + - name: --enable-osdisk-full-caching --enable-osdisk-fc type: bool short-summary: Enable the full-cache ephemeral OS disk feature for the node pool. long-summary: |- diff --git a/src/aks-preview/azext_aks_preview/_params.py b/src/aks-preview/azext_aks_preview/_params.py index 892c323592e..333bc2d1029 100644 --- a/src/aks-preview/azext_aks_preview/_params.py +++ b/src/aks-preview/azext_aks_preview/_params.py @@ -902,7 +902,7 @@ def load_arguments(self, _): c.argument("node_osdisk_size", type=int) c.argument( "enable_os_disk_full_caching", - options_list=["--enable-os-disk-full-caching", "--enable-osdisk-fc"], + options_list=["--enable-osdisk-full-caching", "--enable-osdisk-fc"], action="store_true", validator=validate_os_disk_full_caching, is_preview=True, @@ -2077,7 +2077,7 @@ def load_arguments(self, _): c.argument("node_osdisk_size", type=int) c.argument( "enable_os_disk_full_caching", - options_list=["--enable-os-disk-full-caching", "--enable-osdisk-fc"], + options_list=["--enable-osdisk-full-caching", "--enable-osdisk-fc"], action="store_true", validator=validate_os_disk_full_caching, is_preview=True, diff --git a/src/aks-preview/azext_aks_preview/_validators.py b/src/aks-preview/azext_aks_preview/_validators.py index f3e13c7a7d1..b29960e1f31 100644 --- a/src/aks-preview/azext_aks_preview/_validators.py +++ b/src/aks-preview/azext_aks_preview/_validators.py @@ -955,7 +955,7 @@ def validate_asm_egress_name(namespace): def validate_os_disk_full_caching(namespace): - """Reject --enable-os-disk-full-caching when OS disk type is explicitly Managed. + """Reject --enable-osdisk-full-caching when OS disk type is explicitly Managed. Full-cache OS disk requires Ephemeral storage; failing fast at the CLI gives a clearer error than waiting for an ARM round-trip. @@ -965,7 +965,7 @@ def validate_os_disk_full_caching(namespace): node_osdisk_type = getattr(namespace, "node_osdisk_type", None) if node_osdisk_type == CONST_OS_DISK_TYPE_MANAGED: raise ArgumentUsageError( - "--enable-os-disk-full-caching requires Ephemeral OS disk; " + "--enable-osdisk-full-caching requires Ephemeral OS disk; " "it cannot be used with --node-osdisk-type Managed." ) From b798f497fec09eaede7c497294400c02699fe615 Mon Sep 17 00:00:00 2001 From: weiliu2 Date: Fri, 15 May 2026 17:03:15 +1200 Subject: [PATCH 3/4] comments fix --- src/aks-preview/azext_aks_preview/_help.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aks-preview/azext_aks_preview/_help.py b/src/aks-preview/azext_aks_preview/_help.py index 1b99e5f83ab..753f127836f 100644 --- a/src/aks-preview/azext_aks_preview/_help.py +++ b/src/aks-preview/azext_aks_preview/_help.py @@ -55,7 +55,7 @@ - name: --node-osdisk-type type: string short-summary: OS disk type to be used for machines in a given agent pool. Defaults to 'Ephemeral' when possible in conjunction with VM size and OS disk size. May not be changed for this pool after creation. ('Ephemeral' or 'Managed') - - name: --enable-osdisk-full-caching --enable-osdisk-fc + - name: --enable-osdisk-fc --enable-osdisk-full-caching type: bool short-summary: Enable the full-cache ephemeral OS disk feature for the default node pool. long-summary: |- From b32961dbf636044af0942cbdf20cbeceee88f0d2 Mon Sep 17 00:00:00 2001 From: weiliu2 Date: Fri, 15 May 2026 17:30:23 +1200 Subject: [PATCH 4/4] comment fix --- src/aks-preview/azext_aks_preview/_help.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aks-preview/azext_aks_preview/_help.py b/src/aks-preview/azext_aks_preview/_help.py index 753f127836f..7e4ddc76095 100644 --- a/src/aks-preview/azext_aks_preview/_help.py +++ b/src/aks-preview/azext_aks_preview/_help.py @@ -2114,7 +2114,7 @@ - name: --node-osdisk-type type: string short-summary: OS disk type to be used for machines in a given agent pool. Defaults to 'Ephemeral' when possible in conjunction with VM size and OS disk size. May not be changed for this pool after creation. ('Ephemeral' or 'Managed') - - name: --enable-osdisk-full-caching --enable-osdisk-fc + - name: --enable-osdisk-fc --enable-osdisk-full-caching type: bool short-summary: Enable the full-cache ephemeral OS disk feature for the node pool. long-summary: |-