vCloud Availability for vCloud Director is a new product for vCAN service providers released in July 2016 that enables disaster recovery to and from the cloud. It allows any vSphere customer who installes vSphere Replication to protect her on-prem workloads into the multitenant service provider cloud environment.
vCloud Availability adds additional vCloud APIs thanks to its vCloud Extensibility Framework. I have created a few simple PowerCLI cmdlets that demonstrate how easy is to use the new APIs. The cmdlets allow service provider to monitor state of vCloud Availability components as well as state of tenant replications.
Get-VRCells
Discovers all vCloud Director cells (including Cloud Proxies) and reports their status.
Get-VRCSNodes
Discovers all vSphere Replication Cloud Service nodes, their version and amount of seconds since last successful heartbeat.
Get-VRMServers
Discovers all vSphere Replication Manager Servers and reports their status and paired vCenter Server
Get-VRServers
Discovers all vSphere Replication Servers, their status and statistics about utilization.
Get-VRReplications
Collects all replications in particular organization, their compliance status and other information (RPO, storage used, number of snapshots, etc.). This cmdlet can be used also with tenant credentials.
Function Get-VRCells { <# .SYNOPSIS Discovers all vCloud Director cells .DESCRIPTION Discovers all vCloud Director cells including Cloud Proxies and report their status and version and if they ran VC proxy .EXAMPLE PS C:\> Get-VRCells .NOTES Author: Tomas Fojta #> if (-not $global:DefaultCIServers) {Connect-CIServer} $Uri = $global:DefaultCIServers[0].ServiceUri.AbsoluteUri + "query?type=cell" $head = @{"x-vcloud-authorization"=$global:DefaultCIServers[0].SessionSecret} + @{"Accept"="application/*+xml;version=20.0;vr-version=3.0"} $r = Invoke-WebRequest -URI $Uri -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content $VRCells = $sxml.QueryResultRecords.CellRecord $VRCells } Function Get-VRCSNodes { <# .SYNOPSIS Discovers all vSphere Replication Cloud Service nodes .DESCRIPTION Discovers all vSphere Replication Cloud Service nodes, their version and last heartbeat .EXAMPLE PS C:\> Get-VRCSNodes .NOTES Author: Tomas Fojta #> if (-not $global:DefaultCIServers) {Connect-CIServer} $VRCSNodes = @() $CurrentTime = (New-TimeSpan -Start (Get-Date -Date "01/01/1970") -End (Get-Date).ToUniversalTime()).TotalMilliseconds $Uri = $global:DefaultCIServers[0].ServiceUri.AbsoluteUri + "admin/vr/nodes" $head = @{"x-vcloud-authorization"=$global:DefaultCIServers[0].SessionSecret} + @{"Accept"="application/*+xml;version=20.0;vr-version=3.0"} $r = Invoke-WebRequest -URI $Uri -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content foreach ($VRCS in $sxml.VrcsNodes.Node) { $n = @{} | select VRCS,MaxSupportedAPiVersion,LastHeartbeatTimestamp,LastHeartbeatAgoInSeconds $n.VRCS = $VRCS.Id $n.MaxSupportedAPiVersion = $VRCS.MaxSupportedAPiVersion $n.LastHeartbeatTimestamp = $VRCS.LastHeartbeatTimestamp $n.LastHeartbeatAgoInSeconds = [math]::Truncate(($CurrentTime - [convert]::ToInt64($VRCS.LastHeartbeatTimestamp))/1000) $VRCSNodes += $n } $VRCSNodes } Function Get-VRMServers { <# .SYNOPSIS Discovers all vSphere Replication Manager Servers and reports their status .DESCRIPTION Discovers all vSphere Replication Manager Servers, reports their status and paired vCenter Server .EXAMPLE PS C:\> Get-VRMServers .NOTES Author: Tomas Fojta #> [CmdletBinding()] param( [Parameter(Mandatory=$false,Position=1)] [String]$Org ) if (-not $global:DefaultCIServers) {Connect-CIServer} $VRMServers = @() $Uri = $global:DefaultCIServers[0].ServiceUri.AbsoluteUri + "admin/extension/vimServerReferences" $head = @{"x-vcloud-authorization"=$global:DefaultCIServers[0].SessionSecret} + @{"Accept"="application/*+xml;version=20.0;vr-version=3.0"} $r = Invoke-WebRequest -URI $Uri -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content foreach ($VimServer in $sxml.VMWVimServerReferences.VimServerReference) { $n = @{} | select VRMS,IsConnected,VIMName,VIMhref $n.VIMname = $VimServer.name $n.VIMhref = $VimServer.href $r = Invoke-WebRequest -URI ($VimServer.href + "/vrmServer") -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content $n.VRMS = $sxml.AdminVrmServer.Uuid $n.IsConnected = $sxml.AdminVrmServer.IsConnected $VRMServers += $n } $VRMServers } Function Get-VRServers { <# .SYNOPSIS Collects all vSphere Replication Servers .DESCRIPTION Collects all vSphere Replication Servers and basic statistics .EXAMPLE PS C:\> Get-VRServers .NOTES Author: Tomas Fojta #> if (-not $global:DefaultCIServers) {Connect-CIServer} $VRServers = @() $Uri = $global:DefaultCIServers[0].ServiceUri.AbsoluteUri + "admin/extension/vr/vrServers" $head = @{"x-vcloud-authorization"=$global:DefaultCIServers[0].SessionSecret} + @{"Accept"="application/*+xml;version=20.0;vr-version=3.0"} $r = Invoke-WebRequest -URI $Uri -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content foreach ($vRS in $sxml.References.Reference) { $n = @{} | select Name,href,IsConnected,ReplicationsCount,DisksCount $n.href = $vRS.href $r = Invoke-WebRequest -URI $vRS.href -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content $n.Name = $sxml.AdminVrServer.ReplicationTrafficAddress $n.IsConnected = $sxml.AdminVrServer.IsConnected $r = Invoke-WebRequest -URI ($vRS.href+"/statistics") -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content $n.ReplicationsCount = $sxml.VrServerStatistics.ReplicationsCount $n.DisksCount = $sxml.VrServerStatistics.DisksCount $VRServers += $n } $VRServers } Function Get-VRReplications { <# .SYNOPSIS Collects all replications in particular organization .DESCRIPTION Collects all replications in particular organization, their compliance status and other information .EXAMPLE PS C:\> Connect-CIServer -Org ACME PS C:\> Get-VRReplications .EXAMPLE PS C:\> Get-VRReplications -Org ACME .NOTES Author: Tomas Fojta #> [CmdletBinding()] param( [Parameter(Mandatory=$false,Position=1)] [String]$Org ) if (-not $global:DefaultCIServers) {Connect-CIServer} If ($Org -eq "") {$Org = $global:DefaultCIServers[0].Org} $VRReplications = @() $Uri = $global:DefaultCIServers[0].ServiceUri.AbsoluteUri + ((get-org $org).id).Replace("urn:vcloud:org:","org/") + "/replications" $head = @{"x-vcloud-authorization"=$global:DefaultCIServers[0].SessionSecret} + @{"Accept"="application/*+xml;version=20.0;vr-version=3.0"} $r = Invoke-WebRequest -URI $Uri -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content foreach ($Replication in $sxml.References.Reference) { $n = @{} | select Name,href,Rpo,ReplicationState,CurrentRpoViolation,TestRecoveryState,RecoveryState,VappId,VrServerInfo,ReplicaSpaceRequirements, Instance $n.href = $Replication.href $r = Invoke-WebRequest -URI $Replication.href -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content $n.Rpo = $sxml.ReplicationGroup.Rpo $n.ReplicationState = $sxml.ReplicationGroup.ReplicationState $n.CurrentRpoViolation = $sxml.ReplicationGroup.CurrentRpoViolation $n.TestRecoveryState = $sxml.ReplicationGroup.TestRecoveryState $n.RecoveryState = $sxml.ReplicationGroup.RecoveryState $n.VappId = $sxml.ReplicationGroup.PlaceholderVappId.Replace("urn:vcloud:vapp:","") $n.VrServerInfo = $sxml.ReplicationGroup.VrServerInfo.Uuid $r = Invoke-WebRequest -URI ($Replication.href + "/instances") -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content $n.ReplicaSpaceRequirements = $sxml.ReplicationGroupInstanceList.ReplicaSpaceRequirements $n.Instance = $sxml.ReplicationGroupInstanceList.Instance $Uri = $global:DefaultCIServers[0].ServiceUri.AbsoluteUri + "vApp/vapp-" + $n.VappId $r = Invoke-WebRequest -URI $Uri -Method Get -Headers $head -ErrorAction:Stop [xml]$sxml = $r.Content $n.Name = $sxml.VApp.Children.Vm.name $VRReplications += $n } $VRReplications }
