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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -379,12 +379,6 @@ public List<RecoveryPointBase> ListRecoveryPoints(Dictionary<Enum, object> Provi
string containerUri = HelperUtils.GetContainerUri(uriDict, item.Id);
string protectedItemName = HelperUtils.GetProtectedItemUri(uriDict, item.Id);

TimeSpan duration = endDate - startDate;
if (duration.TotalDays > 30)
{
throw new Exception(Resources.RestoreDiskTimeRangeError);
}

//we need to fetch the list of RPs
var queryFilterString = "null";
if (string.Compare(restorePointQueryType, "All") == 0)
Expand Down Expand Up @@ -448,12 +442,6 @@ public List<PointInTimeBase> ListLogChains(Dictionary<Enum, object> ProviderData
string containerUri = HelperUtils.GetContainerUri(uriDict, item.Id);
string protectedItemName = HelperUtils.GetProtectedItemUri(uriDict, item.Id);

TimeSpan duration = endDate - startDate;
if (duration.TotalDays > 30)
{
throw new Exception(Resources.RestoreDiskTimeRangeError);
}

//we need to fetch the list of RPs
var queryFilterString = QueryBuilder.Instance.GetQueryString(new BMSRPQueryObject()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

using System.Collections.Generic;
using System.Linq;
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
using Microsoft.Azure.Management.RecoveryServices.Backup.Models;
using Microsoft.Azure.Management.RecoveryServices.Models;
using Microsoft.Rest.Azure.OData;
Expand Down Expand Up @@ -114,5 +115,55 @@ public AADPropertiesResource GetAADProperties(string azureRegion, string backupM
AADPropertiesResource aadProperties = BmsAdapter.Client.AadProperties.GetWithHttpMessagesAsync(azureRegion, queryParams).Result.Body;
return aadProperties;
}

/// <summary>
/// This method prepares the source vault for Data Move operation.
/// </summary>
/// <param name="vaultName"></param>
/// <param name="resourceGroupName"></param>
/// <param name="prepareMoveRequest"></param>
public string PrepareDataMove(string vaultName, string resourceGroupName, PrepareDataMoveRequest prepareMoveRequest)
{
// prepare move
var prepareMoveOperationResponse = BmsAdapter.Client.BeginBMSPrepareDataMoveWithHttpMessagesAsync(
vaultName, resourceGroupName, prepareMoveRequest).Result;

// track prepare-move operation to success
var operationStatus = TrackingHelpers.GetOperationStatusDataMove(
prepareMoveOperationResponse,
operationId => GetDataMoveOperationStatus(operationId, vaultName, resourceGroupName));

Logger.Instance.WriteDebug("Prepare move operation: " + operationStatus.Body.Status);

// get the correlation Id and return it for trigger data move
var operationResult = TrackingHelpers.GetCorrelationId(
prepareMoveOperationResponse,
operationId => GetPrepareDataMoveOperationResult(operationId, vaultName, resourceGroupName));

Logger.Instance.WriteDebug("Prepare move - correlationId:" + operationResult.CorrelationId);

return operationResult.CorrelationId;
}

/// <summary>
/// This method triggers the Data Move operation on Target vault.
/// </summary>
/// <param name="vaultName"></param>
/// <param name="resourceGroupName"></param>
/// <param name="triggerMoveRequest"></param>
public void TriggerDataMove(string vaultName, string resourceGroupName, TriggerDataMoveRequest triggerMoveRequest)
{
//trigger move
var triggerMoveOperationResponse = BmsAdapter.Client.BeginBMSTriggerDataMoveWithHttpMessagesAsync(
vaultName, resourceGroupName, triggerMoveRequest).Result;

// track trigger-move operation to success
var operationStatus = TrackingHelpers.GetOperationStatusDataMove(
triggerMoveOperationResponse,
operationId => GetDataMoveOperationStatus(operationId, vaultName, resourceGroupName));

Logger.Instance.WriteDebug("Trigger move operation: " + operationStatus.Body.Status);

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,39 +26,54 @@ namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
/// <summary>
/// Used for Data Source Move operation. Currently we only support vault level data move from one region to another.
/// </summary>
[Cmdlet("Copy", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "RecoveryServicesVault", SupportsShouldProcess = true), OutputType(typeof(String))]
[Cmdlet("Copy", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "RecoveryServicesVault",
DefaultParameterSetName = AzureRSVaultDataMoveParameterSet, SupportsShouldProcess = true), OutputType(typeof(String))]
public class CopyAzureRmRecoveryServicesVault : RecoveryServicesBackupCmdletBase
{
#region Parameters

internal const string AzureRSVaultDataMoveParameterSet = "AzureRSVaultDataMoveParameterSet";
internal const string AzureRSVaultTriggerMoveParameterSet = "AzureRSVaultTriggerMoveParameterSet";

/// <summary>
/// Source Vault for Data Move Operation
/// </summary>
[Parameter(Position = 1, Mandatory = true, HelpMessage = ParamHelpMsgs.DSMove.SourceVault,
[Parameter(Position = 1, Mandatory = true, ParameterSetName = AzureRSVaultDataMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.SourceVault,
ValueFromPipeline = true)]
[Parameter(Position = 1, Mandatory = true, ParameterSetName = AzureRSVaultTriggerMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.SourceVault,
ValueFromPipeline = true)]
[ValidateNotNullOrEmpty]
public ARSVault SourceVault;

/// <summary>
/// Target Vault for Data Move Operation
/// </summary>
[Parameter(Position = 2, Mandatory = true, HelpMessage = ParamHelpMsgs.DSMove.TargetVault,
[Parameter(Position = 2, Mandatory = true, ParameterSetName = AzureRSVaultDataMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.TargetVault,
ValueFromPipeline = true)]
[Parameter(Position = 2, Mandatory = true, ParameterSetName = AzureRSVaultTriggerMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.TargetVault,
ValueFromPipeline = true)]
[ValidateNotNullOrEmpty]
public ARSVault TargetVault;

/// <summary>
/// Retries data move only with unmoved containers in the source vault
/// </summary>
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.DSMove.RetryOnlyFailed)]
[Parameter(Mandatory = false, ParameterSetName = AzureRSVaultDataMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.RetryOnlyFailed)]
public SwitchParameter RetryOnlyFailed;

/// <summary>
/// Prevents the confirmation dialog when specified.
/// </summary>
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsgs.DSMove.ForceOption)]
[Parameter(Mandatory = false, ParameterSetName = AzureRSVaultDataMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.ForceOption)]
[Parameter(Mandatory = false, ParameterSetName = AzureRSVaultTriggerMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.ForceOption)]
public SwitchParameter Force { get; set; }

/// <summary>
/// Prevents the confirmation dialog when specified.
/// </summary>
[Parameter(Mandatory = true, ParameterSetName = AzureRSVaultTriggerMoveParameterSet, HelpMessage = ParamHelpMsgs.DSMove.CorrelationId)]
public String CorrelationIdForDataMove { get; set; }

#endregion Parameters

public override void ExecuteCmdlet()
Expand Down Expand Up @@ -99,13 +114,14 @@ public override void ExecuteCmdlet()
{
throw new ArgumentException(string.Format(Resources.TargetVaultNotEmptyException));
}

// Confirm the target vault storage type
BackupResourceConfigResource getStorageResponse = ServiceClientAdapter.GetVaultStorageType(
TargetVault.ResourceGroupName, TargetVault.Name);

Logger.Instance.WriteDebug("Storage Type: " + getStorageResponse.Properties.StorageType);

Logger.Instance.WriteDebug("Storage Type: " + getStorageResponse.Properties.StorageType);

string correlationId = "";
ConfirmAction(
Force.IsPresent,
string.Format(Resources.TargetVaultStorageRedundancy, TargetVault.Name, getStorageResponse.Properties.StorageType),
Expand All @@ -114,31 +130,38 @@ public override void ExecuteCmdlet()
{
base.ExecuteCmdlet();

// Prepare Data Move
ServiceClientAdapter.BmsAdapter.Client.SubscriptionId = sourceSub; // set source subscription
PrepareDataMoveRequest prepareMoveRequest = new PrepareDataMoveRequest();
prepareMoveRequest.TargetResourceId = TargetVault.ID;
prepareMoveRequest.TargetRegion = TargetVault.Location;

/// currently only allowing vault level data move
prepareMoveRequest.DataMoveLevel = "Vault";

if (RetryOnlyFailed.IsPresent)
if (string.Compare(ParameterSetName, AzureRSVaultDataMoveParameterSet) == 0)
{
prepareMoveRequest.IgnoreMoved = true;
// Prepare Data Move
ServiceClientAdapter.BmsAdapter.Client.SubscriptionId = sourceSub;
PrepareDataMoveRequest prepareMoveRequest = new PrepareDataMoveRequest();
prepareMoveRequest.TargetResourceId = TargetVault.ID;
prepareMoveRequest.TargetRegion = TargetVault.Location;

/// currently only allowing vault level data move
prepareMoveRequest.DataMoveLevel = "Vault";

if (RetryOnlyFailed.IsPresent)
{
prepareMoveRequest.IgnoreMoved = true;
}
else
{
prepareMoveRequest.IgnoreMoved = false;
}

Logger.Instance.WriteDebug("Retry only with failed items : " + prepareMoveRequest.IgnoreMoved);
Logger.Instance.WriteDebug("Location of Target vault: " + TargetVault.Location);

correlationId = ServiceClientAdapter.PrepareDataMove(SourceVault.Name, SourceVault.ResourceGroupName, prepareMoveRequest);
}
else
{
prepareMoveRequest.IgnoreMoved = false;
correlationId = CorrelationIdForDataMove;
}

Logger.Instance.WriteDebug("Retry only with failed items : " + prepareMoveRequest.IgnoreMoved);
Logger.Instance.WriteDebug("Location of Target vault: " + TargetVault.Location);

string correlationId = PrepareDataMove(SourceVault.Name, SourceVault.ResourceGroupName, prepareMoveRequest);

// Trigger Data Move
ServiceClientAdapter.BmsAdapter.Client.SubscriptionId = targetSub; // set target subscription
ServiceClientAdapter.BmsAdapter.Client.SubscriptionId = targetSub;
TriggerDataMoveRequest triggerMoveRequest = new TriggerDataMoveRequest();
triggerMoveRequest.SourceResourceId = SourceVault.ID;
triggerMoveRequest.SourceRegion = SourceVault.Location;
Expand All @@ -149,63 +172,15 @@ public override void ExecuteCmdlet()
triggerMoveRequest.PauseGC = false;

Logger.Instance.WriteDebug("Location of Source vault: " + SourceVault.Location);
TriggerDataMove(TargetVault.Name, TargetVault.ResourceGroupName, triggerMoveRequest);
ServiceClientAdapter.TriggerDataMove(TargetVault.Name, TargetVault.ResourceGroupName, triggerMoveRequest);

// set subscription to original
ServiceClientAdapter.BmsAdapter.Client.SubscriptionId = subscriptionContext;

ServiceClientAdapter.BmsAdapter.Client.SubscriptionId = subscriptionContext; // set subscription to original
WriteObject(ParamHelpMsgs.DSMove.CmdletOutput);
WriteObject(ParamHelpMsgs.DSMove.CmdletOutput);
}
);
);
}, ShouldProcess(TargetVault.Name, VerbsCommon.Set));
}

/// <summary>
/// This method prepares the source vault for Data Move operation.
/// </summary>
/// <param name="vaultName"></param>
/// <param name="resourceGroupName"></param>
/// <param name="prepareMoveRequest"></param>
public string PrepareDataMove(string vaultName, string resourceGroupName, PrepareDataMoveRequest prepareMoveRequest)
{
// prepare move
var prepareMoveOperationResponse = ServiceClientAdapter.BmsAdapter.Client.BeginBMSPrepareDataMoveWithHttpMessagesAsync(
vaultName, resourceGroupName, prepareMoveRequest).Result;

// track prepare-move operation to success
var operationStatus = TrackingHelpers.GetOperationStatusDataMove(
prepareMoveOperationResponse,
operationId => ServiceClientAdapter.GetDataMoveOperationStatus(operationId, vaultName, resourceGroupName));

Logger.Instance.WriteDebug("Prepare move operation: " + operationStatus.Body.Status);

// get the correlation Id and return it for trigger data move
var operationResult = TrackingHelpers.GetCorrelationId(
prepareMoveOperationResponse,
operationId => ServiceClientAdapter.GetPrepareDataMoveOperationResult(operationId, vaultName, resourceGroupName));

Logger.Instance.WriteDebug("Prepare move - correlationId:" + operationResult.CorrelationId);

return operationResult.CorrelationId;
}

/// <summary>
/// This method triggers the Data Move operation on Target vault.
/// </summary>
/// <param name="vaultName"></param>
/// <param name="resourceGroupName"></param>
/// <param name="triggerMoveRequest"></param>
public void TriggerDataMove(string vaultName, string resourceGroupName, TriggerDataMoveRequest triggerMoveRequest)
{
//trigger move
var triggerMoveOperationResponse = ServiceClientAdapter.BmsAdapter.Client.BeginBMSTriggerDataMoveWithHttpMessagesAsync(
vaultName, resourceGroupName, triggerMoveRequest).Result;

// track trigger-move operation to success
var operationStatus = TrackingHelpers.GetOperationStatusDataMove(
triggerMoveOperationResponse,
operationId => ServiceClientAdapter.GetDataMoveOperationStatus(operationId, vaultName, resourceGroupName));

Logger.Instance.WriteDebug("Trigger move operation: " + operationStatus.Body.Status);

}
}
}
Loading