BrownField/Auto-assessment/scripts/Invoke-APIRequest.ps1 (161 lines of code) (raw):
function Convert-SecureStringToPlainText {
param (
[System.Security.SecureString]$secureString
)
$plainText = [Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
)
return $plainText
}
function Get-Base64AuthInfo {
param (
[string]$userName,
[SecureString]$password
)
if ($null -eq $userName) {
Write-Error "Username is null"
return $null
}
if ($null -eq $password) {
Write-Error "Password is null"
return $null
}
$plainPassword = Convert-SecureStringToPlainText -secureString $password
$userName = $userName.Trim()
$plainPassword = $plainPassword.Trim()
# Encode credentials
$base64AuthInfo = [Convert]::ToBase64String(
[Text.Encoding]::ASCII.GetBytes("${userName}:${plainPassword}")
)
return $base64AuthInfo
}
function Invoke-APIRequest {
param (
[Parameter(Mandatory = $true)]
[string]$method,
[Parameter(Mandatory = $true)]
[string]$url,
[securestring]$token = $null,
[string]$body = $null,
[string]$avsVcenter = $null,
[string]$avsvCenteruserName = $null,
[SecureString]$avsvCenterpassword = $null,
[string]$vmwareApiSessionId = $null,
[string]$avsnsxtUrl = $null,
[string]$avsnsxtUserName = $null,
[SecureString]$avsnsxtPassword = $null,
[string]$avsHcxUrl = $null
)
try {
# Check if the vCenter credentials are provided
if ($avsvCenteruserName -and $avsvCenterpassword) {
# Check if the URL is not for HCX API
if ($url -notmatch "hybridity/api") {
# Get vSphere API session ID
$vmwareApiSessionId = Get-vSphere-API-Auth-Token -avsvCenteruserName $avsvCenteruserName `
-avsvCenterpassword $avsvCenterpassword `
-avsVcenter $avsVcenter
}
else {
# Get HCX Auth Token
$hcxAuthToken = Get-HCX-Auth-Token -avsHcxUrl $avsHcxUrl `
-avsvCenteruserName $avsvCenteruserName `
-avsvCenterpassword $avsvCenterpassword
}
}
# Get NSX-T base64 auth info if NSX-T credentials are provided
if ($avsnsxtUserName -and $avsnsxtPassword) {
$nsxtbase64AuthInfo = Get-Base64AuthInfo -userName $avsnsxtUserName -password $avsnsxtPassword
if ($null -eq $nsxtbase64AuthInfo) {
return
}
}
# Prepare headers for the API request
$headers = @{}
$headers["Content-Type"] = "application/json"
# Add Bearer Token to the headers if available for Azure API calls
if ($token) {
$plaintextToken = Convert-SecureStringToPlainText -secureString $token
$headers["Authorization"] = "Bearer $plaintextToken"
$headers["User-Agent"] = "pid-6c1d9c0c-370d-4ab9-9ecc-b8e0ad315cc8"
}
# Add VMware API session ID to the headers if available for vCenter API calls
if ($vmwareApiSessionId) {
$headers["vmware-api-session-id"] = $vmwareApiSessionId
}
# Add HCX Auth Token to the headers if available for HCX API calls
if ($hcxAuthToken) {
$headers["Accept"] = "application/json"
$headers["x-hm-authorization"] = $hcxAuthToken
}
# Add NSX-T basic auth header if NSX-T URL is provided for NSX-T API calls
if ($avsnsxtUserName -and $avsnsxtPassword) {
$headers["Authorization"] = ("Basic {0}" -f $nsxtbase64AuthInfo)
}
# Make the API request
if ($method -ieq "GET") {
$response = Invoke-RestMethod -Method $method -Uri $url -Headers $headers -SkipCertificateCheck
}
elseif ($method -ieq "PATCH") {
$response = Invoke-WebRequest -Method $method -Uri $url -Headers $headers -Body $body
}
else {
$response = Invoke-RestMethod -Method $method -Uri $url -Headers $headers -Body $body
}
#Write-Host "Response Object: $response"
return $response
}
catch {
$errorMessage = $_.ErrorDetails.Message
if ($errorMessage -match "AadPremiumLicenseRequired") {
throw $_
}
else {
return $null
}
}
}
function Get-HCX-Auth-Token {
param (
[string]$avsHcxUrl,
[string]$avsvCenteruserName,
[SecureString]$avsvCenterpassword
)
$sessionUrl = "${avsHcxUrl}hybridity/api/sessions"
$plainavsvCenterpassword = Convert-SecureStringToPlainText -secureString $avsvCenterpassword
# Form the body for the HCX API session request
$hcxBody = @{
username = $avsvCenteruserName
password = $plainavsvCenterpassword
}
$hcxjsonBody = $hcxBody | ConvertTo-Json -Depth 10
# Make the API request
$sessionResponse = Invoke-WebRequest -Uri $sessionUrl -Method "Post" -Headers @{
'Content-Type' = 'application/json'
'Accept' = 'application/json'
} -Body $hcxjsonBody -SkipCertificateCheck
# Check for x-hm-authorization header
if ($sessionResponse.Headers["x-hm-authorization"]) {
$hcxAuthToken = $sessionResponse.Headers["x-hm-authorization"][0]
}
return $hcxAuthToken
}
function Get-vSphere-API-Auth-Token {
param (
[string]$avsvCenteruserName,
[SecureString]$avsvCenterpassword,
[string]$avsVcenter
)
$base64AuthInfo = Get-Base64AuthInfo -userName $avsvCenteruserName -password $avsvCenterpassword
if ($null -eq $base64AuthInfo) {
return
}
$sessionUrl = "${avsVcenter}api/session"
# Make the API request
$sessionResponse = Invoke-RestMethod -Uri $sessionUrl -Method "Post" -Headers @{
Authorization = ("Basic {0}" -f $base64AuthInfo)
'Content-Type' = 'application/json'
} -SkipCertificateCheck
$vmwareApiSessionId = $sessionResponse.Trim()
return $vmwareApiSessionId
}