def update_policy_for_item(cmd, client, resource_group_name, vault_name, container_name, item_name, policy_name, container_type="AzureIaasVM", item_type="VM"): # Client factories backup_protected_items_client = backup_protected_items_cf(cmd.cli_ctx) # Get objects from JSON files item = show_item(cmd, backup_protected_items_client, resource_group_name, vault_name, container_name, item_name, container_type, item_type) policy = show_policy(protection_policies_cf(cmd.cli_ctx), resource_group_name, vault_name, policy_name) _validate_policy(policy) if item.properties.backup_management_type != policy.properties.backup_management_type: raise CLIError( """ The policy type should match with the workload being protected. Use the relevant get-default policy command and use it to update the policy for the workload. """) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) # Update policy request vm_item_properties = _get_vm_item_properties_from_vm_id(item.properties.virtual_machine_id) vm_item_properties.policy_id = policy.id vm_item_properties.source_resource_id = item.properties.source_resource_id vm_item = ProtectedItemResource(properties=vm_item_properties) # Update policy result = sdk_no_wait(True, client.create_or_update, vault_name, resource_group_name, fabric_name, container_uri, item_uri, vm_item) return _track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def disable_protection( cmd, client, resource_group_name, vault_name, container_name, item_name, # pylint: disable=unused-argument container_type="AzureIaasVM", item_type="VM", delete_backup_data=False, **kwargs): item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, container_type, item_type) _validate_item(item) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) # Trigger disable protection and wait for completion if delete_backup_data: result = sdk_no_wait(True, client.delete, vault_name, resource_group_name, fabric_name, container_uri, item_uri) return _track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name) vm_item = _get_disable_protection_request(item) result = sdk_no_wait(True, client.create_or_update, vault_name, resource_group_name, fabric_name, container_uri, item_uri, vm_item) return _track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def disable_protection(cmd, client, resource_group_name, vault_name, item_name, container_name, backup_management_type=None, workload_type=None, delete_backup_data=False, **kwargs): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise CLIError( "Multiple items found. Please give native names instead.") if item.properties.backup_management_type.lower() == "azureiaasvm": return custom.disable_protection(cmd, client, resource_group_name, vault_name, item, delete_backup_data, **kwargs) if item.properties.backup_management_type.lower() == "azurestorage": return custom_afs.disable_protection(cmd, client, resource_group_name, vault_name, item, delete_backup_data, **kwargs) return None
def list_recovery_points(cmd, client, resource_group_name, vault_name, container_name, item_name, backup_management_type=None, workload_type=None, start_date=None, end_date=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise CLIError( "Multiple items found. Please give native names instead.") if item.properties.backup_management_type.lower() == "azureiaasvm": return custom.list_recovery_points(client, resource_group_name, vault_name, item, start_date, end_date) if item.properties.backup_management_type.lower() == "azurestorage": return custom_afs.list_recovery_points(client, resource_group_name, vault_name, item, start_date, end_date) return None
def show_recovery_point(cmd, client, resource_group_name, vault_name, container_name, item_name, name, workload_type=None, backup_management_type=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise CLIError( "Multiple items found. Please give native names instead.") # Get container and item URIs container_uri = custom_help.get_protection_container_uri_from_id(item.id) item_uri = custom_help.get_protected_item_uri_from_id(item.id) return client.get(vault_name, resource_group_name, fabric_name, container_uri, item_uri, name)
def _get_associated_vm_item(container_uri, item_uri, resource_group, vault_name): container_name = container_uri.split(';')[-1] item_name = item_uri.split(';')[-1] filter_string = _get_filter_string({ 'backupManagementType': BackupManagementType.azure_iaas_vm.value, 'itemType': WorkloadType.vm.value }) items = backup_protected_items_cf(None).list( vault_name, resource_group, filter_string, custom_headers=_get_custom_headers()) paged_items = _get_list_from_paged_response(items) filtered_items = [ item for item in paged_items if container_name.lower() in item.properties.container_name.lower() and item.properties.friendly_name.lower() == item_name.lower() ] item = filtered_items[0] return item
def _force_delete_vault(cmd, vault_name, resource_group_name): logger.warning('Attemping to force delete vault: %s', vault_name) container_client = backup_protection_containers_cf(cmd.cli_ctx) backup_item_client = backup_protected_items_cf(cmd.cli_ctx) item_client = protected_items_cf(cmd.cli_ctx) vault_client = vaults_cf(cmd.cli_ctx) containers = _get_containers(container_client, 'AzureIaasVM', 'Registered', resource_group_name, vault_name) for container in containers: container_name = container.name.rsplit(';', 1)[1] items = list_items(cmd, backup_item_client, resource_group_name, vault_name, container_name) for item in items: item_name = item.name.rsplit(';', 1)[1] logger.warning("Deleting backup item '%s' in container '%s'", item_name, container_name) disable_protection(cmd, item_client, resource_group_name, vault_name, container_name, item_name, delete_backup_data=True) # now delete the vault vault_client.delete(resource_group_name, vault_name)
def list_recovery_points(cmd, client, resource_group_name, vault_name, container_name, item_name, container_type="AzureIaasVM", item_type="VM", start_date=None, end_date=None): item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, container_type, item_type) _validate_item(item) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) query_end_date, query_start_date = _get_query_dates(end_date, start_date) filter_string = _get_filter_string({ 'startDate': query_start_date, 'endDate': query_end_date }) # Get recovery points recovery_points = client.list(vault_name, resource_group_name, fabric_name, container_uri, item_uri, filter_string) paged_recovery_points = _get_list_from_paged_response(recovery_points) return paged_recovery_points
def resume_protection(cmd, client, resource_group_name, vault_name, container_name, item_name, policy_name, workload_type=None, backup_management_type=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise CLIError( "Multiple items found. Please give native names instead.") policy = show_policy(protection_policies_cf(cmd.cli_ctx), resource_group_name, vault_name, policy_name) custom_help.validate_policy(policy) if item.properties.backup_management_type.lower() == "azurestorage": return custom_afs.resume_protection(cmd, client, resource_group_name, vault_name, item, policy) if item.properties.backup_management_type.lower() == "azureworkload": return custom_wl.resume_protection(cmd, client, resource_group_name, vault_name, item, policy) return None
def move_recovery_points(cmd, resource_group_name, vault_name, container_name, item_name, rp_name, source_tier, destination_tier, backup_management_type=None, workload_type=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise ValidationError( "Multiple items found. Please give native names instead.") if item.properties.backup_management_type.lower() == "azureiaasvm": return custom.move_recovery_points(cmd, resource_group_name, vault_name, item, rp_name, source_tier, destination_tier) if item.properties.backup_management_type.lower() == "azureworkload": return custom_wl.move_wl_recovery_points(cmd, resource_group_name, vault_name, item, rp_name, source_tier, destination_tier) raise ArgumentUsageError( 'This command is not supported for --backup-management-type AzureStorage.' )
def backup_now(client, resource_group_name, vault_name, container_name, item_name, retain_until, container_type="AzureIaasVM", item_type="VM"): item = show_item(backup_protected_items_cf(None), resource_group_name, vault_name, container_name, item_name, container_type, item_type) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) trigger_backup_request = _get_backup_request(item.properties.workload_type, retain_until) # Trigger backup result = client.trigger(vault_name, resource_group_name, fabric_name, container_uri, item_uri, trigger_backup_request, raw=True, custom_headers=_get_custom_headers()) return _track_backup_job(result, vault_name, resource_group_name)
def restore_files_unmount_rp(cmd, client, resource_group_name, vault_name, container_name, item_name, rp_name): item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, "AzureIaasVM", "VM") _validate_item(item) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) recovery_point = recovery_points_cf(cmd.cli_ctx).get( vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name) if recovery_point.properties.is_instant_ilr_session_active: result = client.revoke(vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, raw=True) _track_backup_operation(cmd.cli_ctx, resource_group_name, result, vault_name)
def _force_delete_vault(cmd, vault_name, resource_group_name): logger.warning('Attemping to force delete vault: %s', vault_name) container_client = backup_protection_containers_cf(cmd.cli_ctx) backup_item_client = backup_protected_items_cf(cmd.cli_ctx) item_client = protected_items_cf(cmd.cli_ctx) vault_client = vaults_cf(cmd.cli_ctx) containers = _get_containers(container_client, 'AzureIaasVM', 'Registered', resource_group_name, vault_name) for container in containers: container_name = container.name.rsplit(';', 1)[1] items = list_items(cmd, backup_item_client, resource_group_name, vault_name, container_name) for item in items: item_name = item.name.rsplit(';', 1)[1] logger.warning("Deleting backup item '%s' in container '%s'", item_name, container_name) disable_protection(cmd, item_client, resource_group_name, vault_name, item, True) # now delete the vault try: vault_client.delete(resource_group_name, vault_name) except Exception: raise CLIError( "Vault cannot be deleted as there are existing resources within the vault" )
def restore_files_mount_rp(cmd, client, resource_group_name, vault_name, container_name, item_name, rp_name): item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, "AzureIaasVM", "VM") _validate_item(item) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) # file restore request _virtual_machine_id = item.properties.virtual_machine_id file_restore_request_properties = IaasVMILRRegistrationRequest(recovery_point_id=rp_name, virtual_machine_id=_virtual_machine_id) file_restore_request = ILRRequestResource(properties=file_restore_request_properties) recovery_point = recovery_points_cf(cmd.cli_ctx).get(vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name) if recovery_point.properties.is_instant_ilr_session_active: recovery_point.properties.renew_existing_registration = True result = sdk_no_wait(True, client.provision, vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, file_restore_request) client_scripts = _track_backup_ilr(cmd.cli_ctx, result, vault_name, resource_group_name) if client_scripts[0].os_type == os_windows: _run_client_script_for_windows(client_scripts) elif client_scripts[0].os_type == os_linux: _run_client_script_for_linux(client_scripts)
def restore_disks(cmd, client, resource_group_name, vault_name, container_name, item_name, rp_name, storage_account, restore_to_staging_storage_account=None): item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, "AzureIaasVM", "VM") _validate_item(item) recovery_point = show_recovery_point(cmd, recovery_points_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, rp_name, "AzureIaasVM", "VM") vault = vaults_cf(cmd.cli_ctx).get(resource_group_name, vault_name) vault_location = vault.location # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) # Original Storage Account Restore Logic use_original_storage_account = _should_use_original_storage_account( recovery_point, restore_to_staging_storage_account) if use_original_storage_account: logger.warning(""" The disks will be restored to their original storage accounts. The VM config file will be uploaded to given storage account. """) # Construct trigger restore request object sa_name, sa_rg = _get_resource_name_and_rg(resource_group_name, storage_account) _storage_account_id = _get_storage_account_id(cmd.cli_ctx, sa_name, sa_rg) _source_resource_id = item.properties.source_resource_id trigger_restore_properties = IaasVMRestoreRequest( create_new_cloud_service=True, recovery_point_id=rp_name, recovery_type='RestoreDisks', region=vault_location, storage_account_id=_storage_account_id, source_resource_id=_source_resource_id, original_storage_account_option=use_original_storage_account) trigger_restore_request = RestoreRequestResource( properties=trigger_restore_properties) # Trigger restore result = client.trigger(vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, trigger_restore_request, raw=True) return _track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def undelete_protection(cmd, client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise ValidationError( "Multiple items found. Please give native names instead.") if item.properties.backup_management_type.lower() == "azureiaasvm": return custom.undelete_protection(cmd, client, resource_group_name, vault_name, item) if item.properties.backup_management_type.lower() == "azureworkload": return custom_wl.undelete_protection(cmd, client, resource_group_name, vault_name, item) return None
def restore_files_unmount_rp(client, resource_group_name, vault_name, container_name, item_name, rp_name): item = show_item(backup_protected_items_cf(None), resource_group_name, vault_name, container_name, item_name, "AzureIaasVM", "VM") # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) recovery_point = recovery_points_cf(None).get( vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, custom_headers=_get_custom_headers()) if recovery_point.properties.is_instant_ilr_session_active: result = client.revoke(vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, raw=True, custom_headers=_get_custom_headers()) _track_backup_operation(resource_group_name, result, vault_name)
def backup_now(cmd, client, resource_group_name, vault_name, item_name, retain_until=None, container_name=None, backup_management_type=None, workload_type=None, backup_type=None, enable_compression=False): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise ValidationError( "Multiple items found. Please give native names instead.") if item.properties.backup_management_type.lower() == "azureiaasvm": return custom.backup_now(cmd, client, resource_group_name, vault_name, item, retain_until) if item.properties.backup_management_type.lower() == "azurestorage": return custom_afs.backup_now(cmd, client, resource_group_name, vault_name, item, retain_until) if item.properties.backup_management_type.lower() == "azureworkload": return custom_wl.backup_now(cmd, client, resource_group_name, vault_name, item, retain_until, backup_type, enable_compression) return None
def backup_now(cmd, client, resource_group_name, vault_name, container_name, item_name, retain_until, container_type="AzureIaasVM", item_type="VM"): item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, container_type, item_type) _validate_item(item) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) trigger_backup_request = _get_backup_request(item.properties.workload_type, retain_until) # Trigger backup result = sdk_no_wait(True, client.trigger, vault_name, resource_group_name, fabric_name, container_uri, item_uri, trigger_backup_request) return _track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def check_protection_enabled_for_vm(cmd, vm_id): vaults = list_vaults(vaults_cf(cmd.cli_ctx)) for vault in vaults: vault_rg = _get_resource_group_from_id(vault.id) items = list_items(cmd, backup_protected_items_cf(cmd.cli_ctx), vault_rg, vault.name) if any(vm_id.lower() == item.properties.virtual_machine_id.lower() for item in items): return vault.id return None
def show_recovery_point(cmd, client, resource_group_name, vault_name, container_name, item_name, name, workload_type=None, backup_management_type=None, use_secondary_region=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type, use_secondary_region) custom_help.validate_item(item) if isinstance(item, list): raise CLIError( "Multiple items found. Please give native names instead.") # Get container and item URIs container_uri = custom_help.get_protection_container_uri_from_id(item.id) item_uri = custom_help.get_protected_item_uri_from_id(item.id) container_type = custom_help.validate_and_extract_container_type( container_name, backup_management_type) if use_secondary_region: if container_type and container_type.lower() == "azurestorage": raise InvalidArgumentValueError(""" --use-secondary-region flag is not supported for --backup-management-type AzureStorage. Please either remove the flag or query for any other backup-management-type. """) client = recovery_points_crr_cf(cmd.cli_ctx) recovery_points = client.list(vault_name, resource_group_name, fabric_name, container_uri, item_uri, None) paged_rps = custom_help.get_list_from_paged_response(recovery_points) filtered_rps = [ rp for rp in paged_rps if rp.name.lower() == name.lower() ] recovery_point = custom_help.get_none_one_or_many(filtered_rps) if recovery_point is None: raise InvalidArgumentValueError( "The recovery point provided does not exist. Please provide valid RP." ) return recovery_point try: response = client.get(vault_name, resource_group_name, fabric_name, container_uri, item_uri, name) except Exception as ex: errorMessage = str(ex) raise InvalidArgumentValueError( "Specified recovery point can not be fetched - \n" + errorMessage) return response
def update_protection_for_vm(cmd, client, resource_group_name, vault_name, container_name, item_name, diskslist=None, disk_list_setting=None, exclude_all_data_disks=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, "AzureIaasVM", "VM") custom_help.validate_item(item) if isinstance(item, list): raise CLIError("Multiple items found. Please give native names instead.") return custom.update_protection_for_vm(cmd, client, resource_group_name, vault_name, item, diskslist, disk_list_setting, exclude_all_data_disks)
def show_recovery_point(cmd, client, resource_group_name, vault_name, container_name, item_name, name, # pylint: disable=redefined-builtin container_type="AzureIaasVM", item_type="VM"): item = show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, container_type, item_type) _validate_item(item) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) return client.get(vault_name, resource_group_name, fabric_name, container_uri, item_uri, name)
def update_policy_for_item(cmd, client, resource_group_name, vault_name, container_name, item_name, policy_name, workload_type=None, backup_management_type=None, tenant_id=None): items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise ValidationError( "Multiple items found. Please give native names instead.") policy = show_policy(protection_policies_cf(cmd.cli_ctx), resource_group_name, vault_name, policy_name) custom_help.validate_policy(policy) is_critical_operation = custom_help.has_resource_guard_mapping( cmd.cli_ctx, resource_group_name, vault_name, "updateProtection") if item.properties.backup_management_type.lower() == "azureiaasvm": return custom.update_policy_for_item(cmd, client, resource_group_name, vault_name, item, policy, tenant_id, is_critical_operation) if item.properties.backup_management_type.lower() == "azurestorage": return custom_afs.update_policy_for_item(cmd, client, resource_group_name, vault_name, item, policy, tenant_id, is_critical_operation) if item.properties.backup_management_type.lower() == "azureworkload": return custom_wl.update_policy_for_item(cmd, client, resource_group_name, vault_name, item, policy, tenant_id, is_critical_operation) return None
def restore_azurefiles(cmd, client, resource_group_name, vault_name, rp_name, container_name, item_name, restore_mode, resolve_conflict, target_storage_account=None, target_file_share=None, target_folder=None, source_file_type=None, source_file_path=None,): backup_management_type = "AzureStorage" workload_type = "AzureFileShare" items_client = backup_protected_items_cf(cmd.cli_ctx) item = show_item(cmd, items_client, resource_group_name, vault_name, container_name, item_name, backup_management_type, workload_type) custom_help.validate_item(item) if isinstance(item, list): raise CLIError("Multiple items found. Please give native names instead.") return custom_afs.restore_AzureFileShare(cmd, client, resource_group_name, vault_name, rp_name, item, restore_mode, resolve_conflict, "ItemLevelRestore", target_storage_account_name=target_storage_account, target_file_share_name=target_file_share, target_folder=target_folder, source_file_type=source_file_type, source_file_path=source_file_path)
def restore_disks(client, resource_group_name, vault_name, container_name, item_name, rp_name, storage_account): item = show_item(backup_protected_items_cf(None), resource_group_name, vault_name, container_name, item_name, "AzureIaasVM", "VM") vault = vaults_cf(None).get(resource_group_name, vault_name, custom_headers=_get_custom_headers()) vault_location = vault.location # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) # Construct trigger restore request object sa_name, sa_rg = _get_resource_name_and_rg(resource_group_name, storage_account) _storage_account_id = _get_storage_account_id(sa_name, sa_rg) _source_resource_id = item.properties.source_resource_id trigger_restore_properties = IaasVMRestoreRequest( create_new_cloud_service=True, recovery_point_id=rp_name, recovery_type='RestoreDisks', region=vault_location, storage_account_id=_storage_account_id, source_resource_id=_source_resource_id) trigger_restore_request = RestoreRequestResource( properties=trigger_restore_properties) # Trigger restore result = client.trigger(vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, trigger_restore_request, raw=True, custom_headers=_get_custom_headers()) return _track_backup_job(result, vault_name, resource_group_name)
def disable_protection( client, resource_group_name, vault_name, container_name, item_name, # pylint: disable=unused-argument container_type="AzureIaasVM", item_type="VM", delete_backup_data=False, **kwargs): item = show_item(backup_protected_items_cf(None), resource_group_name, vault_name, container_name, item_name, container_type, item_type) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) # Trigger disable protection and wait for completion if delete_backup_data: result = client.delete(vault_name, resource_group_name, fabric_name, container_uri, item_uri, raw=True, custom_headers=_get_custom_headers()) return _track_backup_job(result, vault_name, resource_group_name) vm_item = _get_disable_protection_request(item) result = client.create_or_update(vault_name, resource_group_name, fabric_name, container_uri, item_uri, vm_item, raw=True, custom_headers=_get_custom_headers()) return _track_backup_job(result, vault_name, resource_group_name)
def show_recovery_point( client, resource_group_name, vault_name, container_name, item_name, name, # pylint: disable=redefined-builtin container_type="AzureIaasVM", item_type="VM"): item = show_item(backup_protected_items_cf(None), resource_group_name, vault_name, container_name, item_name, container_type, item_type) # Get container and item URIs container_uri = _get_protection_container_uri_from_id(item.id) item_uri = _get_protected_item_uri_from_id(item.id) return client.get(vault_name, resource_group_name, fabric_name, container_uri, item_uri, name, custom_headers=_get_custom_headers())
def enable_for_AzureFileShare(cmd, client, resource_group_name, vault_name, afs_name, storage_account_name, policy_name): # get registered storage accounts storage_account = None containers_client = backup_protection_containers_cf(cmd.cli_ctx) registered_containers = common.list_containers(containers_client, resource_group_name, vault_name, "AzureStorage") storage_account = _get_storage_account_from_list(registered_containers, storage_account_name) # get unregistered storage accounts if storage_account is None: unregistered_containers = list_protectable_containers( cmd.cli_ctx, resource_group_name, vault_name) storage_account = _get_storage_account_from_list( unregistered_containers, storage_account_name) if storage_account is None: # refresh containers in the vault protection_containers_client = protection_containers_cf( cmd.cli_ctx) filter_string = helper.get_filter_string( {'backupManagementType': "AzureStorage"}) refresh_result = protection_containers_client.refresh( vault_name, resource_group_name, fabric_name, filter=filter_string, raw=True) helper.track_refresh_operation(cmd.cli_ctx, refresh_result, vault_name, resource_group_name) # refetch the protectable containers after refresh unregistered_containers = list_protectable_containers( cmd.cli_ctx, resource_group_name, vault_name) storage_account = _get_storage_account_from_list( unregistered_containers, storage_account_name) if storage_account is None: raise CLIError("Storage account not found or not supported.") # register storage account protection_containers_client = protection_containers_cf(cmd.cli_ctx) properties = AzureStorageContainer( backup_management_type="AzureStorage", source_resource_id=storage_account.properties.container_id, workload_type="AzureFileShare") param = ProtectionContainerResource(properties=properties) result = protection_containers_client.register(vault_name, resource_group_name, fabric_name, storage_account.name, param, raw=True) helper.track_register_operation(cmd.cli_ctx, result, vault_name, resource_group_name, storage_account.name) protectable_item = _get_protectable_item_for_afs(cmd.cli_ctx, vault_name, resource_group_name, afs_name, storage_account) if protectable_item is None: items_client = backup_protected_items_cf(cmd.cli_ctx) item = common.show_item(cmd, items_client, resource_group_name, vault_name, storage_account_name, afs_name, "AzureStorage") if item is None: raise CLIError("Could not find a fileshare with name " + afs_name + " to protect or a protected fileshare of name " + afs_name) return item policy = common.show_policy(protection_policies_cf(cmd.cli_ctx), resource_group_name, vault_name, policy_name) helper.validate_policy(policy) helper.validate_azurefileshare_item(protectable_item) container_uri = helper.get_protection_container_uri_from_id( protectable_item.id) item_uri = helper.get_protectable_item_uri_from_id(protectable_item.id) item_properties = AzureFileshareProtectedItem() item_properties.policy_id = policy.id item_properties.source_resource_id = protectable_item.properties.parent_container_fabric_id item = ProtectedItemResource(properties=item_properties) result = client.create_or_update(vault_name, resource_group_name, fabric_name, container_uri, item_uri, item, raw=True) return helper.track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def show_recovery_config(cmd, client, resource_group_name, vault_name, restore_mode, container_name, item_name, rp_name, target_item, target_item_name, log_point_in_time, from_full_rp_name, filepath, target_container): if log_point_in_time is not None: datetime_type(log_point_in_time) if restore_mode == 'AlternateWorkloadRestore': if target_item is None: raise CLIError(""" Target Item must be provided. """) protectable_item_type = target_item.properties.protectable_item_type if protectable_item_type.lower() not in [ "sqlinstance", "saphanasystem" ]: raise CLIError(""" Target Item must be either of type HANAInstance or SQLInstance. """) if restore_mode == 'RestoreAsFiles' and target_container is None: raise CLIError("Target Container must be provided.") if rp_name is None and log_point_in_time is None: raise CLIError(""" Log point in time or recovery point name must be provided. """) item = common.show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_name, item_name, "AzureWorkload") cust_help.validate_item(item) item_type = item.properties.workload_type item_name = item.name if not cust_help.is_sql(item_type) and not cust_help.is_hana(item_type): raise CLIError(""" Item must be either of type SQLDataBase or SAPHanaDatabase. """) # Mapping of restore mode restore_mode_map = { 'OriginalWorkloadRestore': 'OriginalLocation', 'AlternateWorkloadRestore': 'AlternateLocation', 'RestoreAsFiles': 'AlternateLocation' } if rp_name is None and restore_mode == "RestoreAsFiles" and from_full_rp_name is not None: rp_name = from_full_rp_name rp_name = rp_name if rp_name is not None else 'DefaultRangeRecoveryPoint' if rp_name == 'DefaultRangeRecoveryPoint': recovery_points = list_wl_recovery_points(cmd, client, resource_group_name, vault_name, item, None, None, True) recovery_points = [rp for rp in recovery_points if rp.name == rp_name] if recovery_points == []: raise CLIError(""" Invalid input. """) recovery_point = recovery_points[0] else: recovery_point = common.show_recovery_point( cmd, client, resource_group_name, vault_name, container_name, item_name, rp_name, item_type, backup_management_type="AzureWorkload") alternate_directory_paths = [] if 'sql' in item_type.lower( ) and restore_mode == 'AlternateWorkloadRestore': items = list_workload_items(cmd, vault_name, resource_group_name, container_name) for titem in items: if titem.properties.friendly_name == target_item.properties.friendly_name: if titem.properties.server_name == target_item.properties.server_name: for path in recovery_point.properties.extended_info.data_directory_paths: target_path = cust_help.get_target_path( path.type, path.path, path.logical_name, titem.properties.data_directory_paths) alternate_directory_paths.append( (path.type, path.path, path.logical_name, target_path)) db_name = None if restore_mode == 'AlternateWorkloadRestore': friendly_name = target_item.properties.friendly_name db_name = friendly_name + '/' + target_item_name container_id = None if restore_mode == 'AlternateWorkloadRestore': container_id = '/'.join(target_item.id.split('/')[:-2]) if not ('sql' in item_type.lower() and restore_mode == 'AlternateWorkloadRestore'): alternate_directory_paths = None recovery_mode = None if restore_mode == 'RestoreAsFiles': recovery_mode = 'FileRecovery' container_id = target_container.id return { 'restore_mode': restore_mode_map[restore_mode], 'container_uri': item.properties.container_name, 'item_uri': item_name, 'recovery_point_id': recovery_point.name, 'log_point_in_time': log_point_in_time, 'item_type': 'SQL' if 'sql' in item_type.lower() else 'SAPHana', 'source_resource_id': item.properties.source_resource_id, 'database_name': db_name, 'container_id': container_id, 'recovery_mode': recovery_mode, 'filepath': filepath, 'alternate_directory_paths': alternate_directory_paths }