JobStatusApi.ps1


Class JobStatusApi: ApiClient
{
    # Default constructor
    JobStatusApi([hashtable]$values) : base ($values) {}

    [psobject]Status([string]$jobId)
    {
        if ([string]::IsNullOrWhiteSpace($jobId)) {
            throw "Must supply a job id"
        }

        # Get the URL to use
        $url = $this.BuildUrl("jobs\$($jobId)", $False)

        # Send the GET
        try {
            $job = $this.Get($url)
            LogIt "Job $jobid status: $($job.status) percent done: $($job.overallProgressPercent) parameters $($job.parameters)"
            return $job
        } catch {
            LogIt "GET $url status error: $($_)"
            return New-Object PSObject -Property @{
                status = "Failed"
                error = $_
                additionalInfo = @{
                    artifacts = @{}
                }
            }
        }
    }

    [psobject]WaitFor([string]$jobId, [int]$pollSeconds) {
        $job = $null
        do {
            Start-Sleep $pollSeconds
            $job = $this.Status($jobId)
        } until ($job.status -ne 'inProgress')
        if ($job.status -eq "complete") {
            LogIt "Job $jobId final status: $($job.status)"
        } else {
            LogIt "Job $jobId final status $(Convert-HashToString (Convert-ObjectToHashtable $job)) "
            throw "Final job $jobId status: $($job.status)"
        }
        return @{
            status = $job.status
            artifacts = $job.additionalInfo.artifacts
        }
    }

    SaveArtifacts([psobject]$artifacts, [string]$filenameBase, [string]$platform) {
        $filename = "$filenameBase.$platform.json"
        LogIt "Saving artifacts to $filename $(Out-String -InputObject $artifacts)" $False
        $artifacts | ConvertTo-Json -depth 10 | Out-File $filename
    }
}

Function New-JobStatusApi([hashtable]$values) {
    return [JobStatusApi]::New($values)
}