public/Test-DeployStatus.ps1

<#
.SYNOPSIS
Test the status of a deployment.

.PARAMETER deploy
The deployment object to test from Invoke-HelmUpgrade.

.OUTPUTS
0 if the deployment is successful, 1 prehook error, 2 if pod, 3 if other
#>

function Test-DeployStatus {
[CmdletBinding()]
param(
    [Parameter(Mandatory,ValueFromPipeline)]
    [PSCustomObject] $deploy
)

process {
    Set-StrictMode -Version Latest

    function Write-FailureMessage($message) {
        switch ($script:ColorType) {
            'DevOps' {
                Write-Plain "##vso[task.logissue type=error]$message "
                Write-Plain "##vso[task.complete result=Failed;]"
                break
            }
            'ANSI' {
                Write-Plain "$($PSStyle.Formatting.Error) $message"
                break
            }
            default {
                Write-Plain $message
            }
        }
    }

    function GetLastBadEvent {
        param(
            [Parameter(Mandatory)]
            [PSCustomObject] $status
        )
        if ((Get-Member -InputObject $status -Name 'LastBadEvents') `
                -and $status.LastBadEvents) {
            $lastBadEvent = $status.LastBadEvents | Select-Object -First 1
            if ($lastBadEvent) {
                Write-FailureMessage "Last bad event: $($lastBadEvent)"
            }
        }
    }
    Write-Verbose "Deploy status is $($deploy | out-string)"
    Write-Verbose "Deploy status JSON: $($deploy | ConvertTo-Json -Depth 5)"

    if ((Get-Member -InputObject $deploy -Name 'PreHookStatus') `
            -and $deploy.PreHookStatus `
            -and $deploy.PreHookStatus.Status -ne 'Completed') {
        Write-FailureMessage "PreHook pod '$($deploy.PreHookStatus.podName)' has status $($deploy.PreHookStatus.Status)"
        GetLastBadEvent $deploy.PreHookStatus
        return 1
    } elseif ((Get-Member -InputObject $deploy -Name 'PodStatuses') `
            -and $deploy.PodStatuses) {
        $badPod = $deploy.PodStatuses | Where-Object { $_.Status -ne 'Running' } | Select-Object -First 1
        if ($badPod) {
            Write-FailureMessage "Pod '$($badPod.PodName)' has status of $($badPod.status)"
            GetLastBadEvent $badPod
            return 2
        }
    } elseif (!$deploy.Running) {
        Write-FailureMessage "Deployment is not running. Check output."
        return 3
    }
    Write-Status "Deployment successful"
    return 0
}

}