Skip to content

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:

https://github.com/SLURM-CLI-API-Proxy/SLURM-CLI-API-Proxy-client/blob/main/slurm_api_client/docs/SlurmApi.md

References

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)