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
10 changes: 6 additions & 4 deletions src/azure-cli/azure/cli/command_modules/backup/_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

allowed_container_types = ['AzureIaasVM']
allowed_workload_types = ['VM', 'AzureFileShare', 'SAPHANA', 'MSSQL', 'SAPHanaDatabase', 'SQLDataBase']
allowed_azure_workload_types = ['MSSQL', 'SAPHANA', 'SAPASE']
allowed_backup_management_types = ['AzureIaasVM', 'AzureStorage', 'AzureWorkload']
allowed_protectable_item_type = ['SQLAG', 'SQLInstance', 'SQLDatabase', 'HANAInstance', 'SAPHanaDatabase', 'SAPHanaSystem']

Expand All @@ -48,6 +49,7 @@
rp_name_type = CLIArgumentType(help='Name of the recovery point.', options_list=['--rp-name', '-r'])
backup_management_type = CLIArgumentType(help=backup_management_type_help, arg_type=get_enum_type(allowed_backup_management_types), options_list=['--backup-management-type'])
workload_type = CLIArgumentType(help=workload_type_help, arg_type=get_enum_type(allowed_workload_types), options_list=['--workload-type'])
azure_workload_type = CLIArgumentType(help=workload_type_help, arg_type=get_enum_type(allowed_azure_workload_types), options_list=['--workload-type'])
restore_mode_type = CLIArgumentType(help=restore_mode_help, arg_type=get_enum_type(['OriginalLocation', 'AlternateLocation']), options_list=['--restore-mode'])
restore_mode_workload_type = CLIArgumentType(help=restore_mode_help, arg_type=get_enum_type(['AlternateWorkloadRestore', 'OriginalWorkloadRestore', 'RestoreAsFiles']), options_list=['--restore-mode'])
resolve_conflict_type = CLIArgumentType(help=resolve_conflict_help, arg_type=get_enum_type(['Overwrite', 'Skip']), options_list=['--resolve-conflict'])
Expand Down Expand Up @@ -96,12 +98,12 @@ def load_arguments(self, _):
with self.argument_context('backup container re-register') as c:
c.argument('backup_management_type', backup_management_type)
c.argument('container_name', container_name_type)
c.argument('workload_type', workload_type)
c.argument('workload_type', azure_workload_type)

with self.argument_context('backup container register') as c:
c.argument('backup_management_type', backup_management_type)
c.argument('resource_id', resource_id_type)
c.argument('workload_type', workload_type)
c.argument('workload_type', azure_workload_type)

# Item
with self.argument_context('backup item') as c:
Expand Down Expand Up @@ -226,7 +228,7 @@ def load_arguments(self, _):
# Protectable-item
with self.argument_context('backup protectable-item') as c:
c.argument('vault_name', vault_name_type)
c.argument('workload_type', workload_type)
c.argument('workload_type', azure_workload_type)
c.argument('container_name', container_name_type)

with self.argument_context('backup protectable-item show') as c:
Expand Down Expand Up @@ -280,7 +282,7 @@ def load_arguments(self, _):
c.argument('target_item_name', options_list=['--target-item-name'], help="""Specify the target item name for the restore operation.""")
c.argument('target_server_type', target_server_type)
c.argument('target_server_name', options_list=['--target-server-name'], help="""Specify the parent server name of the target item.""")
c.argument('workload_type', workload_type)
c.argument('workload_type', azure_workload_type)
c.argument('target_container_name', target_container_name_type)
c.argument('from_full_rp_name', from_full_rp_type)
c.argument('filepath', filepath_type)
Expand Down
31 changes: 21 additions & 10 deletions src/azure-cli/azure/cli/command_modules/backup/custom_wl.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
protectable_containers_cf, backup_protection_containers_cf, backup_protected_items_cf
import azure.cli.command_modules.backup.custom_help as cust_help
import azure.cli.command_modules.backup.custom_common as common
from azure.cli.core.azclierror import InvalidArgumentValueError


fabric_name = "Azure"
Expand All @@ -47,7 +48,9 @@

protectable_item_type_map = {'SQLDatabase': 'SQLDataBase',
'HANADataBase': 'SAPHanaDatabase',
'SAPHanaDatabase': 'SAPHanaDatabase',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This looks like a breaking change. If someone has used HANADataBase as protectable item type in their script, it will start failing. Better to keep the older one and add another entry to the map

'HANAInstance': 'SAPHanaSystem',
'SAPHanaSystem': 'SAPHanaSystem',
'SQLInstance': 'SQLInstance',
'SQLAG': 'SQLAG'}

Expand All @@ -69,7 +72,7 @@ def list_wl_policies(client, resource_group_name, vault_name, workload_type, bac
Backup Management Type needs to be specified for Azure Workload.
""")

workload_type = workload_type_map[workload_type]
workload_type = _check_map(workload_type, workload_type_map)

filter_string = cust_help.get_filter_string({
'backupManagementType': backup_management_type,
Expand All @@ -94,7 +97,7 @@ def register_wl_container(cmd, client, vault_name, resource_group_name, workload
Resource ID is not a valid one.
""")

workload_type = workload_type_map[workload_type]
workload_type = _check_map(workload_type, workload_type_map)
container_name = resource_id.split('/')[-1]

containers = list_protectable_containers(cmd, resource_group_name, vault_name)
Expand Down Expand Up @@ -122,7 +125,7 @@ def register_wl_container(cmd, client, vault_name, resource_group_name, workload

def re_register_wl_container(cmd, client, vault_name, resource_group_name, workload_type,
container_name, container_type):
workload_type = workload_type_map[workload_type]
workload_type = _check_map(workload_type, workload_type_map)

if not cust_help.is_native_name(container_name):
raise CLIError(
Expand Down Expand Up @@ -194,7 +197,7 @@ def resume_protection(cmd, client, resource_group_name, vault_name, item, policy


def initialize_protectable_items(client, resource_group_name, vault_name, container_name, workload_type):
workload_type = workload_type_map[workload_type]
workload_type = _check_map(workload_type, workload_type_map)

filter_string = cust_help.get_filter_string({
'backupManagementType': 'AzureWorkload',
Expand All @@ -204,7 +207,7 @@ def initialize_protectable_items(client, resource_group_name, vault_name, contai


def create_policy(client, resource_group_name, vault_name, policy_name, policy, workload_type):
workload_type = workload_type_map[workload_type]
workload_type = _check_map(workload_type, workload_type_map)
policy_object = cust_help.get_policy_from_json(client, policy)
policy_object.properties.backup_management_type = "AzureWorkload"
policy_object.properties.workload_type = workload_type
Expand Down Expand Up @@ -236,8 +239,7 @@ def set_policy(client, resource_group_name, vault_name, policy, policy_name, fix


def show_protectable_item(items, name, server_name, protectable_item_type):
if protectable_item_type_map.get(protectable_item_type) is not None:
protectable_item_type = protectable_item_type_map[protectable_item_type]
protectable_item_type = _check_map(protectable_item_type, protectable_item_type_map)
# Name filter
if cust_help.is_native_name(name):
filtered_items = [item for item in items if item.name.lower() == name.lower()]
Expand All @@ -255,8 +257,7 @@ def show_protectable_item(items, name, server_name, protectable_item_type):


def show_protectable_instance(items, server_name, protectable_item_type):
if protectable_item_type_map.get(protectable_item_type) is not None:
protectable_item_type = protectable_item_type_map[protectable_item_type]
protectable_item_type = _check_map(protectable_item_type, protectable_item_type_map)
# Server Name filter
filtered_items = [item for item in items if item.properties.server_name.lower() == server_name.lower()]

Expand All @@ -268,7 +269,7 @@ def show_protectable_instance(items, server_name, protectable_item_type):


def list_protectable_items(client, resource_group_name, vault_name, workload_type, container_uri=None):
workload_type = workload_type_map[workload_type]
workload_type = _check_map(workload_type, workload_type_map)

filter_string = cust_help.get_filter_string({
'backupManagementType': "AzureWorkload",
Expand Down Expand Up @@ -632,3 +633,13 @@ def _get_protected_item_instance(item_type):
if item_type.lower() == "saphanadatabase":
return AzureVmWorkloadSAPHanaDatabaseProtectedItem()
return AzureVmWorkloadSQLDatabaseProtectedItem()


def _check_map(item_type, item_type_map):
if item_type_map.get(item_type) is not None:
return item_type_map[item_type]
error_text = "{} is an invalid argument.".format(item_type)
recommendation_text = "{} are the allowed values.".format(str(list(item_type_map.keys())))
az_error = InvalidArgumentValueError(error_text)
az_error.set_recommendation(recommendation_text)
raise az_error