modules/inventory.psm1

# /api/v2/inventory-sources
function Get-PPDMinventory_sources {
    [CmdletBinding()]
    [Alias('Get-PPDMAssetSource')]
    param(
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [ValidateSet(
            'CLOUD_DIRECTOR',
            'CLOUD_SNAPSHOT_MANAGER',
            'CDR',
            'DATA_MANAGER_APPLIANCE',
            'DATA_MANAGER_VAULT',
            'DATADOMAINMANAGEMENTCENTER',
            'DDSYSTEM',
            'DEFAULTAPPGROUP',
            'EXTERNALDATADOMAIN',
            'GENERICNASMANAGEMENTSERVER',
            'KUBERNETES',
            'ORACLEGROUP',
            'POWERSCALEMANAGEMENTSERVER',
            'POWERSTOREMANAGEMENTSERVER',
            'PPDM',
            'SMISPROVIDER',
            'SQLGROUPS',
            'UNITYMANAGEMENTSERVER',
            'VCENTER'     
        )]
        $Type,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $filter, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v2" 
    )
    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$id"
            }
            default {
                $URI = "/$myself"
            }
        }
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }  
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }
        if ($type) {
            if ($filter) {
                $filter = 'type eq "' + $type + '" and ' + $filter 
            }
            else {
                $filter = 'type eq "' + $type + '"'
            }
        }
        if ($filter) {
            write-verbose ($filter | Out-String)
            $parameters.Add('filter', $filter)
        }    
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response
            }
            default {
                write-output $response.content
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}


function Get-PPDMinfrastructure_nodes {
    [CmdletBinding()]
    [Alias('Get-PPDMAssetNodes')]
    param(
        [Parameter(Mandatory = $TRUE, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $TRUE, ParameterSetName = 'Children', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $TRUE, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $TRUE, ParameterSetName = 'ALL', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $TRUE, ParameterSetName = 'Children', ValueFromPipelineByPropertyName = $true)]

        [ValidateSet('MICROSOFT_SQL_DATABASE_VIEW',
            'FILE_SYSTEM_VIEW',
            'VMWARE_VIRTUAL_MACHINE_HOST_VIEW',
            'VMWARE_VIRTUAL_MACHINE_FOLDER_VIEW',
            'ORACLE_DATA_GUARD_VIEW'      
        )]
        $Type,
        [Parameter(Mandatory = $TRUE, ParameterSetName = 'Children', ValueFromPipelineByPropertyName = $true)]
        [switch]$children,       
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $filter, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v2"
    )
    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
        
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$id"
            }
            'children' {
                $URI = "/$myself/$id/children"
            }            
            default {
                $URI = "/$myself"
            }
        }          
        if ($type) {
            $body.Add('hierarchyType', $TYPE)  
        }
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }   
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }

        if ($filter) {
            write-verbose ($filter | Out-String)
            $parameters.Add('filter', $filter)
        }    
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response
            }
            default {
                write-output $response.content
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}




function Set-PPDMinventory_sources {
    [CmdletBinding()]
    [Alias('Set-PPDMAssetSource')]
    param(
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        $apiver = "/api/v2",
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        $id,
        $configobject
    )
    begin {
        $Response = @()
        $METHOD = "PUT"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            default {
                $URI = "/$myself/$id"
            }
        }   
        $body = $configobject | ConvertTo-json -Depth 7
        $Parameters = @{
            body             = $body 
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'REST'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            ContentType      = "application/json"
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            default {
                write-output ($response)
            } 
        }   
    }
}

<#
.Synopsis
Adds Inventory Components
.Description
Adds Inventory Sources of Types 'DATADOMAINMANAGEMENTCENTER''DDSYSTEM''VCENTER''EXTERNALDATADOMAIN''KUBERNETES' GENERIC_NAS
.Example
Add Vanilla Kubernetes Inventory
 
Create Kubernetes Credentials
$tokenfile="\\nasug.home.labbuildr.com\minio\aks\aksazs1\ppdmk8stoken-20210606.653.18+UTC.json"
$Securestring=ConvertTo-SecureString -AsPlainText -String "$(Get-Content $tokenfile -Encoding utf8)" -Force
$username="limitedadmin"
$Credentials = New-Object System.Management.Automation.PSCredential($username, $Securestring)
$newcreds=New-PPDMcredentials -name aksazs1 -type KUBERNETES -authmethod TOKEN -credentials $Credentials
 
Add the Certificate
$myHost="aksazs1.local.cloudapp.azurestack.external"
Get-PPDMcertificates -newhost $myHost -Port 443 | Approve-PPDMcertificates
 
Add the inventory
Add-PPDMinventory_sources -Type KUBERNETES -Hostname $myHost -Name aksazs1 -ID $newcreds.id -port 443
 
id : deacf2c9-9c15-4749-8fb3-619a76ce2bb1
name : aksazs1
version :
type : KUBERNETES
lastDiscovered :
lastDiscoveryResult : @{status=UNKNOWN; summaries=System.Object[]}
lastDiscoveryTaskId :
address : aksazs1.local.cloudapp.azurestack.external
port : 443
credentials : @{id=c9f25735-352a-4ff3-acbd-d16663804d99}
details :
local : False
vendor :
_links : @{self=; storageSystems=; credentials=}
 
.Example
Add TANZU_GUEST_CLUSTER Kubernetes Inventory
# create vSphere inventory ( if not already added )
Get-PPDMcertificates -newhost vcenter-01.xiolab.lab.emc.com | Approve-PPDMcertificates
$Securestring=ConvertTo-SecureString -AsPlainText -String "Password123!" -Force
$username="Administrator@vsphere.local"
$Credentials = New-Object System.Management.Automation.PSCredential($username, $Securestring)
$newvspherecreds=New-PPDMcredentials -name vsphere -type VCENTER -credentials $Credentials
$vcenter = Add-PPDMinventory_sources -Hostname vcenter-01.xiolab.lab.emc.com -Type VCENTER -ID $newvspherecreds.id -Name vcenter-01 -port 443 -isHostingvCenter -isAssetSource
 
# create the k8s inventory
$token="eyJhbGciOiJSUzI1NiIsImtpZCI6Ii1aX1RVMHludjR6ZTlrV1dFU2c1dWV2NHk4eHFwOGoyLXdWdFBLMHNhS0UifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJwcGRtLWFkbWluLXRva2VuLXAyempqIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InBwZG0tYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI0M2QyNGUyMS05N2E0LTRmM2UtOTE0ZS0yYjhhY2I3NDEwM2UiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06cHBkbS1hZG1pbiJ9.KETUg5EpLQtE8AqoZQEDQXPp6ZlC40Yx6a2Ub9Fpn1WqzgJ5Pj6SaV7FkLKAw371wz4zIwhURLuyARRqgx4y703FmJZpoi1BUrr0ry3qj5zp8UzdzBY455e8AOpqV66BFKzYlNSbqFbazMJjv-fL_sF8QI7RCZM74uKe-iPNM1OU0Zsn27Mqzh85gT_5umceULIFYAh4Hc_sFHrSYmt4enT7yF0HeIwTviQwgch-LZeUQUTJdTqmlUKc31qD47i0oGSj8mnEWx9erlaWx89vOyweua6_Vx3boNEeLCdClsvkuKkBd5KLW-UqriKrvh0Evnid7EyGjXI-Qrfta4Aw5g"
$Securestring=ConvertTo-SecureString -AsPlainText -String $token -Force
$username="limitedadmin"
$Credentials = New-Object System.Management.Automation.PSCredential($username, $Securestring)
$newk8screds=New-PPDMcredentials -name tkg02 -type KUBERNETES -authmethod TOKEN -credentials $Credentials
Get-PPDMcertificates -newhost 10.55.188.3 -Port 6443 | Approve-PPDMcertificates
Add-PPDMinventory_sources -Type KUBERNETES -Hostname 10.55.188.3 -K8S_TYPE TANZU_GUEST_CLUSTER -Name tkg02 -ID $newk8screds.id -VCENTER_ID $vcenter.id -port 6443
#>

function Add-PPDMinventory_sources {
    [CmdletBinding()]
    [Alias('Add-PPDMAssetSource')]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [alias('fqdn')]$Hostname, 
        [Parameter(Mandatory = $true, ParameterSetName = 'GENERIC_NAS', ValueFromPipelineByPropertyName = $true)]
        [ValidateSet('CIFS', 'NFS')]$Protocol, 
        [Parameter(Mandatory = $true, ParameterSetName = 'GENERIC_NAS', ValueFromPipelineByPropertyName = $true)]
        [string[]]$address,                    
        [Parameter(Mandatory = $true, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [ValidateSet(
            # Inventory Type as on of 'DATADOMAINMANAGEMENTCENTER''DDSYSTEM''VCENTER''EXTERNALDATADOMAIN''KUBERNETES'
            'DATADOMAINMANAGEMENTCENTER',
            'DDSYSTEM',
            'VCENTER',
            'EXTERNALDATADOMAIN',
            'KUBERNETES'
        )]$Type, 
        [Parameter(Mandatory = $false, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [ValidateSet(
            # K8S Type as on of 'TANZU_GUEST_CLUSTER' 'VANILLA_ON_VSPHERE' 'NON_VSPHERE'
            'TANZU_GUEST_CLUSTER',
            'VANILLA_ON_VSPHERE',
            'NON_VSPHERE'
        )]$K8S_TYPE,
        [Parameter(Mandatory = $false, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        # Required VCENTER ID if 'TANZU_GUEST_CLUSTER'
        $VCENTER_ID,
        [Parameter(Mandatory = $true, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        $Name,        
        [Parameter(Mandatory = $true, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $true, ParameterSetName = 'GENERIC_NAS', ValueFromPipelineByPropertyName = $true)]
        [alias('secretID')]$ID, 
        [Parameter(Mandatory = $false, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $true, ParameterSetName = 'GENERIC_NAS', ValueFromPipelineByPropertyName = $true)]
        $port,
        [Parameter(Mandatory = $false, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [switch]$isHostingvCenter,  
        [Parameter(Mandatory = $false, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [switch]$isAssetSource,  
        [Parameter(Mandatory = $false, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [switch]$vSphereUiIntegration,                       
        [Parameter(Mandatory = $false, ParameterSetName = 'Host', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $false, ParameterSetName = 'GENERIC_NAS', ValueFromPipelineByPropertyName = $true)]
        [switch]$ssl,
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        $apiver = "/api/v2"

    )
    begin {
        $Response = @()
        $METHOD = "POST"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'Host' {
                $URI = "/$myself"
                $body = @{
                    name        = $Name
                    type        = $Type
                    address     = $Hostname
                    port        = $port
                    credentials = @{
                        id = $ID
                    }
                } 
                if ( $TYPE -eq "VCENTER" ) {
                    $body.Add('details', @{})
                    $body.details.Add('vCenter', @{})
                    write-verbose "$VCENTER selected"
                    $body.details.vCenter.Add('vSphereUiIntegration', $vSphereUiIntegration.IsPresent )
                    $body.details.vCenter.Add('assetSource', $isAssetSource.isPresent )
                    $body.details.vCenter.Add('hosting', $isHostingvCenter.ispresent )
                }
                if ( $K8S_TYPE ) { 
                    $body.Add('details', @{})
                    $body.details.Add('k8s', @{})
                    write-verbose "$K8S_TYPE selected"
                    if ($K8S_TYPE -eq "TANZU_GUEST_CLUSTER") {                        
                        if ($VCENTER_ID) {
                            $body.details.k8s.Add('vCenterId', $VCENTER_ID )
                        }
                        else {
                            write-host "Tanzu Guest Clusters need vCenter ID to be set"
                            break                        
                        }
                    }    
                    $body.details.k8s.Add('distributionType', $K8S_TYPE )
                }                
                $body.Add('ssl', $ssl.isPresent )                
                $body = $body | ConvertTo-Json
            }
            'GENERIC_NAS' {
                $URI = "/$($myself)-batch"
                $body = @{}
                $body.Add('requests', @())    

                # this goes to foreach
                $request = @{}
                $request.Add('id', '1')
                $requestbody = @{
                    name        = $address
                    type        = 'GENERICNASMANAGEMENTSERVER'
                    address     = $address -replace ":"
                    port        = $port
                    credentials = @{
                        id = $ID
                 
                    }
                }
                $request.Add('body', $requestbody)
                $body.requests += $request
                
                $body = $body | ConvertTo-Json -Depth 6
            }                 
            default {
                $URI = "/$myself"
            }
        }  
        Write-Verbose ($body | Out-String)  
        $Parameters = @{
            body             = $body 
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'Rest'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters            
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'Host' {
                write-output $response 
            }
            default {
                write-output ($response )
            } 
        }   
    }
}


function Remove-PPDMinventory_sources {
    [CmdletBinding()]
    [Alias('Remove-PPDMAssetSource')]
    param(
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        $apiver = "/api/v2",
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        $id
    )
    begin {
        $Response = @()
        $METHOD = "DELETE"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(11) -replace "_", "-").ToLower()
   
    }     
    Process {

        $URI = "/$myself/$id"
        $Parameters = @{
            # body = $body
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'Rest'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters      
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response 
            }
            default {
                write-output $response
            } 
        }   
    }
}


<#
.SYNOPSIS
This gets the datacenter Morefs attached to an ESX Host
.EXAMPLE
 
Get-PPDMinventory_sources -Type VCENTER -filter 'name lk "vcsa1%"' | Get-PPDMvcenterDatacenters
 
size : 1
number : 1
totalPages : 1
totalElements : 1
maxPageableElements : 1
 
 
 
 
name moref
---- -----
home_dc Datacenter:datacenter-2
Get-PPDMvcenterMorefs -ID 69c8ac3a-3eca-55f1-a2e0-347e63a90540 -DatacenterMoref Datacenter:datacenter-2
 
id : /home_cluster
name : home_cluster
type : ClusterComputeResource
moref : ClusterComputeResource:domain-c7
children : {@{id=/home_cluster/e200-n1.home.labbuildr.com; name=e200-n1.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-11893; children=System.Object[]; flags=System.Object[]; networks=System.Object[]},
           @{id=/home_cluster/e200-n2.home.labbuildr.com; name=e200-n2.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-1099088; children=System.Object[]; flags=System.Object[]; networks=System.Object[]},
           @{id=/home_cluster/e200-n3.home.labbuildr.com; name=e200-n3.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-11923; children=System.Object[]; flags=System.Object[]; networks=System.Object[]},
           @{id=/home_cluster/e200-n4.home.labbuildr.com; name=e200-n4.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-1114033; children=System.Object[]; flags=System.Object[]; networks=System.Object[]}…}
flags : {@{name=drsEnbled; value=true}}
networks : {}
Get-PPDMvcenterDatastores -id 69c8ac3a-3eca-55f1-a2e0-347e63a90540 -clusterMOREF HostSystem:host-11893
 
name : ISO
capacity : 2180614373376
freeSpace : 738130546688
moref : Datastore:datastore-1122133
type : NFS
 
name : QNAP_LARGE
capacity : 8795824586752
freeSpace : 6403246784512
moref : Datastore:datastore-1091023
type : VMFS
 
name : Quorum1
capacity : 5100273664
freeSpace : 3586129920
moref : Datastore:datastore-1123021
type : VMFS
 
name : Quorum2
capacity : 5100273664
freeSpace : 3591372800
moref : Datastore:datastore-1123022
type : VMFS
 
name : datastore1
capacity : 23622320128
freeSpace : 11849957376
moref : Datastore:datastore-11895
type : VMFS
 
name : vsanDatastore
capacity : 8001583071232
freeSpace : 5517655113812
moref : Datastore:datastore-544
type : vsan
 
 
 
#>

function Get-PPDMesxDatastores {
    [CmdletBinding()]
    param(

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        # Moref Cluster ID , e.g. "ClusterComputeResource:domain-c1006, can be retived via '(Get-PPDMhosts -hosttype ESX_CLUSTER -filter 'name eq "<clustername>"').details.esxcluster.clusterMoref'
        $hostMOREF,        
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        $apiver = "/api/v2"
    )
    begin {
        $Response = @()
        $METHOD = "GET"
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {

            default {
                $URI = "vcenter/$id/data-stores/$hostMoref"
            }
        }        
        $Parameters = @{
            # body = $body
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'Rest'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters      
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {

            default {
                write-output $response.datastores
            } 
        }   
    }
}



function Get-PPDMvcenterDatacenters {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $filter,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v2"
    )

    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "/").ToLower()
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/vcenter/$id/datacenters"
                $body = @{}  

            }
            default {
                $URI = "/$myself"
            }
        }  
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }   
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }
        if ($type) {
            if ($filter) {
                $filter = 'type eq "' + $type + '" and ' + $filter 
            }
            else {
                $filter = 'type eq "' + $type + '"'
            }
        }        
        if ($filter) {
            $parameters.Add('filter', $filter)
        }       
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {

            default {
                write-output $response.datacenters
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}
<#
.SYNOPSIS
This API Call gets Managed Object references from vCenters
.EXAMPLE
# Get your Vcenter
Get-PPDMinventory_sources -Type VCENTER -filter 'name lk "vcsa1%"'
PS C:\Users\Karsten_Bott\workspace\PPDM-pwsh> get-ppdminventory_sources -Type VCENTER -filter 'name lk "vcsa1%"' | Get-PPDMvcenterDatacenters
 
size : 1
number : 1
totalPages : 1
totalElements : 1
maxPageableElements : 1
 
 
 
 
name moref
---- -----
home_dc Datacenter:datacenter-2
 
 
Get-PPDMvcenterMorefs -ID 69c8ac3a-3eca-55f1-a2e0-347e63a90540 -DatacenterMoref Datacenter:datacenter-2
 
id : /home_cluster
name : home_cluster
type : ClusterComputeResource
moref : ClusterComputeResource:domain-c7
children : {@{id=/home_cluster/e200-n1.home.labbuildr.com; name=e200-n1.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-11893; children=System.Object[]; flags=System.Object[]; networks=System.Object[]},
           @{id=/home_cluster/e200-n2.home.labbuildr.com; name=e200-n2.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-1099088; children=System.Object[]; flags=System.Object[]; networks=System.Object[]},
           @{id=/home_cluster/e200-n3.home.labbuildr.com; name=e200-n3.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-11923; children=System.Object[]; flags=System.Object[]; networks=System.Object[]},
           @{id=/home_cluster/e200-n4.home.labbuildr.com; name=e200-n4.home.labbuildr.com; type=HostSystem; moref=HostSystem:host-1114033; children=System.Object[]; flags=System.Object[]; networks=System.Object[]}…}
flags : {@{name=drsEnbled; value=true}}
networks : {}
 
id : /esxi-mgmt.home.labbuildr.com
name : esxi-mgmt.home.labbuildr.com
type : HostSystem
moref : HostSystem:host-703
children : {@{id=/esxi-mgmt.home.labbuildr.com/labbuildr; name=labbuildr; type=ResourcePool; moref=ResourcePool:resgroup-2023851; children=System.Object[]; flags=; networks=System.Object[]},
           @{id=/esxi-mgmt.home.labbuildr.com/mgmt_pool; name=mgmt_pool; type=ResourcePool; moref=ResourcePool:resgroup-747; children=System.Object[]; flags=; networks=System.Object[]}}
flags : {@{name=NFS.MaxVolumes; value=32}, @{name=NFS41.MaxVolumes; value=32}}
networks : {}
# Get Morefs for a Host
Get-PPDMvcenterMorefs -ID 69c8ac3a-3eca-55f1-a2e0-347e63a90540 -hostMoref HostSystem:host-11923
 
#>

function Get-PPDMvcenterMorefs {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'DataCenterMoref', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $true, ParameterSetName = 'HostMoref', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $true, ParameterSetName = 'DataCenterMoref', ValueFromPipelineByPropertyName = $true)]
        $DatacenterMoref,  
        [Parameter(Mandatory = $true, ParameterSetName = 'HostMoref', ValueFromPipelineByPropertyName = $true)]
        $hostMoref,                 
        [Parameter(Mandatory = $false, ParameterSetName = 'DataCenterMoref', ValueFromPipelineByPropertyName = $true)]
        $filter,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v2"
    )

    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "/").ToLower()
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'DatacenterMoref' {
                $URI = "/vcenter/$id/managed-entities/$DatacenterMoref"
 

            }
            'HostMoref' {
                $URI = "/vcenter/$id/managed-entities/$HostMoref"
                $body.Add('self', "true") 

            }
        }  
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }   
        Write-Verbose ($body | out-string)
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }
        if ($type) {
            if ($filter) {
                $filter = 'type eq "' + $type + '" and ' + $filter 
            }
            else {
                $filter = 'type eq "' + $type + '"'
            }
        }        
        if ($filter) {
            $parameters.Add('filter', $filter)
        }       
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {

            default {
                write-output $response.managedEntities
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}