Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/azure-cli/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ Release History
**Backup**

* Add support for cost management settings (#33757)
* `az backup restore files mount-rp`: Fetch ILR mount scripts through the dedicated list action for CHAP credential redaction.

**Cognitive Services**

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@ def _common_client_factory(cli_ctx, **_):


def _backup_client_factory(cli_ctx, **_):
from azure.mgmt.recoveryservicesbackup.activestamp import RecoveryServicesBackupClient
from azure.mgmt.recoveryservicesbackup import RecoveryServicesBackupClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client

return get_mgmt_service_client(cli_ctx, RecoveryServicesBackupClient)


def _backup_passive_client_factory(cli_ctx, **_):
from azure.mgmt.recoveryservicesbackup.passivestamp import RecoveryServicesBackupPassiveClient
from azure.mgmt.recoveryservicesbackup import RecoveryServicesBackupClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client

return get_mgmt_service_client(cli_ctx, RecoveryServicesBackupPassiveClient)
return get_mgmt_service_client(cli_ctx, RecoveryServicesBackupClient)


# External Deps Client Factories
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from datetime import datetime
from azure.cli.core.azclierror import RequiredArgumentMissingError, MutuallyExclusiveArgumentError, \
ArgumentUsageError, InvalidArgumentValueError
from azure.mgmt.recoveryservicesbackup.activestamp.models import StorageType
from azure.mgmt.recoveryservicesbackup.models import StorageType
# Argument types


Expand Down
34 changes: 25 additions & 9 deletions src/azure-cli/azure/cli/command_modules/backup/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from knack.prompting import prompt_y_n
from azure.mgmt.core.tools import is_valid_resource_id

from azure.mgmt.recoveryservicesbackup.activestamp import RecoveryServicesBackupClient
from azure.mgmt.recoveryservicesbackup import RecoveryServicesBackupClient
from azure.mgmt.recoveryservices import RecoveryServicesClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client, get_subscription_id
from azure.cli.core.profiles import ResourceType
Expand All @@ -21,19 +21,26 @@
AzureMonitorAlertSettings, ClassicAlertSettings, SecuritySettings, ImmutabilitySettings, RestoreSettings, \
CrossSubscriptionRestoreSettings, DeletedVaultUndeleteInputProperties, DeletedVaultUndeleteInput, \
SoftDeleteSettings, CostManagementSettings, ImmutabilityConfiguration
from azure.mgmt.recoveryservicesbackup.activestamp.models import ProtectedItemResource, \
from azure.mgmt.recoveryservicesbackup.models import ProtectedItemResource, \
AzureIaaSComputeVMProtectedItem, AzureIaaSClassicComputeVMProtectedItem, ProtectionState, IaasVMBackupRequest, \
BackupRequestResource, IaasVMRestoreRequest, RestoreRequestResource, BackupManagementType, WorkloadType, \
ILRRequestResource, IaasVMILRRegistrationRequest, \
BackupResourceVaultConfig, BackupResourceVaultConfigResource, DiskExclusionProperties, ExtendedProperties, \
MoveRPAcrossTiersRequest, RecoveryPointRehydrationInfo, IaasVMRestoreWithRehydrationRequest, IdentityInfo, \
BackupStatusRequest, ListRecoveryPointsRecommendedForMoveRequest, IdentityBasedRestoreDetails, ScheduleRunType, \
UnlockDeleteRequest, ResourceGuardProxyBase, ResourceGuardProxyBaseResource, TargetDiskNetworkAccessSettings, \
SecuredVMDetails
from azure.mgmt.recoveryservicesbackup.passivestamp.models import CrrJobRequest, CrossRegionRestoreRequest
SecuredVMDetails, InstantItemRecoveryOperationResultRequest
from azure.cli.core.util import CLIError

try:
from azure.mgmt.recoveryservicesbackup.models import CrrJobRequest, CrossRegionRestoreRequest
except ImportError:
def _unavailable_recoveryservicesbackup_model(*_args, **_kwargs):
raise CLIError('This operation is not supported by the installed Recovery Services Backup SDK.')

CrrJobRequest = CrossRegionRestoreRequest = _unavailable_recoveryservicesbackup_model

import azure.cli.command_modules.backup._validators as validators
from azure.cli.core.util import CLIError
from azure.core.exceptions import HttpResponseError, ResourceNotFoundError as CoreResourceNotFoundError
from azure.cli.core.azclierror import RequiredArgumentMissingError, InvalidArgumentValueError, \
MutuallyExclusiveArgumentError, ArgumentUsageError, ValidationError, ResourceNotFoundError
Expand Down Expand Up @@ -1701,7 +1708,16 @@ def restore_files_mount_rp(cmd, client, resource_group_name, vault_name, contain
result = client.provision(vault_name, resource_group_name, fabric_name, container_uri, item_uri, rp_name,
file_restore_request, cls=cust_help.get_pipeline_response)

client_scripts = cust_help.track_backup_ilr(cmd.cli_ctx, result, vault_name, resource_group_name)
operation_id = cust_help.track_backup_ilr(cmd.cli_ctx, result, vault_name, resource_group_name)
mount_script_request = InstantItemRecoveryOperationResultRequest(
provision_instant_item_recovery_operation_id=operation_id)
recovery_target = client.list_instant_item_recovery_operation_result(
resource_group_name=resource_group_name, vault_name=vault_name, fabric_name=fabric_name,
container_name=container_uri, protected_item_name=item_uri, recovery_point_id=rp_name,
body=mount_script_request)
client_scripts = recovery_target.client_scripts if recovery_target else None
if not client_scripts:
raise CLIError('Mount script details were not returned by the backup service.')

if client_scripts[0].os_type == os_windows:
_run_client_script_for_windows(client_scripts)
Expand Down Expand Up @@ -1739,7 +1755,7 @@ def disable_protection(cmd, client, resource_group_name, vault_name, item,

# ResourceGuard scenario: if we are stopping backup and there is MUA setup for the scenario,
# we want to set the appropriate parameters.
if vm_item.properties.protection_state == ProtectionState.protection_stopped:
if vm_item.properties.protection_state == ProtectionState.PROTECTION_STOPPED:
if cust_help.has_resource_guard_mapping(cmd.cli_ctx, resource_group_name,
vault_name, "RecoveryServicesStopProtection"):
# Cross Tenant scenario
Expand Down Expand Up @@ -1968,9 +1984,9 @@ def _get_disable_protection_request(item, undelete=False,
vm_item_properties = _get_vm_item_properties_from_vm_id(item.properties.virtual_machine_id)
vm_item_properties.policy_id = ''
if retain_recovery_points_as_per_policy:
vm_item_properties.protection_state = ProtectionState.backups_suspended
vm_item_properties.protection_state = ProtectionState.BACKUPS_SUSPENDED
else:
vm_item_properties.protection_state = ProtectionState.protection_stopped
vm_item_properties.protection_state = ProtectionState.PROTECTION_STOPPED
vm_item_properties.source_resource_id = item.properties.source_resource_id
if undelete:
vm_item_properties.is_rehydrate = True
Expand Down
10 changes: 5 additions & 5 deletions src/azure-cli/azure/cli/command_modules/backup/custom_afs.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

import azure.cli.command_modules.backup.custom_common as common

from azure.mgmt.recoveryservicesbackup.activestamp.models import ProtectedItemResource, \
from azure.mgmt.recoveryservicesbackup.models import ProtectedItemResource, \
RestoreRequestResource, BackupRequestResource, RestoreFileSpecs, \
AzureFileShareBackupRequest, AzureFileshareProtectedItem, AzureFileShareRestoreRequest, \
TargetAFSRestoreInfo, ProtectionState, ProtectionContainerResource, AzureStorageContainer
Expand All @@ -21,7 +21,7 @@
resources_cf, backup_protected_items_cf, protected_items_cf
from azure.cli.core.azclierror import ArgumentUsageError, ValidationError

from azure.mgmt.recoveryservicesbackup.activestamp import RecoveryServicesBackupClient
from azure.mgmt.recoveryservicesbackup import RecoveryServicesBackupClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client

from knack.log import get_logger
Expand Down Expand Up @@ -440,15 +440,15 @@ def disable_protection(cmd, client, resource_group_name, vault_name, item,
afs_item_properties = AzureFileshareProtectedItem()
afs_item_properties.policy_id = ''
if retain_recovery_points_as_per_policy:
afs_item_properties.protection_state = ProtectionState.backups_suspended
afs_item_properties.protection_state = ProtectionState.BACKUPS_SUSPENDED
else:
afs_item_properties.protection_state = ProtectionState.protection_stopped
afs_item_properties.protection_state = ProtectionState.PROTECTION_STOPPED
afs_item_properties.source_resource_id = item.properties.source_resource_id
afs_item = ProtectedItemResource(properties=afs_item_properties)

# ResourceGuard scenario: if we are stopping backup and there is MUA setup for the scenario,
# we want to set the appropriate parameters.
if afs_item.properties.protection_state == ProtectionState.protection_stopped:
if afs_item.properties.protection_state == ProtectionState.PROTECTION_STOPPED:
if helper.has_resource_guard_mapping(cmd.cli_ctx, resource_group_name,
vault_name, "RecoveryServicesStopProtection"):
# Cross Tenant scenario
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
backup_protection_containers_cf, backup_protectable_items_cf, registered_identities_cf, vaults_cf
from azure.cli.core.azclierror import ValidationError, RequiredArgumentMissingError, InvalidArgumentValueError, \
MutuallyExclusiveArgumentError, ArgumentUsageError
from azure.mgmt.recoveryservicesbackup.activestamp import RecoveryServicesBackupClient
from azure.mgmt.recoveryservicesbackup import RecoveryServicesBackupClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client, get_subscription_id
# pylint: disable=import-error

Expand Down Expand Up @@ -42,9 +42,9 @@ def reconfigure_backup_protection(cmd, client, resource_group_name, vault_name,
raise ValidationError("Multiple items found. Please use native container and item names.")

# Item-level validation (state, workload specifics)
from azure.mgmt.recoveryservicesbackup.activestamp.models import ProtectionState
if item.properties.protection_state not in [ProtectionState.protected,
ProtectionState.protection_stopped]:
from azure.mgmt.recoveryservicesbackup.models import ProtectionState
if item.properties.protection_state not in [ProtectionState.PROTECTED,
ProtectionState.PROTECTION_STOPPED]:
raise ValidationError(f"Reconfiguration only supported for items in states: Protected or "
f"ProtectionStopped. Current state: "
f"{item.properties.protection_state}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
protected_items_cf, backup_protected_items_crr_cf, recovery_points_crr_cf, resource_guard_proxy_cf
from azure.cli.core.util import CLIError
from azure.cli.core.azclierror import InvalidArgumentValueError, RequiredArgumentMissingError
from azure.mgmt.recoveryservicesbackup.activestamp.models import RecoveryPointTierStatus, RecoveryPointTierType, \
from azure.mgmt.recoveryservicesbackup.models import RecoveryPointTierStatus, RecoveryPointTierType, \
UnlockDeleteRequest, TieringMode
from azure.mgmt.recoveryservicesbackup.activestamp import RecoveryServicesBackupClient
from azure.mgmt.recoveryservicesbackup import RecoveryServicesBackupClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client
# pylint: disable=import-error

Expand Down
26 changes: 17 additions & 9 deletions src/azure-cli/azure/cli/command_modules/backup/custom_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,15 @@

from azure.mgmt.core.tools import parse_resource_id, is_valid_resource_id

from azure.mgmt.recoveryservicesbackup.activestamp.models import OperationStatusValues, JobStatus
from azure.mgmt.recoveryservicesbackup.passivestamp.models import CrrJobRequest

from azure.mgmt.recoveryservicesbackup.models import OperationStatusValues
from azure.cli.core.util import CLIError

try:
from azure.mgmt.recoveryservicesbackup.models import CrrJobRequest
except ImportError:
def CrrJobRequest(*_args, **_kwargs):
raise CLIError('This operation is not supported by the installed Recovery Services Backup SDK.')

from azure.cli.core.commands import _is_paged
from azure.cli.command_modules.backup._client_factory import (
job_details_cf, protection_container_refresh_operation_results_cf,
Expand Down Expand Up @@ -413,11 +418,14 @@ def get_target_path(resource_type, path, logical_name, data_directory_paths):
# Tracking Utilities
# pylint: disable=inconsistent-return-statements
def track_backup_ilr(cli_ctx, result, vault_name, resource_group):
operation_id = get_operation_id_from_header(result.http_response.headers['Azure-AsyncOperation'])
operation_status = track_backup_operation(cli_ctx, resource_group, result, vault_name)

if operation_status.properties:
recovery_target = operation_status.properties.recovery_target
return recovery_target.client_scripts
if operation_status.status != OperationStatusValues.SUCCEEDED.value:
raise CLIError('Provisioning access to the recovery point failed with status: {}.'.format(
operation_status.status))

return operation_id


# pylint: disable=inconsistent-return-statements
Expand All @@ -436,7 +444,7 @@ def track_backup_operation(cli_ctx, resource_group, result, vault_name):

operation_id = get_operation_id_from_header(result.http_response.headers['Azure-AsyncOperation'])
operation_status = backup_operation_statuses_client.get(vault_name, resource_group, operation_id)
while operation_status.status == OperationStatusValues.in_progress.value:
while operation_status.status == OperationStatusValues.IN_PROGRESS.value:
time.sleep(5)
operation_status = backup_operation_statuses_client.get(vault_name, resource_group, operation_id)
return operation_status
Expand All @@ -458,7 +466,7 @@ def track_backup_crr_operation(cli_ctx, result, azure_region):

operation_id = get_operation_id_from_header(result.http_response.headers['Azure-AsyncOperation'])
operation_status = crr_operation_statuses_client.get(azure_region, operation_id)
while operation_status.status == OperationStatusValues.in_progress.value:
while operation_status.status == OperationStatusValues.IN_PROGRESS.value:
time.sleep(5)
operation_status = crr_operation_statuses_client.get(azure_region, operation_id)
return operation_status
Expand Down Expand Up @@ -507,7 +515,7 @@ def track_inquiry_operation(cli_ctx, result, vault_name, resource_group, contain


def job_in_progress(job_status):
return job_status in [JobStatus.in_progress.value, JobStatus.cancelling.value]
return job_status in ['InProgress', 'Cancelling']

# List Utilities

Expand Down
18 changes: 11 additions & 7 deletions src/azure-cli/azure/cli/command_modules/backup/custom_wl.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from knack.log import get_logger

from azure.mgmt.recoveryservicesbackup.activestamp.models import AzureVMAppContainerProtectionContainer, \
from azure.mgmt.recoveryservicesbackup.models import AzureVMAppContainerProtectionContainer, \
AzureWorkloadBackupRequest, ProtectedItemResource, AzureRecoveryServiceVaultProtectionIntent, TargetRestoreInfo, \
RestoreRequestResource, BackupRequestResource, ProtectionIntentResource, SQLDataDirectoryMapping, \
ProtectionContainerResource, AzureWorkloadSAPHanaRestoreRequest, AzureWorkloadSQLRestoreRequest, \
Expand All @@ -26,9 +26,13 @@
UserAssignedManagedIdentityDetails, UserAssignedIdentityProperties, \
AzureVmWorkloadSAPAseDatabaseProtectedItem, MoveRPAcrossTiersRequest

from azure.mgmt.recoveryservicesbackup.passivestamp.models import CrossRegionRestoreRequest

from azure.cli.core.util import CLIError

try:
from azure.mgmt.recoveryservicesbackup.models import CrossRegionRestoreRequest
except ImportError:
def CrossRegionRestoreRequest(*_args, **_kwargs):
raise CLIError('This operation is not supported by the installed Recovery Services Backup SDK.')
from azure.cli.command_modules.backup._validators import datetime_type, validate_wl_restore, validate_log_point_in_time
from azure.cli.command_modules.backup._client_factory import protectable_containers_cf, \
backup_protection_containers_cf, backup_protected_items_cf, recovery_points_crr_cf, \
Expand All @@ -42,7 +46,7 @@
from azure.cli.core.azclierror import InvalidArgumentValueError, RequiredArgumentMissingError, ValidationError, \
ResourceNotFoundError, ArgumentUsageError, MutuallyExclusiveArgumentError

from azure.mgmt.recoveryservicesbackup.activestamp import RecoveryServicesBackupClient
from azure.mgmt.recoveryservicesbackup import RecoveryServicesBackupClient
from azure.cli.core.commands.client_factory import get_mgmt_service_client
from azure.cli.core.profiles import ResourceType

Expand Down Expand Up @@ -608,15 +612,15 @@ def disable_protection(cmd, client, resource_group_name, vault_name, item,

properties = _get_protected_item_instance(backup_item_type)
if retain_recovery_points_as_per_policy:
properties.protection_state = ProtectionState.backups_suspended
properties.protection_state = ProtectionState.BACKUPS_SUSPENDED
else:
properties.protection_state = ProtectionState.protection_stopped
properties.protection_state = ProtectionState.PROTECTION_STOPPED
properties.policy_id = ''
param = ProtectedItemResource(properties=properties)

# ResourceGuard scenario: if we are stopping backup and there is MUA setup for the scenario,
# we want to set the appropriate parameters.
if param.properties.protection_state == ProtectionState.protection_stopped:
if param.properties.protection_state == ProtectionState.PROTECTION_STOPPED:
if cust_help.has_resource_guard_mapping(cmd.cli_ctx, resource_group_name,
vault_name, "RecoveryServicesStopProtection"):
# Cross Tenant scenario
Expand Down
Loading
Loading