Developer documentation¶
Under Development
This tool is under active development. The documentation is not complete yet. If you have any questions, please contact us via GitHub Issues
Architectural drivers¶
- Slurm WLM has a reduced set of commands, but the number of optional arguments required by each one is significantly large
- The OpenAPI specification of slurmrest changes significantly on each new version, as well as the supported arguments by each wlm version.
- A wlm can provide support to multiple OpenAPI specification versions
- Each OpenApi specifaction may significantly differ from each other
Client:
References¶
- Schmed's Slurm REST API documentation
- Schmed's Slurm command line documentation
- Slurm version vs supported API versions
graph TD;
Users -->|SSH| sinfo[sinfo];
Users -->|SSH| sbatch[sbatch];
Users -->|SSH| squeue[squeue];
Users -->|SSH| scontrol[scontrol];
subgraph "Head Node"
slurmctld --> slurmdbd[slurmdbd];
sinfo --> slurmctld;
sbatch --> slurmctld;
squeue --> slurmctld;
scontrol --> slurmctld;
end
subgraph "Compute Node"
slurmd1[slurmd]
end
subgraph "Compute Node"
slurmd2[slurmd]
end
slurmctld --> slurmd1;
slurmctld --> slurmd2;
slurmdbd --> Database["Slurm Accounting Database"];
graph TD;
LocalScript --> sinfop
LocalScript --> sbatchp
LocalScript --> squeuep
LocalScript --> scontrolp
Users -->|SSH| sinfo[sinfo];
Users -->|SSH| sbatch[sbatch];
Users -->|SSH| squeue[squeue];
Users -->|SSH| scontrol[scontrol];
Users --> sinfop
Users --> sbatchp
Users --> squeuep
Users --> scontrolp
sinfop[sinfo*] --> |HTTP Request| slurmrestd;
sbatchp[sbatch*] --> |HTTP Request| slurmrestd;
squeuep[squeue*] --> |HTTP Request| slurmrestd;
scontrolp[scontrolp*] --> |HTTP Request| slurmrestd;
subgraph "Slurm controller"
slurmrestd --> slurmctld[slurmctld];
slurmctld --> slurmdbd[slurmdbd];
sinfo --> slurmctld;
sbatch --> slurmctld;
squeue --> slurmctld;
scontrol --> slurmctld;
end
subgraph "Compute Node"
slurmd1[slurmd]
end
subgraph "Compute Node"
slurmd2[slurmd]
end
slurmctld --> slurmd1;
slurmctld --> slurmd2;
slurmdbd --> Database["Slurm Accounting Database"];
open_api_client example¶
import openapi_client
from openapi_client.models.v0039_job_submission import V0039JobSubmission
from openapi_client.models.v0039_job_submission_response import V0039JobSubmissionResponse
from openapi_client.rest import ApiException
import os
import json
from pprint import pprint
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = openapi_client.Configuration(
host = "http://slurm-controller:6820"
)
# The client must configure the authentication and authorization parameters
# in accordance with the API server security policy.
# Examples for each auth method are provided below, use the example that
# satisfies your auth use case.
# Configure API key authorization: user
#configuration.api_key['user'] = os.environ["API_KEY"]
# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
# configuration.api_key_prefix['user'] = 'Bearer'
# Configure API key authorization: token
configuration.api_key['token'] = os.environ["SLURM_JWT"]
# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
# configuration.api_key_prefix['token'] = 'Bearer'
# Enter a context with an instance of the API client
with openapi_client.ApiClient(configuration) as api_client:
# Create an instance of the API class
api_instance = openapi_client.SlurmApi(api_client)
#https://slurm.schedmd.com/rest_api.html#v0.0.42_job_submit_req
#job_request = {'script': '#!/bin/bash', 'job': {'name': 'dajob'}}
job_request = {
"script": "#!/bin/bash",
"job": {
"environment": ["ALL"],
#"current_working_directory": "/home/testuser",
#"name": "jname"
#"output": "slurm-%j.out"
}
}
# job_request = {
# "script": """#!/bin/bash
# ls > /home/hcadavid/temp_file.txt
# sleep 10
# """, # Modified to include sleep command
# "job": {
# "environment": ["PATH=/bin/:/usr/bin/:/sbin/",
# "MY_VAR=value1",
# "ANOTHER_VAR=value2",
# ],
# "current_working_directory": "/home/hcadavid",
# "name": "test slurmrestd job",
# "output": "slurm-%j.out"
# }
# }
# Convert the dictionary to a JSON string
json_req_string = json.dumps(job_request, indent=2)
#Empty job submission (from the documenation)
#v0039_job_submission = openapi_client.V0039JobSubmission() # V0039JobSubmission | submit new job
v0039_job_submission_instance = V0039JobSubmission.from_json(json_req_string)
try:
# submit new job
api_response = api_instance.slurm_v0039_submit_job(v0039_job_submission_instance)
print("The response of SlurmApi->slurm_v0039_submit_job:\n")
pprint(api_response)
except Exception as e:
print("Exception when calling SlurmApi->slurm_v0039_submit_job: %s\n" % e)