Skip to content

Commit b056f6d

Browse files
azure-sdkckairen
andauthored
Sync eng/common directory with azure-sdk-tools for PR 5726 (Azure#20477)
* rerun flag * rerun failed stress test * naming & commenting * update * function and var renaming for better readability * readability & exit on error --------- Co-authored-by: Albert Cheng <albertcheng@microsoft.com>
1 parent fd0ac8c commit b056f6d

File tree

2 files changed

+88
-11
lines changed

2 files changed

+88
-11
lines changed

eng/common/scripts/stress-testing/deploy-stress-tests.ps1

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ param(
2525
# Renders chart templates locally without deployment
2626
[Parameter(Mandatory=$False)][switch]$Template,
2727

28+
[Parameter(Mandatory=$False)][switch]$RetryFailedTests,
29+
2830
# Matrix generation parameters
2931
[Parameter(Mandatory=$False)][string]$MatrixFileName,
3032
[Parameter(Mandatory=$False)][string]$MatrixSelection,

eng/common/scripts/stress-testing/stress-test-deployment-lib.ps1

Lines changed: 86 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ function DeployStressTests(
9898
})]
9999
[System.IO.FileInfo]$LocalAddonsPath,
100100
[Parameter(Mandatory=$False)][switch]$Template,
101+
[Parameter(Mandatory=$False)][switch]$RetryFailedTests,
101102
[Parameter(Mandatory=$False)][string]$MatrixFileName,
102103
[Parameter(Mandatory=$False)][string]$MatrixSelection = "sparse",
103104
[Parameter(Mandatory=$False)][string]$MatrixDisplayNameFilter,
@@ -215,11 +216,16 @@ function DeployStressPackage(
215216
if ($LASTEXITCODE) {exit $LASTEXITCODE}
216217

217218
$dockerBuildConfigs = @()
218-
219-
$genValFile = Join-Path $pkg.Directory "generatedValues.yaml"
220-
$genVal = Get-Content $genValFile -Raw | ConvertFrom-Yaml -Ordered
221-
if (Test-Path $genValFile) {
222-
$scenarios = $genVal.Scenarios
219+
220+
$generatedHelmValuesFilePath = Join-Path $pkg.Directory "generatedValues.yaml"
221+
$generatedHelmValues = Get-Content $generatedHelmValuesFilePath -Raw | ConvertFrom-Yaml -Ordered
222+
$releaseName = $pkg.ReleaseName
223+
if ($RetryFailedTests) {
224+
$releaseName, $generatedHelmValues = generateRetryTestsHelmValues $pkg $releaseName $generatedHelmValues
225+
}
226+
227+
if (Test-Path $generatedHelmValuesFilePath) {
228+
$scenarios = $generatedHelmValues.Scenarios
223229
foreach ($scenario in $scenarios) {
224230
if ("image" -in $scenario.keys) {
225231
$dockerFilePath = Join-Path $pkg.Directory $scenario.image
@@ -286,7 +292,7 @@ function DeployStressPackage(
286292
}
287293
}
288294
}
289-
$genVal.scenarios = @( foreach ($scenario in $genVal.scenarios) {
295+
$generatedHelmValues.scenarios = @( foreach ($scenario in $generatedHelmValues.scenarios) {
290296
$dockerPath = if ("image" -notin $scenario) {
291297
$dockerFilePath
292298
} else {
@@ -298,15 +304,15 @@ function DeployStressPackage(
298304
$scenario
299305
} )
300306

301-
$genVal | ConvertTo-Yaml | Out-File -FilePath $genValFile
307+
$generatedHelmValues | ConvertTo-Yaml | Out-File -FilePath $generatedHelmValuesFilePath
302308
}
303309

304-
Write-Host "Installing or upgrading stress test $($pkg.ReleaseName) from $($pkg.Directory)"
310+
Write-Host "Installing or upgrading stress test $releaseName from $($pkg.Directory)"
305311

306312
$generatedConfigPath = Join-Path $pkg.Directory generatedValues.yaml
307313
$subCommand = $Template ? "template" : "upgrade"
308314
$installFlag = $Template ? "" : "--install"
309-
$helmCommandArg = "helm", $subCommand, $pkg.ReleaseName, $pkg.Directory, "-n", $pkg.Namespace, $installFlag, "--set", "stress-test-addons.env=$environment", "--values", $generatedConfigPath
315+
$helmCommandArg = "helm", $subCommand, $releaseName, $pkg.Directory, "-n", $pkg.Namespace, $installFlag, "--set", "stress-test-addons.env=$environment", "--values", $generatedConfigPath
310316

311317
$result = (Run @helmCommandArg) 2>&1 | Write-Host
312318

@@ -322,7 +328,7 @@ function DeployStressPackage(
322328
# Issues like 'UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress'
323329
# can be the result of cancelled `upgrade` operations (e.g. ctrl-c).
324330
# See https://github.com/helm/helm/issues/4558
325-
Write-Warning "The issue may be fixable by first running 'helm rollback -n $($pkg.Namespace) $($pkg.ReleaseName)'"
331+
Write-Warning "The issue may be fixable by first running 'helm rollback -n $($pkg.Namespace) $releaseName'"
326332
return
327333
}
328334
}
@@ -333,7 +339,7 @@ function DeployStressPackage(
333339
if(!$Template) {
334340
$helmReleaseConfig = RunOrExitOnFailure kubectl get secrets `
335341
-n $pkg.Namespace `
336-
-l "status=deployed,name=$($pkg.ReleaseName)" `
342+
-l "status=deployed,name=$releaseName" `
337343
-o jsonpath='{.items[0].metadata.name}'
338344
Run kubectl label secret -n $pkg.Namespace --overwrite $helmReleaseConfig deployId=$deployId
339345
}
@@ -375,3 +381,72 @@ function CheckDependencies()
375381
}
376382

377383
}
384+
385+
function generateRetryTestsHelmValues ($pkg, $releaseName, $generatedHelmValues) {
386+
$podOutput = RunOrExitOnFailure kubectl get pods -n $pkg.namespace -o json
387+
$pods = $podOutput | ConvertFrom-Json
388+
389+
# Get all jobs within this helm release
390+
391+
$helmStatusOutput = RunOrExitOnFailure helm status -n $pkg.Namespace $pkg.ReleaseName --show-resources
392+
# -----Example output-----
393+
# NAME: <Release Name>
394+
# LAST DEPLOYED: Mon Jan 01 12:12:12 2020
395+
# NAMESPACE: <namespace>
396+
# STATUS: deployed
397+
# REVISION: 10
398+
# RESOURCES:
399+
# ==> v1alpha1/Schedule
400+
# NAME AGE
401+
# <schedule resource name 1> 5h5m
402+
# <schedule resource name 2> 5h5m
403+
404+
# ==> v1/SecretProviderClass
405+
# <secret provider name 1> 7d4h
406+
407+
# ==> v1/Job
408+
# NAME COMPLETIONS DURATION AGE
409+
# <job name 1> 0/1 5h5m 5h5m
410+
# <job name 2> 0/1 5h5m 5h5m
411+
$discoveredJob = $False
412+
$jobs = @()
413+
foreach ($line in $helmStatusOutput) {
414+
if ($discoveredJob -and $line -match "==>") {break}
415+
if ($discoveredJob) {
416+
$jobs += ($line -split '\s+')[0] | Where-Object {($_ -ne "NAME") -and ($_)}
417+
}
418+
if ($line -match "==> v1/Job") {
419+
$discoveredJob = $True
420+
}
421+
}
422+
423+
$failedJobsScenario = @()
424+
$revision = 0
425+
foreach ($job in $jobs) {
426+
$jobRevision = [int]$job.split('-')[-1]
427+
if ($jobRevision -gt $revision) {
428+
$revision = $jobRevision
429+
}
430+
431+
$jobOutput = RunOrExitOnFailure kubectl describe jobs -n $pkg.Namespace $job
432+
$podPhase = $jobOutput | Select-String "0 Failed"
433+
if ([System.String]::IsNullOrEmpty($podPhase)) {
434+
$failedJobsScenario += $job.split("-$($pkg.ReleaseName)")[0]
435+
}
436+
}
437+
438+
$releaseName = "$($pkg.ReleaseName)-$revision-retry"
439+
440+
$retryTestsHelmVal = @{"scenarios"=@()}
441+
foreach ($failedScenario in $failedJobsScenario) {
442+
$failedScenarioObject = $generatedHelmValues.scenarios | Where {$_.Scenario -eq $failedScenario}
443+
$retryTestsHelmVal.scenarios += $failedScenarioObject
444+
}
445+
446+
if (!$retryTestsHelmVal.scenarios.length) {
447+
Write-Host "There are no failed pods to retry."
448+
return
449+
}
450+
$generatedHelmValues = $retryTestsHelmVal
451+
return $releaseName, $generatedHelmValues
452+
}

0 commit comments

Comments
 (0)