/// <summary> /// Monitors jobs for specific object id. /// </summary> /// <param name="jobName">Name of the job to monitor.</param> /// <param name="startTime">Start time of job</param> /// <param name="client">SiteRecovery client.</param> /// <param name="requestHeaders">Request headers.</param> public static void MonitorJobs( string jobName, DateTime startTime, SiteRecoveryManagementClient client, CustomRequestHeaders requestHeaders) { bool trackingFinished = false; while (!trackingFinished) { if (!trackingFinished) { Thread.Sleep(new TimeSpan(0, 1, 0)); } JobQueryParameter queryParam = new JobQueryParameter(); JobListResponse jobList = client.Jobs.List(queryParam, requestHeaders); trackingFinished = true; foreach (var job in jobList.Jobs) { if (job.Properties.ScenarioName.Contains(jobName) && job.Properties.State.Equals( "InProgress", StringComparison.InvariantCultureIgnoreCase)) { trackingFinished = false; break; } } } }
public void ExportJobTest() { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); JobQueryParameter jqp = new JobQueryParameter(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var exportJobResponse = (JobOperationResponse)client.Jobs.Export(jqp, RequestHeaders); Assert.True(exportJobResponse != null, "Export Jobs did not return Job Object"); Assert.False(string.IsNullOrEmpty(exportJobResponse.Job.Name), "Job Id Absent"); stopWatch.Stop(); Assert.Equal <string>(exportJobResponse.Job.Properties.State, "Succeeded"); Assert.Equal(HttpStatusCode.OK, exportJobResponse.StatusCode); Assert.True(exportJobResponse.Job.Properties.CustomDetails.InstanceType.Equals( "ExportJobDetails")); Assert.False(string.IsNullOrEmpty( ((ExportJobDetails)exportJobResponse.Job.Properties.CustomDetails).BlobUri)); Assert.False(string.IsNullOrEmpty( ((ExportJobDetails)exportJobResponse.Job.Properties.CustomDetails).SasToken)); } }
/// <summary> /// Queries by Parameters. /// </summary> private void GetByParam() { JobQueryParameter jqp = new JobQueryParameter(); IList <Management.SiteRecovery.Models.Job> completeJobsList = RecoveryServicesClient.GetAzureSiteRecoveryJob().Jobs; IEnumerable <Management.SiteRecovery.Models.Job> filteredJobsList = completeJobsList.ToArray().AsEnumerable(); if (this.StartTime.HasValue) { filteredJobsList = filteredJobsList.Where(j => j.Properties.StartTime.Value.ToUniversalTime().ToBinary() >= this.StartTime.Value.ToUniversalTime().ToBinary()); } if (this.EndTime.HasValue) { filteredJobsList = filteredJobsList.Where(j => j.Properties.EndTime.Value.ToUniversalTime().ToBinary() <= this.EndTime.Value.ToUniversalTime().ToBinary()); } if (this.State != null) { filteredJobsList = filteredJobsList.Where(j => 0 == string.Compare(j.Properties.State.ToString(), this.State.ToString(), StringComparison.OrdinalIgnoreCase)); } if (this.TargetObjectId != null) { filteredJobsList = filteredJobsList.Where(j => 0 == string.Compare(j.Properties.TargetObjectId.ToString(), this.TargetObjectId.ToString(), StringComparison.OrdinalIgnoreCase)); } this.WriteJobs(filteredJobsList.ToList()); }
/// <summary> /// Get the list of all jobs. /// </summary> /// <param name='operations'> /// Reference to the /// Microsoft.Azure.Management.SiteRecovery.IJobOperations. /// </param> /// <param name='parameters'> /// Optional. Job query parameter. /// </param> /// <param name='customRequestHeaders'> /// Optional. Request header parameters. /// </param> /// <returns> /// The response model for the list Jobs operation. /// </returns> public static JobListResponse List(this IJobOperations operations, JobQueryParameter parameters, CustomRequestHeaders customRequestHeaders) { return(Task.Factory.StartNew((object s) => { return ((IJobOperations)s).ListAsync(parameters, customRequestHeaders); } , operations, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).Unwrap().GetAwaiter().GetResult()); }
/// <summary> /// Queries by Parameters. /// </summary> private void GetByParam() { JobQueryParameter jqp = new JobQueryParameter(); if (this.StartTime.HasValue) { jqp.StartTime = this.StartTime.Value.ToUniversalTime().ToBinary().ToString(); } jqp.State = this.State; this.WriteJobs(RecoveryServicesClient.GetAzureSiteRecoveryJob(jqp).Jobs); }
public void ExportJobTest() { int timeToWaitInMins = 2; int waitBeforeRetryInSec = 1; using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); DateTime from = DateTime.Now.ToUniversalTime() - (new TimeSpan(7, 0, 0, 0)); DateTime to = DateTime.Now.ToUniversalTime(); JobQueryParameter jqp = new JobQueryParameter(); jqp.StartTime = from.ToBinary().ToString(); jqp.EndTime = to.ToBinary().ToString(); jqp.AffectedObjectTypes = new List <string>(); jqp.AffectedObjectTypes.Add("Any"); jqp.JobStatus = new List <string>(); jqp.JobStatus.Add("Completed"); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var exportResponse = client.Jobs.Export(jqp, RequestHeaders); Assert.True(exportResponse != null, "Export Jobs did not return Job Object"); Assert.False(string.IsNullOrEmpty(exportResponse.Job.Name), "Job Id Absent"); JobResponse getJobResponse = null; while (stopWatch.Elapsed.Minutes < timeToWaitInMins) { getJobResponse = client.Jobs.Get(exportResponse.Job.Name, RequestHeaders); Assert.True(getJobResponse != null, "Get call on export job returned null"); if (getJobResponse.Job.Properties.State.Equals("Succeeded")) { break; } System.Threading.Thread.Sleep(waitBeforeRetryInSec * 1000); } stopWatch.Stop(); Assert.Equal <string>(getJobResponse.Job.Properties.State, "Succeeded"); Assert.Equal(HttpStatusCode.OK, getJobResponse.StatusCode); Assert.True(getJobResponse.Job.Properties.CustomDetails.InstanceType.Equals( "ExportJobDetails")); Assert.False(string.IsNullOrEmpty( ((ExportJobDetails)getJobResponse.Job.Properties.CustomDetails).BlobUri)); Assert.False(string.IsNullOrEmpty( ((ExportJobDetails)getJobResponse.Job.Properties.CustomDetails).SasToken)); } }
public void GetRPTest() { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); JobQueryParameter jqp = new JobQueryParameter(); var responseRP = client.RecoveryPlan.List(RequestHeaders); var response = client.RecoveryPlan.Get(responseRP.RecoveryPlans[0].ID, RequestHeaders); Assert.NotNull(response.RecoveryPlan); Assert.NotNull(response.RecoveryPlan.ID); Assert.NotNull(response.RecoveryPlan.Name); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } }
public void GetJobTest() { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); JobQueryParameter jqp = new JobQueryParameter(); var responseJobs = client.Jobs.List(jqp, RequestHeaders); string jobId = responseJobs.Jobs[0].ID; var response = client.Jobs.Get(jobId, RequestHeaders); Assert.NotNull(response.Job); Assert.NotNull(response.Job.ID); Assert.NotNull(response.Job.StartTime); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } }
public void EnumerateJobsTest() { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); JobQueryParameter jqp = new JobQueryParameter(); var response = client.Jobs.List(jqp, RequestHeaders); jqp.ObjectId = response.Jobs[0].TargetObjectId; response = client.Jobs.List(jqp, RequestHeaders); Assert.True(response.Jobs.Count > 0, "No Asr jobs found."); Assert.True(response.Jobs.All(job => !string.IsNullOrEmpty(job.ID)), "Job ID can't be null or empty"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } }
public void CancelJobTest() { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); var requestHeaders = RequestHeaders; requestHeaders.AgentAuthenticationHeader = GenerateAgentAuthenticationHeader(requestHeaders.ClientRequestId); JobQueryParameter jqp = new JobQueryParameter(); var responseJobs = client.Jobs.List(jqp, requestHeaders); var response = client.Jobs.Cancel(responseJobs.Jobs[0].ID, RequestHeaders); Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); } }
/// <summary> /// Returns job id of the job. /// </summary> /// <param name="jobName">Name of the job to check for.</param> /// <param name="startTime">Start time of job</param> /// <param name="client">SiteRecovery client.</param> /// <param name="requestHeaders">Request headers.</param> /// <returns>Job object of the job queried.</returns> public static Job GetJobId( string jobName, DateTime startTime, SiteRecoveryManagementClient client, CustomRequestHeaders requestHeaders) { JobQueryParameter queryParam = new JobQueryParameter(); JobListResponse jobList = client.Jobs.List(queryParam, requestHeaders); foreach (var job in jobList.Jobs) { if (job.Properties.ScenarioName.Contains(jobName)) { return(job); } } return(new Job()); }
private void RestartJobTest(string state) { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); var requestHeaders = RequestHeaders; requestHeaders.AgentAuthenticationHeader = GenerateAgentAuthenticationHeader(requestHeaders.ClientRequestId); JobQueryParameter jqp = new JobQueryParameter(); var responseJobs = client.Jobs.List(jqp, RequestHeaders); JobResponse response = null; try { foreach (var job in responseJobs.Jobs) { if (job.State == state) { response = client.Jobs.Restart(job.ID, requestHeaders); } } } catch (CloudException cloudEx) { if (cloudEx.Error.Code == "CannotRemediateSucceededWorkflow" || cloudEx.Error.Code == "CannotRemediateUnfinishedWorkflow" || cloudEx.Error.Code == "FeatureNotAllowed") { // Request was submitted but failed initial validation. // But our scenario of restart job request was accepted, so test succeeded. return; } } Assert.NotNull(response.Job); Assert.NotNull(response.Job.ID); Assert.NotNull(response.Job.StartTime); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } }
public void EnumerateJobsTest() { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); JobQueryParameter queryParam = new JobQueryParameter(); var response = client.Jobs.List(queryParam, RequestHeaders); Assert.True(response.Jobs.Count > 0, "Jobs count can't be less than 1"); Assert.True(response.Jobs.All( protectedContainer => !string.IsNullOrEmpty(protectedContainer.Name)), "Job name can't be null or empty"); Assert.True(response.Jobs.All( protectedContainer => !string.IsNullOrEmpty(protectedContainer.Id)), "Job Id can't be null or empty"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } }
/// <summary> /// Queries by Parameters. /// </summary> private void GetByParam() { JobQueryParameter jqp = new JobQueryParameter(); //if (this.StartTime.HasValue) //{ // jqp.StartTime = // this.StartTime.Value.ToUniversalTime().ToBinary().ToString(); //} //if (this.EndTime.HasValue) //{ // jqp.EndTime = // this.EndTime.Value.ToUniversalTime().ToBinary().ToString(); //} //jqp.State = this.State; //jqp.ObjectId = this.TargetObjectId; this.WriteJobs(RecoveryServicesClient.GetAzureSiteRecoveryJob(jqp).Jobs); }
/// <summary> /// Queries by Parameters. /// </summary> private void GetByParam() { var jqp = new JobQueryParameter(); if (this.StartTime.HasValue) { jqp.StartTime = this.StartTime.Value.ToUniversalTime() .ToString("o"); } if (this.EndTime.HasValue) { jqp.EndTime = this.EndTime.Value.ToUniversalTime() .ToString("o"); } if (this.State != null) { jqp.JobStatus = new List <string>(); jqp.JobStatus.Add(this.State); } var completeJobsList = this.RecoveryServicesClient.GetAzureSiteRecoveryJob(jqp); // Filtering TargetObjectId var filteredJobsList = completeJobsList.ToArray() .AsEnumerable(); if (this.TargetObjectId != null) { filteredJobsList = filteredJobsList.Where( j => 0 == string.Compare( j.Properties.TargetObjectId.ToString(), this.TargetObjectId.ToString(), StringComparison.OrdinalIgnoreCase)); } this.WriteJobs(filteredJobsList.ToList()); }
/// <summary> /// Get Azure Site Recovery Job. /// </summary> /// <returns>Job list response</returns> public List <Job> GetAzureSiteRecoveryJob( JobQueryParameter jqp) { var odataQuery = new ODataQuery <JobQueryParameter>(jqp.ToQueryString()); var firstPage = this.GetSiteRecoveryClient() .ReplicationJobs.ListWithHttpMessagesAsync( odataQuery, this.GetRequestHeaders(true)) .GetAwaiter() .GetResult() .Body; var pages = Utilities.GetAllFurtherPages( this.GetSiteRecoveryClient() .ReplicationJobs.ListNextWithHttpMessagesAsync, firstPage.NextPageLink, this.GetRequestHeaders(true)); pages.Insert( 0, firstPage); return(Utilities.IpageToList(pages)); }
public void DissociateAndDelete() { using (UndoContext context = UndoContext.Current) { JobResponse response = null; context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); var requestHeaders = RequestHeaders; requestHeaders.AgentAuthenticationHeader = GenerateAgentAuthenticationHeader(requestHeaders.ClientRequestId); JobQueryParameter jqp = new JobQueryParameter(); var responseRP = client.ProtectionProfile.List(RequestHeaders); foreach (var profile in responseRP.ProtectionProfiles) { foreach (var associationDetail in profile.AssociationDetail) { if (associationDetail.AssociationStatus == "Paired") { var input = new CreateAndAssociateProtectionProfileInput(); input.AssociationInput.PrimaryProtectionContainerId = associationDetail.PrimaryProtectionContainerId; input.AssociationInput.RecoveryProtectionContainerId = associationDetail.RecoveryProtectionContainerId; response = client.ProtectionProfile.DissociateAndDelete( profile.ID, input, requestHeaders); break; } } } Assert.NotNull(response); Assert.NotNull(response.Job.ID); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } }
/// <summary> /// Exports the details of the Azure Site Recovery jobs of the vault. /// </summary> /// <remarks> /// The operation to export the details of the Azure Site Recovery jobs of the /// vault. /// </remarks> /// <param name='operations'> /// The operations group for this extension method. /// </param> /// <param name='jobQueryParameter'> /// job query filter. /// </param> /// <param name='cancellationToken'> /// The cancellation token. /// </param> public static async Task <Job> BeginExportAsync(this IReplicationJobsOperations operations, JobQueryParameter jobQueryParameter, CancellationToken cancellationToken = default(CancellationToken)) { using (var _result = await operations.BeginExportWithHttpMessagesAsync(jobQueryParameter, null, cancellationToken).ConfigureAwait(false)) { return(_result.Body); } }
/// <summary> /// Exports the details of the Azure Site Recovery jobs of the vault. /// </summary> /// <remarks> /// The operation to export the details of the Azure Site Recovery jobs of the /// vault. /// </remarks> /// <param name='operations'> /// The operations group for this extension method. /// </param> /// <param name='jobQueryParameter'> /// job query filter. /// </param> public static Job BeginExport(this IReplicationJobsOperations operations, JobQueryParameter jobQueryParameter) { return(operations.BeginExportAsync(jobQueryParameter).GetAwaiter().GetResult()); }
public void Update() { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); var requestHeaders = RequestHeaders; requestHeaders.AgentAuthenticationHeader = GenerateAgentAuthenticationHeader(requestHeaders.ClientRequestId); JobQueryParameter jqp = new JobQueryParameter(); var responseRP = client.ProtectionProfile.List(RequestHeaders); string serializedHyperVReplicaAzureProfileManagementInput = null; foreach (var profile in responseRP.ProtectionProfiles) { if (profile.ReplicationProvider == "HyperVReplicaAzure") { string subsId = null; var obj = DataContractUtils <HyperVReplicaAzureProtectionProfileDetails> .Deserialize( profile.ReplicationProviderSetting); var settings = new HyperVReplicaAzureProtectionProfileInput(); settings.AppConsistencyFreq = obj.AppConsistencyFreq; settings.IsEncryptionEnabled = obj.IsEncryptionEnabled; settings.OnlineIrStartTime = obj.OnlineIrStartTime; settings.RecoveryPointHistoryDuration = obj.RecoveryPointHistoryDuration; settings.ReplicationInterval = obj.ReplicationInterval; settings.StorageAccounts = new List <CustomerStorageAccount>(); var storageAccount = new CustomerStorageAccount(); storageAccount.StorageAccountName = obj.ActiveStorageAccount.StorageAccountName; subsId = storageAccount.SubscriptionId; storageAccount.SubscriptionId = "MySubscriptionId"; settings.StorageAccounts.Add(storageAccount); serializedHyperVReplicaAzureProfileManagementInput = DataContractUtils <HyperVReplicaAzureProtectionProfileInput> .Serialize(settings); // update the profile object. var input = new UpdateProtectionProfileInput(); input.ReplicationProviderSettings = serializedHyperVReplicaAzureProfileManagementInput; var responseUpdate = client.ProtectionProfile.Update(input, profile.ID, RequestHeaders); var responseGet = client.ProtectionProfile.Get(profile.ID, RequestHeaders); // check for subsid. Assert.NotNull(responseGet.ProtectionProfile); // revert the temp changes. storageAccount.SubscriptionId = subsId; serializedHyperVReplicaAzureProfileManagementInput = DataContractUtils <HyperVReplicaAzureProtectionProfileInput> .Serialize(settings); input.ReplicationProviderSettings = serializedHyperVReplicaAzureProfileManagementInput; responseUpdate = client.ProtectionProfile.Update( input, profile.ID, requestHeaders); return; } } } }
public void CreateAndAssociateE2A(string provider) { using (UndoContext context = UndoContext.Current) { context.Start(); var client = GetSiteRecoveryClient(CustomHttpHandler); var requestHeaders = RequestHeaders; requestHeaders.AgentAuthenticationHeader = GenerateAgentAuthenticationHeader(requestHeaders.ClientRequestId); JobQueryParameter jqp = new JobQueryParameter(); var responseRP = client.ProtectionProfile.List(RequestHeaders); string serializedHyperVReplicaAzureProfileManagementInput = null; foreach (var profile in responseRP.ProtectionProfiles) { if (profile.AssociationDetail[0].AssociationStatus == "Paired") { // Instead of creating new set of values. Picking the values from already paired cloud. var obj = DataContractUtils <HyperVReplicaAzureProtectionProfileDetails> .Deserialize( profile.ReplicationProviderSetting); var settings = new HyperVReplicaAzureProtectionProfileInput(); settings.AppConsistencyFreq = obj.AppConsistencyFreq; settings.IsEncryptionEnabled = obj.IsEncryptionEnabled; settings.OnlineIrStartTime = obj.OnlineIrStartTime; settings.RecoveryPointHistoryDuration = obj.RecoveryPointHistoryDuration; settings.ReplicationInterval = obj.ReplicationInterval; settings.StorageAccounts = new List <CustomerStorageAccount>(); var storageAccount = new CustomerStorageAccount(); storageAccount.StorageAccountName = obj.ActiveStorageAccount.StorageAccountName; storageAccount.SubscriptionId = obj.ActiveStorageAccount.SubscriptionId; settings.StorageAccounts.Add(storageAccount); serializedHyperVReplicaAzureProfileManagementInput = DataContractUtils <HyperVReplicaAzureProtectionProfileInput> .Serialize(settings); } } var responsePC = client.ProtectionContainer.List(RequestHeaders); foreach (var pc in responsePC.ProtectionContainers) { if (string.IsNullOrWhiteSpace(pc.Role)) { var input = new CreateAndAssociateProtectionProfileInput(); input.ProtectionProfileInput = new CreateProtectionProfileInput(); input.ProtectionProfileInput.Name = "PP1"; input.ProtectionProfileInput.ReplicationProvider = "HyperVReplicaAzure"; input.ProtectionProfileInput.ReplicationProviderSettings = serializedHyperVReplicaAzureProfileManagementInput; input.AssociationInput = new ProtectionProfileAssociationInput(); input.AssociationInput.PrimaryProtectionContainerId = pc.ID; input.AssociationInput.RecoveryProtectionContainerId = AzureProtectionContainerId; client.ProtectionProfile.CreateAndAssociate(input, requestHeaders); } } //Assert.NotNull(response.); //Assert.NotNull(response.RecoveryPlan.ID); //Assert.NotNull(response.RecoveryPlan.Name); //Assert.Equal(HttpStatusCode.OK, response.StatusCode); } }
/// <summary> /// Get the list of all jobs. /// </summary> /// <param name='operations'> /// Reference to the /// Microsoft.Azure.Management.SiteRecovery.IJobOperations. /// </param> /// <param name='parameters'> /// Optional. Job query parameter. /// </param> /// <param name='customRequestHeaders'> /// Optional. Request header parameters. /// </param> /// <returns> /// The response model for the list Jobs operation. /// </returns> public static Task <JobListResponse> ListAsync(this IJobOperations operations, JobQueryParameter parameters, CustomRequestHeaders customRequestHeaders) { return(operations.ListAsync(parameters, customRequestHeaders, CancellationToken.None)); }
/// <summary> /// Get Azure Site Recovery Job. /// </summary> /// <returns>Job list response</returns> public JobListResponse GetAzureSiteRecoveryJob(JobQueryParameter jqp) { return(this.GetSiteRecoveryClient().Jobs.List(jqp, this.GetRequestHeaders(false))); }
/// <summary> /// Export jobs to blob. /// </summary> /// <param name='operations'> /// Reference to the /// Microsoft.Azure.Management.SiteRecovery.IJobOperations. /// </param> /// <param name='parameters'> /// Required. Job Query Filters /// </param> /// <param name='customRequestHeaders'> /// Optional. Request header parameters. /// </param> /// <returns> /// A standard service response for long running operations. /// </returns> public static Task <LongRunningOperationResponse> ExportAsync(this IJobOperations operations, JobQueryParameter parameters, CustomRequestHeaders customRequestHeaders) { return(operations.ExportAsync(parameters, customRequestHeaders, CancellationToken.None)); }