private void StartRPIPlannedFailover()
{
var plannedFailoverInputProperties = new PlannedFailoverInputProperties()
{
FailoverDirection = this.Direction,
ProviderSpecificDetails = new ProviderSpecificFailoverInput()
};
var input = new PlannedFailoverInput()
{
Properties = plannedFailoverInputProperties
};
if (0 == string.Compare(
this.ReplicationProtectedItem.ReplicationProvider,
Constants.HyperVReplicaAzure,
StringComparison.OrdinalIgnoreCase))
{
if (this.Direction == Constants.PrimaryToRecovery)
{
var failoverInput = new HyperVReplicaAzureFailoverProviderInput()
{
PrimaryKekCertificatePfx = primaryKekCertpfx,
SecondaryKekCertificatePfx = secondaryKekCertpfx,
VaultLocation = this.GetCurrentVaultLocation()
};
input.Properties.ProviderSpecificDetails = failoverInput;
}
else
{
var failbackInput = new HyperVReplicaAzureFailbackProviderInput()
{
DataSyncOption = this.Optimize == Constants.ForDownTime ? Constants.ForDownTime : Constants.ForSynchronization,
RecoveryVmCreationOption = String.Compare(this.CreateVmIfNotFound, Constants.Yes, StringComparison.OrdinalIgnoreCase) == 0 ? Constants.CreateVmIfNotFound : Constants.NoAction
};
if (String.Compare(this.CreateVmIfNotFound, Constants.Yes, StringComparison.OrdinalIgnoreCase) == 0 &&
string.Compare(RecoveryServicesClient.GetAzureSiteRecoveryFabric(this.fabricName).Fabric.Properties.CustomDetails.InstanceType, Constants.HyperVSite) == 0)
{
if (this.ServicesProvider == null || string.Compare(this.ServicesProvider.FabricType, Constants.HyperVSite) != 0)
{
throw new InvalidOperationException(
Properties.Resources.ImproperServerObjectPassedForHyperVFailback);
}
else
{
failbackInput.ProviderIdForAlternateRecovery = this.ServicesProvider.ID;
}
}
input.Properties.ProviderSpecificDetails = failbackInput;
}
}
LongRunningOperationResponse response =
RecoveryServicesClient.StartAzureSiteRecoveryPlannedFailover(
this.fabricName,
this.protectionContainerName,
this.ReplicationProtectedItem.Name,
input);
JobResponse jobResponse =
RecoveryServicesClient
.GetAzureSiteRecoveryJobDetails(PSRecoveryServicesClient.GetJobIdFromReponseLocation(response.Location));
WriteObject(new ASRJob(jobResponse.Job));
}