@@ -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