public override void ExecuteCmdlet() { try { if (!ProcessParameters()) { return; } this.ConfirmAction( Force.IsPresent, string.Format(Resources.StartAzureStorSimpleBackupCloneJobWarningMessage, BackupId), string.Format(Resources.StartAzureStorSimpleBackupCloneJobMessage, BackupId), BackupId, () => { JobResponse response = null; var request = new TriggerCloneRequest() { TargetDeviceId = targetDeviceId, BackupSetId = BackupId, SourceSnapshot = Snapshot, ReturnWorkflowId = true, TargetVolName = CloneVolumeName, TargetACRList = TargetAccessControlRecords ?? new List <AccessControlRecord>() }; response = StorSimpleClient.CloneVolume(sourceDeviceId, request); HandleDeviceJobResponse(response, "start"); } ); } catch (Exception ex) { this.HandleException(ex); } }
/// <summary> /// Clone a backup element. /// </summary> /// <param name='sourceDeviceId'> /// Required. The identifier of the source device from which clone is /// to be triggered /// </param> /// <param name='triggerCloneRequest'> /// Required. The parameters required for clone operation /// </param> /// <param name='customRequestHeaders'> /// Required. The Custom Request Headers which client must use /// </param> /// <param name='cancellationToken'> /// Cancellation token. /// </param> /// <returns> /// This is the Job Response for all Device Job Related Calls /// </returns> public async Task <JobResponse> TriggerAsync(string sourceDeviceId, TriggerCloneRequest triggerCloneRequest, CustomRequestHeaders customRequestHeaders, CancellationToken cancellationToken) { // Validate if (sourceDeviceId == null) { throw new ArgumentNullException("sourceDeviceId"); } if (triggerCloneRequest == null) { throw new ArgumentNullException("triggerCloneRequest"); } if (triggerCloneRequest.BackupSetId == null) { throw new ArgumentNullException("triggerCloneRequest.BackupSetId"); } if (triggerCloneRequest.SourceSnapshot == null) { throw new ArgumentNullException("triggerCloneRequest.SourceSnapshot"); } if (triggerCloneRequest.SourceSnapshot.DataContainerId == null) { throw new ArgumentNullException("triggerCloneRequest.SourceSnapshot.DataContainerId"); } if (triggerCloneRequest.SourceSnapshot.Id == null) { throw new ArgumentNullException("triggerCloneRequest.SourceSnapshot.Id"); } if (triggerCloneRequest.SourceSnapshot.Name == null) { throw new ArgumentNullException("triggerCloneRequest.SourceSnapshot.Name"); } if (triggerCloneRequest.SourceSnapshot.VolumeId == null) { throw new ArgumentNullException("triggerCloneRequest.SourceSnapshot.VolumeId"); } if (triggerCloneRequest.TargetACRList != null) { foreach (AccessControlRecord targetACRListParameterItem in triggerCloneRequest.TargetACRList) { if (targetACRListParameterItem.InitiatorName == null) { throw new ArgumentNullException("triggerCloneRequest.TargetACRList.InitiatorName"); } if (targetACRListParameterItem.Name == null) { throw new ArgumentNullException("triggerCloneRequest.TargetACRList.Name"); } } } if (triggerCloneRequest.TargetDeviceId == null) { throw new ArgumentNullException("triggerCloneRequest.TargetDeviceId"); } if (triggerCloneRequest.TargetVolName == null) { throw new ArgumentNullException("triggerCloneRequest.TargetVolName"); } if (customRequestHeaders == null) { throw new ArgumentNullException("customRequestHeaders"); } // Tracing bool shouldTrace = TracingAdapter.IsEnabled; string invocationId = null; if (shouldTrace) { invocationId = TracingAdapter.NextInvocationId.ToString(); Dictionary <string, object> tracingParameters = new Dictionary <string, object>(); tracingParameters.Add("sourceDeviceId", sourceDeviceId); tracingParameters.Add("triggerCloneRequest", triggerCloneRequest); tracingParameters.Add("customRequestHeaders", customRequestHeaders); TracingAdapter.Enter(invocationId, this, "TriggerAsync", tracingParameters); } // Construct URL string url = ""; url = url + "/"; if (this.Client.Credentials.SubscriptionId != null) { url = url + Uri.EscapeDataString(this.Client.Credentials.SubscriptionId); } url = url + "/cloudservices/"; url = url + Uri.EscapeDataString(this.Client.CloudServiceName); url = url + "/resources/"; url = url + Uri.EscapeDataString(this.Client.ResourceNamespace); url = url + "/~/"; url = url + "CisVault"; url = url + "/"; url = url + Uri.EscapeDataString(this.Client.ResourceName); url = url + "/api/devices/"; url = url + Uri.EscapeDataString(sourceDeviceId); url = url + "/clone"; List <string> queryParameters = new List <string>(); queryParameters.Add("api-version=2014-01-01.1.0"); if (queryParameters.Count > 0) { url = url + "?" + string.Join("&", queryParameters); } string baseUrl = this.Client.BaseUri.AbsoluteUri; // Trim '/' character from the end of baseUrl and beginning of url. if (baseUrl[baseUrl.Length - 1] == '/') { baseUrl = baseUrl.Substring(0, baseUrl.Length - 1); } if (url[0] == '/') { url = url.Substring(1); } url = baseUrl + "/" + url; url = url.Replace(" ", "%20"); // Create HTTP transport objects HttpRequestMessage httpRequest = null; try { httpRequest = new HttpRequestMessage(); httpRequest.Method = HttpMethod.Post; httpRequest.RequestUri = new Uri(url); // Set Headers httpRequest.Headers.Add("Accept", "application/xml"); httpRequest.Headers.Add("Accept-Language", customRequestHeaders.Language); httpRequest.Headers.Add("x-ms-client-request-id", customRequestHeaders.ClientRequestId); httpRequest.Headers.Add("x-ms-version", "2014-01-01"); // Set Credentials cancellationToken.ThrowIfCancellationRequested(); await this.Client.Credentials.ProcessHttpRequestAsync(httpRequest, cancellationToken).ConfigureAwait(false); // Serialize Request string requestContent = null; XDocument requestDoc = new XDocument(); XElement cloneRequestV2Element = new XElement(XName.Get("CloneRequest_V2", "http://windowscloudbackup.com/CiS/V2013_03")); requestDoc.Add(cloneRequestV2Element); XElement backupSetIdElement = new XElement(XName.Get("BackupSetId", "http://windowscloudbackup.com/CiS/V2013_03")); backupSetIdElement.Value = triggerCloneRequest.BackupSetId; cloneRequestV2Element.Add(backupSetIdElement); XElement returnWorkflowIdElement = new XElement(XName.Get("ReturnWorkflowId", "http://windowscloudbackup.com/CiS/V2013_03")); returnWorkflowIdElement.Value = triggerCloneRequest.ReturnWorkflowId.ToString().ToLower(); cloneRequestV2Element.Add(returnWorkflowIdElement); XElement sourceSnapshotElement = new XElement(XName.Get("SourceSnapshot", "http://windowscloudbackup.com/CiS/V2013_03")); cloneRequestV2Element.Add(sourceSnapshotElement); XElement dataContainerIdElement = new XElement(XName.Get("DataContainerId", "http://windowscloudbackup.com/CiS/V2013_03")); dataContainerIdElement.Value = triggerCloneRequest.SourceSnapshot.DataContainerId; sourceSnapshotElement.Add(dataContainerIdElement); XElement idElement = new XElement(XName.Get("Id", "http://windowscloudbackup.com/CiS/V2013_03")); idElement.Value = triggerCloneRequest.SourceSnapshot.Id; sourceSnapshotElement.Add(idElement); XElement nameElement = new XElement(XName.Get("Name", "http://windowscloudbackup.com/CiS/V2013_03")); nameElement.Value = triggerCloneRequest.SourceSnapshot.Name; sourceSnapshotElement.Add(nameElement); XElement sizeInBytesElement = new XElement(XName.Get("SizeInBytes", "http://windowscloudbackup.com/CiS/V2013_03")); sizeInBytesElement.Value = triggerCloneRequest.SourceSnapshot.SizeInBytes.ToString(); sourceSnapshotElement.Add(sizeInBytesElement); XElement volumeIdElement = new XElement(XName.Get("VolumeId", "http://windowscloudbackup.com/CiS/V2013_03")); volumeIdElement.Value = triggerCloneRequest.SourceSnapshot.VolumeId; sourceSnapshotElement.Add(volumeIdElement); if (triggerCloneRequest.TargetACRIdList != null) { XElement targetACRIdListSequenceElement = new XElement(XName.Get("TargetACRIdList", "http://windowscloudbackup.com/CiS/V2013_03")); foreach (string targetACRIdListItem in triggerCloneRequest.TargetACRIdList) { XElement targetACRIdListItemElement = new XElement(XName.Get("string", "http://schemas.microsoft.com/2003/10/Serialization/Arrays")); targetACRIdListItemElement.Value = targetACRIdListItem; targetACRIdListSequenceElement.Add(targetACRIdListItemElement); } cloneRequestV2Element.Add(targetACRIdListSequenceElement); } else { XElement emptyElement = new XElement(XName.Get("TargetACRIdList", "http://windowscloudbackup.com/CiS/V2013_03")); XAttribute nilAttribute = new XAttribute(XName.Get("nil", "http://www.w3.org/2001/XMLSchema-instance"), ""); nilAttribute.Value = "true"; emptyElement.Add(nilAttribute); cloneRequestV2Element.Add(emptyElement); } if (triggerCloneRequest.TargetACRList != null) { XElement targetACRListSequenceElement = new XElement(XName.Get("TargetACRList", "http://windowscloudbackup.com/CiS/V2013_03")); foreach (AccessControlRecord targetACRListItem in triggerCloneRequest.TargetACRList) { XElement accessControlRecordElement = new XElement(XName.Get("AccessControlRecord", "http://windowscloudbackup.com/CiS/V2013_03")); targetACRListSequenceElement.Add(accessControlRecordElement); if (targetACRListItem.InstanceId != null) { XElement instanceIdElement = new XElement(XName.Get("InstanceId", "http://windowscloudbackup.com/CiS/V2013_03")); instanceIdElement.Value = targetACRListItem.InstanceId; accessControlRecordElement.Add(instanceIdElement); } XElement nameElement2 = new XElement(XName.Get("Name", "http://windowscloudbackup.com/CiS/V2013_03")); nameElement2.Value = targetACRListItem.Name; accessControlRecordElement.Add(nameElement2); if (targetACRListItem.GlobalId != null) { XElement globalIdElement = new XElement(XName.Get("GlobalId", "http://schemas.datacontract.org/2004/07/Microsoft.Internal.CiS.Service.Interface.Portal")); globalIdElement.Value = targetACRListItem.GlobalId; accessControlRecordElement.Add(globalIdElement); } else { XElement emptyElement2 = new XElement(XName.Get("GlobalId", "http://schemas.datacontract.org/2004/07/Microsoft.Internal.CiS.Service.Interface.Portal")); XAttribute nilAttribute2 = new XAttribute(XName.Get("nil", "http://www.w3.org/2001/XMLSchema-instance"), ""); nilAttribute2.Value = "true"; emptyElement2.Add(nilAttribute2); accessControlRecordElement.Add(emptyElement2); } XElement operationInProgressElement = new XElement(XName.Get("OperationInProgress", "http://windowscloudbackup.com/CiS/V2013_03")); operationInProgressElement.Value = targetACRListItem.OperationInProgress.ToString(); accessControlRecordElement.Add(operationInProgressElement); XElement initiatorNameElement = new XElement(XName.Get("InitiatorName", "http://windowscloudbackup.com/CiS/V2013_03")); initiatorNameElement.Value = targetACRListItem.InitiatorName; accessControlRecordElement.Add(initiatorNameElement); XElement volumeCountElement = new XElement(XName.Get("VolumeCount", "http://windowscloudbackup.com/CiS/V2013_03")); volumeCountElement.Value = targetACRListItem.VolumeCount.ToString(); accessControlRecordElement.Add(volumeCountElement); } cloneRequestV2Element.Add(targetACRListSequenceElement); } XElement targetDeviceIdElement = new XElement(XName.Get("TargetDeviceId", "http://windowscloudbackup.com/CiS/V2013_03")); targetDeviceIdElement.Value = triggerCloneRequest.TargetDeviceId; cloneRequestV2Element.Add(targetDeviceIdElement); XElement targetVolNameElement = new XElement(XName.Get("TargetVolName", "http://windowscloudbackup.com/CiS/V2013_03")); targetVolNameElement.Value = triggerCloneRequest.TargetVolName; cloneRequestV2Element.Add(targetVolNameElement); requestContent = requestDoc.ToString(); httpRequest.Content = new StringContent(requestContent, Encoding.UTF8); httpRequest.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/xml; charset=utf-8"); // Send Request HttpResponseMessage httpResponse = null; try { if (shouldTrace) { TracingAdapter.SendRequest(invocationId, httpRequest); } cancellationToken.ThrowIfCancellationRequested(); httpResponse = await this.Client.HttpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false); if (shouldTrace) { TracingAdapter.ReceiveResponse(invocationId, httpResponse); } HttpStatusCode statusCode = httpResponse.StatusCode; if (statusCode != HttpStatusCode.Accepted) { cancellationToken.ThrowIfCancellationRequested(); CloudException ex = CloudException.Create(httpRequest, requestContent, httpResponse, await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false)); if (shouldTrace) { TracingAdapter.Error(invocationId, ex); } throw ex; } // Create Result JobResponse result = null; // Deserialize Response if (statusCode == HttpStatusCode.Accepted) { cancellationToken.ThrowIfCancellationRequested(); string responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); result = new JobResponse(); XDocument responseDoc = XDocument.Parse(responseContent); XElement stringElement = responseDoc.Element(XName.Get("string", "http://schemas.microsoft.com/2003/10/Serialization/")); if (stringElement != null) { string stringInstance = stringElement.Value; result.JobId = stringInstance; } } result.StatusCode = statusCode; if (httpResponse.Headers.Contains("x-ms-request-id")) { result.RequestId = httpResponse.Headers.GetValues("x-ms-request-id").FirstOrDefault(); } if (shouldTrace) { TracingAdapter.Exit(invocationId, result); } return(result); } finally { if (httpResponse != null) { httpResponse.Dispose(); } } } finally { if (httpRequest != null) { httpRequest.Dispose(); } } }
public void CloneScenarioSingleDeviceTest() { using (var context = UndoContext.Current) { context.Start(); var client = GetServiceClient <StorSimpleManagementClient>(); // Listing all Devices var devices = client.Devices.List(GetCustomRequestHeaders()); // Asserting that atleast One Device is returned. Assert.True(devices != null); Assert.True(devices.Any()); var actualdeviceId = devices.FirstOrDefault().DeviceId; actualdeviceId = actualdeviceId.Trim(); CustomRequestHeaders hdrs = new CustomRequestHeaders(); hdrs.ClientRequestId = Guid.NewGuid().ToString(); hdrs.Language = "en-us"; //Get service configuration var serviceConfigList = client.ServiceConfig.Get(GetCustomRequestHeaders()); Assert.True(serviceConfigList != null); var existingSac = serviceConfigList.CredentialChangeList.Updated.FirstOrDefault(); Assert.True(existingSac != null); var dataContainerName = TestUtilities.GenerateName("DCName"); // new Data container request object var dc = new DataContainerRequest(); dc.IsDefault = false; dc.Name = dataContainerName; dc.BandwidthRate = 256; dc.VolumeCount = 0; dc.IsEncryptionEnabled = false; dc.PrimaryStorageAccountCredential = existingSac; //Create DataContainer call var taskStatus = client.DataContainer.Create(actualdeviceId, dc, hdrs); //Assert the job status Assert.NotNull(taskStatus); Assert.True(taskStatus.Status == AsyncTaskStatus.Completed); Assert.True(taskStatus.Result == AsyncTaskResult.Succeeded); //Get Data Container call var Createddatacontainer = client.DataContainer.Get(actualdeviceId, dataContainerName, hdrs); //Assert the returned data container object Assert.True(Createddatacontainer != null); Assert.True(Createddatacontainer.DataContainerInfo.Name.Equals(dataContainerName)); //ACR list for Virtual disk creation List <AccessControlRecord> acrList = new List <AccessControlRecord>(); for (var i = 0; i < 1; i++) { AccessControlRecord acr = new AccessControlRecord() { Name = TestUtilities.GenerateName("VDnewTestAcr"), InitiatorName = TestUtilities.GenerateName("VDinitiator") + i }; acrList.Add(acr); } //Virtual disk create request object var virtualDiskToCreate = new VirtualDiskRequest() { Name = TestUtilities.GenerateName("VD1Name"), AccessType = AccessType.ReadWrite, AcrList = acrList, AppType = AppType.PrimaryVolume, IsDefaultBackupEnabled = true, SizeInBytes = 10737418240, DataContainer = Createddatacontainer.DataContainerInfo, Online = true }; //Virtual disk create call taskStatus = client.VirtualDisk.Create(actualdeviceId, virtualDiskToCreate, hdrs); //Asserting the job status Assert.NotNull(taskStatus); Assert.True(taskStatus.Status == AsyncTaskStatus.Completed); Assert.True(taskStatus.Result == AsyncTaskResult.Succeeded); //Virtual disk get call var createdVirtualDisk = client.VirtualDisk.GetByName(actualdeviceId, virtualDiskToCreate.Name, hdrs); Assert.True(createdVirtualDisk != null); Assert.True(createdVirtualDisk.VirtualDiskInfo.Name.Equals(virtualDiskToCreate.Name)); var volumeIds = new List <string>(); volumeIds.Add(createdVirtualDisk.VirtualDiskInfo.InstanceId); var dailySchedule = new BackupScheduleBase(); dailySchedule.BackupType = BackupType.CloudSnapshot; dailySchedule.Status = ScheduleStatus.Enabled; dailySchedule.RetentionCount = 5; dailySchedule.StartTime = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz"); dailySchedule.Recurrence = new ScheduleRecurrence(); dailySchedule.Recurrence.RecurrenceType = RecurrenceType.Daily; dailySchedule.Recurrence.RecurrenceValue = 5; var backupPolicyToCreate = new NewBackupPolicyConfig(); backupPolicyToCreate.Name = TestUtilities.GenerateName("PolicyName"); backupPolicyToCreate.VolumeIds = volumeIds; backupPolicyToCreate.BackupSchedules = new List <BackupScheduleBase>(); backupPolicyToCreate.BackupSchedules.Add(dailySchedule); //BackupPolicy create call taskStatus = client.BackupPolicy.Create(actualdeviceId, backupPolicyToCreate, hdrs); //Asserting the job status Assert.NotNull(taskStatus); Assert.True(taskStatus.Status == AsyncTaskStatus.Completed); Assert.True(taskStatus.Result == AsyncTaskResult.Succeeded); //BackupPolicy list call var allBackupPolicies = client.BackupPolicy.List(actualdeviceId, hdrs); //Assert the returned BackupPolicy object Assert.True(allBackupPolicies != null); Assert.True(allBackupPolicies.Any()); //BackupPolicy get by name call var createdBackupPolicy = client.BackupPolicy.GetBackupPolicyDetailsByName(actualdeviceId, backupPolicyToCreate.Name, hdrs); //Assert the returned BackupPolicy object Assert.True(createdBackupPolicy != null); Assert.True(createdBackupPolicy.BackupPolicyDetails.Name.Equals(backupPolicyToCreate.Name)); BackupNowRequest backupNowRequest = new BackupNowRequest(); backupNowRequest.Type = BackupType.CloudSnapshot; //BackupSets Create call taskStatus = client.Backup.Create(actualdeviceId, createdBackupPolicy.BackupPolicyDetails.InstanceId, backupNowRequest, hdrs); //Asserting the job status Assert.NotNull(taskStatus); Assert.True(taskStatus.Status == AsyncTaskStatus.Completed); Assert.True(taskStatus.Result == AsyncTaskResult.Succeeded); GetBackupResponse backupSetResult; do { //BackupSets Get call backupSetResult = client.Backup.Get(actualdeviceId, "BackupPolicy", Boolean.TrueString, null, null, null, null, null, hdrs); Assert.True(backupSetResult != null); Assert.True(backupSetResult.BackupSetsList != null); TestUtilities.Wait(1000); } while (!backupSetResult.BackupSetsList.Any()); var backupSet = backupSetResult.BackupSetsList.First(); var clonedVolName = createdVirtualDisk.VirtualDiskInfo.Name + "_Cloned"; var triggerCloneRequest = new TriggerCloneRequest() { BackupSetId = backupSet.InstanceId, TargetDeviceId = actualdeviceId, SourceSnapshot = backupSet.Snapshots.First(), TargetVolName = clonedVolName, ReturnWorkflowId = true, TargetACRList = createdVirtualDisk.VirtualDiskInfo.AcrList }; var jobResponse = client.CloneVolume.Trigger(actualdeviceId, triggerCloneRequest, GetCustomRequestHeaders()); //Asserting the job id. Assert.NotNull(jobResponse); Assert.True(jobResponse.JobId != Guid.Empty.ToString()); GetDeviceJobResponse deviceJobResponse; do { //DeviceJob Get call deviceJobResponse = client.DeviceJob.Get(actualdeviceId, null, null, jobResponse.JobId, null, null, 0, 10, hdrs); TestUtilities.Wait(1000); Assert.True(deviceJobResponse.DeviceJobList != null); Assert.True(deviceJobResponse.DeviceJobList.Count == 1); } while (deviceJobResponse.DeviceJobList.First().Status.Equals("Running", StringComparison.InvariantCultureIgnoreCase)); Assert.True(deviceJobResponse.DeviceJobList != null); Assert.True(deviceJobResponse.DeviceJobList.First().Status.Equals("Completed", StringComparison.InvariantCultureIgnoreCase)); VirtualDiskGetResponse virtualDiskGetResponse = client.VirtualDisk.GetByName(actualdeviceId, clonedVolName, GetCustomRequestHeaders()); Assert.True(virtualDiskGetResponse != null); Assert.True(virtualDiskGetResponse.VirtualDiskInfo != null); Assert.True(virtualDiskGetResponse.VirtualDiskInfo.Name.Equals(clonedVolName, StringComparison.InvariantCultureIgnoreCase)); } }
public JobResponse CloneVolume(string deviceId, TriggerCloneRequest request) { return(this.GetStorSimpleClient().CloneVolume.Trigger(deviceId, request, this.GetCustomRequestHeaders())); }
/// <summary> /// Clone a backup element. /// </summary> /// <param name='operations'> /// Reference to the /// Microsoft.WindowsAzure.Management.StorSimple.ICloneVolumeOperations. /// </param> /// <param name='sourceDeviceId'> /// Required. The identifier of the source device from which clone is /// to be triggered /// </param> /// <param name='triggerCloneRequest'> /// Required. The parameters required for clone operation /// </param> /// <param name='customRequestHeaders'> /// Required. The Custom Request Headers which client must use /// </param> /// <returns> /// This is the Job Response for all Device Job Related Calls /// </returns> public static Task <JobResponse> TriggerAsync(this ICloneVolumeOperations operations, string sourceDeviceId, TriggerCloneRequest triggerCloneRequest, CustomRequestHeaders customRequestHeaders) { return(operations.TriggerAsync(sourceDeviceId, triggerCloneRequest, customRequestHeaders, CancellationToken.None)); }
/// <summary> /// Clone a backup element. /// </summary> /// <param name='operations'> /// Reference to the /// Microsoft.WindowsAzure.Management.StorSimple.ICloneVolumeOperations. /// </param> /// <param name='sourceDeviceId'> /// Required. The identifier of the source device from which clone is /// to be triggered /// </param> /// <param name='triggerCloneRequest'> /// Required. The parameters required for clone operation /// </param> /// <param name='customRequestHeaders'> /// Required. The Custom Request Headers which client must use /// </param> /// <returns> /// This is the Job Response for all Device Job Related Calls /// </returns> public static JobResponse Trigger(this ICloneVolumeOperations operations, string sourceDeviceId, TriggerCloneRequest triggerCloneRequest, CustomRequestHeaders customRequestHeaders) { return(Task.Factory.StartNew((object s) => { return ((ICloneVolumeOperations)s).TriggerAsync(sourceDeviceId, triggerCloneRequest, customRequestHeaders); } , operations, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).Unwrap().GetAwaiter().GetResult()); }