vCloud Director vApp Template Report with PowerCLI

I recently needed to get a list of all vApp templates and their datastores within vCloud Director.  I wasn’t able to easily get this information using the Get-* commandlets so I went with the Search-Cloud commandlet.


# Build a hash of arrays where the keys are the shadow VM's id and the values are arrays of the datastores where the shadow VMs live.
$shadowsVMs = @{}
search-cloud -querytype AdminShadowVM | % {
   if ( $shadowsVMs[$_.PrimaryVAppTemplate] -eq $null) {
     $shadowsVMs[$_.PrimaryVAppTemplate] = @($_.DatastoreName)
   }
   else {
     $shadowsVMs[$_.PrimaryVAppTemplate] += $_.DatastoreName
   }
}

# Build a hash where the keys are the org's id and the values are the org's name.  This is used below to display a vApp's org.
$orgNames = @{}
search-cloud -querytype organization | % { $orgNames[$_.id] = $_.name }

# Set the sort option
$sortField = 'Org'

# Use Search-Cloud to find all AdminVMs and filter to see if they are vApp Templates. This is the part I had a hard time with using the Get-* commandlets.
search-cloud -querytype adminvm -property Container, ContainerName, Name, CatalogName, Org, DatastoreName `
                                -filter "IsVappTemplate==True" | `
     select @{N='Org';                   E={ $orgNames[$_.org] }}, `
            @{N='Catalog';               E={ $_.CatalogName} }, `
            @{N='vApp Template';         E={ $_.ContainerName} }, `
            @{N='VM Name';               E={ $_.Name} }, `
            @{N='Datastore';             E={ $_.DatastoreName }}, `
            @{N='Shadow VMs';            E={ $shadowsVMs[$_.Container].count }}, `
            @{N='Shadow VMs Datastores'; E={ $shadowsVMs[$_.Container] -join ', '}} `
     | sort $sortField | ft -auto

If you’d rather send the output to a spreadsheet instead of the console, you can use export-csv on the last line:


# Build a hash of arrays where the keys are the shadow VM's id and the values are arrays of the datastores where the shadow VMs live.
$shadowsVMs = @{}
search-cloud -querytype AdminShadowVM | % {
   if ( $shadowsVMs[$_.PrimaryVAppTemplate] -eq $null) {
     $shadowsVMs[$_.PrimaryVAppTemplate] = @($_.DatastoreName)
   }
   else {
     $shadowsVMs[$_.PrimaryVAppTemplate] += $_.DatastoreName
   }
}

# Build a hash where the keys are the org's id and the values are the org's name.  This is used below to display a vApp's org.
$orgNames = @{}
search-cloud -querytype organization | % { $orgNames[$_.id] = $_.name }

# Set the sort option
$sortField = 'Org'

# Use Search-Cloud to find all AdminVMs and filter to see if they are vApp Templates. This is the part I had a hard time with using the Get-* commandlets.
search-cloud -querytype adminvm -property Container, ContainerName, Name, CatalogName, Org, DatastoreName `
                                -filter "IsVappTemplate==True" | `
     select @{N='Org';                   E={ $orgNames[$_.org] }}, `
            @{N='Catalog';               E={ $_.CatalogName} }, `
            @{N='vApp Template';         E={ $_.ContainerName} }, `
            @{N='VM Name';               E={ $_.Name} }, `
            @{N='Datastore';             E={ $_.DatastoreName }}, `
            @{N='Shadow VMs';            E={ $shadowsVMs[$_.Container].count }}, `
            @{N='Shadow VMs Datastores'; E={ $shadowsVMs[$_.Container] -join ', '}} `
     | export-csv templates.csv
Advertisements