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 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 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 _get_log_time_range(cmd, resource_group_name, vault_name, item, use_secondary_region): container_uri = cust_help.get_protection_container_uri_from_id(item.id) item_uri = cust_help.get_protected_item_uri_from_id(item.id) filter_string = cust_help.get_filter_string({ 'restorePointQueryType': 'Log'}) client = recovery_points_cf(cmd.cli_ctx) if use_secondary_region: client = recovery_points_crr_cf(cmd.cli_ctx) # Get recovery points recovery_points = client.list(vault_name, resource_group_name, fabric_name, container_uri, item_uri, filter_string) paged_recovery_points = cust_help.get_none_one_or_many(cust_help.get_list_from_paged_response(recovery_points)) _check_none_and_many(paged_recovery_points, "Log time range") return paged_recovery_points.properties.time_ranges
def restore_disks(cmd, client, resource_group_name, vault_name, container_name, item_name, rp_name, storage_account, target_resource_group=None, restore_to_staging_storage_account=None, restore_only_osdisk=None, diskslist=None, restore_as_unmanaged_disks=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 target_rg_id = None if restore_as_unmanaged_disks and target_resource_group is not None: raise CLIError(""" Both restore_as_unmanaged_disks and target_resource_group can't be spceified. Please give Only one parameter and retry. """) if recovery_point.properties.is_managed_virtual_machine: if target_resource_group is not None: target_rg_id = '/'.join(_source_resource_id.split('/') [:4]) + "/" + target_resource_group if not restore_as_unmanaged_disks: logger.warning(""" The disks of the managed VM will be restored as unmanaged since targetRG parameter is not provided. This will NOT leverage the instant restore functionality. Hence it can be significantly slow based on given storage account. To leverage instant restore, provide the target RG parameter. Otherwise, provide the intent next time by passing the --restore-as-unmanaged-disks parameter """) _validate_restore_disk_parameters(restore_only_osdisk, diskslist) restore_disk_lun_list = None if restore_only_osdisk: restore_disk_lun_list = [] if diskslist: restore_disk_lun_list = diskslist 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, target_resource_group_id=target_rg_id, original_storage_account_option=use_original_storage_account, restore_disk_lun_list=restore_disk_lun_list) trigger_restore_request = RestoreRequestResource( properties=trigger_restore_properties) # Trigger restore result = sdk_no_wait(True, client.trigger, vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, trigger_restore_request) return _track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def restore_disks(cmd, client, resource_group_name, vault_name, container_name, item_name, rp_name, storage_account, target_resource_group=None, restore_to_staging_storage_account=None, restore_only_osdisk=None, diskslist=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 target_rg_id = None if recovery_point.properties.is_managed_virtual_machine and target_resource_group is not None: target_rg_id = '/'.join( _source_resource_id.split('/')[:4]) + "/" + target_resource_group _validate_restore_disk_parameters(restore_only_osdisk, diskslist) restore_disk_lun_list = None if restore_only_osdisk: restore_disk_lun_list = [] if diskslist: restore_disk_lun_list = diskslist 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, target_resource_group_id=target_rg_id, original_storage_account_option=use_original_storage_account, restore_disk_lun_list=restore_disk_lun_list) trigger_restore_request = RestoreRequestResource( properties=trigger_restore_properties) # Trigger restore result = sdk_no_wait(True, client.trigger, vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name, trigger_restore_request) return _track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def restore_azure_wl(cmd, client, resource_group_name, vault_name, recovery_config, rehydration_duration=15, rehydration_priority=None, use_secondary_region=None): recovery_config_object = cust_help.get_or_read_json(recovery_config) restore_mode = recovery_config_object['restore_mode'] container_uri = recovery_config_object['container_uri'] item_uri = recovery_config_object['item_uri'] recovery_point_id = recovery_config_object['recovery_point_id'] log_point_in_time = recovery_config_object['log_point_in_time'] item_type = recovery_config_object['item_type'] workload_type = recovery_config_object['workload_type'] source_resource_id = recovery_config_object['source_resource_id'] database_name = recovery_config_object['database_name'] container_id = recovery_config_object['container_id'] alternate_directory_paths = recovery_config_object['alternate_directory_paths'] recovery_mode = recovery_config_object['recovery_mode'] filepath = recovery_config_object['filepath'] item = common.show_item(cmd, backup_protected_items_cf(cmd.cli_ctx), resource_group_name, vault_name, container_uri, item_uri, "AzureWorkload") cust_help.validate_item(item) validate_wl_restore(item, item_type, restore_mode, recovery_mode) trigger_restore_properties = _get_restore_request_instance(item_type, log_point_in_time, None) if log_point_in_time is None: recovery_point = common.show_recovery_point(cmd, recovery_points_cf(cmd.cli_ctx), resource_group_name, vault_name, container_uri, item_uri, recovery_point_id, workload_type, "AzureWorkload", use_secondary_region) if recovery_point is None: raise InvalidArgumentValueError(""" Specified recovery point not found. Please check the recovery config file or try removing --use-secondary-region if provided""") common.fetch_tier_for_rp(recovery_point) if (recovery_point.tier_type is not None and recovery_point.tier_type == 'VaultArchive'): if rehydration_priority is None: raise InvalidArgumentValueError("""The selected recovery point is in archive tier, provide additional parameters of rehydration duration and rehydration priority.""") # normal rehydrated restore trigger_restore_properties = _get_restore_request_instance(item_type, log_point_in_time, rehydration_priority) rehyd_duration = 'P' + str(rehydration_duration) + 'D' rehydration_info = RecoveryPointRehydrationInfo(rehydration_retention_duration=rehyd_duration, rehydration_priority=rehydration_priority) trigger_restore_properties.recovery_point_rehydration_info = rehydration_info trigger_restore_properties.recovery_type = restore_mode # Get target vm id if container_id is not None: target_container_name = cust_help.get_protection_container_uri_from_id(container_id) target_resource_group = cust_help.get_resource_group_from_id(container_id) target_vault_name = cust_help.get_vault_from_arm_id(container_id) target_container = common.show_container(cmd, backup_protection_containers_cf(cmd.cli_ctx), target_container_name, target_resource_group, target_vault_name, 'AzureWorkload') setattr(trigger_restore_properties, 'target_virtual_machine_id', target_container.properties.source_resource_id) if restore_mode == 'AlternateLocation': if recovery_mode != "FileRecovery": setattr(trigger_restore_properties, 'source_resource_id', source_resource_id) setattr(trigger_restore_properties, 'target_info', TargetRestoreInfo(overwrite_option='Overwrite', database_name=database_name, container_id=container_id)) if 'sql' in item_type.lower(): directory_map = [] for i in alternate_directory_paths: directory_map.append(SQLDataDirectoryMapping(mapping_type=i[0], source_path=i[1], source_logical_name=i[2], target_path=i[3])) setattr(trigger_restore_properties, 'alternate_directory_paths', directory_map) else: target_info = TargetRestoreInfo(overwrite_option='Overwrite', container_id=container_id, target_directory_for_file_restore=filepath) setattr(trigger_restore_properties, 'target_info', target_info) trigger_restore_properties.recovery_mode = recovery_mode if log_point_in_time is not None: log_point_in_time = datetime_type(log_point_in_time) time_range_list = _get_log_time_range(cmd, resource_group_name, vault_name, item, use_secondary_region) validate_log_point_in_time(log_point_in_time, time_range_list) setattr(trigger_restore_properties, 'point_in_time', log_point_in_time) if 'sql' in item_type.lower(): setattr(trigger_restore_properties, 'should_use_alternate_target_location', True) setattr(trigger_restore_properties, 'is_non_recoverable', False) trigger_restore_request = RestoreRequestResource(properties=trigger_restore_properties) if use_secondary_region: if rehydration_priority is not None: raise MutuallyExclusiveArgumentError("Archive restore isn't supported for secondary region.") vault = vaults_cf(cmd.cli_ctx).get(resource_group_name, vault_name) vault_location = vault.location azure_region = custom.secondary_region_map[vault_location] aad_client = aad_properties_cf(cmd.cli_ctx) filter_string = cust_help.get_filter_string({'backupManagementType': 'AzureWorkload'}) aad_result = aad_client.get(azure_region, filter_string) rp_client = recovery_points_passive_cf(cmd.cli_ctx) crr_access_token = rp_client.get_access_token(vault_name, resource_group_name, fabric_name, container_uri, item_uri, recovery_point_id, aad_result).properties crr_client = cross_region_restore_cf(cmd.cli_ctx) trigger_restore_properties.region = azure_region trigger_crr_request = CrossRegionRestoreRequest(cross_region_restore_access_details=crr_access_token, restore_request=trigger_restore_properties) result = crr_client.begin_trigger(azure_region, trigger_crr_request, cls=cust_help.get_pipeline_response, polling=False).result() return cust_help.track_backup_crr_job(cmd.cli_ctx, result, azure_region, vault.id) # Trigger restore and wait for completion result = client.begin_trigger(vault_name, resource_group_name, fabric_name, container_uri, item_uri, recovery_point_id, trigger_restore_request, cls=cust_help.get_pipeline_response, polling=False).result() return cust_help.track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)
def restore_azure_wl(cmd, client, resource_group_name, vault_name, recovery_config, rehydration_duration=15, rehydration_priority=None): recovery_config_object = cust_help.get_or_read_json(recovery_config) restore_mode = recovery_config_object['restore_mode'] container_uri = recovery_config_object['container_uri'] item_uri = recovery_config_object['item_uri'] recovery_point_id = recovery_config_object['recovery_point_id'] log_point_in_time = recovery_config_object['log_point_in_time'] item_type = recovery_config_object['item_type'] source_resource_id = recovery_config_object['source_resource_id'] database_name = recovery_config_object['database_name'] container_id = recovery_config_object['container_id'] alternate_directory_paths = recovery_config_object['alternate_directory_paths'] recovery_mode = recovery_config_object['recovery_mode'] filepath = recovery_config_object['filepath'] recovery_point = common.show_recovery_point(cmd, recovery_points_cf(cmd.cli_ctx), resource_group_name, vault_name, container_uri, item_uri, recovery_point_id, item_type, backup_management_type="AzureWorkload") rp_list = [recovery_point] common.fetch_tier(rp_list) if (rp_list[0].properties.recovery_point_tier_details is not None and rp_list[0].tier_type == 'VaultArchive' and rehydration_priority is None): raise InvalidArgumentValueError("""The selected recovery point is in archive tier, provide additional parameters of rehydration duration and rehydration priority.""") if rp_list[0].properties.recovery_point_tier_details is not None and rp_list[0].tier_type == 'VaultArchive': # Construct trigger restore request object trigger_restore_properties = _get_restore_request_instance(item_type, log_point_in_time, rehydration_priority) rehyd_duration = 'P' + str(rehydration_duration) + 'D' rehydration_info = RecoveryPointRehydrationInfo(rehydration_retention_duration=rehyd_duration, rehydration_priority=rehydration_priority) trigger_restore_properties.recovery_point_rehydration_info = rehydration_info else: trigger_restore_properties = _get_restore_request_instance(item_type, log_point_in_time, None) trigger_restore_properties.recovery_type = restore_mode # Get target vm id if container_id is not None: target_container_name = cust_help.get_protection_container_uri_from_id(container_id) target_resource_group = cust_help.get_resource_group_from_id(container_id) target_vault_name = cust_help.get_vault_from_arm_id(container_id) target_container = common.show_container(cmd, backup_protection_containers_cf(cmd.cli_ctx), target_container_name, target_resource_group, target_vault_name, 'AzureWorkload') setattr(trigger_restore_properties, 'target_virtual_machine_id', target_container.properties.source_resource_id) if restore_mode == 'AlternateLocation': if recovery_mode != "FileRecovery": setattr(trigger_restore_properties, 'source_resource_id', source_resource_id) setattr(trigger_restore_properties, 'target_info', TargetRestoreInfo(overwrite_option='Overwrite', database_name=database_name, container_id=container_id)) if 'sql' in item_type.lower(): directory_map = [] for i in alternate_directory_paths: directory_map.append(SQLDataDirectoryMapping(mapping_type=i[0], source_path=i[1], source_logical_name=i[2], target_path=i[3])) setattr(trigger_restore_properties, 'alternate_directory_paths', directory_map) else: target_info = TargetRestoreInfo(overwrite_option='Overwrite', container_id=container_id, target_directory_for_file_restore=filepath) setattr(trigger_restore_properties, 'target_info', target_info) trigger_restore_properties.recovery_mode = recovery_mode if log_point_in_time is not None: setattr(trigger_restore_properties, 'point_in_time', datetime_type(log_point_in_time)) if 'sql' in item_type.lower(): setattr(trigger_restore_properties, 'should_use_alternate_target_location', True) setattr(trigger_restore_properties, 'is_non_recoverable', False) trigger_restore_request = RestoreRequestResource(properties=trigger_restore_properties) # Trigger restore and wait for completion result = client.trigger(vault_name, resource_group_name, fabric_name, container_uri, item_uri, recovery_point_id, trigger_restore_request, raw=True, polling=False).result() return cust_help.track_backup_job(cmd.cli_ctx, result, vault_name, resource_group_name)