Skip to content

Commit 352e030

Browse files
authored
[dataprotection] Add support for AKS backup configuration modification (#9452)
* [Release] Add support for AKS backup configuration modification * [Release] Update version to 1.8.0 and nit fixes * azdev style fixes * Modify AKS backup configuration parameter * Fix typos and improve error messages for AKS backup configuration handling * Refactor AKS backup configuration initialization * Update AKS backup configuration argument options * Update AKS backup instance configuration in tests
1 parent ba8b732 commit 352e030

File tree

8 files changed

+441
-6
lines changed

8 files changed

+441
-6
lines changed

src/dataprotection/HISTORY.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
33
Release History
44
===============
5+
1.8.0
6+
+++++
7+
* `az dataprotection backup-instance update`: New parameter: `--backup-configuration` to update AKS datasource parameters.
8+
* Fix in `helpers.py` to correctly prepare/normalize AKS backup-configuration payloads passed via the CLI.
59

610
1.7.1
711
+++++

src/dataprotection/azext_dataprotection/manual/_help.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
examples:
3232
- name: Update backed up containers for a vaulted blob backup instance
3333
text: az dataprotection backup-instance update --backup-instance-name MyDisk1 --vaulted-blob-container-list {backup_configuration} -g MyResourceGroup --vault-name MyVault
34+
- name: Update backed up namespaces for an aks backup instance
35+
text: az dataprotection backup-instance update --backup-instance-name MyAKSCluster1 --aks-backup-configuration {aks_backup_configuration} -g MyResourceGroup --vault-name MyVault
3436
"""
3537

3638
helps['dataprotection backup-instance update-policy'] = """

src/dataprotection/azext_dataprotection/manual/_params.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ def load_arguments(self, _):
134134
c.argument('vaulted_blob_container_list', type=validate_file_or_dict, options_list=['--vaulted-blob-container-list', '--container-blob-list'],
135135
help="Enter the container list to modify a vaulted blob backup. The output for "
136136
"'az dataprotection backup-instance initialize-backupconfig' needs to be provided as input")
137+
c.argument('aks_backup_configuration', type=validate_file_or_dict, options_list=['--aks-backup-configuration', '--aks-config'],
138+
help="Enter the AKS backup configuration to modify AKS backup datasource parameters. "
139+
"The output for 'az dataprotection backup-instance initialize-backupconfig --datasource-type AzureKubernetesService' needs to be provided as input.")
137140
c.argument('use_system_assigned_identity', options_list=['--system-assigned', '--use-system-identity', '--use-system-assigned-identity'], arg_type=get_three_state_flag(), help="Use system assigned identity")
138141
c.argument('user_assigned_identity_arm_url', options_list=['--user-assigned', '--user-assigned-identity-arm-url', '--uami'], type=str, help="ARM ID of the User Assigned Managed Identity")
139142

src/dataprotection/azext_dataprotection/manual/custom.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# pylint: disable=no-else-continue
1515
# pylint: disable=no-else-raise
1616
import time
17+
import json
1718
from azure.cli.core.azclierror import (
1819
RequiredArgumentMissingError,
1920
InvalidArgumentValueError,
@@ -246,7 +247,7 @@ def dataprotection_backup_instance_validate_for_update(cmd, resource_group_name,
246247

247248

248249
def dataprotection_backup_instance_update(cmd, resource_group_name, vault_name, backup_instance_name,
249-
vaulted_blob_container_list=None, no_wait=False,
250+
vaulted_blob_container_list=None, aks_backup_configuration=None, no_wait=False,
250251
use_system_assigned_identity=None, user_assigned_identity_arm_url=None):
251252
from azext_dataprotection.aaz.latest.dataprotection.backup_instance import Show as BackupInstanceShow
252253
backup_instance = BackupInstanceShow(cli_ctx=cmd.cli_ctx)(command_args={
@@ -266,10 +267,36 @@ def dataprotection_backup_instance_update(cmd, resource_group_name, vault_name,
266267
identity_details = helper.get_identity_details(use_system_assigned_identity, user_assigned_identity_arm_url)
267268
backup_instance["properties"]["identityDetails"] = identity_details
268269

269-
# Policy changes - updating the vaulted blob container list for vaulted blob backups
270-
if vaulted_blob_container_list is not None:
271-
backup_instance['properties']['policyInfo']['policyParameters']['backupDatasourceParametersList'] = \
272-
[vaulted_blob_container_list,]
270+
# Policy changes
271+
# - Updating the vaulted blob container list for vaulted blob backups
272+
# - Updating the backup datasource parameters for AKS backups
273+
datasource_type = backup_instance["properties"]["dataSourceInfo"]["datasourceType"]
274+
275+
# If user provided any of the datasource parameter update inputs, handle according to datasource type
276+
if vaulted_blob_container_list is not None or aks_backup_configuration is not None:
277+
if datasource_type == "Microsoft.ContainerService/managedClusters":
278+
# AKS scenario (only --aks-backup-configuration is valid)
279+
if vaulted_blob_container_list is not None:
280+
raise InvalidArgumentValueError(f'Invalid argument --vaulted-blob-container-list for AKS datasource type: {datasource_type}. Use --aks-backup-configuration instead.')
281+
elif aks_backup_configuration is not None:
282+
# Allow passing JSON string or already-parsed object for AKS backup configuration
283+
if isinstance(aks_backup_configuration, str):
284+
try:
285+
aks_backup_configuration = json.loads(aks_backup_configuration)
286+
except json.JSONDecodeError:
287+
raise InvalidArgumentValueError("Provided --aks-backup-configuration is not valid JSON.")
288+
except Exception:
289+
raise InvalidArgumentValueError("Provided --aks-backup-configuration is not valid.")
290+
backup_instance['properties']['policyInfo']['policyParameters']['backupDatasourceParametersList'] = [aks_backup_configuration]
291+
elif datasource_type == "Microsoft.Storage/storageAccounts/blobServices":
292+
# Blob scenario (only --vaulted-blob-container-list is valid)
293+
if aks_backup_configuration is not None:
294+
raise InvalidArgumentValueError(f'Invalid argument --aks-backup-configuration for Blob datasource type: {datasource_type}. Use --vaulted-blob-container-list instead.')
295+
elif vaulted_blob_container_list is not None:
296+
backup_instance['properties']['policyInfo']['policyParameters']['backupDatasourceParametersList'] = [vaulted_blob_container_list]
297+
else:
298+
raise InvalidArgumentValueError(f"Setting backup datasource parameters is not supported for datasource type: {datasource_type}.\n "
299+
"Supported datasource types are Microsoft.ContainerService/managedClusters (AKS) and Microsoft.Storage/storageAccounts/blobServices (Blob).")
273300

274301
backup_instance = helper.convert_backup_instance_show_to_input(backup_instance)
275302

src/dataprotection/azext_dataprotection/manual/helpers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,16 @@ def convert_backup_instance_show_to_input(backup_instance):
997997
del backup_instance['properties']['protectionStatus']
998998
if 'provisioningState' in backup_instance['properties']:
999999
del backup_instance['properties']['provisioningState']
1000+
# Cleaning up resourceProperties if objectType is null to avoid schema validation error
1001+
for datasource_property in ['dataSourceInfo', 'dataSourceSetInfo']:
1002+
if datasource_property in backup_instance['properties']:
1003+
datasource_info = backup_instance['properties'][datasource_property]
1004+
if (isinstance(datasource_info, dict) and
1005+
'resourceProperties' in datasource_info and
1006+
isinstance(datasource_info['resourceProperties'], dict)):
1007+
if datasource_info['resourceProperties'].get('objectType') is None:
1008+
# Cleaning up resourceProperties when objectType is null to avoid schema validation error
1009+
del backup_instance['properties'][datasource_property]['resourceProperties']
10001010
return backup_instance
10011011

10021012

0 commit comments

Comments
 (0)