Below is the Powershell Script that enables the user to run a Job programmatically.
Depending on the region of Loome Integrate you are using (AU or US), you are required to modify the script below accordingly.
The $selectedHost
line is referring to AU by default. To change it to US replace $AU
with $US
($selectedHost = $US;
).
# For US
$US = @{
"idsHostname" = "identity-us.perspectiveilm.com";
"apiHostname" = "dg-api-us.perspectiveilm.com";
};
# For AU
$AU = @{
"idsHostname" = "identity-au.perspectiveilm.com";
"apiHostname" = "dg-api-au.perspectiveilm.com";
};
# Change this to your selected host respectively.
$selectedHost = $AU;
# Comment out the appropriate
$clientId = Read-Host -Prompt "Please provide a valid Client ID";
$accessHeaders = @{
"grant_type" = "client_credentials";
"client_id" = $clientId;
"client_secret" = $clientId;
"scope" = "webApi"
};
$baseUrl = "https://$($selectedHost['apiHostname'])/api/v1/";
$accessToken = ((Invoke-WebRequest -Uri "https://$($selectedHost['idsHostname'])/connect/token" -Method Post -Body $accessHeaders).Content | ConvertFrom-Json).access_token;
$accessHeaders = @{"Authorization" = "bearer $accessToken" }
# Retrieve projects
$projectReq = (Invoke-WebRequest -Uri "$($baseUrl)Projects?pagenumber=1&pageSize=1000" -Headers $accessHeaders);
$projects = ($projectReq.Content | ConvertFrom-Json).items;
Write-Host -ForegroundColor Green -Object "Projects";
foreach ($proj in $projects.GetEnumerator()) {
Write-Host "$($proj.projectId) - $($proj.projectName)";
}
# Save the project number, retrieve jobs for the project
$projectNumber = Read-Host -Prompt "Please provide the project ID you wish to search for jobs in";
$jobReq = (Invoke-WebRequest -Uri "$($baseUrl)Projects/$projectNumber/Jobs?pagenumber=1&pageSize=1000" -Headers $accessHeaders);
$jobs = ($jobReq.Content | ConvertFrom-Json).items;
Write-Host -ForegroundColor Green -Object "Jobs";
foreach ($job in $jobs.GetEnumerator()) {
Write-Host "$($job.jobId) - $($job.jobName)";
}
# Save the job number, invoke the RunOnce endpoint.
$jobNumber = Read-Host -Prompt "Please provide the job ID you wish to execute";
$runOnceReq = (Invoke-WebRequest -Uri "$($baseUrl)Jobs/$jobNumber/JobExecutions/RunOnce" -Headers $accessHeaders);
# If 200, you ran the job.
if ($runOnceReq.StatusCode -eq 200) {
Write-Host -ForegroundColor Green "Job with ID $jobNumber successfully queued for execution!";
}
$status = "";
do {
Start-Sleep -Seconds 3;
$status = ((Invoke-WebRequest -Uri "$($baseUrl)Jobs/$jobNumber" -Headers $accessHeaders).Content | ConvertFrom-Json).lastExecution.status;
Write-Output "Current Status: $status";
}while ($status -ne "Success" -and $status -ne "Failure");
Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');
The following snippet can be used for viewing the logs of a job for a specific execution.
pagingInfo
object returned
with the response can be used for determining the remaining pages to call as well as how large the payload being
returned is.
# For US
$US = @{
"idsHostname" = "identity-us.perspectiveilm.com";
"apiHostname" = "dg-api-us.perspectiveilm.com";
};
# For AU
$AU = @{
"idsHostname" = "identity-au.perspectiveilm.com";
"apiHostname" = "dg-api-au.perspectiveilm.com";
};
# Change this to your selected host respectively.
$selectedHost = $AU;
# Comment out the appropriate
$clientId = Read-Host -Prompt "Please provide a valid Client ID";
$accessHeaders = @{
"grant_type" = "client_credentials";
"client_id" = $clientId;
"client_secret" = $clientId;
"scope" = "webApi"
};
$baseUrl = "https://$($selectedHost['apiHostname'])/api/v1/";
$accessToken = ((Invoke-WebRequest -Uri "https://$($selectedHost['idsHostname'])/connect/token" -Method Post -Body $accessHeaders).Content | ConvertFrom-Json).access_token;
$accessHeaders = @{"Authorization" = "bearer $accessToken"; "Time-Zone-Offset" = "+1000"; }
# The Loome Integrate Online Logging levels and their human readable.
$LogLevels = @{
"0" = "Trace";
"1" = "Debug";
"2" = "Information";
"4" = "Error";
"5" = "Critical";
"6" = "None";
}
# Retrieves a page of job executions based on the provided Job Id.
function Get-JobExecutions(
[int]$JobId,
[int]$PageNumber = 1,
[int]$PageSize = 100,
[boolean]$Reverse = $true) {
$QueryParams = @{
"pageNumber" = $PageNumber;
"pageSize" = $PageSize;
"itemsToSkipInQuery" = 0;
"maxItemsInQuery" = $PageSize;
"reverse" = $Reverse.ToString();
}
$RequestUrl = "$($baseUrl)Jobs/$JobId/JobExecutions";
$Response = Invoke-WebRequest -Uri $RequestUrl -Headers $accessHeaders -Method Get -Body $QueryParams;
return (ConvertFrom-Json -InputObject $Response.Content);
}
# Retrieves a page of logs for a Job Execution based on the provided id.
function Get-JobExecutionLogs(
[int]$JobExecutionId,
[int]$PageNumber = 1,
[int]$PageSize = 100,
[boolean]$Reverse = $false) {
$QueryParams = @{
"pageNumber" = $PageNumber;
"pageSize" = $PageSize;
"itemsToSkipInQuery" = 0;
"maxItemsInQuery" = $PageSize;
"reverse" = $Reverse.ToString();
}
$RequestUrl = "$($baseUrl)Logs/App/JobExecutions/$JobExecutionId";
$Response = Invoke-WebRequest -Uri $RequestUrl -Headers $accessHeaders -Method Get -Body $QueryParams;
return (ConvertFrom-Json -InputObject $Response.Content);
}
$JobId = Read-Host "Please provide a Job ID to retrieve executions for"
$JobExecutions = Get-JobExecutions -JobId $JobId;
foreach ($JobExecution in $JobExecutions.items) {
Write-Output "$($JobExecution.jobExecutionId) - $($JobExecution.status)"
}
$JobExecutionId = Read-Host "Please select one of the Job Execution IDs from above to view the logs for";
$Logs = Get-JobExecutionLogs -JobExecutionId $JobExecutionId;
$CurrentPage = 1;
$MaxPage;
# Iterate through log pages
do {
$CurrentPage = $Logs.pagingInfo.pageNumber;
$MaxPage = $Logs.pagingInfo.totalPages;
# Format Log Messages in a readable manner
foreach ($Log in $Logs.items) {
$LogTime = $Log.logDateTime;
$LogLevel = $LogLevels[$Log.logLevel.ToString()];
$LogMessage = $Log.logMessage;
Write-Output "$LogTime - [$LogLevel] $LogMessage";
}
} until ($CurrentPage -eq $MaxPage)