Public/ProviderVDC/Get-CIProviderVC.ps1

function Get-CIProviderVC(){
    <#
    .SYNOPSIS
    Returns a collection of eligble Provider vCenters that are registered and assosiated vCenter Resources

    .DESCRIPTION
    Returns a collection of eligble Provider vCenters that are registered and assosiated vCenter Resources

    KNOWN ISSUE : If a PVDC already exists for the CIProviderVC then the cmdlet fails - to be investigated after BETA

    .PARAMETER Name
    The Provider Virtual Center Name

    .EXAMPLE
    Get-CIProividerVC
    Returns all Provider vCenters registered against the connected Cloud Director Service

    .EXAMPLE
    Get-CIProividerVC -Name "Test-VC"
    Returns the Provider vCenters with the name Test-VC if it exists in the currently connected Cloud Director Service

    .NOTES
    AUTHOR: Adrian Begg
    LASTEDIT: 2019-12-17
    VERSION: 1.0
    #>

    Param(
        [Parameter(Mandatory=$False, ParameterSetName = "ByName")]
            [ValidateNotNullorEmpty()] [String] $Name
    )
    # Always check if we are connected first
    Test-CIServerConnection | Out-Null

    # Get the OrgId of the currently connected System Org
    $OrgHref = ($global:DefaultCIServers.ExtensionData.OrganizationReferences.OrganizationReference | Where-Object {$_.Name -eq "System"}).href
    [Hashtable] $OrgIdRequestParameters = @{
        URI = $OrgHref
        Method = "Get"
        APIVersion = 33
        APIType = "Legacy"
    }
    [xml] $OrgIdXML = (Invoke-CICloudAPIRequest @OrgIdRequestParameters).RawData
    $OrgId = ($OrgIdXML.AdminOrg.id).Trim("urn:vcloud:org:")

    # Define the request "Body" with the filters or mandatory parameters
    [Hashtable] $APIParameters = @{
        type = "virtualCenter"
        page = 1
        pageSize = 128
        links = "true"
        format = "records"
    }

    # Next define basic request properties for the API call, legacy vCloud API does not allow Encoding so need to call the "filter" in URI as a hot mess
    [Hashtable] $RequestParameters = @{
        URI = "$($global:DefaultCIServers.ServiceUri)query?$filter=(id==$OrgId)"
        Method = "Get"
        APIVersion = 33
        APIType = "Legacy"
        Data = $APIParameters
    }
    # Make the API call to create the group
    [xml] $Response = (Invoke-CICloudAPIRequest @RequestParameters).RawData
    $colvCenters = ($Response.QueryResultRecords.VirtualCenterRecord)

    # Check if a filter was specified
    if($PSBoundParameters.ContainsKey('Name')){
        $colvCenters = $colvCenters | Where-Object{$_.name -eq $Name}
    }

    # Query the vCenter for available Resource Pools
    foreach($resvCenter in $colvCenters){
        # Return the resoruce pools and Storage Profiles
        $DRSClusterEndpoint = ($colvCenters.Link | Where-Object{$_.model -eq "ResourcePools"}).href
        $StorageProfileEndpoint = ($colvCenters.Link | Where-Object{$_.model -eq "StorageProfiles"}).href

        [Hashtable] $DRSClusterParameters = @{
            URI = $DRSClusterEndpoint
            Method = "Get"
            APIVersion = 33
        }
        $DRSClusters = ((Invoke-CICloudAPIRequest @DRSClusterParameters).JSONData).values
        # Now iterate over the clusters and retrieve
        foreach($Cluster in $DRSClusters){
            [Hashtable] $HardwareVersionParams = @{
                URI = "$($global:DefaultCIServers.CloudAPIServiceURI)/1.0.0/virtualCenters/$($Cluster.vcId)/resourcePools/$($Cluster.moref)/hwv"
                Method = "Get"
                APIVersion = 33
            }
            # Return the Hardware Versions
            $SupportedHardwareVersions = ((Invoke-CICloudAPIRequest @HardwareVersionParams).JSONData).versions
            $Cluster | Add-Member NoteProperty SupportedHardwareVersions $SupportedHardwareVersions

            # Get the eligible Storage Profiles at a Cluster Level
            [Hashtable] $StorageProfileArgs = @{
                page = 1
                pageSize = 128
                links = "true"
                filter = "(_context==$($Cluster.moref))"
            }

            [Hashtable] $StorageProfileParams = @{
                URI = $StorageProfileEndpoint
                Method = "Get"
                APIVersion = 33
                Data = $StorageProfileArgs
            }
            $EligbleStorageProfiles = ((Invoke-CICloudAPIRequest @StorageProfileParams).JSONData).values
            $Cluster | Add-Member NoteProperty EligbleStorageProfiles $EligbleStorageProfiles

            # Get the Resource Pool Objects
            [Hashtable] $ResourcePoolArgs = @{
                page = 1
                pageSize = 128
                links = "true"
            }
            [Hashtable] $ResourcePoolParams = @{
                URI = "$($global:DefaultCIServers.CloudAPIServiceURI)/1.0.0/virtualCenters/$($Cluster.vcId)/resourcePools/browse/$($Cluster.moref)"
                Method = "Get"
                APIVersion = 33
                Data = $ResourcePoolArgs
            }
            $ResourcePools = ((Invoke-CICloudAPIRequest @ResourcePoolParams).JSONData).values
            $Cluster | Add-Member NoteProperty ResourcePools $ResourcePools
        }
        # Add the DRS/HA Cluster and Resource Pools to the vCenter
        $resvCenter | Add-Member NoteProperty Clusters $DRSClusters
        # Add the vCenter Id - should fix this and use a call to the href but quick fix for now
        $resvCenter | Add-Member NoteProperty id $DRSClusters[0].vcId.Trim("urn:vcloud:vimserver:")
    }
    return $colvCenters
}