This Module Creates a nice HTML Report for vCD Customers. Report Contains Objects like Users, Catalogs, VDCs, vApps, VMs, Edge Gateways
252 lines
9.4 KiB
PowerShell
252 lines
9.4 KiB
PowerShell
function Get-VcdTenantReport {
|
|
<#
|
|
.NOTES
|
|
===========================================================================
|
|
Created by: Markus Kraus
|
|
Twitter: @VMarkus_K
|
|
Private Blog: mycloudrevolution.com
|
|
===========================================================================
|
|
Changelog:
|
|
1.0.0 - Inital Release
|
|
1.0.1 - Removed "Test-IP" Module
|
|
1.0.2 - More Detailed Console Log
|
|
===========================================================================
|
|
External Code Sources:
|
|
Examle Usage of BOOTSTRAP with PowerShell
|
|
https://github.com/tdewin/randomsamples/tree/master/powershell-veeamallstat
|
|
BOOTSTRAP with PowerShell
|
|
https://github.com/tdewin/randomsamples/tree/master/powerstarthtml
|
|
===========================================================================
|
|
Tested Against Environment:
|
|
vCD Version: 8.20
|
|
PowerCLI Version: PowerCLI 6.5.1
|
|
PowerShell Version: 5.0
|
|
OS Version: Windows 8.1
|
|
Keyword: VMware, vCD, Report, HTML
|
|
===========================================================================
|
|
|
|
.DESCRIPTION
|
|
This Function creates a HTML Report for your vCloud Director Organization.
|
|
|
|
This Function is fully tested as Organization Administrator.
|
|
With lower permissions a unexpected behavior is possible.
|
|
|
|
.Example
|
|
Get-VcdTenantReport -Server $ServerFQDN -Org $OrgName -Credential $MyCedential
|
|
|
|
.Example
|
|
Get-VcdTenantReport -Server $ServerFQDN -Org $OrgName -Path "C:\Temp\Report.html"
|
|
|
|
.PARAMETER Server
|
|
The FQDN of your vCloud Director Endpoint.
|
|
|
|
.PARAMETER Org
|
|
The Organization Name.
|
|
|
|
.PARAMETER Credential
|
|
PowerShell Credentials to access the Eénvironment.
|
|
|
|
.PARAMETER Path
|
|
The Path of the exported HTML Report.
|
|
|
|
#>
|
|
#Requires -Version 5
|
|
#Requires -Modules VMware.VimAutomation.Cloud, @{ModuleName="VMware.VimAutomation.Cloud";ModuleVersion="6.5.1.0"}
|
|
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory=$True, ValueFromPipeline=$False)]
|
|
[ValidateNotNullorEmpty()]
|
|
[String] $Server,
|
|
[Parameter(Mandatory=$True, ValueFromPipeline=$False)]
|
|
[ValidateNotNullorEmpty()]
|
|
[String] $Org,
|
|
[Parameter(Mandatory=$False, ValueFromPipeline=$False)]
|
|
[ValidateNotNullorEmpty()]
|
|
[PSCredential] $Credential,
|
|
[Parameter(Mandatory=$false, ValueFromPipeline=$False)]
|
|
[ValidateNotNullorEmpty()]
|
|
[String] $Path = ".\Report.html"
|
|
|
|
)
|
|
|
|
Process {
|
|
|
|
# Start Connection to vCD
|
|
|
|
if ($global:DefaultCIServers) {
|
|
"$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Disconnect existing vCD Server ..."
|
|
$Trash = Disconnect-CIServer -Server * -Force:$true -Confirm:$false -ErrorAction SilentlyContinue
|
|
}
|
|
|
|
"$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Connect vCD Server ..."
|
|
if ($Credential) {
|
|
$Trash = Connect-CIServer -Server $Server -Org $Org -Credential $Credential -ErrorAction Stop
|
|
}
|
|
else {
|
|
$Trash = Connect-CIServer -Server $Server -Org $Org -ErrorAction Stop
|
|
}
|
|
"$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Create HTML Report..."
|
|
|
|
# Init HTML Report
|
|
$ps = New-PowerStartHTML -title "vCD Tenant Report"
|
|
|
|
#Set CSS Style
|
|
$ps.cssStyles['.bgtitle'] = "background-color:grey"
|
|
$ps.cssStyles['.bgsubsection'] = "background-color:#eee;"
|
|
|
|
# Processing Data
|
|
## Get Main Objects
|
|
[Array] $OrgVdcs = Get-OrgVdc
|
|
[Array] $Catalogs = Get-Catalog
|
|
[Array] $Users = Get-CIUser
|
|
|
|
## Add Header to Report
|
|
$ps.Main().Add("div","jumbotron").N()
|
|
$ps.Append("h1","display-3",("vCD Tenant Report" -f $OrgVdcs.Count)).Append("p","lead","Organization User Count: {0}" -f $Users.Count).Append("p","lead","Organization Catalog Count: {0}" -f $Catalogs.Count).Append("p","lead","Organization VDC Count: {0}" -f $OrgVdcs.Count).Append("hr","my-4").Append("p","font-italic","This Report lists the most important objects in your vCD Environmet. For more details contact your Service Provider").N()
|
|
|
|
## add Org Users to Report
|
|
$ps.Main().Append("h2",$null,"Org Users").N()
|
|
|
|
$ps.Add('table','table').Add("tr","bgtitle text-white").Append("th",$null,"User Name").Append("th",$null,"Locked").Append("th",$null,"DeployedVMCount").Append("th",$null,"StoredVMCount").N()
|
|
$ps.Add("tr").N()
|
|
|
|
foreach ($User in $Users) {
|
|
$ps.Append("td",$null,$User.Name).N()
|
|
$ps.Append("td",$null,$User.Locked).N()
|
|
$ps.Append("td",$null,$User.DeployedVMCount).N()
|
|
$ps.Append("td",$null,$User.StoredVMCount).N()
|
|
$ps.Up().N()
|
|
|
|
}
|
|
$ps.Up().N()
|
|
|
|
## add Org Catalogs to Report
|
|
$ps.Main().Append("h2",$null,"Org Catalogs").N()
|
|
|
|
foreach ($Catalog in $Catalogs) {
|
|
$ps.Add('table','table').Add("tr","bgtitle text-white").Append("th",$null,"Catalog Name").N()
|
|
$ps.Add("tr").N()
|
|
$ps.Append("td",$null,$Catalog.Name).Up().N()
|
|
|
|
$ps.Add("td","bgsubsection").N()
|
|
$ps.Add("table","table bgcolorsub").N()
|
|
$ps.Add("tr").N()
|
|
|
|
$headers = @("Item")
|
|
foreach ($h in $headers) {
|
|
$ps.Append("th",$null,$h).N()
|
|
}
|
|
$ps.Up().N()
|
|
|
|
### add Itens of the Catalog to the Report
|
|
[Array] $Items = $Catalog.ExtensionData.CatalogItems.CatalogItem
|
|
|
|
foreach ($Item in $Items) {
|
|
$ps.Add("tr").N()
|
|
$ps.Append("td",$null,$Item.Name).N()
|
|
|
|
$ps.Up().N()
|
|
|
|
}
|
|
|
|
$ps.Up().Up().N()
|
|
}
|
|
$ps.Up().N()
|
|
|
|
## add Org VDC`s to the Report
|
|
$ps.Main().Append("h2",$null,"Org VDCs").N()
|
|
|
|
foreach ($OrgVdc in $OrgVdcs) {
|
|
$ps.Main().Add('table','table table-striped table-inverse').Add("tr").Append("th",$null,"VDC Name").Append("th",$null,"Enabled").Append("th",$null,"CpuUsedGHz").Append("th",$null,"MemoryUsedGB").Append("th",$null,"StorageUsedGB").Up().N()
|
|
$ps.Add("tr").N()
|
|
$ps.Append("td",$null,$OrgVdc.Name).Append("td",$null,$OrgVdc.Enabled).Append("td",$null,$OrgVdc.CpuUsedGHz).Append("td",$null,$OrgVdc.MemoryUsedGB).Append("td",$null,[Math]::Round($OrgVdc.StorageUsedGB,2)).Up().N()
|
|
|
|
### add Edge Gateways of this Org VDC to Report
|
|
$ps.Main().Append("h3",$null,"Org VDC Edge Gateways").N()
|
|
[Array] $Edges = Search-Cloud -QueryType EdgeGateway -Filter "Vdc==$($OrgVdc.Id)"
|
|
|
|
foreach ($Edge in $Edges) {
|
|
$ps.Add('table','table').Add("tr","bgtitle text-white").Append("th",$null,"Edge Name").N()
|
|
$ps.Add("tr").N()
|
|
$ps.Append("td",$null,$Edge.Name).Up().N()
|
|
|
|
$ps.Add("td","bgsubsection").N()
|
|
$ps.Add("table","table bgcolorsub").N()
|
|
$ps.Append("tr").Append("td","font-weight-bold","HaStatus").Append("td",$null,($Edge.HaStatus)).N()
|
|
$ps.Append("td","font-weight-bold","AdvancedNetworkingEnabled").Append("td",$null,$Edge.AdvancedNetworkingEnabled).N()
|
|
$ps.Append("tr").Append("td","font-weight-bold","NumberOfExtNetworks").Append("td",$null,($Edge.NumberOfExtNetworks)).N()
|
|
$ps.Append("td","font-weight-bold","NumberOfOrgNetworks").Append("td",$null,$Edge.NumberOfOrgNetworks).N()
|
|
|
|
$ps.Up().Up().N()
|
|
}
|
|
$ps.Up().N()
|
|
|
|
### add Org Networks of this Org VDC to Report
|
|
$ps.Main().Append("h3",$null,"Org VDC Networks").N()
|
|
[Array] $Networks = $OrgVdc | Get-OrgVdcNetwork
|
|
|
|
foreach ($Network in $Networks) {
|
|
$ps.Add('table','table').Add("tr","bgtitle text-white").Append("th",$null,"Network Name").N()
|
|
$ps.Add("tr").N()
|
|
$ps.Append("td",$null,$Network.Name).Up().N()
|
|
|
|
$ps.Add("td","bgsubsection").N()
|
|
$ps.Add("table","table bgcolorsub").N()
|
|
$ps.Append("tr").Append("td","font-weight-bold","DefaultGateway").Append("td",$null,($Network.DefaultGateway)).N()
|
|
$ps.Append("td","font-weight-bold","Netmask").Append("td",$null,$Network.Netmask).N()
|
|
$ps.Append("tr").Append("td","font-weight-bold","NetworkType").Append("td",$null,($Network.NetworkType)).N()
|
|
$ps.Append("td","font-weight-bold","StaticIPPool").Append("td",$null,$Network.StaticIPPool).N()
|
|
|
|
$ps.Up().Up().N()
|
|
}
|
|
$ps.Up().N()
|
|
|
|
### add vApps of this Org VDC to Report
|
|
$ps.Main().Append("h3",$null,"Org VDC vApps").N()
|
|
|
|
[Array] $Vapps = $OrgVdc | Get-CIVApp
|
|
|
|
foreach ($Vapp in $Vapps) {
|
|
$ps.Add('table','table').Add("tr","bgtitle text-white").Append("th",$null,"vApp Name").Append("th",$null,"Owner").Up().N()
|
|
$ps.Add("tr").N()
|
|
$ps.Append("td",$null,$Vapp.Name).Append("td",$null,$Vapp.Owner).Up().N()
|
|
|
|
#### add VMs of this vApp to Report
|
|
$ps.Add("td","bgsubsection").N()
|
|
$ps.Add("table","table bgcolorsub").N()
|
|
$ps.Add("tr").N()
|
|
|
|
$headers = @("Name","Status","GuestOSFullName","CpuCount","MemoryGB")
|
|
foreach ($h in $headers) {
|
|
$ps.Append("th",$null,$h).N()
|
|
}
|
|
$ps.Up().N()
|
|
|
|
[Array] $VMs = $Vapp | Get-CIVM
|
|
|
|
foreach ($VM in $VMs) {
|
|
$ps.Add("tr").N()
|
|
$ps.Append("td",$null,$VM.Name).N()
|
|
$ps.Append("td",$null,$VM.Status).N()
|
|
$ps.Append("td",$null,$VM.GuestOSFullName).N()
|
|
$ps.Append("td",$null,$VM.CpuCount).N()
|
|
$ps.Append("td",$null,$VM.MemoryGB).N()
|
|
|
|
$ps.Up().N()
|
|
|
|
}
|
|
$ps.Up().Up().N()
|
|
|
|
}
|
|
$ps.Up().N()
|
|
|
|
}
|
|
$ps.save($Path)
|
|
|
|
"$(Get-Date -Format "yyyy-MM-dd HH:mm:ss") - Open HTML Report..."
|
|
Start-Process $Path
|
|
|
|
}
|
|
}
|