tools/gcve2bq/get-gcve-util.ps1 (214 lines of code) (raw):

# Copyright 2023 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. function get-DatastoreUtil { <# .SYNOPSIS Run Get-Datastore and write contents to file. .EXAMPLE get-DatastoreUtil -server "aVcenterServer" get-DatastoreUtil -server "10.0.0.1" #> param ( [Parameter(Mandatory=$true, Position=0)][string]$server ) $uuid = "datastores.json" if (Test-Path $uuid) { Remove-Item $uuid } $run_date = [datetime]::Now.ToUniversalTime().ToString("s") Write-Host $run_date $run_id = New-Guid $datastores = (Get-Datastore | Select-Object -Property Name, CapacityGB, FreeSpaceGB) foreach ($datastore in $datastores){ #hashTable allows for flexibility with extracted objects $ht = @{} $datastore | Add-Member -Type NoteProperty -Name "run_id" -Value $run_id.ToString() $datastore | Add-Member -Type NoteProperty -Name "run_date" -Value $run_date $datastore | Add-Member -Type NoteProperty -Name "vCenter" -Value $server $datastore | Add-Member -Type NoteProperty -Name "region" -Value $server.split('.')[2] $ht.add("run_id",$datastore.run_id); $ht.add("run_date",$datastore.run_date); $ht.add("vCenter",$datastore.vCenter); $ht.add("region",$datastore.region); $ht.add("Name",$datastore.Name); $ht.add("CapacityGB",$datastore.CapacityGB); $ht.add("FreeSpaceGB",$datastore.FreeSpaceGB); $jsonline = $ht | ConvertTo-Json -Compress Add-Content $uuid $jsonline } Write-Host $uuid } function get-HostUtil { <# .SYNOPSIS Run Get-VMHost and write contents to file. .EXAMPLE get-HostUtil -server "aVcenterServer" get-HostUtil -server "10.0.0.1" #> param ( [Parameter(Mandatory=$true, Position=0)][string]$server ) $uuid = "esxi.json" Write-Host "Writing to $uuid" if (Test-Path $uuid) { Remove-Item $uuid } $run_date = [datetime]::Now.ToUniversalTime().ToString("s") Write-Host $run_date $run_id = New-Guid $esxiHosts = (Get-VMHost | Select-Object -Property Name,` CpuUsageMhz,CpuTotalMhz,` MemoryUsageGB, MemoryTotalGB, PowerState, NumCpu) foreach ($esxi in $esxiHosts){ #hashTable allows for flexibility with extracted objects $ht = @{} #Grab the host to access extended properties $an_esxi_host = Get-VMHost -Name $esxi.Name #Parent Name of the Host is the Cluster Name $Cluster = $an_esxi_host.Parent.Name $NumCpuCores = $an_esxi_host.ExtensionData.Summary.Hardware.NumCpuCores $NumCpuThreads = $an_esxi_host.ExtensionData.Summary.Hardware.NumCpuThreads $esxi | Add-Member -Type NoteProperty -Name "run_id" -Value $run_id.ToString() $esxi | Add-Member -Type NoteProperty -Name "run_date" -Value $run_date $esxi | Add-Member -Type NoteProperty -Name "vCenter" -Value $server $esxi | Add-Member -Type NoteProperty -Name "region" -Value $server.split('.')[2] #add our extended properties to our main object $esxi | Add-Member -Type NoteProperty -Name "NumCpuCores" -Value $NumCpuCores $esxi | Add-Member -Type NoteProperty -Name "NumCpuThreads" -Value $NumCpuThreads $esxi | Add-Member -Type NoteProperty -Name "Cluster" -Value $Cluster $ht.add("run_id",$esxi.run_id); $ht.add("run_date",$esxi.run_date); $ht.add("vCenter",$esxi.vCenter); $ht.add("region",$esxi.region); #Name, CpuUsageMhz, CpuTotalMhz, MemoryUsageGB, MemoryTotalGB, PowerState) $ht.add("Name",$esxi.Name); $ht.add("CpuUsageMhz",$esxi.CpuUsageMhz); $ht.add("CpuTotalMhz",$esxi.CpuTotalMhz); $ht.add("MemoryUsageGB",$esxi.MemoryUsageGB); $ht.add("MemoryTotalGB",$esxi.MemoryTotalGB); $ht.add("PowerState",$esxi.PowerState); #CPU info $ht.add("NumCpu",$esxi.NumCpu); $ht.add("NumCpuCores",$esxi.NumCpuCores); $ht.add("NumCpuThreads",$esxi.NumCpuThreads); #Cluster Name if ( $esxi.Cluster -eq $null ){ $esxi.Cluster = "" } $ht.add("Cluster",$esxi.Cluster.ToString() ); $jsonline = $ht | ConvertTo-Json -Compress Add-Content $uuid $jsonline } Write-Host $uuid } function get-util { <# .SYNOPSIS Run Get-VM and write contents to file. .EXAMPLE get-util -server "aVcenterServer" get-util -server "10.0.0.1" #> param ( [Parameter(Mandatory=$true, Position=0)][string]$server ) #$vCenterHostname = $server.split('.')[0] $uuid = "vm.json" if (Test-Path $uuid) { Remove-Item $uuid } $run_date = [datetime]::Now.ToUniversalTime().ToString("s") Write-Host $run_date $run_id = New-Guid $vms = (Get-VM | Select-Object -Property Name, CustomFields, NumCpu, MemoryGB,` ProvisionedSpaceGB, PowerState,` VMHost) # Add-Content $uuid $vms foreach ($i in $vms) { #hashTable allows for flexibility with extracted objects $ht = @{} #Get the Cluster Parent Name $_vmHost = Get-VMHost -Name $i.VMHost $Cluster = $_vmHost.Parent.Name $i | Add-Member -Type NoteProperty -Name "run_id" -Value $run_id.ToString() $i | Add-Member -Type NoteProperty -Name "run_date" -Value $run_date $i | Add-Member -Type NoteProperty -Name "vCenter" -Value $server $i | Add-Member -Type NoteProperty -Name "region" -Value $server.split('.')[2] $i | Add-Member -Type NoteProperty -Name "Cluster" -Value $Cluster $custom = $i | Select -ExpandProperty "CustomFields" foreach ($co in $custom) { if ($co.Key -eq "application") { $i | Add-Member -Type NoteProperty -Name "applications" -Value $co.Value.split(",") } } $ht.add("run_id",$i.run_id); $ht.add("run_date",$i.run_date); $ht.add("vCenter",$i.vCenter); $ht.add("region",$i.region); $ht.add("Name",$i.Name); $ht.add("CustomFields",$i.CustomFields); $ht.add("NumCpu",$i.NumCpu); $ht.add("MemoryGB",$i.MemoryGB); $ht.add("ProvisionedSpaceGB",$i.ProvisionedSpaceGB); $ht.add("PowerState",$i.PowerState); #null check before converting to string if ( $i.VMHost -eq $null ){ $i.VMHost = "" } if ( $i.Cluster -eq $null ){ $i.Cluster = "" } $ht.add("VMHost",$i.VMHost.ToString() ); $ht.add("Cluster",$i.Cluster.ToString() ); $jsonline = $ht | ConvertTo-Json -Compress Add-Content $uuid $jsonline } Write-Host $uuid } function main { <# .SYNOPSIS 1. Fetch environment variables for vCenter and BigQuery connection 2. Extract data and write to flat file 3. Load Data into BQ table .EXAMPLE main #> # Fetch environment variables from Cloud Run configuration $dataset_region=[System.Environment]::GetEnvironmentVariable('dataset_region') $datastore_table=[System.Environment]::GetEnvironmentVariable('datastore_table') # format: project:dataset.table $esxi_table=[System.Environment]::GetEnvironmentVariable('esxi_table') # format: project:dataset.table $vm_table=[System.Environment]::GetEnvironmentVariable('vm_table') # format: project:dataset.table $vCenter_username=[System.Environment]::GetEnvironmentVariable('vCenter_username') $vCenter_server=[System.Environment]::GetEnvironmentVariable('vCenter_server') $vCenter_password=[System.Environment]::GetEnvironmentVariable('vCenter_password') $vCenterHostname = $vCenter_server.split('.')[0] # Setup PowerCLI Import-Module VMware.PowerCLI -Verbose:$false $_tmppwd = ConvertTo-SecureString $vCenter_password -AsPlainText -Force $_cred = New-Object System.Management.Automation.PSCredential ($vCenter_username , $_tmppwd) Connect-VIServer -Server $vCenter_server -Credential $_cred # Fetch utilization data and load to BigQuery get-DatastoreUtil -server $vCenter_server bq load --location $dataset_region --noreplace --autodetect --source_format NEWLINE_DELIMITED_JSON $datastore_table "datastores.json" get-HostUtil -server $vCenter_server bq load --location $dataset_region --noreplace --autodetect --source_format NEWLINE_DELIMITED_JSON $esxi_table "esxi.json" get-util -server $vCenter_server bq load --location $dataset_region --noreplace --autodetect --source_format NEWLINE_DELIMITED_JSON $vm_table "vm.json" Disconnect-VIServer -Server $vCenter_server -Force -confirm:$false } main