mirror of
https://github.com/sasjs/adapter.git
synced 2026-01-02 18:20:06 +00:00
fix(execute-job): added error object if it present
This commit is contained in:
@@ -29,6 +29,12 @@ import { executeScript } from './api/viya/executeScript'
|
|||||||
import { getAccessTokenForViya } from './auth/getAccessTokenForViya'
|
import { getAccessTokenForViya } from './auth/getAccessTokenForViya'
|
||||||
import { refreshTokensForViya } from './auth/refreshTokensForViya'
|
import { refreshTokensForViya } from './auth/refreshTokensForViya'
|
||||||
|
|
||||||
|
interface JobExecutionResult {
|
||||||
|
result?: { result: object }
|
||||||
|
log?: string
|
||||||
|
error?: object
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A client for interfacing with the SAS Viya REST API.
|
* A client for interfacing with the SAS Viya REST API.
|
||||||
*
|
*
|
||||||
@@ -732,11 +738,13 @@ export class SASViyaApiClient {
|
|||||||
debug: boolean,
|
debug: boolean,
|
||||||
data?: any,
|
data?: any,
|
||||||
authConfig?: AuthConfig
|
authConfig?: AuthConfig
|
||||||
) {
|
): Promise<JobExecutionResult> {
|
||||||
let access_token = (authConfig || {}).access_token
|
let access_token = (authConfig || {}).access_token
|
||||||
|
|
||||||
if (authConfig) {
|
if (authConfig) {
|
||||||
;({ access_token } = await getTokens(this.requestClient, authConfig))
|
;({ access_token } = await getTokens(this.requestClient, authConfig))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isRelativePath(sasJob) && !this.rootFolderName) {
|
if (isRelativePath(sasJob) && !this.rootFolderName) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'Relative paths cannot be used without specifying a root folder name.'
|
'Relative paths cannot be used without specifying a root folder name.'
|
||||||
@@ -749,6 +757,7 @@ export class SASViyaApiClient {
|
|||||||
const fullFolderPath = isRelativePath(sasJob)
|
const fullFolderPath = isRelativePath(sasJob)
|
||||||
? `${this.rootFolderName}/${folderPath}`
|
? `${this.rootFolderName}/${folderPath}`
|
||||||
: folderPath
|
: folderPath
|
||||||
|
|
||||||
await this.populateFolderMap(fullFolderPath, access_token)
|
await this.populateFolderMap(fullFolderPath, access_token)
|
||||||
|
|
||||||
const jobFolder = this.folderMap.get(fullFolderPath)
|
const jobFolder = this.folderMap.get(fullFolderPath)
|
||||||
@@ -765,9 +774,8 @@ export class SASViyaApiClient {
|
|||||||
files = await this.uploadTables(data, access_token)
|
files = await this.uploadTables(data, access_token)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!jobToExecute) {
|
if (!jobToExecute) throw new Error(`Job was not found.`)
|
||||||
throw new Error(`Job was not found.`)
|
|
||||||
}
|
|
||||||
const jobDefinitionLink = jobToExecute?.links.find(
|
const jobDefinitionLink = jobToExecute?.links.find(
|
||||||
(l) => l.rel === 'getResource'
|
(l) => l.rel === 'getResource'
|
||||||
)?.href
|
)?.href
|
||||||
@@ -807,16 +815,19 @@ export class SASViyaApiClient {
|
|||||||
jobDefinition,
|
jobDefinition,
|
||||||
arguments: jobArguments
|
arguments: jobArguments
|
||||||
}
|
}
|
||||||
|
|
||||||
const { result: postedJob } = await this.requestClient.post<Job>(
|
const { result: postedJob } = await this.requestClient.post<Job>(
|
||||||
`${this.serverUrl}/jobExecution/jobs?_action=wait`,
|
`${this.serverUrl}/jobExecution/jobs?_action=wait`,
|
||||||
postJobRequestBody,
|
postJobRequestBody,
|
||||||
access_token
|
access_token
|
||||||
)
|
)
|
||||||
|
|
||||||
const jobStatus = await this.pollJobState(postedJob, authConfig).catch(
|
const jobStatus = await this.pollJobState(postedJob, authConfig).catch(
|
||||||
(err) => {
|
(err) => {
|
||||||
throw prefixMessage(err, 'Error while polling job status. ')
|
throw prefixMessage(err, 'Error while polling job status. ')
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const { result: currentJob } = await this.requestClient.get<Job>(
|
const { result: currentJob } = await this.requestClient.get<Job>(
|
||||||
`${this.serverUrl}/jobExecution/jobs/${postedJob.id}`,
|
`${this.serverUrl}/jobExecution/jobs/${postedJob.id}`,
|
||||||
access_token
|
access_token
|
||||||
@@ -827,6 +838,7 @@ export class SASViyaApiClient {
|
|||||||
|
|
||||||
const resultLink = currentJob.results['_webout.json']
|
const resultLink = currentJob.results['_webout.json']
|
||||||
const logLink = currentJob.links.find((l) => l.rel === 'log')
|
const logLink = currentJob.links.find((l) => l.rel === 'log')
|
||||||
|
|
||||||
if (resultLink) {
|
if (resultLink) {
|
||||||
jobResult = await this.requestClient.get<any>(
|
jobResult = await this.requestClient.get<any>(
|
||||||
`${this.serverUrl}${resultLink}/content`,
|
`${this.serverUrl}${resultLink}/content`,
|
||||||
@@ -834,11 +846,13 @@ export class SASViyaApiClient {
|
|||||||
'text/plain'
|
'text/plain'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug && logLink) {
|
if (debug && logLink) {
|
||||||
log = await this.requestClient
|
log = await this.requestClient
|
||||||
.get<any>(`${this.serverUrl}${logLink.href}/content`, access_token)
|
.get<any>(`${this.serverUrl}${logLink.href}/content`, access_token)
|
||||||
.then((res: any) => res.result.items.map((i: any) => i.line).join('\n'))
|
.then((res: any) => res.result.items.map((i: any) => i.line).join('\n'))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jobStatus === 'failed') {
|
if (jobStatus === 'failed') {
|
||||||
throw new JobExecutionError(
|
throw new JobExecutionError(
|
||||||
currentJob.error?.errorCode,
|
currentJob.error?.errorCode,
|
||||||
@@ -846,7 +860,16 @@ export class SASViyaApiClient {
|
|||||||
log
|
log
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return { result: jobResult?.result, log }
|
|
||||||
|
const executionResult: JobExecutionResult = {
|
||||||
|
result: jobResult?.result,
|
||||||
|
log
|
||||||
|
}
|
||||||
|
|
||||||
|
const { error } = currentJob
|
||||||
|
if (error) executionResult.error = error
|
||||||
|
|
||||||
|
return executionResult
|
||||||
}
|
}
|
||||||
|
|
||||||
private async populateFolderMap(folderPath: string, accessToken?: string) {
|
private async populateFolderMap(folderPath: string, accessToken?: string) {
|
||||||
|
|||||||
Reference in New Issue
Block a user