agent_deply/doc_scripts/test_deploy.ps1
dark f90bccd0ad 1、增加执行间隔
2、添加推送进度流程
2026-05-28 16:01:27 +08:00

290 lines
11 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

param(
[Alias('ConfigPath')]
[string]$TestConfigPath = (Join-Path $PSScriptRoot 'config.txt'),
[ValidateSet('smoke', 'full')]
[string]$Mode = 'full',
[switch]$SkipRollback,
[int]$MaxIps = 0,
[switch]$Help
)
# PAM 测试脚本PowerShell 实现)。
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
if ($Help) {
@'
Usage:
powershell -File .\test_deploy.ps1 [-ConfigPath .\config.txt] [-Mode smoke|full] [-SkipRollback] [-MaxIps N]
Modes:
smoke - only test config, token, node, and online IP lookup
full - test all deployment interfaces in workflow order
Notes:
- full mode tests create version, upload, publish, node download, upgrade, start, verify, and log download
- rollback is tested once by default in full mode
- use -SkipRollback if you do not want the test script to change the deployed state
- use -MaxIps to limit how many online IPs are used for interface testing
'@ | Write-Host
exit 0
}
. (Join-Path $PSScriptRoot 'deploy.ps1')
function Add-TestResult {
param(
[System.Collections.Generic.List[object]]$Results,
[string]$Step,
[string]$Status,
[string]$Detail
)
$Results.Add([pscustomobject]@{
Step = $Step
Status = $Status
Detail = $Detail
}) | Out-Null
}
function Write-TestReport {
param([System.Collections.Generic.List[object]]$Results)
$passCount = @($Results | Where-Object { $_.Status -eq 'PASS' }).Count
$failCount = @($Results | Where-Object { $_.Status -eq 'FAIL' }).Count
$skipCount = @($Results | Where-Object { $_.Status -eq 'SKIP' }).Count
Write-Host ''
Write-Host '====================== API TEST REPORT ======================'
Write-Host "PASS: $passCount"
Write-Host "FAIL: $failCount"
Write-Host "SKIP: $skipCount"
Write-Host ''
Write-Host ('{0,-28} {1,-8} {2}' -f 'STEP', 'STATUS', 'DETAIL')
foreach ($item in $Results) {
Write-Host ('{0,-28} {1,-8} {2}' -f $item.Step, $item.Status, $item.Detail)
}
}
function Invoke-PamSmokeTest {
param([string]$ConfigPath)
$results = [System.Collections.Generic.List[object]]::new()
$config = Get-PamConfig -Path $ConfigPath
try {
Test-ZipFile -Config $config
Add-TestResult -Results $results -Step 'ZIP_FILE' -Status 'PASS' -Detail $config.ZIP_FILE_PATH
} catch {
Add-TestResult -Results $results -Step 'ZIP_FILE' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
$token = Get-Token -Config $config
Add-TestResult -Results $results -Step 'TOKEN' -Status 'PASS' -Detail ('token length={0}' -f $token.Length)
} catch {
Add-TestResult -Results $results -Step 'TOKEN' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
$nodeUrl = Get-NodeUrl -Config $config -Token $token
Add-TestResult -Results $results -Step 'TARGET_NODE' -Status 'PASS' -Detail $nodeUrl
} catch {
Add-TestResult -Results $results -Step 'TARGET_NODE' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
$ips = Get-OnlineIps -Config $config -Token $token -NodeUrl $nodeUrl
Add-TestResult -Results $results -Step 'ONLINE_IPS' -Status 'PASS' -Detail (($ips -join ', '))
} catch {
Add-TestResult -Results $results -Step 'ONLINE_IPS' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
Write-TestReport -Results $results
}
function Invoke-PamFullTest {
param(
[string]$ConfigPath,
[bool]$ShouldSkipRollback,
[int]$MaxIps
)
$results = [System.Collections.Generic.List[object]]::new()
$config = Get-PamConfig -Path $ConfigPath
try {
Test-ZipFile -Config $config
Add-TestResult -Results $results -Step 'ZIP_FILE' -Status 'PASS' -Detail $config.ZIP_FILE_PATH
} catch {
Add-TestResult -Results $results -Step 'ZIP_FILE' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
$token = Get-Token -Config $config
Add-TestResult -Results $results -Step 'TOKEN' -Status 'PASS' -Detail ('token length={0}' -f $token.Length)
} catch {
Add-TestResult -Results $results -Step 'TOKEN' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
New-VersionRecord -Config $config -Token $token
Add-TestResult -Results $results -Step 'CREATE_VERSION' -Status 'PASS' -Detail $config.VERSION_NUMBER
} catch {
Add-TestResult -Results $results -Step 'CREATE_VERSION' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
$hashCode = Upload-Package -Config $config -Token $token
Add-TestResult -Results $results -Step 'UPLOAD_PACKAGE' -Status 'PASS' -Detail $hashCode
} catch {
Add-TestResult -Results $results -Step 'UPLOAD_PACKAGE' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
Publish-Version -Config $config -Token $token -HashCode $hashCode
Add-TestResult -Results $results -Step 'PUBLISH_VERSION' -Status 'PASS' -Detail $config.AIRPORT_CODE
} catch {
Add-TestResult -Results $results -Step 'PUBLISH_VERSION' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
$nodeUrl = Get-NodeUrl -Config $config -Token $token
Add-TestResult -Results $results -Step 'TARGET_NODE' -Status 'PASS' -Detail $nodeUrl
} catch {
Add-TestResult -Results $results -Step 'TARGET_NODE' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
$ips = Get-OnlineIps -Config $config -Token $token -NodeUrl $nodeUrl
Add-TestResult -Results $results -Step 'ONLINE_IPS' -Status 'PASS' -Detail (($ips -join ', '))
} catch {
Add-TestResult -Results $results -Step 'ONLINE_IPS' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
try {
Download-CloudToNode -Config $config -Token $token -NodeUrl $nodeUrl
Add-TestResult -Results $results -Step 'DOWNLOAD_TO_NODE' -Status 'PASS' -Detail $config.VERSION_NUMBER
} catch {
Add-TestResult -Results $results -Step 'DOWNLOAD_TO_NODE' -Status 'FAIL' -Detail $_.Exception.Message
Write-TestReport -Results $results
throw
}
$testIps = @($ips)
if ($MaxIps -gt 0) {
$testIps = @($ips | Select-Object -First $MaxIps)
}
$rollbackTested = $false
foreach ($ip in $testIps) {
try {
$upgradeResponse = Invoke-UpgradeRequest -Config $config -Token $token -NodeUrl $nodeUrl -Ip $ip
if (Test-ResponseFailure -Response $upgradeResponse) {
$upgradeMessage = Get-PrimaryResponseMessage -Response $upgradeResponse
if (-not $upgradeMessage) { $upgradeMessage = 'task creation failed' }
Add-TestResult -Results $results -Step "UPGRADE [$ip]" -Status 'FAIL' -Detail $upgradeMessage
} else {
Add-TestResult -Results $results -Step "UPGRADE [$ip]" -Status 'PASS' -Detail 'task created'
try {
Wait-UpgradeProgress -Config $config -Token $token -NodeUrl $nodeUrl -Ip $ip
Add-TestResult -Results $results -Step "UPGRADE_PROGRESS [$ip]" -Status 'PASS' -Detail ("rateOfProgress={0}" -f $script:UpgradeProgressState.RateOfProgress)
} catch {
$upgradeMessage = Get-ProgressStateMessage -State $script:UpgradeProgressState -DefaultMessage 'progress polling failed'
Add-TestResult -Results $results -Step "UPGRADE_PROGRESS [$ip]" -Status 'FAIL' -Detail $upgradeMessage
}
}
} catch {
Add-TestResult -Results $results -Step "UPGRADE [$ip]" -Status 'FAIL' -Detail $_.Exception.Message
}
try {
Start-Application -Config $config -Token $token -NodeUrl $nodeUrl -Ip $ip
Add-TestResult -Results $results -Step "START [$ip]" -Status 'PASS' -Detail 'request completed'
} catch {
Add-TestResult -Results $results -Step "START [$ip]" -Status 'FAIL' -Detail $_.Exception.Message
}
try {
$verifyResponse = Verify-Ip -Config $config -Token $token -NodeUrl $nodeUrl -Ip $ip
$verifySuccess = Get-ResponseValue -Response $verifyResponse -Candidates @('success')
$verifyMessage = Get-ResponseValue -Response $verifyResponse -Candidates @('message')
if ($verifySuccess -eq 'true') {
Add-TestResult -Results $results -Step "VERIFY [$ip]" -Status 'PASS' -Detail 'success=true'
} else {
if (-not $verifyMessage) { $verifyMessage = 'success != true' }
Add-TestResult -Results $results -Step "VERIFY [$ip]" -Status 'FAIL' -Detail $verifyMessage
}
} catch {
Add-TestResult -Results $results -Step "VERIFY [$ip]" -Status 'FAIL' -Detail $_.Exception.Message
}
try {
$logFile = Download-DeployLog -Config $config -Token $token -NodeUrl $nodeUrl -Ip $ip
Add-TestResult -Results $results -Step "LOG_DOWNLOAD [$ip]" -Status 'PASS' -Detail $logFile
} catch {
Add-TestResult -Results $results -Step "LOG_DOWNLOAD [$ip]" -Status 'FAIL' -Detail $_.Exception.Message
}
if (-not $ShouldSkipRollback -and -not $rollbackTested) {
try {
$rollbackResult = Invoke-Rollback -Config $config -Token $token -NodeUrl $nodeUrl -Ip $ip -StopFirst:$true
if ($rollbackResult -eq 'ROLLBACK_SUCCESS') {
Add-TestResult -Results $results -Step "ROLLBACK [$ip]" -Status 'PASS' -Detail $rollbackResult
} else {
Add-TestResult -Results $results -Step "ROLLBACK [$ip]" -Status 'FAIL' -Detail $rollbackResult
}
} catch {
Add-TestResult -Results $results -Step "ROLLBACK [$ip]" -Status 'FAIL' -Detail $_.Exception.Message
}
$rollbackTested = $true
}
}
if ($ShouldSkipRollback) {
Add-TestResult -Results $results -Step 'ROLLBACK' -Status 'SKIP' -Detail 'skipped by parameter'
} elseif (-not $rollbackTested) {
Add-TestResult -Results $results -Step 'ROLLBACK' -Status 'SKIP' -Detail 'no IP available for rollback test'
}
Write-TestReport -Results $results
if (@($results | Where-Object { $_.Status -eq 'FAIL' }).Count -gt 0) {
throw 'One or more API tests failed.'
}
}
try {
if ($Mode -eq 'smoke') {
Invoke-PamSmokeTest -ConfigPath $TestConfigPath
} else {
Invoke-PamFullTest -ConfigPath $TestConfigPath -ShouldSkipRollback:$SkipRollback.IsPresent -MaxIps $MaxIps
}
} catch {
Write-ErrLog $_
exit 1
}