e2etest/GuestProxyAgentTest/Scripts/GuestProxyAgentExtensionValidation.ps1 (144 lines of code) (raw):
# Copyright (c) Microsoft Corporation
# SPDX-License-Identifier: MIT
param (
[Parameter(Mandatory=$true, Position=0)]
[string]$customOutputJsonSAS,
[string]$expectedProxyAgentVersion
)
Write-Output "$((Get-Date).ToUniversalTime()) - expectedProxyAgentVersion=$expectedProxyAgentVersion"
$decodedUrlBytes = [System.Convert]::FromBase64String($customOutputJsonSAS)
$decodedUrlString = [System.Text.Encoding]::UTF8.GetString($decodedUrlBytes)
Write-Output "$((Get-Date).ToUniversalTime()) - Start Guest Proxy Agent Extension Validation"
$currentFolder = $PWD.Path
$customOutputJsonPath = $currentFolder + "\proxyagentextensionvalidation.json";
New-Item -ItemType File -Path $customOutputJsonPath -Force
$timeoutInSeconds = 300
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
do {
$nonRootRegKeyPath = $null
$proxy = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows Azure\HandlerState"
foreach ($obj in $proxy) {
if($obj.Name -like "*Microsoft.CPlat.ProxyAgent.ProxyAgentWindows*")
{
$nonRootRegKeyPath = $obj.Name
Write-Output "$((Get-Date).ToUniversalTime()) - Got proxy agent extension registry key path: " $nonRootRegKeyPath
break
}
}
if ($nonRootRegKeyPath -ne $null) {
$registrykeyPath = $nonRootRegKeyPath -replace '^HKEY_LOCAL_MACHINE', 'HKLM:'
$PIRversion = ($registrykeyPath -split "_")[1]
Write-Output "$((Get-Date).ToUniversalTime()) - PIR Version: $PIRversion"
if (((Get-Item -Path $registrykeyPath).GetValue("SequenceNumber") -ne $null) -and ((Get-Item -Path $registrykeyPath).GetValue("StatusFolder") -ne $null)) {
$seqNo = (Get-ItemProperty -Path $registrykeyPath).SequenceNumber
Write-Output "$((Get-Date).ToUniversalTime()) - Seq No: $seqNo"
$statusFolderPath = (Get-ItemProperty -Path $registrykeyPath).StatusFolder
Write-Output "$((Get-Date).ToUniversalTime()) - Status Folder: $statusFolderPath"
$statusFilePath = [IO.Path]::Combine($statusFolderPath, $seqNo + ".status")
Write-Output "$((Get-Date).ToUniversalTime()) - Status file path: $statusFilePath"
break
}
}
if ($stopwatch.Elapsed.TotalSeconds -ge $timeoutInSeconds) {
Write-Output "$((Get-Date).ToUniversalTime()) - Timeout reached. Error, The registry key does not have proxy agent extension."
exit 1
}
start-sleep -Seconds 3
} until ($false)
$extensionFolder = Split-Path -Path $statusFolderPath -Parent
Write-Output "$((Get-Date).ToUniversalTime()) - Extension Folder: $extensionFolder"
$PIRExePath = [IO.Path]::Combine($extensionFolder, "ProxyAgentExt.exe")
Write-Output "$((Get-Date).ToUniversalTime()) - TEST: ProxyAgentVMExtension Status is succesful, Check that status file is success with 5 minute timeout"
$guestProxyAgentExtensionStatusObjGenerated = $false
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
do {
$boolStatus = Test-Path -Path $statusFilePath
if ($boolStatus) {
$json = Get-Content $statusFilePath | Out-String | ConvertFrom-Json
$extensionStatus = $json.status.status
if ($extensionStatus -eq "Success") {
Write-Output "$((Get-Date).ToUniversalTime()) - The extension status is success: $extensionStatus."
$guestProxyAgentExtensionStatusObjGenerated = $true
break
}
if ($extensionStatus -eq "Error") {
Write-Output "$((Get-Date).ToUniversalTime()) - The extension status is error: $extensionStatus."
break
}
if ($stopwatch.Elapsed.TotalSeconds -ge $timeoutInSeconds) {
Write-Output "$((Get-Date).ToUniversalTime()) - Timeout reached. Error, The extension status is $extensionStatus."
break
}
}
start-sleep -Seconds 3
} until ($false)
Write-Output "$((Get-Date).ToUniversalTime()) - TEST: ProxyAgentVMExtension Service is started and success"
$serviceName = "GuestProxyAgentVMExtension"
$guestProxyAgentExtensionServiceExist = $false
$guestProxyAgentExtensionServiceStatus = $false
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
if ($service -ne $null) {
$serviceStatus = $service.Status
Write-Output "$((Get-Date).ToUniversalTime()) - The service $serviceName exists with status $serviceStatus."
$guestProxyAgentExtensionServiceExist = $true
$guestProxyAgentExtensionServiceStatus = $true
}
Write-Output "$((Get-Date).ToUniversalTime()) - TEST: ProxyAgentVMExtension process is running "
$processName = "ProxyAgentExt"
$process = Get-Process -Name $processName -ErrorAction SilentlyContinue
$guestProxyAgentExtensionProcessExist = $true
if ($process -ne $null) {
Write-Output "$((Get-Date).ToUniversalTime()) - The process $processName exists."
} else {
$guestProxyAgentExtensionProcessExist = $false
Write-Output "$((Get-Date).ToUniversalTime()) - The process $processName does not exist."
}
Write-Output "$((Get-Date).ToUniversalTime()) - TEST: ProxyAgent version running in VM is the same as expected version"
$proxyAgentExeCmd = $extensionFolder + "\ProxyAgent\ProxyAgent\GuestProxyAgent.exe --version"
$proxyAgentVersion = Invoke-Expression $proxyAgentExeCmd
Write-Output "$((Get-Date).ToUniversalTime()) - proxy agent version from extension folder: $proxyAgentVersion"
$guestProxyAgentExtensionVersion = $false
$json = Get-Content $statusFilePath | Out-String | ConvertFrom-Json
if ($json.status.substatus -is [System.Collections.IEnumerable] -and $json.status.substatus.Count -gt 0) {
Write-Output "$((Get-Date).ToUniversalTime()) - The 'substatus' array exists and has length greater than 0."
$guestProxyAgentExtensionVersion = $true
}
if ($guestProxyAgentExtensionVersion) {
$proxyAgentStatus = $json.status.substatus[1].formattedMessage.message
$jsonObject = $proxyAgentStatus | ConvertFrom-json
$extractedVersion = $jsonObject.version
if ($extractedVersion -ne $proxyAgentVersion) {
Write-Output "$((Get-Date).ToUniversalTime()) - Error, the proxy agent version [ $extractedVersions ] does not match the version [ $proxyAgentVersion ]"
$guestProxyAgentExtensionVersion = $false
}
if ($expectedProxyAgentVersion -ne "0") {
$cleanExpectedProxyAgentVersion = $expectedProxyAgentVersion.Trim()
if ($extractedVersion -eq $cleanExpectedProxyAgentVersion){
Write-Output "$((Get-Date).ToUniversalTime()) - After Update Version check: The proxy agent version matches the expected and extracted version"
} else {
Write-Output "$((Get-Date).ToUniversalTime()) - After Update Version check: Error, the proxy agent version [ $extractedVersion ] does not match expected version [ $cleanExpectedProxyAgentVersion ]"
$guestProxyAgentExtensionVersion = $false
}
}
}
Write-Output "$((Get-Date).ToUniversalTime()) - TEST: Check detailed status of the extension if InstanceView is successful"
$guestProxyAgentExtensionInstanceView = $false
if ($proxyAgentStatus -like "*SUCCESS*") {
Write-Output "$((Get-Date).ToUniversalTime()) - The InstanceView status is $proxyAgentStatus."
$guestProxyAgentExtensionInstanceView = $true
} else {
Write-Output "$((Get-Date).ToUniversalTime()) - Error the InstanceView status is not ready: $proxyAgentStatus."
}
$jsonString = '{ "guestProxyAgentExtensionServiceExist": ' + $guestProxyAgentExtensionServiceExist.ToString().ToLower() `
+ ', "guestProxyAgentExtensionProcessExist": ' + $guestProxyAgentExtensionProcessExist.ToString().ToLower() `
+ ', "guestProxyAgentExtensionServiceStatus": ' + $guestProxyAgentExtensionServiceStatus.ToString().ToLower() `
+ ', "guestProxyAgentExtensionStatusObjGenerated": ' + $guestProxyAgentExtensionStatusObjGenerated.ToString().ToLower() `
+ ', "guestProxyAgentExtensionVersion": ' + $guestProxyAgentExtensionVersion.ToString().ToLower() `
+ ', "guestProxyAgentExtensionInstanceView": ' + $guestProxyAgentExtensionInstanceView.ToString().ToLower() ` + '}'
Write-Output "$((Get-Date).ToUniversalTime()) - $jsonString"
Set-Content -Path $customOutputJsonPath -Value $jsonString
$headers = @{
'x-ms-blob-type' = 'BlockBlob'
}
Write-Output "$((Get-Date).ToUniversalTime()) - Upload File..."
Invoke-RestMethod -Uri $decodedUrlString -Method Put -Headers $headers -InFile $customOutputJsonPath