예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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)
예제 #6
0
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
예제 #7
0
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)
예제 #8
0
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
예제 #9
0
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
예제 #10
0
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.'
    )
예제 #11
0
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)
예제 #12
0
파일: custom.py 프로젝트: zooba/azure-cli
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)
예제 #13
0
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"
        )
예제 #14
0
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)
예제 #15
0
파일: custom.py 프로젝트: zooba/azure-cli
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)
예제 #16
0
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
예제 #17
0
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)
예제 #18
0
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
예제 #19
0
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)
예제 #20
0
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
예제 #21
0
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
예제 #22
0
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)
예제 #23
0
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)
예제 #24
0
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
예제 #25
0
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)
예제 #26
0
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)
예제 #27
0
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)
예제 #28
0
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())
예제 #29
0
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)
예제 #30
0
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
    }