Skip to content

Commit 7975041

Browse files
committed
Merge pull request #223 from MabOneSdk/pragrawa-dev1
Enable Protection Validation and TBDs implementation
2 parents 0359aae + 8af7854 commit 7975041

File tree

9 files changed

+317
-56
lines changed

9 files changed

+317
-56
lines changed

src/ResourceManager/RecoveryServices.Backup/Cmdlets/Item/EnableAzureRmRecoveryServicesProtection.cs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020
using System.Management.Automation;
2121
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models;
2222
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.ProviderModel;
23+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
2324
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
25+
using HydraModel = Microsoft.Azure.Management.RecoveryServices.Backup.Models;
26+
2427

2528
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
2629
{
@@ -30,8 +33,8 @@ namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
3033
[Cmdlet(VerbsLifecycle.Enable, "AzureRmRecoveryServicesProtection", DefaultParameterSetName = ModifyProtectionParameterSet), OutputType(typeof(AzureRmRecoveryServicesJobBase))]
3134
public class EnableAzureRmRecoveryServicesProtection : RecoveryServicesBackupCmdletBase
3235
{
33-
internal const string AzureVMClassicComputeParameterSet = "AzureVMClassicCompute";
34-
internal const string AzureVMComputeParameterSet = "AzureVMCompute";
36+
internal const string AzureVMClassicComputeParameterSet = "AzureVMClassicComputeEnableProtection";
37+
internal const string AzureVMComputeParameterSet = "AzureVMComputeEnableProtection";
3538
internal const string ModifyProtectionParameterSet = "ModifyProtection";
3639

3740
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = AzureVMClassicComputeParameterSet, HelpMessage = ParamHelpMsg.Item.AzureVMName)]
@@ -44,15 +47,15 @@ public class EnableAzureRmRecoveryServicesProtection : RecoveryServicesBackupCmd
4447
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = AzureVMComputeParameterSet, HelpMessage = ParamHelpMsg.Item.AzureVMResourceGroupName)]
4548
public string ResourceGroupName { get; set; }
4649

47-
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = AzureVMClassicComputeParameterSet, HelpMessage = ParamHelpMsg.Common.WorkloadType)]
48-
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, ParameterSetName = AzureVMComputeParameterSet, HelpMessage = ParamHelpMsg.Common.WorkloadType)]
50+
[Parameter(Mandatory = true, ParameterSetName = AzureVMClassicComputeParameterSet, HelpMessage = ParamHelpMsg.Common.WorkloadType)]
51+
[Parameter(Mandatory = true, ParameterSetName = AzureVMComputeParameterSet, HelpMessage = ParamHelpMsg.Common.WorkloadType)]
4952
public WorkloadType WorkLoadType { get; set; }
5053

5154
[Parameter(Mandatory = true, HelpMessage = ParamHelpMsg.Policy.ProtectionPolicy)]
5255
[ValidateNotNullOrEmpty]
5356
public AzureRmRecoveryServicesPolicyBase Policy { get; set; }
5457

55-
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsg.Item.ProtectedItem, ValueFromPipeline = true)]
58+
[Parameter(Mandatory = true, ParameterSetName = ModifyProtectionParameterSet, HelpMessage = ParamHelpMsg.Item.ProtectedItem, ValueFromPipeline = true)]
5659
[ValidateNotNullOrEmpty]
5760
public AzureRmRecoveryServicesItemBase Item { get; set; }
5861

@@ -81,19 +84,30 @@ public override void ExecuteCmdlet()
8184
// Track Response and display job details
8285
// -- TBD to move it to common helper and remove hard-coded vaules
8386

84-
var response = HydraAdapter.GetProtectedItemOperationStatusByURL(jobResponse.AzureAsyncOperation);
85-
while (response.OperationStatus.Status == "InProgress")
86-
{
87-
response = HydraAdapter.GetProtectedItemOperationStatusByURL(jobResponse.AzureAsyncOperation);
88-
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5));
89-
}
87+
var response = OperationStatusHelper.TrackOperationStatus(jobResponse, HydraAdapter);
9088

91-
if(response.OperationStatus.Status == "Completed")
89+
if (response.OperationStatus.Status == HydraModel.OperationStatusValues.Succeeded)
9290
{
93-
// TBD -- Hydra change to add jobId in OperationStatusExtendedInfo
94-
string jobId = ""; //response.OperationStatus.Properties.jobId;
91+
var jobStatusResponse = (HydraModel.OperationStatusJobExtendedInfo)response.OperationStatus.Properties;
92+
string jobId = jobStatusResponse.JobId;
9593
var job = HydraAdapter.GetJob(jobId);
96-
//WriteObject(ConversionHelpers.GetJobModel(job));
94+
WriteObject(JobConversions.GetPSJob(job));
95+
}
96+
else if(response.OperationStatus.Status == HydraModel.OperationStatusValues.Failed)
97+
{
98+
var jobStatusResponse = (HydraModel.OperationStatusJobExtendedInfo)response.OperationStatus.Properties;
99+
if(jobStatusResponse != null || !string.IsNullOrEmpty(jobStatusResponse.JobId))
100+
{
101+
string jobId = jobStatusResponse.JobId;
102+
var job = HydraAdapter.GetJob(jobId);
103+
WriteObject(JobConversions.GetPSJob(job));
104+
}
105+
106+
var errorMessage = string.Format(Resources.EnableProtectionOperationFailed,
107+
response.OperationStatus.OperationStatusError.Code,
108+
response.OperationStatus.OperationStatusError.Message);
109+
110+
throw new Exception(errorMessage);
97111
}
98112
});
99113
}

src/ResourceManager/RecoveryServices.Backup/Commands.RecoveryServices.Backup.Helpers/Commands.RecoveryServices.Backup.Helpers.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<ItemGroup>
5252
<Compile Include="Conversions\JobConversions.cs" />
5353
<Compile Include="Conversions\RecoveryPointConversions.cs" />
54+
<Compile Include="OperationStatusHelper.cs" />
5455
<Compile Include="Utils.cs" />
5556
<Compile Include="Validations\PolicyValidations.cs" />
5657
<Compile Include="Conversions\SchedulePolicyConversions.cs" />
@@ -64,6 +65,10 @@
6465
<Project>{5ee72c53-1720-4309-b54b-5fb79703195f}</Project>
6566
<Name>Commands.Common</Name>
6667
</ProjectReference>
68+
<ProjectReference Include="Commands.RecoveryServices.Backup.HydraAdapter\Commands.RecoveryServices.Backup.HydraAdapter.csproj">
69+
<Project>{b758fec1-35c1-4f93-a954-66dd33f6e0ec}</Project>
70+
<Name>Commands.RecoveryServices.Backup.HydraAdapter</Name>
71+
</ProjectReference>
6772
<ProjectReference Include="..\Commands.RecoveryServices.Backup.Logger\Commands.RecoveryServices.Backup.Logger.csproj">
6873
<Project>{5e675749-6139-464a-904c-59c0ffdfec82}</Project>
6974
<Name>Commands.RecoveryServices.Backup.Logger</Name>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// ----------------------------------------------------------------------------------
2+
//
3+
// Copyright Microsoft Corporation
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
// ----------------------------------------------------------------------------------
14+
15+
using System;
16+
using System.Collections.Specialized;
17+
using System.Web;
18+
using CmdletModel = Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models;
19+
using HydraModel = Microsoft.Azure.Management.RecoveryServices.Backup.Models;
20+
using Microsoft.Azure.Management.RecoveryServices.Backup.Models;
21+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.HydraAdapter;
22+
23+
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers
24+
{
25+
public class OperationStatusHelper
26+
{
27+
public const double defaultOperationStatusRetryTimeInSec = 5.0;
28+
29+
public static BackUpOperationStatusResponse TrackOperationStatus(BaseRecoveryServicesJobResponse jobResponse, HydraAdapter hydraAdapter)
30+
{
31+
var response = hydraAdapter.GetProtectedItemOperationStatusByURL(jobResponse.AzureAsyncOperation);
32+
while (response.OperationStatus.Status == HydraModel.OperationStatusValues.InProgress)
33+
{
34+
response = hydraAdapter.GetProtectedItemOperationStatusByURL(jobResponse.AzureAsyncOperation);
35+
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(defaultOperationStatusRetryTimeInSec));
36+
}
37+
38+
return response;
39+
}
40+
}
41+
}

src/ResourceManager/RecoveryServices.Backup/Commands.RecoveryServices.Backup.Logger/Commands.RecoveryServices.Backup.Logger.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<ItemGroup>
3333
<Reference Include="System" />
3434
<Reference Include="System.Core" />
35+
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
3536
<Reference Include="System.Xml.Linq" />
3637
<Reference Include="System.Data.DataSetExtensions" />
3738
<Reference Include="Microsoft.CSharp" />

src/ResourceManager/RecoveryServices.Backup/Commands.RecoveryServices.Backup.Models/Properties/Resources.Designer.cs

Lines changed: 105 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ResourceManager/RecoveryServices.Backup/Commands.RecoveryServices.Backup.Models/Properties/Resources.resx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,4 +288,42 @@
288288
<data name="ScheduleTimeNotInUTCTimeZoneException" xml:space="preserve">
289289
<value>ScheduleRunTimes in Schedule Policy should be in UTC Timezone</value>
290290
</data>
291+
<data name="InvalidProtectionItemException" xml:space="preserve">
292+
<value>Invalid Item - either NULL or NOT of type: {0}</value>
293+
</data>
294+
<data name="DiscoveryFailure" xml:space="preserve">
295+
<value>Failed to discover VM {0} under {1} {2}. Please make sure names are correct and VM is not deleted"</value>
296+
</data>
297+
<data name="DiscoveryFailureErrorCode" xml:space="preserve">
298+
<value>Discovery operation failed with ErrorCode: {0}</value>
299+
</data>
300+
<data name="DiscoveryFailureErrorMessage" xml:space="preserve">
301+
<value>Going to retry Discovery if retry count is not exceeded"</value>
302+
</data>
303+
<data name="ContainerCountAfterFilter" xml:space="preserve">
304+
<value>Count of containers after BackupManagementType and friendlyName filter = {0}</value>
305+
</data>
306+
<data name="ContainerNotDiscovered" xml:space="preserve">
307+
<value>Container is not discovered</value>
308+
</data>
309+
<data name="VMNotDiscovered" xml:space="preserve">
310+
<value>VM {0} is not yet discovered. Triggering Discovery</value>
311+
</data>
312+
<data name="AzureVMNotFound" xml:space="preserve">
313+
<value>The specified Azure Virtual Machine Not Found. Possible causes are
314+
1. VM does not exist
315+
2. The VM name or the Service name needs to be case sensitive
316+
3. VM is already Protected with same or other Vault. Please Unprotect VM first and then try to protect it again.
317+
318+
Please contact Microsoft for further assistant.</value>
319+
</data>
320+
<data name="InvalidAzureVMName" xml:space="preserve">
321+
<value>Azure VM name can not be null or empty</value>
322+
</data>
323+
<data name="BothCloudServiceNameAndResourceGroupNameShouldNotEmpty" xml:space="preserve">
324+
<value>For Azure VM, both cloud service name and resource group name can not be empty</value>
325+
</data>
326+
<data name="EnableProtectionOperationFailed" xml:space="preserve">
327+
<value>Enable Protection OperationFailed with error code {0} , and error Message {1}</value>
328+
</data>
291329
</root>

src/ResourceManager/RecoveryServices.Backup/Commands.RecoveryServices.Backup.Providers/Commands.RecoveryServices.Backup.Providers.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
</Reference>
4747
<Reference Include="System" />
4848
<Reference Include="System.Core" />
49+
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
4950
<Reference Include="System.Net" />
5051
<Reference Include="System.Xml.Linq" />
5152
<Reference Include="System.Data.DataSetExtensions" />
@@ -92,6 +93,10 @@
9293
<Project>{30b92759-50b3-494e-b9f0-ec9a2ce9d57b}</Project>
9394
<Name>Commands.RecoveryServices.Backup.Models</Name>
9495
</ProjectReference>
96+
<ProjectReference Include="..\Commands.RecoveryServices.Backup.Logger\Commands.RecoveryServices.Backup.Logger.csproj">
97+
<Project>{5e675749-6139-464a-904c-59c0ffdfec82}</Project>
98+
<Name>Commands.RecoveryServices.Backup.Logger</Name>
99+
</ProjectReference>
95100
</ItemGroup>
96101
<ItemGroup>
97102
<None Include="packages.config" />

0 commit comments

Comments
 (0)