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
4 changes: 4 additions & 0 deletions src/dataprotection/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

Release History
===============
1.8.0
+++++
* `az dataprotection backup-instance update`: New parameter: `--backup-configuration` to update AKS datasource parameters.
* Fix in `helpers.py` to correctly prepare/normalize AKS backup-configuration payloads passed via the CLI.

1.7.1
+++++
Expand Down
2 changes: 2 additions & 0 deletions src/dataprotection/azext_dataprotection/manual/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
examples:
- name: Update backed up containers for a vaulted blob backup instance
text: az dataprotection backup-instance update --backup-instance-name MyDisk1 --vaulted-blob-container-list {backup_configuration} -g MyResourceGroup --vault-name MyVault
- name: Update backed up namespaces for an aks backup instance
text: az dataprotection backup-instance update --backup-instance-name MyAKSCluster1 --aks-backup-configuration {aks_backup_configuration} -g MyResourceGroup --vault-name MyVault
"""

helps['dataprotection backup-instance update-policy'] = """
Expand Down
3 changes: 3 additions & 0 deletions src/dataprotection/azext_dataprotection/manual/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ def load_arguments(self, _):
c.argument('vaulted_blob_container_list', type=validate_file_or_dict, options_list=['--vaulted-blob-container-list', '--container-blob-list'],
help="Enter the container list to modify a vaulted blob backup. The output for "
"'az dataprotection backup-instance initialize-backupconfig' needs to be provided as input")
c.argument('aks_backup_configuration', type=validate_file_or_dict, options_list=['--aks-backup-configuration', '--aks-config'],
help="Enter the AKS backup configuration to modify AKS backup datasource parameters. "
"The output for 'az dataprotection backup-instance initialize-backupconfig --datasource-type AzureKubernetesService' needs to be provided as input.")
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")
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")

Expand Down
37 changes: 32 additions & 5 deletions src/dataprotection/azext_dataprotection/manual/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
# pylint: disable=no-else-continue
# pylint: disable=no-else-raise
import time
import json
from azure.cli.core.azclierror import (
RequiredArgumentMissingError,
InvalidArgumentValueError,
Expand Down Expand Up @@ -246,7 +247,7 @@ def dataprotection_backup_instance_validate_for_update(cmd, resource_group_name,


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

# Policy changes - updating the vaulted blob container list for vaulted blob backups
if vaulted_blob_container_list is not None:
backup_instance['properties']['policyInfo']['policyParameters']['backupDatasourceParametersList'] = \
[vaulted_blob_container_list,]
# Policy changes
# - Updating the vaulted blob container list for vaulted blob backups
# - Updating the backup datasource parameters for AKS backups
datasource_type = backup_instance["properties"]["dataSourceInfo"]["datasourceType"]

# If user provided any of the datasource parameter update inputs, handle according to datasource type
if vaulted_blob_container_list is not None or aks_backup_configuration is not None:
if datasource_type == "Microsoft.ContainerService/managedClusters":
# AKS scenario (only --aks-backup-configuration is valid)
if vaulted_blob_container_list is not None:
raise InvalidArgumentValueError(f'Invalid argument --vaulted-blob-container-list for AKS datasource type: {datasource_type}. Use --aks-backup-configuration instead.')
elif aks_backup_configuration is not None:
# Allow passing JSON string or already-parsed object for AKS backup configuration
if isinstance(aks_backup_configuration, str):
try:
aks_backup_configuration = json.loads(aks_backup_configuration)
except json.JSONDecodeError:
raise InvalidArgumentValueError("Provided --aks-backup-configuration is not valid JSON.")
except Exception:
Comment thread
priyansh17 marked this conversation as resolved.
raise InvalidArgumentValueError("Provided --aks-backup-configuration is not valid.")
backup_instance['properties']['policyInfo']['policyParameters']['backupDatasourceParametersList'] = [aks_backup_configuration]
elif datasource_type == "Microsoft.Storage/storageAccounts/blobServices":
# Blob scenario (only --vaulted-blob-container-list is valid)
if aks_backup_configuration is not None:
raise InvalidArgumentValueError(f'Invalid argument --aks-backup-configuration for Blob datasource type: {datasource_type}. Use --vaulted-blob-container-list instead.')
elif vaulted_blob_container_list is not None:
backup_instance['properties']['policyInfo']['policyParameters']['backupDatasourceParametersList'] = [vaulted_blob_container_list]
else:
raise InvalidArgumentValueError(f"Setting backup datasource parameters is not supported for datasource type: {datasource_type}.\n "
"Supported datasource types are Microsoft.ContainerService/managedClusters (AKS) and Microsoft.Storage/storageAccounts/blobServices (Blob).")

Comment thread
priyansh17 marked this conversation as resolved.
backup_instance = helper.convert_backup_instance_show_to_input(backup_instance)

Expand Down
10 changes: 10 additions & 0 deletions src/dataprotection/azext_dataprotection/manual/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,16 @@ def convert_backup_instance_show_to_input(backup_instance):
del backup_instance['properties']['protectionStatus']
if 'provisioningState' in backup_instance['properties']:
del backup_instance['properties']['provisioningState']
# Cleaning up resourceProperties if objectType is null to avoid schema validation error
for datasource_property in ['dataSourceInfo', 'dataSourceSetInfo']:
if datasource_property in backup_instance['properties']:
datasource_info = backup_instance['properties'][datasource_property]
if (isinstance(datasource_info, dict) and
'resourceProperties' in datasource_info and
isinstance(datasource_info['resourceProperties'], dict)):
if datasource_info['resourceProperties'].get('objectType') is None:
# Cleaning up resourceProperties when objectType is null to avoid schema validation error
del backup_instance['properties'][datasource_property]['resourceProperties']
Comment thread
priyansh17 marked this conversation as resolved.
return backup_instance


Expand Down
Loading
Loading