ps/Modules/Alkami.DevOps.Validations/Public/Invoke-WebTests.ps1
2023-05-30 22:51:22 -07:00

172 lines
6.4 KiB
PowerShell

function Invoke-WebTests {
<#
.SYNOPSIS
Helper function that wraps Start-WebTests and sets up the variables needed for Start-WebTests.
.DESCRIPTION
This is intended to be used from a TeamCity agent as it uses Invoke-Command -Script {Start-WebTests}
which are to be run on each web-tier server.
.PARAMETER Servers
String CSV of servers to run the Start-WebTests on.
.PARAMETER AwsProfile
Aws Profile to use for S3 bucket.
.PARAMETER EnvironmentType
Which environment (dev, prod) to run the tests on. Uses different URLs based on environmentType.
.PARAMETER SitesToSkip
A list of sites to skip web tests on. Http/https will be trimmed
.PARAMETER SkipWidgetWarmup
Bool to skip warming up the widgets with a throw-away http request to all configured widgets on a site.
Defaults to true (skip widget warmup).
.NOTES
Keeps track of all the tests and will return bool if they all pass or any fail.
return $PassedAllTests
#>
[cmdletbinding()]
[OutputType([System.Boolean])]
param(
[Parameter(Mandatory = $true)]
[string[]]$Servers,
[Parameter(Mandatory = $false)]
[string]$AwsProfile,
[Parameter(Mandatory = $false)]
[string[]]$SitesToSkip,
[Parameter(Mandatory = $false)]
[bool]$SkipWidgetWarmUp = $true,
[Parameter(Mandatory = $false)]
[int]$MaximumSitesToTest = 20,
[Parameter(Mandatory = $false)]
[int]$SiteThreads = 4,
[Parameter(Mandatory = $false)]
[int]$WidgetThreads = 8,
[Parameter(Mandatory = $false)]
[string[]]$ServerTargetOverride
)
if([string]::IsNullOrEmpty($AwsProfile)) {
$AwsProfile = "prod"
}
$logLead = (Get-LogLeadName)
$passedAllTests = $true
$sitesToSkipArray = @()
# We do a type check here to determine if this was called directly from TC or not. If yes, clean it up.
if($null -ne $SitesToSkip -and $SitesToSkip -match ",|\s+") {
Write-Host "Got called from TC directly. Doing the splits for sites to skip."
# Split out individual sites, divided by commas or spaces. Ignore blanks.
$sitesToSkipArray = ($SitesToSkip -split ',|\s+') | Where-Object {("" -ne $_)}
} else {
$sitesToSkipArray = $SitesToSkip
}
if (![String]::IsNullOrEmpty($ServerTargetOverride)) {
# Same type check here. Split override servers if there's more than one.
# Also split servers, because we're coming from TC, so it must be a string as well.
if(($Servers -match ",") -or ($ServerTargetOverride -match ",|\s+")) {
Write-Host "Got called from TC directly. Doing the splits for override servers."
[array]$overrideArray = ($ServerTargetOverride -split ',|\s+') | Where-Object {("" -ne $_)}
[array]$serverArray = $Servers.split(',')
Write-Host "$logLead : ServerArray $serverArray"
Write-Host "$logLead : OverrideArray $overrideArray"
} else {
Write-Host "Got Arrays, passing through"
[array]$overrideArray = $ServerTargetOverride
[array]$serverArray = $Servers
}
$unexpectedServers = $overrideArray.Where{ $_ -notin $serverArray }
if (($null -ne $unexpectedServers) -and ($unexpectedServers.Count -gt 0)) {
throw "$logLead : Received unexpected servers/values in the Server Target Override List. Re-examine your parameter list. Unexpected: $unexpectedServers"
} else {
$finalServers = $overrideArray
}
} else {
$finalServers = $Servers
}
# Get the logins
try{
$loginsJson = Get-LoginsToTest -AwsProfile $AwsProfile
} catch {
Write-Warning "$logLead : Exception getting logins to test!"
$ex = $_
Resolve-Error -ErrorRecord $ex
Write-Host "$logLead : Setting test results to failed, returning False."
return $false
}
# Get the Urls
try {
$coreUrlsJson = Get-CoreUrlsToTest -AwsProfile $AwsProfile
} catch {
Write-Warning "$logLead : Exception getting core URLs to test!"
$ex = $_
Resolve-Error -ErrorRecord $ex
Write-Host "$logLead : Setting test results to failed, returning False."
return $false
}
# Kick off the webtests on the servers
try {
$serverScriptArguments = @{
LoginsJson = $loginsJson
CoreUrlsJson = $coreUrlsJson
SitesToSkip = $sitesToSkipArray
MaximumSitesToTest = $MaximumSitesToTest
SkipWidgetWarmUp = $SkipWidgetWarmUp
SiteThreads = $SiteThreads
WidgetThreads = $WidgetThreads
}
$results = Invoke-ParallelServers -Servers $finalServers -ReturnObjects -Arguments $serverScriptArguments -Script {
param($inputArguments)
$server = (Get-FullyQualifiedServerName)
$sbLoginsJson = $inputArguments.LoginsJson
$sbCoreUrlsJson = $inputArguments.CoreUrlsJson
$sbSitesToSkip = $inputArguments.SitesToSkip
$sbMaximumSitesToTest = $inputArguments.MaximumSitesToTest
$sbSkipWidgetWarmUp = $inputArguments.SkipWidgetWarmUp
$sbSiteThreads = $inputArguments.SiteThreads
$sbWidgetThreads = $inputArguments.WidgetThreads
Write-Host "##teamcity[blockOpened name='$server']"
$result = (Start-WebTests -LoginsJson $sbLoginsJson `
-CoreUrlsJson $sbCoreUrlsJson `
-SitesToSkip $sbSitesToSkip `
-MaximumSitesToTest $sbMaximumSitesToTest `
-SkipWidgetWarmUp $sbSkipWidgetWarmup `
-SiteThreads $sbSiteThreads `
-WidgetThreads $sbWidgetThreads)
Write-Host "##teamcity[blockClosed name='$server']"
return $result
}
foreach($result in $results) {
if(!$result) {
$passedAllTests = $false
}
}
} catch {
Write-Warning "$logLead : Error during web tests!"
$ex = $_
Resolve-Error -ErrorRecord $ex
Write-Host "$logLead : Setting test results to failed, returning False."
$passedAllTests = $false
}
Write-Host "$logLead : Has passed all tests? : $passedAllTests"
return $passedAllTests
}