13
13
// ----------------------------------------------------------------------------------
14
14
15
15
using System ;
16
+ using System . Web ;
16
17
using System . Collections . Generic ;
18
+ using System . Collections . Specialized ;
17
19
using System . Linq ;
18
20
using System . Management . Automation ;
19
21
using System . Text ;
23
25
using MBS = Microsoft . Azure . Management . BackupServices ;
24
26
using Microsoft . Azure . Commands . Compute . Models ;
25
27
26
-
27
28
namespace Microsoft . Azure . Commands . AzureBackup . Cmdlets
28
29
{
29
30
/// <summary>
@@ -32,18 +33,27 @@ namespace Microsoft.Azure.Commands.AzureBackup.Cmdlets
32
33
[ Cmdlet ( VerbsLifecycle . Register , "AzureBackupContainer" ) , OutputType ( typeof ( Guid ) ) ]
33
34
public class RegisterAzureBackupContainer : AzureBackupVaultCmdletBase
34
35
{
36
+ //[Parameter(Position = 2, Mandatory = true, HelpMessage = AzureBackupCmdletHelpMessage.VirtualMachine)]
37
+ //[ValidateNotNullOrEmpty]
38
+ //public PSVirtualMachineInstanceView VirtualMachine { get; set; }
35
39
[ Parameter ( Position = 2 , Mandatory = true , HelpMessage = AzureBackupCmdletHelpMessage . VirtualMachine ) ]
36
40
[ ValidateNotNullOrEmpty ]
37
- public PSVirtualMachineInstanceView VirtualMachine { get ; set ; }
41
+ public string VirtualMachineName { get ; set ; }
42
+
43
+ [ Parameter ( Position = 3 , Mandatory = true , HelpMessage = AzureBackupCmdletHelpMessage . VirtualMachine ) ]
44
+ [ ValidateNotNullOrEmpty ]
45
+ public string VirtualMachineRGName { get ; set ; }
38
46
39
47
public override void ExecuteCmdlet ( )
40
48
{
41
49
base . ExecuteCmdlet ( ) ;
42
50
43
51
ExecutionBlock ( ( ) =>
44
52
{
45
- string vmName = VirtualMachine . Name ;
46
- string rgName = VirtualMachine . ResourceGroupName ;
53
+ //string vmName = VirtualMachine.Name;
54
+ //string rgName = VirtualMachine.ResourceGroupName;
55
+ string vmName = VirtualMachineName ;
56
+ string rgName = VirtualMachineRGName ;
47
57
Guid jobId = Guid . Empty ;
48
58
bool isDiscoveryNeed = false ;
49
59
MBS . OperationResponse operationResponse ;
@@ -66,7 +76,7 @@ public override void ExecuteCmdlet()
66
76
//Container is discovered. Register the container
67
77
List < string > containerNameList = new List < string > ( ) ;
68
78
containerNameList . Add ( container . Name ) ;
69
- RegisterContainerRequest registrationRequest = new RegisterContainerRequest ( containerNameList , " IaasVMContainer" ) ; //TODO: Container type from enum
79
+ RegisterContainerRequest registrationRequest = new RegisterContainerRequest ( containerNameList , AzureBackupContainerType . IaasVMContainer . ToString ( ) ) ;
70
80
operationResponse = AzureBackupClient . Container . RegisterAsync ( registrationRequest , GetCustomRequestHeaders ( ) , CmdletCancellationToken ) . Result ;
71
81
72
82
//TODO fix the OperationResponse to JobID conversion
@@ -78,22 +88,69 @@ public override void ExecuteCmdlet()
78
88
79
89
private void RefreshContainer ( )
80
90
{
81
- MBS . OperationResponse opResponse =
82
- AzureBackupClient . Container . RefreshAsync ( GetCustomRequestHeaders ( ) , CmdletCancellationToken ) . Result ;
91
+ bool isRetyNeeded = true ;
92
+ int retryCount = 1 ;
93
+ bool isDiscoverySuccessful = false ;
94
+ while ( isRetyNeeded && retryCount <= 3 )
95
+ {
96
+ MBS . OperationResponse opResponse =
97
+ AzureBackupClient . Container . RefreshAsync ( GetCustomRequestHeaders ( ) , CmdletCancellationToken ) . Result ;
98
+
99
+ //Now wait for the operation to Complete
100
+ isRetyNeeded = WaitForDiscoveryToCOmplete ( opResponse . OperationId . ToString ( ) , out isDiscoverySuccessful ) ;
101
+ retryCount ++ ;
102
+ }
103
+
104
+ if ( ! isDiscoverySuccessful )
105
+ {
106
+ //Discovery failed
107
+ throw new Exception ( ) ; //TODO:
108
+ }
109
+ }
110
+
111
+ private bool WaitForDiscoveryToCOmplete ( string operationId , out bool isDiscoverySuccessful )
112
+ {
113
+ bool isRetryNeeded = false ;
114
+
115
+
116
+ BMSOperationStatusResponse status = new BMSOperationStatusResponse ( )
117
+ {
118
+ OperationStatus = AzureBackupOperationStatus . InProgress . ToString ( )
119
+ } ;
83
120
84
- //Now wait for the operation to Complete
121
+ while ( status . OperationStatus != AzureBackupOperationStatus . Completed . ToString ( ) )
122
+ {
123
+ status = AzureBackupClient . OperationStatus . GetAsync ( operationId , GetCustomRequestHeaders ( ) , CmdletCancellationToken ) . Result ;
124
+ System . Threading . Thread . Sleep ( TimeSpan . FromSeconds ( 15 ) ) ;
125
+ }
85
126
86
- //If operat
87
- throw new NotImplementedException ( ) ;
127
+ isDiscoverySuccessful = true ;
128
+ //If operation fails check if retry is needed or not
129
+ if ( status . OperationResult != AzureBackupOperationResult . Succeeded . ToString ( ) )
130
+ {
131
+ isDiscoverySuccessful = false ;
132
+ if ( ( status . ErrorCode == AzureBackupOperationErrorCode . DiscoveryInProgress . ToString ( ) ||
133
+ ( status . ErrorCode == AzureBackupOperationErrorCode . BMSUserErrorObjectLocked . ToString ( ) ) ) )
134
+ {
135
+ //Need to retry for this errors
136
+ isRetryNeeded = true ;
137
+ }
138
+ }
139
+ return isRetryNeeded ;
88
140
}
89
141
90
142
private bool IsDiscoveryNeeded ( string vmName , string rgName , out ContainerInfo container )
91
143
{
92
144
bool isDiscoveryNeed = false ;
93
145
//First check if container is discoverd or not
94
146
ListContainerQueryParameter queryParams = new ListContainerQueryParameter ( ) ;
95
- queryParams . ContainerFriendlyNameField = vmName ;
96
- ListContainerResponse containers = AzureBackupClient . Container . ListAsync ( queryParams ,
147
+ queryParams . ContainerTypeField = String . Empty ; // AzureBackupContainerType.IaasVMContainer.ToString();
148
+ queryParams . ContainerStatusField = String . Empty ;
149
+ // queryParams.ContainerFriendlyNameField = vmName;
150
+ queryParams . ContainerFriendlyNameField = String . Empty ;
151
+ string queryString = GetQueryFileter ( queryParams ) ;
152
+
153
+ ListContainerResponse containers = AzureBackupClient . Container . ListAsync ( queryString ,
97
154
GetCustomRequestHeaders ( ) , CmdletCancellationToken ) . Result ;
98
155
if ( containers . Objects . Count ( ) == 0 )
99
156
{
@@ -116,5 +173,34 @@ private bool IsDiscoveryNeeded(string vmName, string rgName, out ContainerInfo c
116
173
}
117
174
return isDiscoveryNeed ;
118
175
}
176
+
177
+ private string GetQueryFileter ( ListContainerQueryParameter queryParams )
178
+ {
179
+ NameValueCollection collection = new NameValueCollection ( ) ;
180
+ if ( ! String . IsNullOrEmpty ( queryParams . ContainerTypeField ) )
181
+ {
182
+ collection . Add ( "ContainerType" , queryParams . ContainerTypeField ) ;
183
+ }
184
+
185
+ if ( ! String . IsNullOrEmpty ( queryParams . ContainerStatusField ) )
186
+ {
187
+ collection . Add ( "ContainerStatus" , queryParams . ContainerStatusField ) ;
188
+ }
189
+
190
+ if ( ! String . IsNullOrEmpty ( queryParams . ContainerFriendlyNameField ) )
191
+ {
192
+ collection . Add ( "FriendlyName" , queryParams . ContainerFriendlyNameField ) ;
193
+ }
194
+
195
+ if ( collection == null || collection . Count == 0 )
196
+ {
197
+ return String . Empty ;
198
+ }
199
+
200
+ var httpValueCollection = HttpUtility . ParseQueryString ( String . Empty ) ;
201
+ httpValueCollection . Add ( collection ) ;
202
+
203
+ return "&" + httpValueCollection . ToString ( ) ;
204
+ }
119
205
}
120
206
}
0 commit comments