Files
dmilov fb641c8a1c License PowerCLI-Examples-Scripts repository under BSD-2 Clause (#462)
As part of the VMware open source program, we have to update this repository with the correct license and copyright information.
We add the BSD-2 Clause License for this repository.
We mark all source code provided by VMware with the Copyright notice under BSD-2 Clause license.

* Update repository license to BSD 2-Clause License

* Update Copyright
2021-06-07 09:58:47 +03:00

1706 lines
67 KiB
PowerShell

<#
Copyright 2021 VMware, Inc.
SPDX-License-Identifier: BSD-2-Clause
#>
Function Connect-HcxServer {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Connect to the HCX Enterprise Manager
.DESCRIPTION
This cmdlet connects to the HCX Enterprise Manager
.EXAMPLE
Connect-HcxServer -Server $HCXServer -Username $Username -Password $Password
#>
Param (
[Parameter(Mandatory=$true)][String]$Server,
[Parameter(Mandatory=$true)][String]$Username,
[Parameter(Mandatory=$true)][String]$Password
)
$payload = @{
"username" = $Username
"password" = $Password
}
$body = $payload | ConvertTo-Json
$hcxLoginUrl = "https://$Server/hybridity/api/sessions"
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $hcxLoginUrl -Body $body -Method POST -UseBasicParsing -ContentType "application/json" -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $hcxLoginUrl -Body $body -Method POST -UseBasicParsing -ContentType "application/json"
}
if($results.StatusCode -eq 200) {
$hcxAuthToken = $results.Headers.'x-hm-authorization'
$headers = @{
"x-hm-authorization"="$hcxAuthToken"
"Content-Type"="application/json"
"Accept"="application/json"
}
$global:hcxConnection = new-object PSObject -Property @{
'Server' = "https://$server/hybridity/api";
'headers' = $headers
}
$global:hcxConnection
} else {
Write-Error "Failed to connect to HCX Manager, please verify your vSphere SSO credentials"
}
}
Function Get-HcxCloudConfig {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the Cloud HCX information that is registerd with HCX Manager
.DESCRIPTION
This cmdlet returns the Cloud HCX information that is registerd with HCX Manager
.EXAMPLE
Get-HcxCloudConfig
#>
If (-Not $global:hcxConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxServer " } Else {
$cloudConfigUrl = $global:hcxConnection.Server + "/cloudConfigs"
if($PSVersionTable.PSEdition -eq "Core") {
$cloudvcRequests = Invoke-WebRequest -Uri $cloudConfigUrl -Method GET -Headers $global:hcxConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$cloudvcRequests = Invoke-WebRequest -Uri $cloudConfigUrl -Method GET -Headers $global:hcxConnection.headers -UseBasicParsing
}
$cloudvcData = ($cloudvcRequests.content | ConvertFrom-Json).data.items
$tmp = [pscustomobject] @{
Name = $cloudvcData.cloudName;
Version = $cloudvcData.version;
Build = $cloudvcData.buildNumber;
HCXUUID = $cloudvcData.endpointId;
}
$tmp
}
}
Function Get-HcxEndpoint {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/24/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
List all HCX endpoints (onPrem and Cloud)
.DESCRIPTION
This cmdlet lists all HCX endpoints (onPrem and Cloud)
.EXAMPLE
Get-HcxEndpoint -cloudVCConnection $cloudVCConnection
#>
Param (
[Parameter(Mandatory=$true)]$cloudVCConnection
)
If (-Not $global:hcxConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxManager " } Else {
#Cloud HCX Manager
$cloudHCXConnectionURL = $global:hcxConnection.Server + "/cloudConfigs"
if($PSVersionTable.PSEdition -eq "Core") {
$cloudRequests = Invoke-WebRequest -Uri $cloudHCXConnectionURL -Method GET -Headers $global:hcxConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$cloudRequests = Invoke-WebRequest -Uri $cloudHCXConnectionURL -Method GET -Headers $global:hcxConnection.headers -UseBasicParsing
}
$cloudData = ($cloudRequests.Content | ConvertFrom-Json).data.items[0]
$hcxInventoryUrl = $global:hcxConnection.Server + "/service/inventory/resourcecontainer/list"
$payload = @{
"cloud" = @{
"local"="true";
"remote"="true";
}
}
$body = $payload | ConvertTo-Json
if($PSVersionTable.PSEdition -eq "Core") {
$requests = Invoke-WebRequest -Uri $hcxInventoryUrl -Body $body -Method POST -Headers $global:hcxConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$requests = Invoke-WebRequest -Uri $hcxInventoryUrl -Body $body -Method POST -Headers $global:hcxConnection.headers -UseBasicParsing
}
if($requests.StatusCode -eq 200) {
$items = ($requests.Content | ConvertFrom-Json).data.items
$results = @()
foreach ($item in $items) {
$tmp = [pscustomobject] @{
SourceResourceName = $item.resourceName;
SourceResourceType = $item.resourceType;
SourceResourceId = $item.resourceId;
SourceEndpointName = $item.endpoint.name;
SourceEndpointType = "VC"
SourceEndpointId = $item.endpoint.endpointId;
RemoteResourceName = $cloudVCConnection.name;
RemoteResourceType = "VC"
RemoteResourceId = $cloudVCConnection.InstanceUuid
RemoteEndpointName = $cloudData.cloudName;
RemoteEndpointType = $cloudData.cloudType;
RemoteEndpointId = $cloudData.endpointId;
}
$results+=$tmp
}
return $results
} else {
Write-Error "Failed to list HCX Connection Resources"
}
}
}
Function New-HcxMigration {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/24/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Initiate a "Bulk" migrations supporting Cold, vMotion, VR or new Cloud Motion
.DESCRIPTION
This cmdlet initiates a "Bulk" migrations supporting Cold, vMotion, VR or new Cloud Motionn
.EXAMPLE
Validate Migration request only
New-HcxMigration -onPremVCConnection $onPremVC -cloudVCConnection $cloudVC `
-MigrationType bulkVMotion `
-VMs @("SJC-CNA-34","SJC-CNA-35","SJC-CNA-36") `
-NetworkMappings @{"SJC-CORP-WORKLOADS"="sddc-cgw-network-1";"SJC-CORP-INTERNAL-1"="sddc-cgw-network-2";"SJC-CORP-INTERNAL-2"="sddc-cgw-network-3"} `
-StartTime "Sep 24 2018 1:30 PM" `
-EndTime "Sep 24 2018 2:30 PM"
.EXAMPLE
Start Migration request
New-HcxMigration -onPremVCConnection $onPremVC -cloudVCConnection $cloudVC `
-MigrationType bulkVMotion `
-VMs @("SJC-CNA-34","SJC-CNA-35","SJC-CNA-36") `
-NetworkMappings @{"SJC-CORP-WORKLOADS"="sddc-cgw-network-1";"SJC-CORP-INTERNAL-1"="sddc-cgw-network-2";"SJC-CORP-INTERNAL-2"="sddc-cgw-network-3"} `
-StartTime "Sep 24 2018 1:30 PM" `
-EndTime "Sep 24 2018 2:30 PM" `
-MigrationType bulkVMotion
#>
Param (
[Parameter(Mandatory=$true)][String[]]$VMs,
[Parameter(Mandatory=$true)][Hashtable]$NetworkMappings,
[Parameter(Mandatory=$true)]$onPremVCConnection,
[Parameter(Mandatory=$true)]$cloudVCConnection,
[Parameter(Mandatory=$true)][String]$StartTime,
[Parameter(Mandatory=$true)][String]$EndTime,
[Parameter(Mandatory=$true)][ValidateSet("Cold","vMotion","VR","bulkVMotion")][String]$MigrationType,
[Parameter(Mandatory=$false)]$ValidateOnly=$true
)
If (-Not $global:hcxConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxManager " } Else {
$hcxEndpointInfo = Get-HcxEndpoint -cloudVCConnection $cloudVCConnection
$inputArray = @()
foreach ($vm in $VMs) {
$vmView = Get-View -Server $onPremVCConnection -ViewType VirtualMachine -Filter @{"name"=$vm}
$cloudResourcePoolName = "Compute-ResourcePool"
$cloudFolderName = "Workloads"
$cloudDatastoreName = "WorkloadDatastore"
$cloudDatacenterName = "SDDC-Datacenter"
$cloudResourcePool = (Get-ResourcePool -Server $cloudVCConnection -Name $cloudResourcePoolName).ExtensionData
$cloudFolder = (Get-Folder -Server $cloudVCConnection -Name $cloudFolderName).ExtensionData
$cloudDatastore = (Get-Datastore -Server $cloudVCConnection -Name $cloudDatastoreName).ExtensionData
$cloudDatacenter = (Get-Datacenter -Server $cloudVCConnection -Name $cloudDatacenterName).ExtensionData
$placementArray = @()
$placement = @{
"containerType"="folder";
"containerId"=$cloudFolder.MoRef.Value;
"containerName"=$cloudFolderName;
}
$placementArray+=$placement
$placement = @{
"containerType"="resourcePool";
"containerId"=$cloudResourcePool.MoRef.Value;
"containerName"=$cloudResourcePoolName;
}
$placementArray+=$placement
$placement = @{
"containerType"="dataCenter";
"containerId"=$cloudDatacenter.MoRef.Value;
"containerName"=$cloudDatacenterName;
}
$placementArray+=$placement
$networkArray = @()
$vmNetworks = $vmView.Network
foreach ($vmNetwork in $vmNetworks) {
if($vmNetwork.Type -eq "Network") {
$sourceNetworkType = "VirtualNetwork"
} else { $sourceNetworkType = $vmNetwork.Type }
$sourceNetworkRef = New-Object VMware.Vim.ManagedObjectReference
$sourceNetworkRef.Type = $vmNetwork.Type
$sourceNetworkRef.Value = $vmNetwork.Value
$sourceNetwork = Get-View -Server $onPremVCConnection $sourceNetworkRef
$sourceNetworkName = $sourceNetwork.Name
$destNetworkName = $NetworkMappings[$sourceNetworkName]
$destNetwork = Get-VDPortGroup -Server $cloudVCConnection -Name $destNetworkName
if($destNetwork.Id -match "DistributedVirtualPortgroup") {
$destNetworkType = "DistributedVirtualPortgroup"
$destNetworkId = ($destNetwork.Id).Replace("DistributedVirtualPortgroup-","")
} else {
$destNetworkType = "Network"
$destNetworkId = ($destNetwork.Id).Replace("Network-","")
}
$tmp = @{
"srcNetworkType" = $sourceNetworkType;
"srcNetworkValue" = $vmNetwork.Value;
"srcNetworkHref" = $vmNetwork.Value;
"srcNetworkName" = $sourceNetworkName;
"destNetworkType" = $destNetworkType;
"destNetworkValue" = $destNetworkId;
"destNetworkHref" = $destNetworkId;
"destNetworkName" = $destNetworkName;
}
$networkArray+=$tmp
}
$input = @{
"input" = @{
"migrationType"=$MigrationType;
"entityDetails" = @{
"entityId"=$vmView.MoRef.Value;
"entityName"=$vm;
}
"source" = @{
"endpointType"=$hcxEndpointInfo.SourceEndpointType;
"endpointId"=$hcxEndpointInfo.SourceEndpointId;
"endpointName"=$hcxEndpointInfo.SourceEndpointName;
"resourceType"=$hcxEndpointInfo.SourceResourceType;
"resourceId"=$hcxEndpointInfo.SourceResourceId;
"resourceName"=$hcxEndpointInfo.SourceResourceName;
}
"destination" = @{
"endpointType"=$hcxEndpointInfo.RemoteEndpointType;
"endpointId"=$hcxEndpointInfo.RemoteEndpointId;
"endpointName"=$hcxEndpointInfo.RemoteEndpointName;
"resourceType"=$hcxEndpointInfo.RemoteResourceType;
"resourceId"=$hcxEndpointInfo.RemoteResourceId;
"resourceName"=$hcxEndpointInfo.RemoteResourceName;
}
"placement" = $placementArray
"storage" = @{
"datastoreId"=$cloudDatastore.Moref.Value;
"datastoreName"=$cloudDatastoreName;
"diskProvisionType"="thin";
}
"networks" = @{
"retainMac" = $true;
"targetNetworks" = $networkArray;
}
"decisionRules" = @{
"removeSnapshots"=$true;
"removeISOs"=$true;
"forcePowerOffVm"=$false;
"upgradeHardware"=$false;
"upgradeVMTools"=$false;
}
"schedule" = @{}
}
}
$inputArray+=$input
}
$spec = @{
"migrations"=$inputArray
}
$body = $spec | ConvertTo-Json -Depth 20
Write-Verbose -Message "Pre-Validation JSON Spec: $body"
$hcxMigrationValiateUrl = $global:hcxConnection.Server+ "/migrations?action=validate"
if($PSVersionTable.PSEdition -eq "Core") {
$requests = Invoke-WebRequest -Uri $hcxMigrationValiateUrl -Body $body -Method POST -Headers $global:hcxConnection.headers -UseBasicParsing -ContentType "application/json" -SkipCertificateCheck
} else {
$requests = Invoke-WebRequest -Uri $hcxMigrationValiateUrl -Body $body -Method POST -Headers $global:hcxConnection.headers -UseBasicParsing -ContentType "application/json"
}
if($requests.StatusCode -eq 200) {
$validationErrors = ($requests.Content|ConvertFrom-Json).migrations.validationInfo.validationResult.errors
if($validationErrors -ne $null) {
Write-Host -Foreground Red "`nThere were validation errors found for this HCX Migration Spec ..."
foreach ($message in $validationErrors) {
Write-Host -Foreground Yellow "`t" $message.message
}
} else {
Write-Host -Foreground Green "`nHCX Pre-Migration Spec successfully validated"
if($ValidateOnly -eq $false) {
try {
$startDateTime = $StartTime | Get-Date
} catch {
Write-Host -Foreground Red "Invalid input for -StartTime, please check for typos"
exit
}
try {
$endDateTime = $EndTime | Get-Date
} catch {
Write-Host -Foreground Red "Invalid input for -EndTime, please check for typos"
exit
}
$offset = (Get-TimeZone).GetUtcOffset($startDateTime).TotalMinutes
$offset = [int]($offSet.toString().replace("-",""))
$schedule = @{
scheduledFailover = $true;
startYear = $startDateTime.Year;
startMonth = $startDateTime.Month;
startDay = $startDateTime.Day;
startHour = $startDateTime | Get-Date -UFormat %H;
startMinute = $startDateTime | Get-Date -UFormat %M;
endYear = $endDateTime.Year;
endMonth = $endDateTime.Month;
endDay = $endDateTime.Day;
endHour = $endDateTime | Get-Date -UFormat %H;
endMinute = $endDateTime | Get-Date -UFormat %M;
timezoneOffset = $offset;
}
foreach ($migration in $spec.migrations) {
$migration.input.schedule = $schedule
}
$body = $spec | ConvertTo-Json -Depth 8
Write-Verbose -Message "Validated JSON Spec: $body"
$hcxMigrationStartUrl = $global:hcxConnection.Server+ "/migrations?action=start"
if($PSVersionTable.PSEdition -eq "Core") {
$requests = Invoke-WebRequest -Uri $hcxMigrationStartUrl -Body $body -Method POST -Headers $global:hcxConnection.headers -UseBasicParsing -ContentType "application/json" -SkipCertificateCheck
} else {
$requests = Invoke-WebRequest -Uri $hcxMigrationStartUrl -Body $body -Method POST -Headers $global:hcxConnection.headers -UseBasicParsing -ContentType "application/json"
}
if($requests.StatusCode -eq 200) {
$migrationIds = ($requests.Content | ConvertFrom-Json).migrations.migrationId
Write-Host -ForegroundColor Green "Starting HCX Migration ..."
foreach ($migrationId in $migrationIds) {
Write-Host -ForegroundColor Green "`tMigrationID: $migrationId"
}
} else {
Write-Error "Failed to start HCX Migration"
}
}
}
} else {
Write-Error "Failed to validate HCX Migration spec"
}
}
}
Function Get-HcxMigration {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/24/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
List all HCX Migrations that are in-progress, have completed or failed
.DESCRIPTION
This cmdlet lists ist all HCX Migrations that are in-progress, have completed or failed
.EXAMPLE
List all HCX Migrations
Get-HcxMigration
.EXAMPLE
List all running HCX Migrations
Get-HcxMigration -RunningMigrations
.EXAMPLE
List all HCX Migrations
Get-HcxMigration -MigrationId <MigrationID>
#>
Param (
[Parameter(Mandatory=$false)][String[]]$MigrationId,
[Switch]$RunningMigrations
)
If (-Not $global:hcxConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxManager " } Else {
If($PSBoundParameters.ContainsKey("MigrationId")){
$spec = @{
filter = @{
migrationId = $MigrationId
}
paging =@{
pageSize = $MigrationId.Count
}
}
} Else {
$spec = @{}
}
$body = $spec | ConvertTo-Json
$hcxQueryUrl = $global:hcxConnection.Server + "/migrations?action=query"
if($PSVersionTable.PSEdition -eq "Core") {
$requests = Invoke-WebRequest -Uri $hcxQueryUrl -Method POST -body $body -Headers $global:hcxConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$requests = Invoke-WebRequest -Uri $hcxQueryUrl -Method POST -Headers $global:hcxConnection.headers -UseBasicParsing
}
if($PSBoundParameters.ContainsKey("MigrationId")){
$migrations = ($requests.content | ConvertFrom-Json).items
} else {
$migrations = ($requests.content | ConvertFrom-Json).rows
}
if($RunningMigrations){
$migrations = $migrations | where { $_.jobInfo.state -ne "MIGRATE_FAILED" -and $_.jobInfo.state -ne "MIGRATE_CANCELED"-and $_.jobInfo.state -ne "MIGRATED" }
}
$results = @()
foreach ($migration in $migrations) {
$tmp = [pscustomobject] @{
ID = $migration.migrationId;
VM = $migration.migrationInfo.entityDetails.entityName;
State = $migration.jobInfo.state;
Progress = ($migration.migrationInfo.progressDetails.progressPercentage).toString() + " %";
DataCopied = ([math]::round($migration.migrationInfo.progressDetails.diskCopyBytes/1Gb, 2)).toString() + " GB";
Message = $migration.migrationInfo.message;
InitiatedBy = $migration.jobInfo.username;
CreateDate = $migration.jobInfo.creationDate;
LastUpdated = $migration.jobInfo.lastUpdated;
}
$results+=$tmp
}
$results
}
}
Function Connect-HcxVAMI {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Connect to the HCX Enterprise Manager VAMI
.DESCRIPTION
This cmdlet connects to the HCX Enterprise Manager VAMI
.EXAMPLE
Connect-HcxVAMI -Server $HCXServer -Username $VAMIUsername -Password $VAMIPassword
#>
Param (
[Parameter(Mandatory=$true)][String]$Server,
[Parameter(Mandatory=$true)][String]$Username,
[Parameter(Mandatory=$true)][String]$Password
)
$pair = "${Username}:${Password}"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
$base64 = [System.Convert]::ToBase64String($bytes)
$basicAuthValue = "Basic $base64"
$headers = @{
"authorization"="$basicAuthValue"
"Content-Type"="application/json"
"Accept"="application/json"
}
$global:hcxVAMIConnection = new-object PSObject -Property @{
'Server' = "https://${server}:9443";
'headers' = $headers
}
$global:hcxVAMIConnection
}
Function Get-HcxVCConfig {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the onPrem vCenter Server registered with HCX Manager
.DESCRIPTION
This cmdlet returns the onPrem vCenter Server registered with HCX Manager
.EXAMPLE
Get-HcxVCConfig
#>
If (-Not $global:hcxVAMIConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$vcConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/vcenter"
$pscConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/lookupservice"
if($PSVersionTable.PSEdition -eq "Core") {
$vcRequests = Invoke-WebRequest -Uri $vcConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
$ssoRequests = Invoke-WebRequest -Uri $pscConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$vcRequests = Invoke-WebRequest -Uri $vcConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
$ssoRequests = Invoke-WebRequest -Uri $pscConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
$vcData = ($vcRequests.content | ConvertFrom-Json).data.items
$ssoData = ($ssoRequests.content | ConvertFrom-Json).data.items
$tmp = [pscustomobject] @{
Name = $vcData.config.name;
UserName = $vcData.Config.userName
LookupServiceUrl = $ssoData.config.lookupServiceUrl
Version = $vcData.config.version;
Build = $vcData.config.buildNumber;
UUID = $vcData.config.vcuuid;
HCXUUID = $vcData.config.uuid;
}
$tmp
}
}
Function Get-HcxLicense {
<#
.NOTES
===========================================================================
Created by: Mark McGilly
Date: 4/29/2019
Organization: Liberty Mutual Insurance
===========================================================================
.SYNOPSIS
Returns the license key that is registered with HCX Manager
.DESCRIPTION
This cmdlet returns the license key registered with HCX Manager
.EXAMPLE
Get-HcxLicense
#>
If (-Not $global:hcxVAMIConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$hcxConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/hcx"
if($PSVersionTable.PSEdition -eq "Core") {
$licenseRequests = Invoke-WebRequest -Uri $hcxConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$licenseRequests = Invoke-WebRequest -Uri $hcxConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
$license = ($licenseRequests.content | ConvertFrom-Json).data.items
if($licenseRequests) {
$license.config.activationKey
}
}
}
Function Set-HcxLicense {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Activate HCX Manager with HCX Cloud
.DESCRIPTION
This cmdlet activates HCX Manager with HCX Cloud
.EXAMPLE
Set-HcxLicense -LicenseKey <KEY>
#>
Param (
[Parameter(Mandatory=$True)]$LicenseKey
)
If (-Not $global:hcxVAMIConnection) { Write-error "HCX VAMI Auth Token not found, please run Connect-HcxVAMI " } Else {
$hcxConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/hcx"
$method = "POST"
$hcxConfig = @{
config = @{
url = "https://connect.hcx.vmware.com";
activationKey = $LicenseKey;
}
}
$payload = @{
data = @{
items = @($hcxConfig)
}
}
$body = $payload | ConvertTo-Json -Depth 5
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$vcConfigUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $hcxConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $hcxConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully registered HCX Manager with HCX Cloud"
if($Troubleshoot) { ($results.Content | ConvertFrom-Json).data.items }
} else {
Write-Error "Failed to registered HCX Manager"
}
}
}
Function Set-HcxVCConfig {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Registers on-prem vCenter Server with HCX Manager
.DESCRIPTION
This cmdlet registers on-prem vCenter Server with HCX Manager
.EXAMPLE
Set-HcxVC -VIServer <hostname> -VIUsername <username> -VIPassword <password>
#>
Param (
[Parameter(Mandatory=$True)]$VIServer,
[Parameter(Mandatory=$True)]$PSCServer,
[Parameter(Mandatory=$True)]$VIUsername,
[Parameter(Mandatory=$True)]$VIPassword,
[Switch]$Troubleshoot
)
If (-Not $global:hcxVAMIConnection) { Write-error "HCX VAMI Auth Token not found, please run Connect-HcxVAMI " } Else {
$vcConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/vcenter"
$pscConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/lookupservice"
$method = "POST"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($VIPassword)
$base64 = [System.Convert]::ToBase64String($bytes)
$vcConfig = @{
config = @{
url = "https://$VIServer";
userName = $VIUsername;
password = $base64;
}
}
$payload = @{
data = @{
items = @($vcConfig)
}
}
$body = $payload | ConvertTo-Json -Depth 5
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$vcConfigUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $vcConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $vcConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully registered vCenter Server with HCX Manager"
if($Troubleshoot) { ($results.Content | ConvertFrom-Json).data.items.config }
$pscConfig = @{
config = @{
lookupServiceUrl = "https://$PSCServer"
providerType = "PSC"
}
}
$payload = @{
data = @{
items = @($pscConfig)
}
}
$body = $payload | ConvertTo-Json -Depth 5
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$pscConfigUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $pscConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $pscConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully registered PSC with HCX Manager"
if($Troubleshoot) { ($results.Content | ConvertFrom-Json).data.items.config }
} else {
Write-Error "Failed to registered PSC Server"
}
} else {
Write-Error "Failed to registered vCenter Server"
}
}
}
Function Get-HcxNSXConfig {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the onPrem NSX-V Server registered with HCX Manager
.DESCRIPTION
This cmdlet returns the onPrem NSX-V Server registered with HCX Manager
.EXAMPLE
Get-HcxNSXConfig
#>
If (-Not $global:hcxVAMIConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$nsxConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/nsx"
if($PSVersionTable.PSEdition -eq "Core") {
$nsxRequests = Invoke-WebRequest -Uri $nsxConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$nsxRequests = Invoke-WebRequest -Uri $nsxConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
$nsxData = ($nsxRequests.content | ConvertFrom-Json).data.items
$tmp = [pscustomobject] @{
Name = $nsxData.config.url;
UserName = $nsxData.config.userName
Version = $nsxData.config.version;
HCXUUID = $nsxData.config.uuid;
}
$tmp
}
}
Function Set-HcxNSXConfig {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Registers on-prem NSX-V Server with HCX Manager
.DESCRIPTION
This cmdlet registers on-prem NSX-V Server with HCX Manager
.EXAMPLE
Set-HcxNSXConfig -NSXServer <hostname> -NSXUsername <username> -NSXPassword <password>
#>
Param (
[Parameter(Mandatory=$True)]$NSXServer,
[Parameter(Mandatory=$True)]$NSXUsername,
[Parameter(Mandatory=$True)]$NSXPassword,
[Switch]$Troubleshoot
)
If (-Not $global:hcxVAMIConnection) { Write-error "HCX VAMI Auth Token not found, please run Connect-HcxVAMI " } Else {
$nsxConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/nsx"
$method = "POST"
$bytes = [System.Text.Encoding]::ASCII.GetBytes($NSXPassword)
$base64 = [System.Convert]::ToBase64String($bytes)
$nsxConfig = @{
config = @{
url = "https://$NSXServer";
userName = $NSXUsername;
password = $base64;
}
}
$payload = @{
data = @{
items = @($nsxConfig)
}
}
$body = $payload | ConvertTo-Json -Depth 5
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$nsxConfigUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $nsxConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $nsxConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully registered NSX Server with HCX Manager"
if($Troubleshoot) { ($results.Content | ConvertFrom-Json).data.items.config }
} else {
Write-Error "Failed to registered NSX Server"
}
return $config
}
}
Function Get-HcxCity {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the available HCX Location based on user City and Country input
.DESCRIPTION
This cmdlet returns the available HCX Location based on user City and Country input
.EXAMPLE
Get-HcxCity -City <City> -Country <Country>
#>
Param (
[Parameter(Mandatory=$True)]$City,
[Switch]$Troubleshoot
)
If (-Not $global:hcxVAMIConnection) { Write-error "HCX VAMI Auth Token not found, please run Connect-HcxVAMI " } Else {
$citySearchUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/searchCities?searchString=$City"
$method = "GET"
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$citySearchUrl`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $citySearchUrl -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $citySearchUrl -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully returned results for City search: $City"
$cityDetails = ($results.Content | ConvertFrom-Json).items
$cityDetails | select City,Country
} else {
Write-Error "Failed to search for city $City"
}
}
}
Function Get-HcxLocation {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the registered City/Country location for HCX Manager
.DESCRIPTION
This cmdlet returns the registered City/Country location for HCX Manager
.EXAMPLE
Get-HcxLocation
#>
If (-Not $global:hcxVAMIConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$locationConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/location"
if($PSVersionTable.PSEdition -eq "Core") {
$locationRequests = Invoke-WebRequest -Uri $locationConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$locationRequests = Invoke-WebRequest -Uri $locationConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
($locationRequests.content | ConvertFrom-Json)
}
}
Function Set-HcxLocation {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Register HCX Manager to a specific City/Country
.DESCRIPTION
This cmdlet register HCX Manager to a specific City/Country
.EXAMPLE
Set-HcxLocation -City <City> -Country <Country>
#>
Param (
[Parameter(Mandatory=$True)]$City,
[Parameter(Mandatory=$True)]$Country,
[Switch]$Troubleshoot
)
If (-Not $global:hcxVAMIConnection) { Write-error "HCX VAMI Auth Token not found, please run Connect-HcxVAMI " } Else {
$citySearchUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/searchCities?searchString=$City"
$method = "GET"
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$citySearchUrl`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $citySearchUrl -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $citySearchUrl -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
if($Troubleshoot) { ($results.Content | ConvertFrom-Json).items }
$locationConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/location"
$method = "PUT"
$cityDetails = ($results.Content | ConvertFrom-Json).items
$cityDetails = $cityDetails | where { $_.city -eq $City -and $_.country -match $Country }
if(-not $cityDetails) {
Write-Host -ForegroundColor Red "Invalid input for City and/or Country, please provide the exact input from Get-HcxCity cmdlet"
break
}
$locationConfig = @{
city = $cityDetails.city;
country = $cityDetails.country;
province = $cityDetails.province;
latitude = $cityDetails.latitude;
longitude = $cityDetails.longitude;
}
$body = $locationConfig | ConvertTo-Json -Depth 5
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$locationConfigUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $locationConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $locationConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 204) {
Write-Host -ForegroundColor Green "Successfully registered datacenter location $City to HCX Manager"
} else {
Write-Error "Failed to registerd datacenter location in HCX Manager"
}
} else {
Write-Error "Failed to search for city $City"
}
}
}
Function Get-HcxRoleMapping {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the System Admin and Enterprise User Group role mappings for HCX Manager
.DESCRIPTION
This cmdlet returns the System Admin and Enterprise User Group role mappings for HCX Manager
.EXAMPLE
Get-HcxRoleMapping
#>
If (-Not $global:hcxVAMIConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$roleConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/roleMappings"
if($PSVersionTable.PSEdition -eq "Core") {
$roleRequests = Invoke-WebRequest -Uri $roleConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$roleRequests = Invoke-WebRequest -Uri $roleConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
($roleRequests.content | ConvertFrom-Json)
}
}
Function Set-HcxRoleMapping {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 09/16/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Configures the System Admin and Enterprise User Group role mappings for HCX Manager
.DESCRIPTION
This cmdlet configures the System Admin and Enterprise User Group role mappings for HCX Manager
.EXAMPLE
Set-HcxRoleMapping -SystemAdminGroup @("DOMAIN\GROUP") -EnterpriseAdminGroup @("DOMAIN\GROUP")
#>
Param (
[Parameter(Mandatory=$True)][String[]]$SystemAdminGroup,
[Parameter(Mandatory=$True)][String[]]$EnterpriseAdminGroup,
[Switch]$Troubleshoot
)
If (-Not $global:hcxVAMIConnection) { Write-error "HCX VAMI Auth Token not found, please run Connect-HcxVAMI " } Else {
$roleConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/roleMappings"
$method = "PUT"
$roleConfig = @()
$systemAdminRole = @{
role = "System Administrator";
userGroups = $SystemAdminGroup
}
$enterpriseAdminRole = @{
role = "Enterprise Administrator"
userGroups = $EnterpriseAdminGroup
}
$roleConfig+=$systemAdminRole
$roleConfig+=$enterpriseAdminRole
$body = $roleConfig | ConvertTo-Json -Depth 5
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$locationConfigUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $roleConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $roleConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully updated vSphere Group Mappings in HCX Manager"
} else {
Write-Error "Failed to update vSphere Group Mappings"
}
}
}
Function Get-HcxProxy {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 10/31/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the proxy settings for HCX Manager
.DESCRIPTION
This cmdlet returns the proxy settings for HCX Manager
.EXAMPLE
Get-HcxProxy
#>
If (-Not $global:hcxVAMIConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$proxyConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/proxy"
if($PSVersionTable.PSEdition -eq "Core") {
$proxyRequests = Invoke-WebRequest -Uri $proxyConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$proxyRequests = Invoke-WebRequest -Uri $proxyConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
$proxySettings = ($proxyRequests.content | ConvertFrom-Json).data.items
if($proxyRequests) {
$proxySettings.config
}
}
}
Function Set-HcxProxy {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 10/31/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Configure proxy settings on HCX Manager
.DESCRIPTION
This cmdlet configure proxy settings on HCX Manager
.EXAMPLE
Set-HcxProxy -ProxyServer proxy.vmware.com -ProxyPort 3124
.EXAMPLE
Set-HcxProxy -ProxyServer proxy.vmware.com -ProxyPort 3124 -ProxyUser foo -ProxyPassword bar
#>
Param (
[Parameter(Mandatory=$True)]$ProxyServer,
[Parameter(Mandatory=$True)]$ProxyPort,
[Parameter(Mandatory=$False)]$ProxyUser,
[Parameter(Mandatory=$False)]$ProxyPassword,
[Parameter(Mandatory=$False)]$ProxyExclusions,
[Switch]$Troubleshoot
)
If (-Not $global:hcxVAMIConnection) { Write-error "HCX VAMI Auth Token not found, please run Connect-HcxVAMI " } Else {
$proxyConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/proxy"
$method = "POST"
if(-not $ProxyUser) { $ProxyUser = ""}
if(-not $ProxyPassword) { $ProxyPassword = ""}
$proxyConfig = @{
config = @{
proxyHost = "$ProxyServer";
proxyPort = "$ProxyPort";
nonProxyHosts = "$ProxyExclusions";
userName = "$ProxyUser";
password = "$ProxyPassword";
}
}
$payload = @{
data = @{
items = @($proxyConfig)
}
}
$body = $payload | ConvertTo-Json -Depth 5
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $method`n$proxyConfigUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $proxyConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $proxyConfigUrl -Body $body -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully updated proxy settings in HCX Manager"
if($Troubleshoot) { ($results.Content | ConvertFrom-Json).data.items.config }
} else {
Write-Error "Failed to update proxy settings"
}
}
}
Function Remove-HcxProxy {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 10/31/2018
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the proxy settings for HCX Manager
.DESCRIPTION
This cmdlet returns the proxy settings for HCX Manager
.EXAMPLE
Remove-HcxProxy
#>
If (-Not $global:hcxVAMIConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$roleConfigUrl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/proxy"
if($PSVersionTable.PSEdition -eq "Core") {
$proxyRequests = Invoke-WebRequest -Uri $roleConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$proxyRequests = Invoke-WebRequest -Uri $roleConfigUrl -Method GET -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
$proxySettings = ($proxyRequests.content | ConvertFrom-Json).data.items
if($proxyRequests) {
$proxyUUID = $proxySettings.config.UUID
$deleteProxyConfigURl = $global:hcxVAMIConnection.Server + "/api/admin/global/config/proxy/$proxyUUID"
$method = "DELETE"
try {
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $deleteProxyConfigURl -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $deleteProxyConfigURl -Method $method -Headers $global:hcxVAMIConnection.headers -UseBasicParsing
}
} catch {
Write-Host -ForegroundColor Red "`nRequest failed: ($_.Exception)`n"
break
}
if($results.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Successfully deleted proxy settings in HCX Manager"
} else {
Write-Error "Failed to delete proxy settings"
}
} else {
Write-Warning "No proxy settings were configured"
}
}
}
Function Connect-HcxCloudServer {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 06/19/2019
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Connect to the HCX Cloud Service
.DESCRIPTION
This cmdlet connects to the HCX Cloud Service
.EXAMPLE
Connect-HcxCloudServer -RefreshToken
#>
Param (
[Parameter(Mandatory=$true)][String]$RefreshToken,
[Switch]$Troubleshoot
)
$results = Invoke-WebRequest -Uri "https://console.cloud.vmware.com/csp/gateway/am/api/auth/api-tokens/authorize" -Method POST -Headers @{accept='application/json'} -Body "refresh_token=$RefreshToken"
if($results.StatusCode -ne 200) {
Write-Host -ForegroundColor Red "Failed to retrieve Access Token, please ensure your VMC Refresh Token is valid and try again"
break
}
$accessToken = ($results | ConvertFrom-Json).access_token
$payload = @{
token = $accessToken;
}
$body = $payload | ConvertTo-Json
$hcxCloudLoginUrl = "https://connect.hcx.vmware.com/provider/csp/api/sessions"
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $hcxCloudLoginUrl -Body $body -Method POST -UseBasicParsing -ContentType "application/json" -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $hcxCloudLoginUrl -Body $body -Method POST -UseBasicParsing -ContentType "application/json"
}
if($results.StatusCode -eq 200) {
$hcxAuthToken = $results.Headers.'x-hm-authorization'
$headers = @{
"x-hm-authorization"="$hcxAuthToken"
"Content-Type"="application/json"
"Accept"="application/json"
}
$global:hcxCloudConnection = new-object PSObject -Property @{
'Server' = "https://connect.hcx.vmware.com/provider/csp/consumer/api";
'headers' = $headers
}
$global:hcxCloudConnection
} else {
Write-Error "Failed to connect to HCX Cloud Service, please verify your CSP Refresh Token is valid"
}
}
Function Get-HCXCloudActivationKey {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 06/19/2019
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the activation keys from HCX Cloud
.DESCRIPTION
This cmdlet returns the activation keys from HCX Cloud
.EXAMPLE
Get-HCXCloudActivationKeys
.EXAMPLE
Get-HCXCloudActivationKeys -Type [AVAILABLE|CONSUMED|DEACTIVATED|DELETED]
#>
Param (
[Parameter(Mandatory=$false)][ValidateSet("AVAILABLE","CONSUMED","DEACTIVATED","DELETED")][String]$Type,
[Switch]$Troubleshoot
)
If (-Not $global:hcxCloudConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$method = "GET"
$hcxLicenseUrl = $global:hcxCloudConnection.Server + "/activationKeys"
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $METHOD`n$hcxLicenseUrl`n"
}
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $hcxLicenseUrl -Method $method -Headers $global:hcxCloudConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $hcxLicenseUrl -Method $method -Headers $global:hcxCloudConnection.headers -UseBasicParsing
}
if($Type) {
($results.content | ConvertFrom-Json).result.activationKeys | where { $_.status -eq $Type}
} else {
($results.content | ConvertFrom-Json).result.activationKeys
}
}
}
Function Get-HCXCloudSubscription {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 06/19/2019
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns the subscription information for HCX CLoud Service
.DESCRIPTION
This cmdlet returns the subscription information for HCX Cloud Service
.EXAMPLE
Get-HCXCloudSubscription
#>
Param (
[Switch]$Troubleshoot
)
If (-Not $global:hcxCloudConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$method = "GET"
$hcxSubscriptionUrl = $global:hcxCloudConnection.Server + "/subscriptions"
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $METHOD`n$hcxSubscriptionUrl`n"
}
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $hcxSubscriptionUrl -Method $method -Headers $global:hcxCloudConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $hcxSubscriptionUrl -Method $method -Headers $global:hcxCloudConnection.headers -UseBasicParsing
}
($results.content | ConvertFrom-Json).subscriptions | select @{Name = "SID"; Expression = {$_.sid}},@{Name = "STATUS"; Expression = {$_.status}},@{Name = 'OfferName'; Expression = {$_.subscriptionComponents.offerName}}
}
}
Function New-HCXCloudActivationKey {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 06/19/2019
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Requests new HCX Activation License Key
.DESCRIPTION
This cmdlet requests new HCX Activation License Key
.EXAMPLE
Get-HCXCloudActivationKey -SID <SID> -SystemType [HCX-CLOUD|HCX-ENTERPRISE]
#>
Param (
[Parameter(Mandatory=$true)][String]$SID,
[Parameter(Mandatory=$true)][ValidateSet("HCX-CLOUD","HCX-ENTERPRISE")][String]$SystemType,
[Switch]$Troubleshoot
)
If (-Not $global:hcxCloudConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$method = "POST"
$hcxLicenseUrl = $global:hcxCloudConnection.Server + "/activationKeys"
$payload = @{
numberOfKeys = "1";
sid = $SID;
systemType = ($SystemType).toLower();
}
$body = $payload | ConvertTo-Json
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $METHOD`n$hcxSubscriptionUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$requests = Invoke-WebRequest -Uri $hcxLicenseUrl -Method $method -Body $body -Headers $global:hcxCloudConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$requests = Invoke-WebRequest -Uri $hcxLicenseUrl -Method $method -Body $body -Headers $global:hcxCloudConnection.headers -UseBasicParsing
}
} catch {
if($_.Exception.Response.StatusCode -eq "Unauthorized") {
Write-Host -ForegroundColor Red "`nThe HCX Cloud session is no longer valid, please re-run the Connect-HCXCloudServer cmdlet to retrieve a new token`n"
break
} else {
Write-Error "Error in requesting new HCX license key"
Write-Error "`n($_.Exception.Message)`n"
break
}
}
if($requests.StatusCode -eq 200) {
Write-Host "Successfully requestd new $SystemType License Key"
($requests.content | ConvertFrom-Json).activationKeys
}
}
}
Function Get-HCXCloud {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 06/19/2019
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Returns HCX deployment information for all SDDCs
.DESCRIPTION
This cmdlet returns HCX deployment information for all SDDCs
.EXAMPLE
Get-HCXCloud
#>
Param (
[Switch]$Troubleshoot
)
If (-Not $global:hcxCloudConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$method = "GET"
$hcxCloudSDDCUrl = $global:hcxCloudConnection.Server + "/sddcs"
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $METHOD`n$hcxSubscriptionUrl`n"
}
if($PSVersionTable.PSEdition -eq "Core") {
$results = Invoke-WebRequest -Uri $hcxCloudSDDCUrl -Method $method -Headers $global:hcxCloudConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$results = Invoke-WebRequest -Uri $hcxCloudSDDCUrl -Method $method -Headers $global:hcxCloudConnection.headers -UseBasicParsing
}
($results.content | ConvertFrom-Json).sddcs | Sort-Object -Property Name | select @{Name = "SDDCName"; Expression = {$_.name}}, @{Name = "SDDCID"; Expression = {$_.id}}, @{Name = "HCXStatus"; Expression = {$_.activationStatus}}, @{Name = "Region"; Expression = {$_.region}}
}
}
Function Set-HCXCloud {
<#
.NOTES
===========================================================================
Created by: William Lam
Date: 06/19/2019
Organization: VMware
Blog: http://www.virtuallyghetto.com
Twitter: @lamw
===========================================================================
.SYNOPSIS
Activate or Deactivate HCX for given VMC SDDC
.DESCRIPTION
This cmdlet activates or deactivates HCX for given VMC SDDC
.EXAMPLE
Set-HCXCloud -Activate -SDDCID $SDDCID
.EXAMPLE
Set-HCXCloud -Deactivate -SDDCID $SDDCID
#>
Param (
[Parameter(Mandatory=$true)][String]$SDDCID,
[Switch]$Activate,
[Switch]$Deactivate,
[Switch]$Troubleshoot
)
If (-Not $global:hcxCloudConnection) { Write-error "HCX Auth Token not found, please run Connect-HcxVAMI " } Else {
$method = "POST"
if($Activate) {
$HcxSid = (Get-HCXCloudSubscription | where {$_.STATUS -eq "ACTIVE"}).SID
# Check to see if there is an available HCX-Cloud Key
$HcxKey = ((Get-HCXCloudActivationKey -Type AVAILABLE | where {$_.systemType -eq 'hcx-cloud'}) | select -First 1).activationKey
if($HcxKey -eq $null) {
$HcxKey = New-HCXCloudActivationKey -SID $HcxSid -SystemType HCX-CLOUD
}
if($HCXKey -eq $null -or $HcxSid -eq $null) {
Write-Error "Failed to retrieve HCX Subscription ID or request HCX Cloud License Key"
break
}
$hcxSDDCUrl = $global:hcxCloudConnection.Server + "/sddcs/$($SDDCID)?action=activate"
$payload = @{
activationKey = $HcxKey;
}
} else {
$payload = ""
$hcxSDDCUrl = $global:hcxCloudConnection.Server + "/sddcs/$($SDDCID)?action=deactivate"
}
$body = $payload | ConvertTo-Json
if($Troubleshoot) {
Write-Host -ForegroundColor cyan "`n[DEBUG] - $METHOD`n$hcxSDDCUrl`n"
Write-Host -ForegroundColor cyan "[DEBUG]`n$body`n"
}
try {
if($PSVersionTable.PSEdition -eq "Core") {
$requests = Invoke-WebRequest -Uri $hcxSDDCUrl -Method $method -Body $body -Headers $global:hcxCloudConnection.headers -UseBasicParsing -SkipCertificateCheck
} else {
$requests = Invoke-WebRequest -Uri $hcxSDDCUrl -Method $method -Body $body -Headers $global:hcxCloudConnection.headers -UseBasicParsing
}
} catch {
if($_.Exception.Response.StatusCode -eq "Unauthorized") {
Write-Host -ForegroundColor Red "`nThe HCX Cloud session is no longer valid, please re-run the Connect-HCXCloudServer cmdlet to retrieve a new token`n"
break
} else {
Write-Error "Error in attempting to activate or deactivate HCX"
Write-Error "`n($_.Exception.Message)`n"
break
}
}
if($requests.StatusCode -eq 200) {
if($Activate) {
Write-Host "Activating HCX for SDDC: $SDDCID, starting deployment. You can monitor the status using the HCX Cloud Console"
} else {
Write-Host "Deactivating HCX for SDDC: $SDDCID, starting un-deploymentt. You can monitor the status using the HCX Cloud Console"
}
($requests.content | ConvertFrom-Json)
}
}
}