Skip to content

Commit ad1131d

Browse files
committed
[AKS] Set CMK property "enabled" to false and remove other CMK properties when "--disable-azure-keyvault-kms" is specified
1 parent 22c3785 commit ad1131d

5 files changed

Lines changed: 237 additions & 2 deletions

File tree

src/aks-preview/HISTORY.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ To release a new version, please select a new version number (usually plus 1 to
1212
Pending
1313
+++++++
1414

15+
19.0.0b7
16+
+++++++
17+
* `az aks update`: Set CMK property "enabled" to false and remove other CMK properties when "--disable-azure-keyvault-kms" is specified
18+
1519
19.0.0b6
1620
+++++++
1721
* Update the minimum required cli core version to `2.73.0` (actually since `18.0.0b35`).

src/aks-preview/azext_aks_preview/managed_cluster_decorator.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,38 @@ def get_enable_azure_keyvault_kms(self) -> bool:
13761376
"""
13771377
return self._get_enable_azure_keyvault_kms(enable_validation=True)
13781378

1379+
def _get_disable_azure_keyvault_kms(self, enable_validation: bool = False) -> bool:
1380+
"""Internal function to obtain the value of disable_azure_keyvault_kms.
1381+
1382+
This function supports the option of enable_validation. When enabled,
1383+
if both enable_azure_keyvault_kms and disable_azure_keyvault_kms are
1384+
specified, raise a MutuallyExclusiveArgumentError.
1385+
1386+
:return: bool
1387+
"""
1388+
# Read the original value passed by the command.
1389+
disable_azure_keyvault_kms = self.raw_param.get("disable_azure_keyvault_kms")
1390+
1391+
# This option is not supported in create mode, hence we do not read the property value from the `mc` object.
1392+
# This parameter does not need dynamic completion.
1393+
if enable_validation:
1394+
if disable_azure_keyvault_kms and self._get_enable_azure_keyvault_kms(enable_validation=False):
1395+
raise MutuallyExclusiveArgumentError(
1396+
"Cannot specify --enable-azure-keyvault-kms and --disable-azure-keyvault-kms at the same time."
1397+
)
1398+
1399+
return disable_azure_keyvault_kms
1400+
1401+
def get_disable_azure_keyvault_kms(self) -> bool:
1402+
"""Obtain the value of disable_azure_keyvault_kms.
1403+
1404+
This function will verify the parameter by default. If both enable_azure_keyvault_kms and
1405+
disable_azure_keyvault_kms are specified, raise a MutuallyExclusiveArgumentError.
1406+
1407+
:return: bool
1408+
"""
1409+
return self._get_disable_azure_keyvault_kms(enable_validation=True)
1410+
13791411
def _get_azure_keyvault_kms_key_id(self, enable_validation: bool = False) -> Union[str, None]:
13801412
"""Internal function to obtain the value of azure_keyvault_kms_key_id according to the context.
13811413
@@ -5999,6 +6031,13 @@ def update_kms_pmk_cmk(self, mc: ManagedCluster) -> ManagedCluster:
59996031
key_vault_resource_id=self.context.get_azure_keyvault_kms_key_vault_resource_id(),
60006032
)
60016033

6034+
if self.context.get_disable_azure_keyvault_kms():
6035+
if mc.security_profile is None:
6036+
mc.security_profile = self.models.ManagedClusterSecurityProfile()
6037+
mc.security_profile.azure_key_vault_kms = self.models.AzureKeyVaultKms()
6038+
# set enabled to False
6039+
mc.security_profile.azure_key_vault_kms.enabled = False
6040+
60026041
return mc
60036042

60046043
def update_storage_profile(self, mc: ManagedCluster) -> ManagedCluster:

src/aks-preview/azext_aks_preview/tests/latest/test_aks_commands.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12138,6 +12138,24 @@ def test_aks_create_with_kms_pmk_and_update_cmk(
1213812138
],
1213912139
)
1214012140

12141+
# disable CMK
12142+
update_cmd = (
12143+
"aks update --resource-group={resource_group} --name={name} "
12144+
"--disable-azure-keyvault-kms "
12145+
"-o json"
12146+
)
12147+
self.cmd(
12148+
update_cmd,
12149+
checks=[
12150+
self.check("provisioningState", "Succeeded"),
12151+
self.check("securityProfile.azureKeyVaultKms.enabled", False),
12152+
self.check(
12153+
"securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
12154+
"Enabled"
12155+
),
12156+
],
12157+
)
12158+
1214112159
# delete
1214212160
cmd = (
1214312161
"aks delete --resource-group={resource_group} --name={name} --yes --no-wait"
@@ -12156,7 +12174,7 @@ def test_aks_create_with_kms_pmk_and_update_cmk(
1215612174
name_prefix="clitest",
1215712175
location="eastus2euap",
1215812176
)
12159-
def test_aks_create_with_kms_pmk_and_cmk(
12177+
def test_aks_create_with_kms_pmk_and_cmk_and_disable_cmk(
1216012178
self, resource_group, resource_group_location
1216112179
):
1216212180
"""Test PMK-enabled cluster creation with versionless key ID"""
@@ -12267,6 +12285,24 @@ def test_aks_create_with_kms_pmk_and_cmk(
1226712285
],
1226812286
)
1226912287

12288+
# disable CMK
12289+
update_cmd = (
12290+
"aks update --resource-group={resource_group} --name={name} "
12291+
"--disable-azure-keyvault-kms "
12292+
"-o json"
12293+
)
12294+
self.cmd(
12295+
update_cmd,
12296+
checks=[
12297+
self.check("provisioningState", "Succeeded"),
12298+
self.check("securityProfile.azureKeyVaultKms.enabled", False),
12299+
self.check(
12300+
"securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
12301+
"Enabled"
12302+
),
12303+
],
12304+
)
12305+
1227012306
# delete
1227112307
cmd = (
1227212308
"aks delete --resource-group={resource_group} --name={name} --yes --no-wait"

src/aks-preview/azext_aks_preview/tests/latest/test_managed_cluster_decorator.py

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8562,6 +8562,162 @@ def test_update_kms_pmk_cmk(self):
85628562
)
85638563
self.assertEqual(dec_mc_5, ground_truth_mc_5)
85648564

8565+
# test enable Azure Key Vault KMS with key ID
8566+
dec_6 = AKSPreviewManagedClusterUpdateDecorator(
8567+
self.cmd,
8568+
self.client,
8569+
{
8570+
"enable_azure_keyvault_kms": True,
8571+
"azure_keyvault_kms_key_id": "https://test-keyvault.vault.azure.net/keys/test-key",
8572+
"azure_keyvault_kms_key_vault_resource_id": "/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8573+
},
8574+
CUSTOM_MGMT_AKS_PREVIEW,
8575+
)
8576+
mc_6 = self.models.ManagedCluster(location="test_location")
8577+
dec_6.context.attach_mc(mc_6)
8578+
dec_mc_6 = dec_6.update_kms_pmk_cmk(mc_6)
8579+
8580+
# expected security profile with Azure Key Vault KMS
8581+
ground_truth_azure_key_vault_kms_6 = self.models.AzureKeyVaultKms(
8582+
enabled=True,
8583+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8584+
key_vault_resource_id="/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8585+
)
8586+
ground_truth_security_profile_6 = self.models.ManagedClusterSecurityProfile(
8587+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_6,
8588+
)
8589+
ground_truth_mc_6 = self.models.ManagedCluster(
8590+
location="test_location",
8591+
security_profile=ground_truth_security_profile_6,
8592+
)
8593+
self.assertEqual(dec_mc_6, ground_truth_mc_6)
8594+
8595+
# test enable Azure Key Vault KMS on cluster with existing security profile
8596+
dec_7 = AKSPreviewManagedClusterUpdateDecorator(
8597+
self.cmd,
8598+
self.client,
8599+
{
8600+
"enable_azure_keyvault_kms": True,
8601+
"azure_keyvault_kms_key_id": "https://test-keyvault.vault.azure.net/keys/test-key",
8602+
},
8603+
CUSTOM_MGMT_AKS_PREVIEW,
8604+
)
8605+
existing_security_profile = self.models.ManagedClusterSecurityProfile()
8606+
mc_7 = self.models.ManagedCluster(
8607+
location="test_location",
8608+
security_profile=existing_security_profile,
8609+
)
8610+
dec_7.context.attach_mc(mc_7)
8611+
dec_mc_7 = dec_7.update_kms_pmk_cmk(mc_7)
8612+
8613+
# should add to existing security profile
8614+
ground_truth_azure_key_vault_kms_7 = self.models.AzureKeyVaultKms(
8615+
enabled=True,
8616+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8617+
key_vault_resource_id=None,
8618+
)
8619+
ground_truth_security_profile_7 = self.models.ManagedClusterSecurityProfile(
8620+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_7,
8621+
)
8622+
ground_truth_mc_7 = self.models.ManagedCluster(
8623+
location="test_location",
8624+
security_profile=ground_truth_security_profile_7,
8625+
)
8626+
self.assertEqual(dec_mc_7, ground_truth_mc_7)
8627+
8628+
# test disable Azure Key Vault KMS
8629+
dec_8 = AKSPreviewManagedClusterUpdateDecorator(
8630+
self.cmd,
8631+
self.client,
8632+
{
8633+
"disable_azure_keyvault_kms": True,
8634+
},
8635+
CUSTOM_MGMT_AKS_PREVIEW,
8636+
)
8637+
mc_8 = self.models.ManagedCluster(location="test_location")
8638+
dec_8.context.attach_mc(mc_8)
8639+
dec_mc_8 = dec_8.update_kms_pmk_cmk(mc_8)
8640+
8641+
# expected security profile with disabled Azure Key Vault KMS
8642+
ground_truth_azure_key_vault_kms_8 = self.models.AzureKeyVaultKms(enabled=False)
8643+
ground_truth_security_profile_8 = self.models.ManagedClusterSecurityProfile(
8644+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_8,
8645+
)
8646+
ground_truth_mc_8 = self.models.ManagedCluster(
8647+
location="test_location",
8648+
security_profile=ground_truth_security_profile_8,
8649+
)
8650+
self.assertEqual(dec_mc_8, ground_truth_mc_8)
8651+
8652+
# test disable Azure Key Vault KMS on cluster with existing security profile
8653+
dec_9 = AKSPreviewManagedClusterUpdateDecorator(
8654+
self.cmd,
8655+
self.client,
8656+
{
8657+
"disable_azure_keyvault_kms": True,
8658+
},
8659+
CUSTOM_MGMT_AKS_PREVIEW,
8660+
)
8661+
existing_azure_key_vault_kms = self.models.AzureKeyVaultKms(
8662+
enabled=True,
8663+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8664+
)
8665+
existing_security_profile = self.models.ManagedClusterSecurityProfile(
8666+
azure_key_vault_kms=existing_azure_key_vault_kms,
8667+
)
8668+
mc_9 = self.models.ManagedCluster(
8669+
location="test_location",
8670+
security_profile=existing_security_profile,
8671+
)
8672+
dec_9.context.attach_mc(mc_9)
8673+
dec_mc_9 = dec_9.update_kms_pmk_cmk(mc_9)
8674+
8675+
# should disable existing Azure Key Vault KMS
8676+
ground_truth_azure_key_vault_kms_9 = self.models.AzureKeyVaultKms(enabled=False)
8677+
ground_truth_security_profile_9 = self.models.ManagedClusterSecurityProfile(
8678+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_9,
8679+
)
8680+
ground_truth_mc_9 = self.models.ManagedCluster(
8681+
location="test_location",
8682+
security_profile=ground_truth_security_profile_9,
8683+
)
8684+
self.assertEqual(dec_mc_9, ground_truth_mc_9)
8685+
8686+
# test combined infrastructure encryption and Azure Key Vault KMS enable
8687+
dec_10 = AKSPreviewManagedClusterUpdateDecorator(
8688+
self.cmd,
8689+
self.client,
8690+
{
8691+
"kms_infrastructure_encryption": "Enabled",
8692+
"enable_azure_keyvault_kms": True,
8693+
"azure_keyvault_kms_key_id": "https://test-keyvault.vault.azure.net/keys/test-key",
8694+
"azure_keyvault_kms_key_vault_resource_id": "/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8695+
},
8696+
CUSTOM_MGMT_AKS_PREVIEW,
8697+
)
8698+
mc_10 = self.models.ManagedCluster(location="test_location")
8699+
dec_10.context.attach_mc(mc_10)
8700+
dec_mc_10 = dec_10.update_kms_pmk_cmk(mc_10)
8701+
8702+
# expected security profile with both infrastructure encryption and Azure Key Vault KMS
8703+
ground_truth_kube_resource_encryption_profile_10 = self.models.KubernetesResourceObjectEncryptionProfile(
8704+
infrastructure_encryption="Enabled"
8705+
)
8706+
ground_truth_azure_key_vault_kms_10 = self.models.AzureKeyVaultKms(
8707+
enabled=True,
8708+
key_id="https://test-keyvault.vault.azure.net/keys/test-key",
8709+
key_vault_resource_id="/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.KeyVault/vaults/test-keyvault",
8710+
)
8711+
ground_truth_security_profile_10 = self.models.ManagedClusterSecurityProfile(
8712+
kubernetes_resource_object_encryption_profile=ground_truth_kube_resource_encryption_profile_10,
8713+
azure_key_vault_kms=ground_truth_azure_key_vault_kms_10,
8714+
)
8715+
ground_truth_mc_10 = self.models.ManagedCluster(
8716+
location="test_location",
8717+
security_profile=ground_truth_security_profile_10,
8718+
)
8719+
self.assertEqual(dec_mc_10, ground_truth_mc_10)
8720+
85658721
def test_update_workload_auto_scaler_profile(self):
85668722
# Throws exception when incorrect mc object is passed.
85678723
dec_1 = AKSPreviewManagedClusterUpdateDecorator(

src/aks-preview/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from setuptools import find_packages, setup
1111

12-
VERSION = "19.0.0b6"
12+
VERSION = "19.0.0b7"
1313

1414
CLASSIFIERS = [
1515
"Development Status :: 4 - Beta",

0 commit comments

Comments
 (0)