Skip to content

ASR support for Azure zone to zone replication #11785

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 4, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,21 @@ function getPrimaryLocation
return "westus"
}

function getPrimaryZoneLocation
{
return "southeastasia"
}

function getPrimaryZone
{
return "1"
}

function getRecoveryZone
{
return "2"
}

function getRecoveryLocation{
return getVaultLocation
}
Expand Down Expand Up @@ -83,6 +98,9 @@ function getPrimaryContainerMapping{
return "A2APCM"+ $seed;
}

function getRecoveryPlanName{
return "A2ARP"+ $seed;
}

function getRecoveryContainerMapping{
return "A2ARCM"+ $seed;
Expand Down Expand Up @@ -172,6 +190,23 @@ function createAzureVmInProximityPlacementgroup{
return $vm.Id
}

function createAzureVmInAvailabilityZone{
param([string]$primaryLocation)

$VMLocalAdminUser = "adminUser"
$PasswordString = $(Get-RandomSuffix 12)
$Password=$PasswordString| ConvertTo-SecureString -Force -AsPlainText
$VMLocalAdminSecurePassword = $Password
$VMLocation = getPrimaryZoneLocation
$VMZone = getPrimaryZone
$VMName = getAzureVmName
$domain = "domain"+ $seed
$password=$VMLocalAdminSecurePassword|ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ($VMLocalAdminUser, $password);
$vm = New-AzVM -Name $VMName -Credential $Credential -location $VMLocation -Image RHEL -DomainNameLabel $domain -Zone $VMZone
return $vm.Id
}

function createRecoveryNetworkId{
param([string] $location , [string] $resourceGroup)

Expand All @@ -187,6 +222,21 @@ function createRecoveryNetworkId{
return $virtualNetwork.Id
}

function createRecoveryNetworkIdForZone{
param([string] $location , [string] $resourceGroup)

$NetworkName = getRecoveryNetworkName
$NetworkLocation = getPrimaryZoneLocation
$ResourceGroupName = getRecoveryResourceGroupName
$frontendSubnet = New-AzVirtualNetworkSubnetConfig -Name frontendSubnet -AddressPrefix "10.0.1.0/24"
$virtualNetwork = New-AzVirtualNetwork `
-ResourceGroupName $ResourceGroupName `
-Location $NetworkLocation `
-Name $NetworkName `
-AddressPrefix 10.0.0.0/16 -Subnet $frontendSubnet
return $virtualNetwork.Id
}

function createCacheStorageAccount{
param([string] $location , [string] $resourceGroup)

Expand All @@ -201,6 +251,21 @@ function createCacheStorageAccount{
return $storageAccount.Id
}

function createCacheStorageAccountForZone{
param([string] $location , [string] $resourceGroup)

$StorageAccountName = getCacheStorageAccountName
$cacheLocation = getPrimaryZoneLocation
$storageRes = getAzureVmName
$storageAccount = New-AzStorageAccount `
-ResourceGroupName $storageRes `
-Location $cacheLocation `
-Name $StorageAccountName `
-Type 'Standard_LRS'
return $storageAccount.Id
}



function createRecoveryCacheStorageAccount{
param([string] $location , [string] $resourceGroup)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,5 +96,19 @@ public void A2AReplicateProximityPlacementGroupVm()
{
this.RunPowerShellTest(_logger, Constants.NewModel, "Test-ReplicateProximityPlacementGroupVm");
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void A2AZoneToZoneRecoveryPlanReplication()
{
this.RunPowerShellTest(_logger, Constants.NewModel, "Test-ZoneToZoneRecoveryPlanReplication");
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void A2ARecoveryPlanReplication()
{
this.RunPowerShellTest(_logger, Constants.NewModel, "Test-RecoveryPlanReplication");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -547,4 +547,251 @@ function Test-ReplicateProximityPlacementGroupVm{

$pe = Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $rc -Name $vmName
Assert-NotNull($pe.providerSpecificDetails.RecoveryProximityPlacementGroupId)
}
}

<#
.SYNOPSIS
Test ZoneToZoneRecoveryPlanReplication new parametersets
#>

function Test-ZoneToZoneRecoveryPlanReplication{
param([string] $seed ='347')
$primaryPolicyName = getPrimaryPolicy
$recoveryPolicyName = getRecoveryPolicy

$primaryContainerMappingName = getPrimaryContainerMapping
$recoveryContainerMappingName = getRecoveryContainerMapping

$primaryContainerName = getPrimaryContainer
$recoveryContainerName = getRecoveryContainer
$vaultRgLocation = getPrimaryZoneLocation
$vaultName = getVaultName
$vaultLocation = getPrimaryZoneLocation
$vaultRg = getVaultRg
$primaryLocation = getPrimaryZoneLocation
$recoveryLocation = getPrimaryZoneLocation
$primaryFabricName = getPrimaryFabric
$RecoveryReplicaDiskAccountType = "Premium_LRS"
$RecoveryTargetDiskAccountType = "Premium_LRS"
$policyName = getPrimaryPolicy
$mappingName = getPrimaryContainerMapping
$recZone = getRecoveryZone
$priZone = getPrimaryZone
$RecoveryPlanName = getRecoveryPlanName

#create recovery side resources
$recRgName = getRecoveryResourceGroupName
New-AzResourceGroup -name $recRgName -location $recoveryLocation -force
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
$RecoveryAzureNetworkId = createRecoveryNetworkIdForZone
$index =$RecoveryAzureNetworkId.IndexOf("/providers/")
$recRg =$RecoveryAzureNetworkId.Substring(0,$index)

#create primary
$vmName = getAzureVmName
New-AzResourceGroup -name $vmName -location $primaryLocation -force
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
$logStg = createCacheStorageAccountForZone

$v2VmId = createAzureVmInAvailabilityZone
$vm = get-azVm -ResourceGroupName $vmName -Name $vmName
$vhdid =$vm.StorageProfile.OSDisk.ManagedDisk.Id
$index =$vm.Id.IndexOf("/providers/")
$Rg =$vm.Id.Substring(0,$index)
$PrimaryAzureNetworkId = $Rg + "/providers/Microsoft.Network/virtualNetworks/" + $vmName

# vault Creation
New-AzResourceGroup -name $vaultRg -location $vaultRgLocation -force
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
New-AzRecoveryServicesVault -ResourceGroupName $vaultRg -Name $vaultName -Location $vaultLocation
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
$Vault = Get-AzRecoveryServicesVault -ResourceGroupName $vaultRg -Name $vaultName
Set-ASRVaultContext -Vault $Vault

# fabric Creation
$fabJob= New-AzRecoveryServicesAsrFabric -Azure -Name $primaryFabricName -Location $primaryLocation
WaitForJobCompletion -JobId $fabJob.Name
$fab = Get-AzRecoveryServicesAsrFabric -Name $primaryFabricName
Assert-true { $fab.name -eq $primaryFabricName }
Assert-AreEqual $fab.FabricSpecificDetails.Location $primaryLocation

$pf = get-asrFabric -Name $primaryFabricName

#Container creation
$job = New-AzRecoveryServicesAsrProtectionContainer -Name $primaryContainerName -Fabric $pf
WaitForJobCompletion -JobId $Job.Name
$pc = Get-asrProtectionContainer -name $primaryContainerName -Fabric $pf
Assert-NotNull($pc)
$job = New-AzRecoveryServicesAsrProtectionContainer -Name $recoveryContainerName -Fabric $pf
WaitForJobCompletion -JobId $Job.Name
$rc = Get-asrProtectionContainer -name $recoveryContainerName -Fabric $pf
Assert-NotNull($rc)

#create policy and mapping
$job = New-AzRecoveryServicesAsrPolicy -Name $policyName -RecoveryPointRetentionInHours 12 -AzureToAzure
WaitForJobCompletion -JobId $job.Name
$policy = Get-AzRecoveryServicesAsrPolicy -Name $policyName
$job = New-AzRecoveryServicesAsrProtectionContainerMapping -Name $mappingName -Policy $policy -PrimaryProtectionContainer $pc -RecoveryProtectionContainer $rc
WaitForJobCompletion -JobId $job.Name
$mapping = Get-AzRecoveryServicesAsrProtectionContainerMapping -Name $mappingName -ProtectionContainer $pc

#enable Replication
$v = New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig -managed -LogStorageAccountId $logStg `
-DiskId $vhdid -RecoveryResourceGroupId $recRg -RecoveryReplicaDiskAccountType $RecoveryReplicaDiskAccountType `
-RecoveryTargetDiskAccountType $RecoveryTargetDiskAccountType
$enableDRjob = New-AzRecoveryServicesAsrReplicationProtectedItem -AzureToAzure -AzureVmId $vm.Id -Name $vmName -ProtectionContainerMapping $mapping -RecoveryResourceGroupId $recRg -AzureToAzureDiskReplicationConfiguration $v -RecoveryAvailabilityZone $recZone -RecoveryAzureNetworkId $RecoveryAzureNetworkId -RecoveryAzureSubnetName "frontendSubnet"
WaitForJobCompletion -JobId $enableDRjob.Name
WaitForIRCompletion -affectedObjectId $enableDRjob.TargetObjectId

$pe = Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $pc -Name $vmName
Assert-NotNull($pe)

#Create Recovery Plan
$createRecoveryJob = New-AzRecoveryServicesAsrRecoveryPlan -AzureZoneToZone -Name $RecoveryPlanName -PrimaryFabric $pf -ReplicationProtectedItem $pe -RecoveryZone $recZone -PrimaryZone $priZone
WaitForJobCompletion -JobId $createRecoveryJob.Name

#Get Recovery Plan
$RecoveryPlan = Get-AzRecoveryServicesAsrRecoveryPlan -Name $RecoveryPlanName
Assert-NotNull($RecoveryPlan)

#Failover
$failoverjob = Start-AzRecoveryServicesAsrUnPlannedFailoverJob -RecoveryPlan $RecoveryPlan -Direction PrimaryToRecovery -PerformSourceSideAction
WaitForJobCompletion -JobId $failoverjob.Name
#Get recovery vm and verify
$recvm = get-azVm -ResourceGroupName $recRgName -Name $vmName
Assert-NotNull($recvm.Zones);

$pe = Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $pc -Name $vmName
Assert-NotNull($pe)

#Get Recovery Plan
$RecoveryPlan = Get-AzRecoveryServicesAsrRecoveryPlan -Name $RecoveryPlanName
Assert-NotNull($RecoveryPlan)
}

<#
.SYNOPSIS
Test RecoveryPlanReplication new parametersets
#>

function Test-RecoveryPlanReplication{
param([string] $seed ='918')
$primaryPolicyName = getPrimaryPolicy
$recoveryPolicyName = getRecoveryPolicy

$primaryContainerMappingName = getPrimaryContainerMapping
$recoveryContainerMappingName = getRecoveryContainerMapping

$primaryContainerName = getPrimaryContainer
$recoveryContainerName = getRecoveryContainer
$vaultRgLocation = getVaultRgLocation
$vaultName = getVaultName
$vaultLocation = getVaultLocation
$vaultRg = getVaultRg
$primaryLocation = getPrimaryLocation
$recoveryLocation = getRecoveryLocation
$primaryFabricName = getPrimaryFabric
$recoveryFabricName = getRecoveryFabric
$RecoveryReplicaDiskAccountType = "Premium_LRS"
$RecoveryTargetDiskAccountType = "Premium_LRS"
$policyName = getPrimaryPolicy
$mappingName = getPrimaryContainerMapping
$recMappingName = getRecoveryContainerMapping
$primaryNetMapping = getPrimaryNetworkMapping
$recoveryNetMapping = getRecoveryNetworkMapping
$RecoveryPlanName = getRecoveryPlanName

#create recovery side resources
$recRgName = getRecoveryResourceGroupName
New-AzResourceGroup -name $recRgName -location $recoveryLocation -force
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
$RecoveryAzureNetworkId = createRecoveryNetworkId
$index =$RecoveryAzureNetworkId.IndexOf("/providers/")
$recRg =$RecoveryAzureNetworkId.Substring(0,$index)
#create proximity placement group
$recPpg = New-AzProximityPlacementGroup -ResourceGroupName $recRgName -Name "PPG1-asr" -Location $recoveryLocation
$recPpg1 = New-AzProximityPlacementGroup -ResourceGroupName $recRgName -Name "PPG2-asr" -Location $recoveryLocation

#create primary
$vmName = getAzureVmName
New-AzResourceGroup -name $vmName -location $primaryLocation -force
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
$logStg = createCacheStorageAccount
$recLogStg = createRecoveryCacheStorageAccount

$v2VmId = createAzureVmInProximityPlacementgroup
$vm = get-azVm -ResourceGroupName $vmName -Name $vmName
$vhdid =$vm.StorageProfile.OSDisk.ManagedDisk.Id
$index =$vm.Id.IndexOf("/providers/")
$Rg =$vm.Id.Substring(0,$index)
$PrimaryAzureNetworkId = $Rg + "/providers/Microsoft.Network/virtualNetworks/" + $vmName

# vault Creation
New-AzResourceGroup -name $vaultRg -location $vaultRgLocation -force
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
New-AzRecoveryServicesVault -ResourceGroupName $vaultRg -Name $vaultName -Location $vaultLocation
[Microsoft.Rest.ClientRuntime.Azure.TestFramework.TestUtilities]::Wait(20 * 1000)
$Vault = Get-AzRecoveryServicesVault -ResourceGroupName $vaultRg -Name $vaultName
Set-ASRVaultContext -Vault $Vault

# fabric Creation
$fabJob= New-AzRecoveryServicesAsrFabric -Azure -Name $primaryFabricName -Location $primaryLocation
WaitForJobCompletion -JobId $fabJob.Name
$fab = Get-AzRecoveryServicesAsrFabric -Name $primaryFabricName
Assert-true { $fab.name -eq $primaryFabricName }
Assert-AreEqual $fab.FabricSpecificDetails.Location $primaryLocation

$fabJob= New-AzRecoveryServicesAsrFabric -Azure -Name $recoveryFabricName -Location $recoveryLocation
WaitForJobCompletion -JobId $fabJob.Name
$fab = Get-AzRecoveryServicesAsrFabric -Name $recoveryFabricName
Assert-true { $fab.name -eq $recoveryFabricName }
Assert-AreEqual $fab.FabricSpecificDetails.Location $recoveryLocation
$pf = get-asrFabric -Name $primaryFabricName
$rf = get-asrFabric -Name $recoveryFabricName

#Container creation
$job = New-AzRecoveryServicesAsrProtectionContainer -Name $primaryContainerName -Fabric $pf
WaitForJobCompletion -JobId $Job.Name
$pc = Get-asrProtectionContainer -name $primaryContainerName -Fabric $pf
Assert-NotNull($pc)
$job = New-AzRecoveryServicesAsrProtectionContainer -Name $recoveryContainerName -Fabric $rf
WaitForJobCompletion -JobId $Job.Name
$rc = Get-asrProtectionContainer -name $recoveryContainerName -Fabric $rf
Assert-NotNull($rc)

#create policy and mapping
$job = New-AzRecoveryServicesAsrPolicy -Name $policyName -RecoveryPointRetentionInHours 12 -AzureToAzure
WaitForJobCompletion -JobId $job.Name
$policy = Get-AzRecoveryServicesAsrPolicy -Name $policyName
$job = New-AzRecoveryServicesAsrProtectionContainerMapping -Name $mappingName -Policy $policy -PrimaryProtectionContainer $pc -RecoveryProtectionContainer $rc
WaitForJobCompletion -JobId $job.Name
$mapping = Get-AzRecoveryServicesAsrProtectionContainerMapping -Name $mappingName -ProtectionContainer $pc

#network mapping
$job = New-AzRecoveryServicesAsrNetworkMapping -AzureToAzure -Name $primaryNetMapping -PrimaryFabric $pf -PrimaryAzureNetworkId $PrimaryAzureNetworkId -RecoveryFabric $rf -RecoveryAzureNetworkId $RecoveryAzureNetworkId
WaitForJobCompletion -JobId $job.Name

#enable Replication
$v = New-AzRecoveryServicesAsrAzureToAzureDiskReplicationConfig -managed -LogStorageAccountId $logStg `
-DiskId $vhdid -RecoveryResourceGroupId $recRg -RecoveryReplicaDiskAccountType $RecoveryReplicaDiskAccountType `
-RecoveryTargetDiskAccountType $RecoveryTargetDiskAccountType
$enableDRjob = New-AzRecoveryServicesAsrReplicationProtectedItem -AzureToAzure -AzureVmId $vm.Id -Name $vmName -ProtectionContainerMapping $mapping -RecoveryResourceGroupId $recRg -AzureToAzureDiskReplicationConfiguration $v -RecoveryProximityPlacementGroupId $recPpg.Id
WaitForJobCompletion -JobId $enableDRjob.Name
WaitForIRCompletion -affectedObjectId $enableDRjob.TargetObjectId

#Validate PPG Set in replicated vm properties
$pe = Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $pc -Name $vmName
Assert-NotNull($pe.providerSpecificDetails.RecoveryProximityPlacementGroupId)

#Create Recovery Plan
$createRecoveryJob = New-AzRecoveryServicesAsrRecoveryPlan -Name $RecoveryPlanName -PrimaryFabric $pf -RecoveryFabric $rf -ReplicationProtectedItem $pe
WaitForJobCompletion -JobId $createRecoveryJob.Name

#Get Recovery Plan
$RecoveryPlan = Get-AzRecoveryServicesAsrRecoveryPlan -Name $RecoveryPlanName
Assert-NotNull($RecoveryPlan)

#Failover
$failoverjob = Start-AzRecoveryServicesAsrUnPlannedFailoverJob -RecoveryPlan $RecoveryPlan -Direction PrimaryToRecovery -PerformSourceSideAction
WaitForJobCompletion -JobId $failoverjob.Name
}
Loading