Skip to content

Commit d41382d

Browse files
committed
Merge pull request #205 from MabOneSdk/user/dev1-adit/rsjobs2
User/dev1 adit/rsjobs2
2 parents 6392926 + 59aedd6 commit d41382d

30 files changed

+4353
-122
lines changed

src/ResourceManager/RecoveryServices.Backup/CmdletParameterHelpMessages.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ internal static class Job
5656
public const string JobFilter = "Job whose latest object has to be fetched.";
5757
public const string WaitJobOrListFilter = "Job or List of jobs until end of which the cmdlet should wait.";
5858
public const string WaitJobTimeoutFilter = "Maximum time to wait before aborting wait in seconds.";
59+
public const string StopJobJobIdFilter = "Id of Job to be stopped.";
60+
public const string StopJobJobFilter = "Job to be stopped.";
5961
}
6062

6163
internal static class Item

src/ResourceManager/RecoveryServices.Backup/CmdletWarningAndErrorMessages.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,9 @@ public override void ExecuteCmdlet()
9292
{
9393
// TBD -- Hydra change to add jobId in OperationStatusExtendedInfo
9494
string jobId = ""; //response.OperationStatus.Properties.jobId;
95-
var job = HydraAdapter.GetJob("", "", jobId);
95+
var job = HydraAdapter.GetJob(jobId);
9696
//WriteObject(ConversionHelpers.GetJobModel(job));
9797
}
98-
9998
});
10099
}
101100
}

src/ResourceManager/RecoveryServices.Backup/Cmdlets/Jobs/GetAzureRmRecoveryServicesJob.cs

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Management.Automation;
1818
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models;
1919
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
20+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
2021

2122
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
2223
{
@@ -44,20 +45,18 @@ public class GetAzureRmRecoveryServicesJob : RecoveryServicesBackupCmdletBase
4445

4546
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsg.Job.BackupManagementTypeFilter)]
4647
[ValidateNotNullOrEmpty]
47-
public BackupManagementType BackupManagementType { get; set; }
48+
public BackupManagementType? BackupManagementType { get; set; }
4849

4950
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsg.Job.OperationFilter)]
5051
[ValidateNotNullOrEmpty]
51-
public JobOperation Operation { get; set; }
52+
public JobOperation? Operation { get; set; }
5253

5354
[Parameter(Mandatory = false, HelpMessage = ParamHelpMsg.Job.StatusFilter)]
5455
[ValidateNotNullOrEmpty]
55-
public JobStatus Status { get; set; }
56+
public JobStatus? Status { get; set; }
5657

5758
public override void ExecuteCmdlet()
5859
{
59-
ARSVault Vault = null;
60-
6160
ExecutionBlock(() =>
6261
{
6362
base.ExecuteCmdlet();
@@ -68,22 +67,29 @@ public override void ExecuteCmdlet()
6867

6968
if (From.HasValue)
7069
{
70+
WriteDebug("Entered From filter: " + From.Value);
7171
rangeStart = From.Value;
7272
}
7373

7474
if (To.HasValue)
7575
{
76+
WriteDebug("Entered To filter; " + To.Value);
7677
rangeEnd = To.Value;
7778
}
7879

80+
if (rangeStart.Kind != DateTimeKind.Utc || rangeEnd.Kind != DateTimeKind.Utc)
81+
{
82+
throw new Exception(Resources.JobTimeFiltersShouldBeSpecifiedInUtc);
83+
}
84+
7985
// validate filters
80-
if (rangeEnd >= rangeStart)
86+
if (rangeEnd <= rangeStart)
8187
{
82-
throw new Exception(CmdletWarningAndErrorMessages.Job.ToShouldBeLessThanFrom);
88+
throw new Exception(Resources.JobToShouldBeGreaterThanFrom);
8389
}
8490
else if (rangeEnd.Subtract(rangeStart) > TimeSpan.FromDays(30))
8591
{
86-
throw new Exception(CmdletWarningAndErrorMessages.Job.AllowedDateTimeRangeExceeded);
92+
throw new Exception(Resources.JobAllowedDateTimeRangeExceeded);
8793
}
8894

8995
// validate JobId and Job objects
@@ -92,36 +98,45 @@ public override void ExecuteCmdlet()
9298
// if JobId and Job are provided together and they don't match then throw exception
9399
if (Job != null && JobId != Job.InstanceId)
94100
{
95-
throw new Exception(CmdletWarningAndErrorMessages.Job.JobIdAndJobMismatch);
101+
throw new Exception(Resources.JobJobIdAndJobMismatch);
96102
}
97103
}
98104
else if (Job != null)
99105
{
100106
JobId = Job.InstanceId;
101107
}
102108

103-
// TODO: Initialize Vault object from base cmdlet once support is added
104109
List<AzureRmRecoveryServicesJobBase> result = new List<AzureRmRecoveryServicesJobBase>();
105110
int resultCount = 0;
106-
var adapterResponse = HydraAdapter.GetJobs(Vault.ResouceGroupName, Vault.Name, JobId, Status.ToString(), Operation.ToString(), rangeStart, rangeEnd,
107-
BackupManagementType.ToString());
111+
var adapterResponse = HydraAdapter.GetJobs(JobId,
112+
Status.HasValue ? Status.ToString() : null,
113+
Operation.HasValue ? Operation.ToString() : null,
114+
rangeStart,
115+
rangeEnd,
116+
BackupManagementType.HasValue ? Helpers.JobConversions.GetJobTypeForService(BackupManagementType.Value) : null);
108117
JobConversions.AddHydraJobsToPSList(adapterResponse, result, ref resultCount);
109118

110119
while (!string.IsNullOrEmpty(adapterResponse.ItemList.NextLink))
111120
{
112121
if (resultCount >= JobConstants.MaximumJobsToFetch)
113122
{
114123
// trace a warning that there are more jobs and user has to refine filters.
115-
WriteWarning(CmdletWarningAndErrorMessages.Job.RefineFilters);
124+
WriteWarning(Resources.JobRefineFilters);
116125
break;
117126
}
118127

119128
string skipToken;
120129
HydraHelpers.GetSkipTokenFromNextLink(adapterResponse.ItemList.NextLink, out skipToken);
121130
if (skipToken != null)
122131
{
123-
adapterResponse = HydraAdapter.GetJobs(Vault.ResouceGroupName, Vault.Name, JobId, Status.ToString(), Operation.ToString(),
124-
rangeStart, rangeEnd, BackupManagementType.ToString(), null, skipToken);
132+
adapterResponse = HydraAdapter.GetJobs(JobId,
133+
Status.HasValue ? Status.ToString() : null,
134+
Operation.HasValue ? Operation.ToString() : null,
135+
rangeStart,
136+
rangeEnd,
137+
BackupManagementType.HasValue ? Helpers.JobConversions.GetJobTypeForService(BackupManagementType.Value) : null,
138+
null,
139+
skipToken);
125140
JobConversions.AddHydraJobsToPSList(adapterResponse, result, ref resultCount);
126141
}
127142
else

src/ResourceManager/RecoveryServices.Backup/Cmdlets/Jobs/GetAzureRmRecoveryServicesJobDetails.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ public class GetAzureRmRecoveryServicesJobDetails : RecoveryServicesBackupCmdlet
3434

3535
public override void ExecuteCmdlet()
3636
{
37-
ARSVault Vault = null;
38-
3937
ExecutionBlock(() =>
4038
{
4139
base.ExecuteCmdlet();
@@ -45,8 +43,7 @@ public override void ExecuteCmdlet()
4543
JobId = Job.InstanceId;
4644
}
4745

48-
// Initialize vault object from base cmdlet
49-
var adapterResponse = HydraAdapter.GetJob(Vault.ResouceGroupName, Vault.Name, JobId);
46+
var adapterResponse = HydraAdapter.GetJob(JobId);
5047
WriteObject(JobConversions.GetPSJob(adapterResponse));
5148
});
5249
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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.Generic;
17+
using System.Management.Automation;
18+
using System.Net;
19+
using System.Threading;
20+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models;
21+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
22+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
23+
24+
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
25+
{
26+
[Cmdlet("Stop", "AzureRmBackupJob", DefaultParameterSetName = JobFilterSet), OutputType(typeof(AzureRmRecoveryServicesJobBase))]
27+
public class StopAzureRmRecoveryServicesJob : RecoveryServicesBackupCmdletBase
28+
{
29+
protected const string IdFilterSet = "IdFilterSet";
30+
protected const string JobFilterSet = "JobFilterSet";
31+
32+
[Parameter(Mandatory = true, HelpMessage = ParamHelpMsg.Job.StopJobJobFilter, ParameterSetName = IdFilterSet)]
33+
[ValidateNotNull]
34+
public AzureRmRecoveryServicesJobBase Job { get; set; }
35+
36+
[Parameter(Mandatory = true, HelpMessage = ParamHelpMsg.Job.StopJobJobIdFilter, ParameterSetName = JobFilterSet)]
37+
[ValidateNotNull]
38+
public string JobId { get; set; }
39+
40+
public override void ExecuteCmdlet()
41+
{
42+
ExecutionBlock(() =>
43+
{
44+
base.ExecuteCmdlet();
45+
46+
if (ParameterSetName == JobFilterSet)
47+
{
48+
JobId = Job.InstanceId;
49+
}
50+
51+
var cancelResponse = HydraAdapter.CancelJob(JobId);
52+
string opId = HydraHelpers.GetLastIdFromFullId(cancelResponse.Location);
53+
var cancelStatus = HydraAdapter.GetJobOperationStatus(JobId, opId);
54+
55+
while (cancelStatus.StatusCode == HttpStatusCode.Accepted)
56+
{
57+
Thread.Sleep(15 * 1000);
58+
cancelStatus = HydraAdapter.GetJobOperationStatus(JobId, opId);
59+
}
60+
61+
if (cancelStatus.StatusCode != HttpStatusCode.NoContent)
62+
{
63+
throw new Exception(string.Format(Resources.JobCouldNotCancelJob, cancelStatus.StatusCode.ToString()));
64+
}
65+
else
66+
{
67+
WriteObject(JobConversions.GetPSJob(cancelStatus.Item));
68+
}
69+
});
70+
}
71+
}
72+
}

src/ResourceManager/RecoveryServices.Backup/Cmdlets/Jobs/WaitAzureRmRecoveryServicesJob.cs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@
1717
using System.Management.Automation;
1818
using Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models;
1919
using Microsoft.Azure.Commands.RecoveryServices.Backup.Helpers;
20+
using Microsoft.Azure.Commands.RecoveryServices.Backup.Properties;
2021

2122
namespace Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets
2223
{
2324
[Cmdlet("Wait", "AzureRmBackupJob"), OutputType(typeof(List<AzureRmRecoveryServicesJobBase>), typeof(AzureRmRecoveryServicesJobBase))]
2425
public class WaitAzureRmRecoveryServicesJob : RecoveryServicesBackupCmdletBase
2526
{
26-
[Parameter(Mandatory = true, HelpMessage = ParamHelpMsg.Job.WaitJobOrListFilter)]
27+
[Parameter(Mandatory = true, HelpMessage = ParamHelpMsg.Job.WaitJobOrListFilter, ValueFromPipeline = true)]
2728
[ValidateNotNull]
2829
public object Job { get; set; }
2930

@@ -32,7 +33,6 @@ public class WaitAzureRmRecoveryServicesJob : RecoveryServicesBackupCmdletBase
3233

3334
public override void ExecuteCmdlet()
3435
{
35-
ARSVault Vault = null;
3636
ExecutionBlock(() =>
3737
{
3838
base.ExecuteCmdlet();
@@ -42,12 +42,12 @@ public override void ExecuteCmdlet()
4242

4343
// TODO: Validate the following code
4444
object castedObj;
45-
if (GetCastedObjFromPSObj(Job, typeof(AzureRmRecoveryServicesJobBase), out castedObj))
45+
if (GetCastedObjFromPSObj<AzureRmRecoveryServicesJobBase>(Job, out castedObj))
4646
{
4747
AzureRmRecoveryServicesJobBase justJob = castedObj as AzureRmRecoveryServicesJobBase;
4848
jobsToWaitOn.Add(justJob.InstanceId);
4949
}
50-
else if (GetCastedObjFromPSObj(Job, typeof(List<AzureRmRecoveryServicesJobBase>), out castedObj))
50+
else if (GetCastedObjFromPSObj<List<AzureRmRecoveryServicesJobBase>>(Job, out castedObj))
5151
{
5252
List<AzureRmRecoveryServicesJobBase> jobsList = castedObj as List<AzureRmRecoveryServicesJobBase>;
5353
foreach (var job in jobsList)
@@ -58,7 +58,7 @@ public override void ExecuteCmdlet()
5858
else
5959
{
6060
// not a valid object. throw exception.
61-
throw new Exception(CmdletWarningAndErrorMessages.Job.WaitJobInvalidInput + Job.GetType().FullName);
61+
throw new Exception(string.Format(Resources.JobWaitJobInvalidInput, Job.GetType().FullName));
6262
}
6363

6464
// now wait until timeout happens or all jobs complete execution
@@ -79,7 +79,7 @@ public override void ExecuteCmdlet()
7979
foreach (string jobId in jobsToWaitOn)
8080
{
8181
var updatedJob = JobConversions.GetPSJob(
82-
HydraAdapter.GetJob(Vault.ResouceGroupName, Vault.Name, jobId)
82+
HydraAdapter.GetJob(jobId)
8383
);
8484

8585
if (IsJobInProgress(updatedJob))
@@ -107,23 +107,20 @@ public override void ExecuteCmdlet()
107107
});
108108
}
109109

110-
private bool GetCastedObjFromPSObj(object obj, Type objType, out object castedJob)
110+
private bool GetCastedObjFromPSObj<T>(object obj, out object castedJob) where T : class
111111
{
112112
if (obj is PSObject)
113113
{
114114
obj = ((PSObject)obj).ImmediateBaseObject;
115115
}
116-
// try to cast the immediate object to base object
117-
try
118-
{
119-
castedJob = Convert.ChangeType(obj, objType);
120-
return true;
121-
}
122-
catch (InvalidCastException)
116+
117+
castedJob = obj as T;
118+
119+
if (castedJob == null)
123120
{
124-
castedJob = null;
125121
return false;
126122
}
123+
return true;
127124
}
128125

129126
// Move the following function to a common helper file later when

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@
7373
<Compile Include="Cmdlets\Item\GetAzureRmRecoveryServicesItem.cs" />
7474
<Compile Include="Cmdlets\Jobs\GetAzureRmRecoveryServicesJob.cs" />
7575
<Compile Include="Cmdlets\Jobs\GetAzureRmRecoveryServicesJobDetails.cs" />
76+
<Compile Include="Cmdlets\Jobs\StopAzureRmRecoveryServicesJob.cs" />
7677
<Compile Include="Cmdlets\Jobs\WaitAzureRmRecoveryServicesJob.cs" />
7778
<Compile Include="Cmdlets\ProtectionPolicy\GetAzureRmRecoveryServicesBackupRetentionPolicyObject.cs" />
7879
<Compile Include="Cmdlets\ProtectionPolicy\GetAzureRmRecoveryServicesPolicy.cs" />
7980
<Compile Include="Cmdlets\ProtectionPolicy\GetAzureRmRecoveryServicesSchedulePolicyObject.cs" />
8081
<Compile Include="Cmdlets\ProtectionPolicy\PolicyCmdletHelpers.cs" />
8182
<Compile Include="Cmdlets\ProtectionPolicy\SetAzureRmRecoveryServicesPolicy.cs" />
8283
<Compile Include="Cmdlets\ProtectionPolicy\NewAzureRmRecoveryServicesPolicy.cs" />
83-
<Compile Include="CmdletWarningAndErrorMessages.cs" />
8484
<Compile Include="Constants.cs" />
8585
<Compile Include="Cmdlets\RecoveryPoint\GetAzureRMRecoveryServicesRecoveryPoint.cs" />
8686
<Compile Include="Cmdlets\Restore\RestoreAzureRMRecoveryServicesBackupItem.cs" />

src/ResourceManager/RecoveryServices.Backup/Commands.RecoveryServices.Backup.Helpers/Conversions/ConversionHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public static AzureRmRecoveryServicesPolicyBase GetPolicyModel(ProtectionPolicyR
9191
iaasPolicyModel.RetentionPolicy = PolicyHelpers.GetPSLongTermRetentionPolicy((LongTermRetentionPolicy)
9292
((AzureIaaSVMProtectionPolicy)hydraResponse.Properties).RetentionPolicy);
9393
iaasPolicyModel.SchedulePolicy = PolicyHelpers.GetPSSimpleSchedulePolicyPolicy((SimpleSchedulePolicy)
94-
((AzureIaaSVMProtectionPolicy)hydraResponse.Properties).SchedulePolicy);
94+
((AzureIaaSVMProtectionPolicy)hydraResponse.Properties).SchedulePolicy);
9595
}
9696
else
9797
{

0 commit comments

Comments
 (0)