/// <summary> /// Given a list of volume containers to be failed over from a source device, /// this method returns the eligibility result, as a failover target, for all /// devices under that resource. /// </summary> /// <param name='operations'> /// The operations group for this extension method. /// </param> /// <param name='sourceDeviceName'> /// The source device name on which failover is performed. /// </param> /// <param name='parameters'> /// ListFailoverTargetsRequest containing the list of volume containers to be /// failed over. /// </param> /// <param name='resourceGroupName'> /// The resource group name /// </param> /// <param name='managerName'> /// The manager name /// </param> public static IEnumerable <FailoverTarget> ListFailoverTargets(this IDevicesOperations operations, string sourceDeviceName, ListFailoverTargetsRequest parameters, string resourceGroupName, string managerName) { return(operations.ListFailoverTargetsAsync(sourceDeviceName, parameters, resourceGroupName, managerName).GetAwaiter().GetResult()); }
/// <summary> /// Given a list of volume containers to be failed over from a source device, /// this method returns the eligibility result, as a failover target, for all /// devices under that resource. /// </summary> /// <param name='operations'> /// The operations group for this extension method. /// </param> /// <param name='sourceDeviceName'> /// The source device name on which failover is performed. /// </param> /// <param name='parameters'> /// ListFailoverTargetsRequest containing the list of volume containers to be /// failed over. /// </param> /// <param name='resourceGroupName'> /// The resource group name /// </param> /// <param name='managerName'> /// The manager name /// </param> /// <param name='cancellationToken'> /// The cancellation token. /// </param> public static async Task <IEnumerable <FailoverTarget> > ListFailoverTargetsAsync(this IDevicesOperations operations, string sourceDeviceName, ListFailoverTargetsRequest parameters, string resourceGroupName, string managerName, CancellationToken cancellationToken = default(CancellationToken)) { using (var _result = await operations.ListFailoverTargetsWithHttpMessagesAsync(sourceDeviceName, parameters, resourceGroupName, managerName, null, cancellationToken).ConfigureAwait(false)) { return(_result.Body); } }
/// <summary> /// Helper method to trigger failover /// </summary> private void Failover(string sourceDeviceName, string targetDeviceName, string targetDeviceId) { //validate source and target device are not same Assert.False(sourceDeviceName.Equals( targetDeviceName, StringComparison.CurrentCultureIgnoreCase)); // Get failover sets from source device var failoverSets = this.Client.Devices.ListFailoverSets( sourceDeviceName, this.ResourceGroupName, this.ManagerName); Assert.NotNull(failoverSets); Assert.NotEmpty(failoverSets); var volumeContainerIds = failoverSets.First().VolumeContainers.Select(vc => vc.VolumeContainerId).ToList(); Assert.NotNull(volumeContainerIds); // Get failover targets ListFailoverTargetsRequest failoverTargetsRequest = new ListFailoverTargetsRequest() { VolumeContainers = volumeContainerIds }; var failoverTargets = this.Client.Devices.ListFailoverTargets( sourceDeviceName, failoverTargetsRequest, this.ResourceGroupName, this.ManagerName); Assert.NotNull(failoverTargets); Assert.NotEmpty(failoverTargets); //validate that target device is eligible var targetDeviceIsValid = failoverTargets.FirstOrDefault(t => t.DeviceId.Equals(targetDeviceId) && t.EligibilityResult.EligibilityStatus.Equals(TargetEligibilityStatus.Eligible)); Assert.NotNull(targetDeviceIsValid); // Create a failover request FailoverRequest failoverRequest = new FailoverRequest() { TargetDeviceId = targetDeviceId, VolumeContainers = volumeContainerIds }; var jobStartTime = new DateTime(2017, 06, 21); // Trigger failover this.Client.Devices.Failover( sourceDeviceName.GetDoubleEncoded(), failoverRequest, this.ResourceGroupName, this.ManagerName); //validate var allFailoverJobs = GetSpecificJobsTypeByManager(this.ManagerName, JobType.FailoverVolumeContainers); var failoverJob = allFailoverJobs.FirstOrDefault( j => j.StartTime > jobStartTime && j.EntityLabel.Equals(sourceDeviceName, StringComparison.CurrentCultureIgnoreCase)); Assert.True(failoverJob != null && failoverJob.Status.Equals(JobStatus.Succeeded), "Failover was not successful."); }