Hello,
I have created a SAS job file, scheduled it for one time -for testing purposes- and it worked perfectly. Now, I am trying to call this SAS job (using Job Definition Id) through REST API following this link
export server_name='..... ' curl POST 'https://$server_name/jobExecution/jobs' \ --header 'Content-Type: application/vnd.sas.job.execution.job.request+json' \ --header 'Accept: application/vnd.sas.job.execution.job+json' \ --header 'Authorization: Bearer ey..' \ --data-raw '{ "jobDefinitionUri": "/jobDefinitions/definitions/49bbd477-dc4f-4155-9e72-2b9ecf09c148" }'
but I am getting the following error:
"error": { "errorCode": 31509, "message": "Job routing failure.", "errors": [ { "errorCode": 5734, "message": "The job must include an argument named either \"_contextName\" or \"_sessionId\".", "details": [ "traceId: 7fbbb6e817a969da", "path: /compute/jobs" ], "links": [], "version": 2, "httpStatusCode": 400 }
curl --location --request POST 'https://$server_name/compute/contexts/347103b9-e3f3-43dc-88c7-0546678ea285/sessions' \ --header 'Content-Type: application/vnd.sas.compute.session.request+json' \ --header 'Accept: application/vnd.sas.compute.session+json' \ --header 'Authorization: Bearer ey...' \ --data-raw ''but also got the response status as "Pending":
Hi @WaelAburezeq,
Perhaps the issue is with your Job Definition? Feel free to post a sample of your jobDefinition code. I wasn't able to replicate your error. You can refer to a series of jobs API calls in this Postman collection on GitHub for examples of CRUD operations with jobs.
Thanks,
Joe
Join us for SAS Community Trivia
SAS Bowl XLVI, Causal Analysis
Wednesday, December 18, 2024, at 10 a.m. ET | #SASBowl
Hi Joe,
Your PostMan file worked perfectly when I run it. However, let's replicate my issue as the following:
1- Create a SAS Code file with the same code in your Job Definition and save it under your folder.
proc print data=sashelp.class; run;
2- Right click on SAS code file , Create Job and then Schedule it for one time. This worked!
3- From Environment Manager --> Jobs --> Scheduling --> Job Propriety --> Job Definition Tab then get the job Id. You will notice Type is Compute as well.
4- Go to Postman, run only CAS Session authentication to get Session Id (Without Job Definition task)
5- Run Your jobExecution with a Pre-requisite script as below where the "456...etc" is the job id retrieved from step #3.
pm.environment.set("jobDefinition", "4568b08b-e071-4d9a-9f2e-88f12192e134");
You will then get the same error as mine (I attached the response too)
Hi @WaelAburezeq,
Unfortunately, I couldn't recreate your error using the steps you outlined. When I send the POST {{sasserver}}/jobExecution/jobs with the JSON body
I get a 201 response with the following:
{ "creationTimeStamp": "2020-10-02T17:17:10.118Z", "modifiedTimeStamp": "2020-10-02T17:17:10.118Z", "createdBy": "jofurb", "modifiedBy": "jofurb", "version": 4, "id": "6fc47d68-d4e3-4dba-aa55-dd5f2b79c7b1", "jobRequest": { "version": 3, "jobDefinitionUri": "/jobDefinitions/definitions/182343f8-8e5c-46ec-a8f9-70d101f04741", "jobDefinition": { "creationTimeStamp": "2020-10-02T16:49:53.265Z", "modifiedTimeStamp": "2020-10-02T16:49:53.266Z", "createdBy": "jofurb", "modifiedBy": "jofurb", "version": 2, "id": "182343f8-8e5c-46ec-a8f9-70d101f04741", "name": "printClassProgram", "type": "Compute", "parameters": [], "code": "proc print data=sashelp.class; run;", "links": [ { "method": "GET", .....................
I'm attaching the entire response.
Join us for SAS Community Trivia
SAS Bowl XLVI, Causal Analysis
Wednesday, December 18, 2024, at 10 a.m. ET | #SASBowl
Hi Joe, Thank you so much for your reply.
A- Are you using SAS Compute Service ID to create a session Id or it is just a normal session Id request?
B- Are you using the Job Id extracted from Job Definition under Jobs that are located in Environment Manger - the job you created from the .sas code file?
I am attaching my postman two requests:
1- Creating SAS Session Id
2- Executing Job Definition
Parameters are:
1- OAuth Username and Password
2- viyahostserver
3- Job Id from the above Point B in second API pre-requisite
Looking forward for your continuous support
Hi @joeFurbee ,
Would you please let me know if you replicated the issue and how to overcome it?
Thank you,
Hi @WaelAburezeq,
I collaborated with a colleague on looking into this thread and we think we've found the root issue. This is what we came up with:
Looking at the postman collection in your latest post, try adding a _sessionId parameter to the request body of his POST /jobExecution/jobs request. Something like:
{
"jobDefinitionUri": "/jobDefinitions/definitions/{{jobDefinition}}",
"arguments": {
"_sessionId": "<compute_session_id>"
}
}
Note however, you need to adjust how you find the correct value for the _sessionId parameter.
In your Postman collection, you use POST /casManagement/servers/cas-shared-defaults/sessions, but that is not the right "session". You need a compute session ID and not a CAS session ID.
You were on the right track initially when looking at the response from the POST /compute/contexts/{contextId}/sessions request. The session ID in that response is the correct one to use for the _sessionId parameter in the request body of his POST /jobExecution/jobs request.
Finally note, you are responsible for terminating the compute session when you run jobs on it in this way. The job execution service will not terminate the session after your job runs in this case.
Hope this helps,
Joe
Join us for SAS Community Trivia
SAS Bowl XLVI, Causal Analysis
Wednesday, December 18, 2024, at 10 a.m. ET | #SASBowl
Thank a million Joe for your continuous support , I have some good news actually.
I tried to pass _Sessionid in argument body but I kept getting invalid body response. I already retrieved the compute context id for "SAS Job Execution Compute Context" , created compute session id and tried to pass it in job execution API.
However, what worked for me is to pass "_contextName": "SAS Job Execution compute context" instead of _SessionId and that worked as magic! I also didn't have to create compute session id nor SAS session id (which I think is a bit weird unless the "/jobExecution/jobs" creates a compute session by default.
I am attaching my postman requests for your kind review, please have a look at:
- Submit SAS Job Definition for Execution
- JobState
- Delete SAS Studio Compute Session (I couldn't get the Compute Session Id from the first API in order to terminate the session)
Hi @WaelAburezeq,
I uploaded your Postman collection. I created the viyahostserver environment variable and replaced the jobDefinitionID with one of my own jobs. The collection ran without issue. Did you need anything besides confirmation of your collection?
Thanks,
Joe
Join us for SAS Community Trivia
SAS Bowl XLVI, Causal Analysis
Wednesday, December 18, 2024, at 10 a.m. ET | #SASBowl
Hi @WaelAburezeq,
When I ran your collection, in the POST Create SAS Studio Compute Session call, I see the key:value "id": "5fe124e0-a4fe-4149-85cd-58ac5530009f-ses0000", and you add that value to a variable in the Tests code: pm.environment.set("computesessionid", jsonData.id);
I then ran the last call in your collection GET Get Active Compute Sessions. The session id from above returned successfully.
I then see you use that same value to end the session in the DELETE SAS Studio Compute Session: {{viyahostserver}}/compute/sessions/{{computesessionid}}.
I rerun the GET Get Active Compute Sessions call and this returned an empty response as there are no active sessions, indicated by this in the response: "count":0,"items":[],"limit":10,"version":2}.
I think your code is good and running properly.
Thanks,
Joe
Join us for SAS Community Trivia
SAS Bowl XLVI, Causal Analysis
Wednesday, December 18, 2024, at 10 a.m. ET | #SASBowl
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.