Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/aks-preview/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,17 @@ If there is no rush to release a new version, please just add a description of t
To release a new version, please select a new version number (usually plus 1 to last patch version, X.Y.Z -> Major.Minor.Patch, more details in `\doc <https://semver.org/>`_), and then add a new section named as the new version number in this file, the content should include the new modifications and everything from the *Pending* section. Finally, update the `VERSION` variable in `setup.py` with this new version number.

Pending

19.0.0b10
+++++++
* Vendor new SDK and bump API version to 2025-08-02-preview.
* `az aks update`: Fix `--azure-keyvault-kms-key-vault-network-access` parameter not being correctly applied during cluster creation and updates.

19.0.0b9
+++++++
* `az aks create --enable-hosted-system`: no longer provision default system node pool when creating an automatic cluster with hosted system enabled.
* `az aks machine update`: Add support for updating machine tags, node taints and node labels.
* Fix `az aks bastion` subshell defaulting to cmd on Windows when invoked from PowerShell by implementing grandparent process detection to identify the actual user shell.
* Fix `az aks bastion` subshell defaulting to cmd on Windows when invoked from PowerShell by implementing grandparent process detection to identify the actual user shell.

19.0.0b8
+++++++
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3998,6 +3998,7 @@ def set_up_kms_pmk_and_cmk(self, mc: ManagedCluster) -> ManagedCluster:
mc.security_profile.azure_key_vault_kms = self.models.AzureKeyVaultKms(
enabled=True,
key_id=key_id,
key_vault_network_access=self.context.get_azure_keyvault_kms_key_vault_network_access(),
key_vault_resource_id=self.context.get_azure_keyvault_kms_key_vault_resource_id(),
)

Expand Down Expand Up @@ -6039,6 +6040,7 @@ def update_kms_pmk_cmk(self, mc: ManagedCluster) -> ManagedCluster:
mc.security_profile.azure_key_vault_kms = self.models.AzureKeyVaultKms(
enabled=True,
key_id=key_id,
key_vault_network_access=self.context.get_azure_keyvault_kms_key_vault_network_access(),
key_vault_resource_id=self.context.get_azure_keyvault_kms_key_vault_resource_id(),
)

Expand Down
170 changes: 170 additions & 0 deletions src/aks-preview/azext_aks_preview/tests/latest/test_aks_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -12230,6 +12230,7 @@ def test_aks_create_with_kms_pmk_and_update_cmk(
update_cmd = (
"aks update --resource-group={resource_group} --name={name} "
"--enable-azure-keyvault-kms --azure-keyvault-kms-key-id={key_id} "
"--azure-keyvault-kms-key-vault-network-access=Public "
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Live test passed!

"--azure-keyvault-kms-key-vault-resource-id={kv_resource_id} "
"-o json"
)
Expand Down Expand Up @@ -12373,6 +12374,175 @@ def test_aks_create_with_kms_pmk_and_cmk_and_disable_cmk(
"aks create --resource-group={resource_group} --name={name} "
"--assign-identity {identity_id} "
"--enable-azure-keyvault-kms --azure-keyvault-kms-key-id={key_id} "
"--azure-keyvault-kms-key-vault-network-access=Public "
"--azure-keyvault-kms-key-vault-resource-id={kv_resource_id} "
"--kms-infrastructure-encryption=Enabled "
"--kubernetes-version={k8s_version} "
"--ssh-key-value={ssh_key_value} "
"--aks-custom-headers AKSHTTPCustomFeatures=Microsoft.ContainerService/KMSPMKPreview "
"-o json"
)
self.cmd(
create_cmd,
checks=[
self.check("provisioningState", "Succeeded"),
self.check("securityProfile.azureKeyVaultKms.enabled", True),
self.check("securityProfile.azureKeyVaultKms.keyId", key_id_versionless),
self.check(
"securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
"Enabled"
),
],
)

# disable CMK
update_cmd = (
"aks update --resource-group={resource_group} --name={name} "
"--disable-azure-keyvault-kms "
"-o json"
)
self.cmd(
update_cmd,
checks=[
self.check("provisioningState", "Succeeded"),
self.check("securityProfile.azureKeyVaultKms.enabled", False),
self.check(
"securityProfile.kubernetesResourceObjectEncryptionProfile.infrastructureEncryption",
"Enabled"
),
],
)

# delete
cmd = (
"aks delete --resource-group={resource_group} --name={name} --yes --no-wait"
)
self.cmd(
cmd,
checks=[
self.is_empty(),
],
)

@live_only()
@AllowLargeResponse()
@AKSCustomResourceGroupPreparer(
random_name_length=17,
name_prefix="clitest",
location="eastus2euap",
)
def test_aks_create_with_kms_pmk_and_cmk_and_disable_cmk_private(
self, resource_group, resource_group_location
):
"""Test PMK-enabled cluster creation with versionless key ID"""
aks_name = self.create_random_name("cliakstest", 16)
kv_name = self.create_random_name("cliakstestkv", 16)
identity_name = self.create_random_name("cliakstestidentity", 24)
k8s_version = self._get_version_in_range(location=resource_group_location, min_version="1.33.0", max_version="1.34.0")
self.kwargs.update(
{
"resource_group": resource_group,
"name": aks_name,
"kv_name": kv_name,
"identity_name": identity_name,
"ssh_key_value": self.generate_ssh_keys(),
"k8s_version": k8s_version,
}
)

# create user-assigned identity
identity_id = self._get_user_assigned_identity(resource_group)
identity_object_id = self._get_principal_id_of_user_assigned_identity(identity_id)
assert identity_id is not None
assert identity_object_id is not None
self.kwargs.update(
{
"identity_id": identity_id,
"identity_object_id": identity_object_id,
}
)

# create key vault and key
create_keyvault = (
"keyvault create --resource-group={resource_group} --name={kv_name} --enable-rbac-authorization=false --no-self-perms -o json"
)
self.cmd(
create_keyvault,
checks=[self.check("properties.provisioningState", "Succeeded")],
)

# set access policy for test identity
test_identity_object_id = self._get_test_identity_object_id()
test_identity_access_policy = 'keyvault set-policy --resource-group={resource_group} --name={kv_name} ' \
'--key-permissions all --object-id ' + test_identity_object_id
self.cmd(test_identity_access_policy, checks=[
self.check('properties.provisioningState', 'Succeeded')
])

# create key and extract versionless key ID
create_key = "keyvault key create -n kms --vault-name {kv_name} -o json"
key = self.cmd(
create_key, checks=[self.check("attributes.enabled", True)]
).get_output_in_json()
key_id_versioned = key["key"]["kid"]
# Extract versionless key ID (remove version part)
# Format: https://{vault}.vault.azure.net/keys/{name}/{version}
# We want: https://{vault}.vault.azure.net/keys/{name}
key_id_parts = key_id_versioned.rsplit('/', 1)
key_id_versionless = key_id_parts[0]

assert key_id_versionless is not None
self.kwargs.update(
{
"key_id": key_id_versionless,
}
)

# Get key vault resource ID
kv_resource_id = self.cmd(
"keyvault show --resource-group={resource_group} --name={kv_name} --query id -o tsv"
).output.strip()
self.kwargs.update(
{
"kv_resource_id": kv_resource_id,
}
)

# assign access policy
set_policy = (
"keyvault set-policy --resource-group={resource_group} --name={kv_name} "
"--object-id {identity_object_id} --key-permissions encrypt decrypt -o json"
)
self.cmd(
set_policy, checks=[self.check("properties.provisioningState", "Succeeded")]
)

# update key vault to disable public network access and enable trusted service
disable_public_network_access = (
"keyvault update --resource-group={resource_group} --name={kv_name} "
"--public-network-access Disabled "
"--bypass AzureServices --default-action Deny "
"-o json"
)
self.cmd(
disable_public_network_access,
checks=[self.check("properties.provisioningState", "Succeeded")],
)

# add "Key Vault Reader" role to the identity
create_role_assignment = (
"role assignment create --role 21090545-7ca7-4776-b22c-e363652d74d2 "
'--assignee-object-id {identity_object_id} --assignee-principal-type "ServicePrincipal" '
"--scope {kv_resource_id}"
)
self.cmd(create_role_assignment)

# create cluster with PMK enabled and versionless key ID
create_cmd = (
"aks create --resource-group={resource_group} --name={name} "
"--assign-identity {identity_id} "
"--enable-azure-keyvault-kms --azure-keyvault-kms-key-id={key_id} "
"--azure-keyvault-kms-key-vault-network-access=Private "
"--azure-keyvault-kms-key-vault-resource-id={kv_resource_id} "
"--kms-infrastructure-encryption=Enabled "
"--kubernetes-version={k8s_version} "
Expand Down
Loading
Loading