[CmdletBinding()] param( [Parameter(Mandatory = $true)][string]$ApiKey, [Parameter(Mandatory = $true)][string]$BaseUrl, [string]$TimelineId, [string]$TimelineName, [string]$ProjectId, [string]$DataItemAssetId, [string]$DataItemName, [string]$Role, [int]$UserCount = 1 ) $BaseUrl = $BaseUrl.TrimEnd('/') $reportsDir = Join-Path (Get-Location).Path "reports" if (-not (Test-Path $reportsDir)) { New-Item -ItemType Directory -Path $reportsDir -Force | Out-Null } function Test-PlaceholderValue { param([string]$Value) return [string]::IsNullOrWhiteSpace($Value) -or $Value -match '^\$\(' } function Write-PrettyJson { param([Parameter(Mandatory = $true)]$InputObject) Write-Host ($InputObject | ConvertTo-Json -Depth 10) } if (Test-PlaceholderValue -Value $TimelineId) { $TimelineId = $null } if (Test-PlaceholderValue -Value $TimelineName) { $TimelineName = $null } if (Test-PlaceholderValue -Value $ProjectId) { $ProjectId = $null } if (Test-PlaceholderValue -Value $DataItemAssetId) { $DataItemAssetId = $null } if (Test-PlaceholderValue -Value $DataItemName) { $DataItemName = $null } if (Test-PlaceholderValue -Value $Role) { $Role = $null } if (-not $TimelineId -and -not $TimelineName) { throw "Provide either -TimelineId or -TimelineName." } if ($TimelineName -and -not $TimelineId -and -not $ProjectId) { throw "ProjectId is required when TimelineName is used without TimelineId." } $headers = @{ Authorization = "X-API-KEY $ApiKey" "Content-Type" = "application/json" } $body = @{ userCount = $UserCount } if ($TimelineId) { $body.timelineAssetId = $TimelineId } if ($TimelineName -and -not $TimelineId) { $body.timelineName = $TimelineName } if ($ProjectId) { $body.projectId = $ProjectId } if ($DataItemAssetId) { $body.dataItemAssetId = $DataItemAssetId } if ($DataItemName -and -not $DataItemAssetId) { $body.dataItemName = $DataItemName } if ($Role) { $body.role = $Role } $requestBody = $body | ConvertTo-Json -Depth 10 Write-Host "Submitting integration run request..." Write-PrettyJson -InputObject $body $response = Invoke-RestMethod ` -Uri "$BaseUrl/api/integration/runIntegration" ` -Method Post ` -Headers $headers ` -Body $requestBody Write-Host "Integration run started." Write-PrettyJson -InputObject $response $runId = $response.runId $pollResultUrl = $response.pollResultUrl $trackItems = @($response.trackItems) if (-not $runId) { throw "runId was not returned by the API." } if (-not $pollResultUrl) { throw "pollResultUrl was not returned by the API." } $trackItemIds = @($trackItems | ForEach-Object { $_.trackItemId } | Where-Object { $_ }) -join "," $trackItemNames = @($trackItems | ForEach-Object { $_.sequenceName } | Where-Object { $_ }) -join "|" $plannedRunTime = 0 if ($response.plannedRunTime) { [void][int]::TryParse("$($response.plannedRunTime)", [ref]$plannedRunTime) } $expectedRunTime = if ($plannedRunTime -gt 0) { $plannedRunTime + 300 } else { 3600 } @{ RunId = $runId PollResultUrl = $pollResultUrl TrackItemIds = $trackItemIds TrackItemNames = $trackItemNames ExpectedRunTime = $expectedRunTime } | ConvertTo-Json -Depth 10 | Set-Content -Path "run-output.json" -Encoding utf8 Write-Host "##vso[task.setvariable variable=RunId]$runId" Write-Host "##vso[task.setvariable variable=PollResultUrl]$pollResultUrl" Write-Host "##vso[task.setvariable variable=TrackItemIds]$trackItemIds" Write-Host "##vso[task.setvariable variable=TrackItemNames]$trackItemNames" Write-Host "##vso[task.setvariable variable=ExpectedRunTime]$expectedRunTime"