@@ -26,39 +26,54 @@ namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
26
26
/// <summary>
27
27
/// Used for Data Source Move operation. Currently we only support vault level data move from one region to another.
28
28
/// </summary>
29
- [ Cmdlet ( "Copy" , ResourceManager . Common . AzureRMConstants . AzureRMPrefix + "RecoveryServicesVault" , SupportsShouldProcess = true ) , OutputType ( typeof ( String ) ) ]
29
+ [ Cmdlet ( "Copy" , ResourceManager . Common . AzureRMConstants . AzureRMPrefix + "RecoveryServicesVault" ,
30
+ DefaultParameterSetName = AzureRSVaultDataMoveParameterSet , SupportsShouldProcess = true ) , OutputType ( typeof ( String ) ) ]
30
31
public class CopyAzureRmRecoveryServicesVault : RecoveryServicesBackupCmdletBase
31
32
{
32
33
#region Parameters
33
34
35
+ internal const string AzureRSVaultDataMoveParameterSet = "AzureRSVaultDataMoveParameterSet" ;
36
+ internal const string AzureRSVaultTriggerMoveParameterSet = "AzureRSVaultTriggerMoveParameterSet" ;
37
+
34
38
/// <summary>
35
39
/// Source Vault for Data Move Operation
36
40
/// </summary>
37
- [ Parameter ( Position = 1 , Mandatory = true , HelpMessage = ParamHelpMsgs . DSMove . SourceVault ,
41
+ [ Parameter ( Position = 1 , Mandatory = true , ParameterSetName = AzureRSVaultDataMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . SourceVault ,
42
+ ValueFromPipeline = true ) ]
43
+ [ Parameter ( Position = 1 , Mandatory = true , ParameterSetName = AzureRSVaultTriggerMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . SourceVault ,
38
44
ValueFromPipeline = true ) ]
39
45
[ ValidateNotNullOrEmpty ]
40
46
public ARSVault SourceVault ;
41
47
42
48
/// <summary>
43
49
/// Target Vault for Data Move Operation
44
50
/// </summary>
45
- [ Parameter ( Position = 2 , Mandatory = true , HelpMessage = ParamHelpMsgs . DSMove . TargetVault ,
51
+ [ Parameter ( Position = 2 , Mandatory = true , ParameterSetName = AzureRSVaultDataMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . TargetVault ,
52
+ ValueFromPipeline = true ) ]
53
+ [ Parameter ( Position = 2 , Mandatory = true , ParameterSetName = AzureRSVaultTriggerMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . TargetVault ,
46
54
ValueFromPipeline = true ) ]
47
55
[ ValidateNotNullOrEmpty ]
48
56
public ARSVault TargetVault ;
49
57
50
58
/// <summary>
51
59
/// Retries data move only with unmoved containers in the source vault
52
60
/// </summary>
53
- [ Parameter ( Mandatory = false , HelpMessage = ParamHelpMsgs . DSMove . RetryOnlyFailed ) ]
61
+ [ Parameter ( Mandatory = false , ParameterSetName = AzureRSVaultDataMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . RetryOnlyFailed ) ]
54
62
public SwitchParameter RetryOnlyFailed ;
55
63
56
64
/// <summary>
57
65
/// Prevents the confirmation dialog when specified.
58
66
/// </summary>
59
- [ Parameter ( Mandatory = false , HelpMessage = ParamHelpMsgs . DSMove . ForceOption ) ]
67
+ [ Parameter ( Mandatory = false , ParameterSetName = AzureRSVaultDataMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . ForceOption ) ]
68
+ [ Parameter ( Mandatory = false , ParameterSetName = AzureRSVaultTriggerMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . ForceOption ) ]
60
69
public SwitchParameter Force { get ; set ; }
61
70
71
+ /// <summary>
72
+ /// Prevents the confirmation dialog when specified.
73
+ /// </summary>
74
+ [ Parameter ( Mandatory = true , ParameterSetName = AzureRSVaultTriggerMoveParameterSet , HelpMessage = ParamHelpMsgs . DSMove . CorrelationId ) ]
75
+ public String CorrelationIdForDataMove { get ; set ; }
76
+
62
77
#endregion Parameters
63
78
64
79
public override void ExecuteCmdlet ( )
@@ -99,13 +114,14 @@ public override void ExecuteCmdlet()
99
114
{
100
115
throw new ArgumentException ( string . Format ( Resources . TargetVaultNotEmptyException ) ) ;
101
116
}
102
-
117
+
103
118
// Confirm the target vault storage type
104
119
BackupResourceConfigResource getStorageResponse = ServiceClientAdapter . GetVaultStorageType (
105
120
TargetVault . ResourceGroupName , TargetVault . Name ) ;
106
121
107
- Logger . Instance . WriteDebug ( "Storage Type: " + getStorageResponse . Properties . StorageType ) ;
108
-
122
+ Logger . Instance . WriteDebug ( "Storage Type: " + getStorageResponse . Properties . StorageType ) ;
123
+
124
+ string correlationId = "" ;
109
125
ConfirmAction (
110
126
Force . IsPresent ,
111
127
string . Format ( Resources . TargetVaultStorageRedundancy , TargetVault . Name , getStorageResponse . Properties . StorageType ) ,
@@ -114,31 +130,38 @@ public override void ExecuteCmdlet()
114
130
{
115
131
base . ExecuteCmdlet ( ) ;
116
132
117
- // Prepare Data Move
118
- ServiceClientAdapter . BmsAdapter . Client . SubscriptionId = sourceSub ; // set source subscription
119
- PrepareDataMoveRequest prepareMoveRequest = new PrepareDataMoveRequest ( ) ;
120
- prepareMoveRequest . TargetResourceId = TargetVault . ID ;
121
- prepareMoveRequest . TargetRegion = TargetVault . Location ;
122
-
123
- /// currently only allowing vault level data move
124
- prepareMoveRequest . DataMoveLevel = "Vault" ;
125
-
126
- if ( RetryOnlyFailed . IsPresent )
133
+ if ( string . Compare ( ParameterSetName , AzureRSVaultDataMoveParameterSet ) == 0 )
127
134
{
128
- prepareMoveRequest . IgnoreMoved = true ;
135
+ // Prepare Data Move
136
+ ServiceClientAdapter . BmsAdapter . Client . SubscriptionId = sourceSub ;
137
+ PrepareDataMoveRequest prepareMoveRequest = new PrepareDataMoveRequest ( ) ;
138
+ prepareMoveRequest . TargetResourceId = TargetVault . ID ;
139
+ prepareMoveRequest . TargetRegion = TargetVault . Location ;
140
+
141
+ /// currently only allowing vault level data move
142
+ prepareMoveRequest . DataMoveLevel = "Vault" ;
143
+
144
+ if ( RetryOnlyFailed . IsPresent )
145
+ {
146
+ prepareMoveRequest . IgnoreMoved = true ;
147
+ }
148
+ else
149
+ {
150
+ prepareMoveRequest . IgnoreMoved = false ;
151
+ }
152
+
153
+ Logger . Instance . WriteDebug ( "Retry only with failed items : " + prepareMoveRequest . IgnoreMoved ) ;
154
+ Logger . Instance . WriteDebug ( "Location of Target vault: " + TargetVault . Location ) ;
155
+
156
+ correlationId = ServiceClientAdapter . PrepareDataMove ( SourceVault . Name , SourceVault . ResourceGroupName , prepareMoveRequest ) ;
129
157
}
130
158
else
131
159
{
132
- prepareMoveRequest . IgnoreMoved = false ;
160
+ correlationId = CorrelationIdForDataMove ;
133
161
}
134
162
135
- Logger . Instance . WriteDebug ( "Retry only with failed items : " + prepareMoveRequest . IgnoreMoved ) ;
136
- Logger . Instance . WriteDebug ( "Location of Target vault: " + TargetVault . Location ) ;
137
-
138
- string correlationId = PrepareDataMove ( SourceVault . Name , SourceVault . ResourceGroupName , prepareMoveRequest ) ;
139
-
140
163
// Trigger Data Move
141
- ServiceClientAdapter . BmsAdapter . Client . SubscriptionId = targetSub ; // set target subscription
164
+ ServiceClientAdapter . BmsAdapter . Client . SubscriptionId = targetSub ;
142
165
TriggerDataMoveRequest triggerMoveRequest = new TriggerDataMoveRequest ( ) ;
143
166
triggerMoveRequest . SourceResourceId = SourceVault . ID ;
144
167
triggerMoveRequest . SourceRegion = SourceVault . Location ;
@@ -149,63 +172,15 @@ public override void ExecuteCmdlet()
149
172
triggerMoveRequest . PauseGC = false ;
150
173
151
174
Logger . Instance . WriteDebug ( "Location of Source vault: " + SourceVault . Location ) ;
152
- TriggerDataMove ( TargetVault . Name , TargetVault . ResourceGroupName , triggerMoveRequest ) ;
175
+ ServiceClientAdapter . TriggerDataMove ( TargetVault . Name , TargetVault . ResourceGroupName , triggerMoveRequest ) ;
176
+
177
+ // set subscription to original
178
+ ServiceClientAdapter . BmsAdapter . Client . SubscriptionId = subscriptionContext ;
153
179
154
- ServiceClientAdapter . BmsAdapter . Client . SubscriptionId = subscriptionContext ; // set subscription to original
155
- WriteObject ( ParamHelpMsgs . DSMove . CmdletOutput ) ;
180
+ WriteObject ( ParamHelpMsgs . DSMove . CmdletOutput ) ;
156
181
}
157
- ) ;
182
+ ) ;
158
183
} , ShouldProcess ( TargetVault . Name , VerbsCommon . Set ) ) ;
159
184
}
160
-
161
- /// <summary>
162
- /// This method prepares the source vault for Data Move operation.
163
- /// </summary>
164
- /// <param name="vaultName"></param>
165
- /// <param name="resourceGroupName"></param>
166
- /// <param name="prepareMoveRequest"></param>
167
- public string PrepareDataMove ( string vaultName , string resourceGroupName , PrepareDataMoveRequest prepareMoveRequest )
168
- {
169
- // prepare move
170
- var prepareMoveOperationResponse = ServiceClientAdapter . BmsAdapter . Client . BeginBMSPrepareDataMoveWithHttpMessagesAsync (
171
- vaultName , resourceGroupName , prepareMoveRequest ) . Result ;
172
-
173
- // track prepare-move operation to success
174
- var operationStatus = TrackingHelpers . GetOperationStatusDataMove (
175
- prepareMoveOperationResponse ,
176
- operationId => ServiceClientAdapter . GetDataMoveOperationStatus ( operationId , vaultName , resourceGroupName ) ) ;
177
-
178
- Logger . Instance . WriteDebug ( "Prepare move operation: " + operationStatus . Body . Status ) ;
179
-
180
- // get the correlation Id and return it for trigger data move
181
- var operationResult = TrackingHelpers . GetCorrelationId (
182
- prepareMoveOperationResponse ,
183
- operationId => ServiceClientAdapter . GetPrepareDataMoveOperationResult ( operationId , vaultName , resourceGroupName ) ) ;
184
-
185
- Logger . Instance . WriteDebug ( "Prepare move - correlationId:" + operationResult . CorrelationId ) ;
186
-
187
- return operationResult . CorrelationId ;
188
- }
189
-
190
- /// <summary>
191
- /// This method triggers the Data Move operation on Target vault.
192
- /// </summary>
193
- /// <param name="vaultName"></param>
194
- /// <param name="resourceGroupName"></param>
195
- /// <param name="triggerMoveRequest"></param>
196
- public void TriggerDataMove ( string vaultName , string resourceGroupName , TriggerDataMoveRequest triggerMoveRequest )
197
- {
198
- //trigger move
199
- var triggerMoveOperationResponse = ServiceClientAdapter . BmsAdapter . Client . BeginBMSTriggerDataMoveWithHttpMessagesAsync (
200
- vaultName , resourceGroupName , triggerMoveRequest ) . Result ;
201
-
202
- // track trigger-move operation to success
203
- var operationStatus = TrackingHelpers . GetOperationStatusDataMove (
204
- triggerMoveOperationResponse ,
205
- operationId => ServiceClientAdapter . GetDataMoveOperationStatus ( operationId , vaultName , resourceGroupName ) ) ;
206
-
207
- Logger . Instance . WriteDebug ( "Trigger move operation: " + operationStatus . Body . Status ) ;
208
-
209
- }
210
185
}
211
186
}
0 commit comments