{ "cells": [ { "attachments": { "JupyterPCIntegration.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2YAAAFLCAYAAAC9eJ8/AAAMPHRFWHRteGZpbGUAJTNDbXhmaWxlJTIwaG9zdCUzRCUyMmRyYXdpby5jb3JwLmFtYXpvbi5jb20lMjIlMjBtb2RpZmllZCUzRCUyMjIwMjEtMTEtMDRUMTMlM0E1NiUzQTMxLjE2MlolMjIlMjBhZ2VudCUzRCUyMk1vemlsbGElMkY1LjAlMjAoTWFjaW50b3NoJTNCJTIwSW50ZWwlMjBNYWMlMjBPUyUyMFglMjAxMC4xNSUzQiUyMHJ2JTNBOTEuMCklMjBHZWNrbyUyRjIwMTAwMTAxJTIwRmlyZWZveCUyRjkxLjAlMjIlMjBldGFnJTNEJTIyanNjQ1RtajRkV0dhZUxYcWNoYWMlMjIlMjB2ZXJzaW9uJTNEJTIyMTIuNC44JTIyJTIwdHlwZSUzRCUyMmJyb3dzZXIlMjIlM0UlM0NkaWFncmFtJTIwaWQlM0QlMjJnY3Mzc20tZktUejlaVTlrUm9PcSUyMiUyMG5hbWUlM0QlMjJQYWdlLTElMjIlM0U3VnhaYzZNNEVQNDFmZ3lGdUhuMGtXT21rdDJaZFdhenV5OHVETExOQkNNUHlMRzl2MzRiRUtma0l4dklaSnc0cVFwcWhJRHU3MnQxdCUyQlQwMU9GeWV4MDVxOFVkOFhEUVUyUnYyMU5IUFVWUmJHVEFuMFN5eXlTbVlXYUNlZVI3bVFpVmdySCUyRkwyWkNtVW5Ydm9maldrZEtTRUQ5VlYzb2tqREVMcTNKbkNnaW0zcTNHUW5xZDEwNWM4d0p4cTRUOE5JSDM2T0xUR3JwY2ltJTJGd2Y1OGtkOFp5ZXpNMHNrN00wRzhjRHl5cVlqVXk1NDZqQWloMmRGeU84UkJvcnhjTDlsMVYzdk9GZzhXNFpDZWNzRWZYJTJCOHR1cldqclhGRHIlMkY4WmE5JTJGUTV1YUNXZWZKQ2Ric2hmc1BZeEI4aTNFRWYlMkZxdVM5WXdmUFlDZEpkclpVWDhrS2FhMVFmd0N6Y2V5ajBkemd5VGxxVG9EVUd6YmRZRmlHOGxZOVFGemJaWkY2RG04S2h4ZjlSOHdJcUFhOVdHbHh2M2x5c1BDTCUyRnFnS3hwNElkNFdHQlFCdUU4Y2p3ZmJETWtBWWxBRnBJUXREZFkwR1VBTFFTSG00VlA4WGpsdUlsV044QWZrTTFJU0JrTGtKSzNtZUtUVVFGRnElMkJSNHVaMG5oSk9jVGF4Sjg0aXNWJTJCa3RQd0VQaEdjbmNEaHhBN0wySms1QWs0Rm9SQjV4JTJGbkE5UllXZnF3UTVnNWtmQkkySGZzSVI5WUVVJTJGY0NmSiUyQk5Ua3R6T1lhMEF6OUlSNFUzOGNINmJ0a2Fxeko1ZWRBdlBpUmZZWTYlMkZFQTVsaE83a3IzbFpFRE5qWG1Dd3hqWGJRaFoyMUdjZVlrMUZaYzFNeTFzd1p1Nml3VmMwN09zeEx6SXVSU3lMQkFlUFNNM2lsY3J6Njg4dndnMGElMkZQbzJlVnE2UVBKcGxJYTFUOHZUN0EzTmdkVUFlWGFtelIlMkJmWm84b0M5aFNzYTUwOXlPTG84OFdKbkNCSWc0dGhzSTVwTWowMTJDUlFQV2Nudlc4TUxhT3FSTFRYUWszTU5PeFJETldHQ1ZTOVpnTERsSkJtbHglMkJMczRoaTZnS0xHSXBrNlM4M3l1MzNIejhldmtWbVBGdDhIV3lNdSUyQjBQTkxzQWVEYzFqajJJbFZpVFJIUkI1aVIwZ3N0U09nRE9oRjRCMXJMUExVbFVuQ3IlMkZPNloweDdqcXJDbXBrenVtVGtUN1NTQUhnbWxBM01mN2hSJTJGbUo2NzhJTyUyQjQxd294V1VjdVBvUTJCbU1ZY0k3cG9ZN01xeWV2ZmRDcUVRNGM2aiUyRlZRMGlSUWRKTDRlMmNYYVVEbXhYS2tiOGtnaElzYW9PdnBsMlAlMkI1N1ZIUTZ5JTJCNWZBS0Y3a0JWalIzejFXME52QWl0Nk1qT1REWURuY3Z4dTBGUDZ5ZFBkJTJGWEk3dlFmTGdnNzhEanc4T255emg0QVk3bnNEenZ6TnM1WVElMkJpaTFtMUF1SXNyVGNmWGVNTjZPT0g2UXJoJTJGRjJ1SDhkYiUyQlhWJTJCZU9RMlN6R2xKdmFub2ZKZzhhb1lQTHplclZMNHc3NU4wTHhsSkRIY3dwQkVLcGJ3dUJqRG1TSm9rQlQ2U29LNUN6QTZWdVlNZXhMT3Zka0VsV2JRWGVFakJGa1kwM0RzYzYxMkR1MzJhMHp4Y0VYRXZ2VVQ5T0dLYUdKdXpvVyUyQmJ2d0xBQ25tcHM1bHJjNDhTcDcwWm0lMkZUWjVqa0JJU1I1ZFBPTXNrMGI3a0puYm1lT2s4NG1nUzV1aHRCemVHSVdtb1RtS2tTakJ4bEIlMkZFUVNrSmNDMGVUS1lweVVaSGNGSTZoaE9jMCUyRm9EeGU1WHpvMzhDQWJLVUJFbXM4N0plSU16cyUyRlR6RmtFbkJGaUVzeGt1eTUwSDBCUmwwUVVNWDgxcnFhTENUMWVaSzUlMkI0RHNseXRhWTRuVFdTU3JZaTl5RzRpTUZBa081RDZ6b3RPbnhVaHQ1JTJCWldpWVUlMkJkZ21SV01PMkhXblpRRnBYRks3aUtXYkRCOVpCa0dKSmYlMkZvM3BVMExuaHBZb1JhMEVHS3pMZHB6RXZxTGNWQ2hxMklkV3JGd1VwcTdHRHNJSWtkOFZEbSUyQk5oa2pvd0VuNnc3UmRnMnhHZVlWZVolMkJDRWtYNkdMSjlDTFp2RlBtOXc2dVRMTGs2MnR5bXdqRzBleUt1bkd3Ym9nRWsxM3lHeUJaJTJCTFUlMkZhY1Vla0NqMGU2djVIb3A5V0pwJTJCMjgyWHRvWWJXdXRYUTYzVjhqaVdaSHdhQmJQWEZSN0JhS1hKVnY4aXRVWXV4Rk9rbjM1emdraGJPUHJMaSUyQk5sNjkwemRUczU4WExReE9wNk9yOXhNdVpFU1pMWm9KVyUyRklwcTFmMktMa3ZWZEMxUHdTcHVSUmNrYTdtc2ZhY2ljMGc3a3dxZmRxSnZ5RWY4eWRWalhhdmpSR0ZlWWw4MTcwaiUyRkYxZVBEeXExV2owZWpXR291OTM0NjIzN09mN0loSlBQODFudzBRYjJ1JTJGRlprUmQzNDZlUXBVcDI5V1AlMkJYRWVGJTJCQkxTbVRncTQwUkhaYjBKUDJVMGNISnNsZXRJJTJGNDc4RkwlMkZYN3ZKcWZKcCUyRjZ0bzdDTWl1U25nVzg2N3NVdFlWVFJXNFJwWlN0WkgxMkxxa212V0p4SURFaHllN1prdUtZQnVFM3VVdUNQVmNLVyUyQmVTUG04dVBOV0VoZVRvMVZQTWRJdGpwNyUyRkJJZno1TERjejRyak9LbkNaajNnanBWT2d1dkdSYm02dXVvbnZyajd0YW1pJTJCNW10VGJtQm4lMkJLMURlOXgwVmdSUUFhZnpaaWlwYWNXMXAzRTJjelpCZ2syN3pHRUdtaDkyOVRM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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "# Setting up and Using a Python Client Library for the Slurm REST API\n", "\n", "This notebook provides details how to set up a Python client library for the Slurm REST API. It currently tested with Slurm 20.11.7 and 20.11.8, which provides Slurm REST API v0.0.36. Some additional details and a high-level overview are provided in this related blog post.\n", "https://aws.amazon.com/blogs/hpc/using-the-slurm-rest-api-to-integrate-with-distributed-architectures-on-aws/\n", "\n", "First, we will create a Python module from the OpenAPI specification, then we will run representative functions from the created Python module, including viewing node information, submitting jobs, and viewing the job queue.\n", "\n", "This notebook is intended to follow the pcluster-athena++ notebook, which is also contained in this repository. In that notebook, the infrastructure in the diagram below is created automatically. The pcluster-athena++ notebook uses custom functions created in a separate helper module to interact with the REST API. This notebook is intended to provide lower-level functionality using only functions created directly from the OpenAPI specification.\n", "\n", "\n", "![JupyterPCIntegration.png](attachment:JupyterPCIntegration.png)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set-up\n", "\n", "We will use the OpenAPI Generator for Python to create the client module. The source can be found at: https://github.com/openapi-generators/openapi-python-client. Here, we will use pip to install it." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: openapi-python-client in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (0.10.7)\n", "Requirement already satisfied: pyyaml<6.0.0,>=5.3.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (5.4.1)\n", "Requirement already satisfied: importlib_metadata<5,>2 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (3.7.0)\n", "Requirement already satisfied: attrs<22.0.0,>=21.0.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (21.2.0)\n", "Requirement already satisfied: httpx<0.21.0,>=0.15.4 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (0.20.0)\n", "Requirement already satisfied: pydantic<2.0.0,>=1.6.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (1.8.2)\n", "Requirement already satisfied: typer<0.4,>=0.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (0.3.2)\n", "Requirement already satisfied: typing-extensions in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (3.10.0.2)\n", "Requirement already satisfied: isort<6.0.0,>=5.0.5 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (5.7.0)\n", "Requirement already satisfied: python-dateutil<3.0.0,>=2.8.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (2.8.1)\n", "Requirement already satisfied: shellingham<2.0.0,>=1.3.2 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (1.4.0)\n", "Requirement already satisfied: black in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (20.8b1)\n", "Requirement already satisfied: jinja2<4.0.0,>=3.0.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (3.0.2)\n", "Requirement already satisfied: autoflake<2.0,>=1.4 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from openapi-python-client) (1.4)\n", "Requirement already satisfied: pyflakes>=1.1.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from autoflake<2.0,>=1.4->openapi-python-client) (2.2.0)\n", "Requirement already satisfied: sniffio in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->openapi-python-client) (1.2.0)\n", "Requirement already satisfied: charset-normalizer in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->openapi-python-client) (2.0.6)\n", "Requirement already satisfied: httpcore<0.14.0,>=0.13.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->openapi-python-client) (0.13.7)\n", "Requirement already satisfied: async-generator in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->openapi-python-client) (1.10)\n", "Requirement already satisfied: certifi in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->openapi-python-client) (2021.5.30)\n", "Requirement already satisfied: rfc3986[idna2008]<2,>=1.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->openapi-python-client) (1.5.0)\n", "Requirement already satisfied: anyio==3.* in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->openapi-python-client) (3.3.4)\n", "Requirement already satisfied: h11<0.13,>=0.11 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->openapi-python-client) (0.12.0)\n", "Requirement already satisfied: idna>=2.8 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from anyio==3.*->httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->openapi-python-client) (3.1)\n", "Requirement already satisfied: dataclasses in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from anyio==3.*->httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->openapi-python-client) (0.8)\n", "Requirement already satisfied: contextvars>=2.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from sniffio->httpx<0.21.0,>=0.15.4->openapi-python-client) (2.4)\n", "Requirement already satisfied: immutables>=0.9 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from contextvars>=2.1->sniffio->httpx<0.21.0,>=0.15.4->openapi-python-client) (0.15)\n", "Requirement already satisfied: zipp>=0.5 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from importlib_metadata<5,>2->openapi-python-client) (3.4.0)\n", "Requirement already satisfied: MarkupSafe>=2.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from jinja2<4.0.0,>=3.0.0->openapi-python-client) (2.0.1)\n", "Requirement already satisfied: six>=1.5 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from python-dateutil<3.0.0,>=2.8.1->openapi-python-client) (1.15.0)\n", "Requirement already satisfied: click<7.2.0,>=7.1.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from typer<0.4,>=0.3->openapi-python-client) (7.1.2)\n", "Requirement already satisfied: appdirs in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from black->openapi-python-client) (1.4.4)\n", "Requirement already satisfied: mypy-extensions>=0.4.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from black->openapi-python-client) (0.4.3)\n", "Requirement already satisfied: typed-ast>=1.4.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from black->openapi-python-client) (1.4.2)\n", "Requirement already satisfied: regex>=2020.1.8 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from black->openapi-python-client) (2020.11.13)\n", "Requirement already satisfied: pathspec<1,>=0.6 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from black->openapi-python-client) (0.8.1)\n", "Requirement already satisfied: toml>=0.10.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from black->openapi-python-client) (0.10.2)\n", "\u001b[33mWARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.\n", "You should consider upgrading via the '/home/ec2-user/anaconda3/envs/python3/bin/python -m pip install --upgrade pip' command.\u001b[0m\n" ] } ], "source": [ "!pip install openapi-python-client" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import boto3\n", "import random\n", "import requests\n", "import json\n", "import pprint\n", "from botocore.exceptions import ClientError" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Required inputs\n", "* The name of the parallel cluster that was previously set-up with the Slurm REST API using the pcluster-athena++ notebook\n", "* The region of that cluster" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# unique name of the pcluster\n", "pcluster_name = 'myPC5c'\n", "region=\"us-east-1\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Helper Functions\n", "Three additional helper cells are adapted from the pcluster-athena++ notebook to obtain the API Key, IP Address, and S3 bucket from the infrastructure previously created. This information needs to be collected in order to connect to the Slurm REST API.\n", "\n", "### Get the secret key from Secrets Manager" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Header information:\n", "{'X-SLURM-USER-NAME': 'slurm',\n", " 'X-SLURM-USER-TOKEN': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MzcxODIyMDEsImlhdCI6MTYzNzE4MDQwMSwic3VuIjoicm9vdCJ9.o0giOhxzlhgCi-2kLYecBqoTVbGaRtGgpU74PXvIY2c'}\n" ] } ], "source": [ "slurm_secret_name = \"slurm_token_{}\".format(pcluster_name)\n", "\n", "session = boto3.session.Session()\n", "###\n", "# Retrieve the slurm_token from the SecretManager\n", "#\n", "def get_secret(session, slurm_secret_name, region):\n", "\n", " # Create a Secrets Manager client\n", " client = session.client(\n", " service_name='secretsmanager',\n", " region_name=region\n", " )\n", "\n", " # In this sample we only handle the specific exceptions for the 'GetSecretValue' API.\n", " # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html\n", " # We rethrow the exception by default.\n", "\n", " try:\n", " get_secret_value_response = client.get_secret_value(SecretId=slurm_secret_name)\n", " except ClientError as e:\n", " print(\"Error\", e)\n", " else:\n", " # Decrypts secret using the associated KMS CMK.\n", " # Depending on whether the secret is a string or binary, one of these fields will be populated.\n", " if 'SecretString' in get_secret_value_response:\n", " secret = get_secret_value_response['SecretString']\n", " return secret\n", " else:\n", " decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary'])\n", " return decoded_binary_secret\n", "\n", "###\n", "# Retrieve the token and inject into the header for JWT auth\n", "#\n", "def update_header_token(session, slurm_secret_name,region):\n", " # we use 'slurm' as the default user on head node for slurm commands\n", " token = get_secret(session, slurm_secret_name, region)\n", " post_headers = {'X-SLURM-USER-NAME':'slurm', 'X-SLURM-USER-TOKEN': token, 'Content-type': 'application/json', 'Accept': 'application/json'}\n", " get_headers = {'X-SLURM-USER-NAME':'slurm', 'X-SLURM-USER-TOKEN': token, 'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}\n", " return [post_headers, get_headers]\n", "\n", "junk, get_headers=update_header_token(session, slurm_secret_name, region)\n", "get_headers.pop('Accept')\n", "get_headers.pop('Content-type')\n", "\n", "print(\"Header information:\")\n", "ppr = pprint.PrettyPrinter(depth=2, indent=1)\n", "ppr.pprint(get_headers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Obtain the REST API Endpoint from the CloudFormation Template" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Slurm REST endpoint is on 172.31.46.225\n" ] } ], "source": [ "cf_client = boto3.client('cloudformation')\n", "\n", "resp=cf_client.describe_stacks(StackName=pcluster_name)\n", "outputs=resp[\"Stacks\"][0][\"Outputs\"]\n", "\n", "slurm_host=''\n", "for o in outputs:\n", " if o['OutputKey'] == 'HeadNodePrivateIP':\n", " slurm_host = o['OutputValue']\n", " print(\"Slurm REST endpoint is on \", slurm_host)\n", " break;\n", "\n", "slurm_rest='http://'+slurm_host+':8082'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The S3 bucket name that was set up in pcluster-athena++" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "S3 bucket name is mypc5c-534950961494\n" ] } ], "source": [ "s3bucket=pcluster_name.lower() + \"-\" + boto3.client('sts').get_caller_identity().get('Account')\n", "print('S3 bucket name is ' + s3bucket)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## View and Save the OpenAPI Specification to a File" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'components': {'schemas': {...}, 'securitySchemes': {...}},\n", " 'info': {'contact': {...},\n", " 'description': 'API to access and control Slurm.',\n", " 'license': {...},\n", " 'termsOfService': 'https://github.com/SchedMD/slurm/blob/master/DISCLAIMER',\n", " 'title': 'Slurm Rest API',\n", " 'version': '0.0.36'},\n", " 'openapi': '3.0.2',\n", " 'paths': {'/openapi': {...},\n", " '/openapi.json': {...},\n", " '/openapi.yaml': {...},\n", " '/openapi/v3': {...},\n", " '/slurm/v0.0.35/diag': {...},\n", " '/slurm/v0.0.35/job/submit': {...},\n", " '/slurm/v0.0.35/job/{job_id}': {...},\n", " '/slurm/v0.0.35/jobs': {...},\n", " '/slurm/v0.0.35/node/{node_name}': {...},\n", " '/slurm/v0.0.35/nodes': {...},\n", " '/slurm/v0.0.35/partition/{partition_name}': {...},\n", " '/slurm/v0.0.35/partitions': {...},\n", " '/slurm/v0.0.35/ping': {...},\n", " '/slurm/v0.0.36/diag': {...},\n", " '/slurm/v0.0.36/job/submit': {...},\n", " '/slurm/v0.0.36/job/{job_id}': {...},\n", " '/slurm/v0.0.36/jobs': {...},\n", " '/slurm/v0.0.36/node/{node_name}': {...},\n", " '/slurm/v0.0.36/nodes': {...},\n", " '/slurm/v0.0.36/partition/{partition_name}': {...},\n", " '/slurm/v0.0.36/partitions': {...},\n", " '/slurm/v0.0.36/ping': {...},\n", " '/slurmdb/v0.0.36/account/{account_name}': {...},\n", " '/slurmdb/v0.0.36/accounts': {...},\n", " '/slurmdb/v0.0.36/association': {...},\n", " '/slurmdb/v0.0.36/associations': {...},\n", " '/slurmdb/v0.0.36/cluster/{cluster_name}': {...},\n", " '/slurmdb/v0.0.36/clusters': {...},\n", " '/slurmdb/v0.0.36/config': {...},\n", " '/slurmdb/v0.0.36/diag': {...},\n", " '/slurmdb/v0.0.36/job/{job_id}': {...},\n", " '/slurmdb/v0.0.36/jobs': {...},\n", " '/slurmdb/v0.0.36/qos': {...},\n", " '/slurmdb/v0.0.36/qos/{qos_name}': {...},\n", " '/slurmdb/v0.0.36/tres': {...},\n", " '/slurmdb/v0.0.36/user/{user_name}': {...},\n", " '/slurmdb/v0.0.36/users': {...},\n", " '/slurmdb/v0.0.36/wckey/{wckey}': {...},\n", " '/slurmdb/v0.0.36/wckeys': {...}},\n", " 'security': [{...}],\n", " 'servers': [{...}],\n", " 'tags': [{...}, {...}]}\n" ] } ], "source": [ "rest_api = requests.get(slurm_rest+\"/openapi/v3\", headers=get_headers)\n", "\n", "if rest_api.status_code != 200:\n", " # This means something went wrong.\n", " print(\"Error\" , rest_api.status_code)\n", "\n", "ppr = pprint.PrettyPrinter(depth=2, indent=1)\n", "ppr.pprint(rest_api.json())\n", "\n", "with open('slurmrestapi.json', 'w', encoding='utf-8') as f:\n", " json.dump(rest_api.json(), f, ensure_ascii=False, indent=4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Build client library module\n", "\n", "* Generate the client library module using OpenAPI generator\n", "* Apply a hotfix to the generated module\n", "* Install the generated module with pip\n", "\n", "Note, a README.md file will be generated by OpenAPI generator in the slurm-rest-api-client directory with details on client python module useage.\n", "\n", "The hotfix patch is included in this repository in the same directory as this Jupyter notebook, but is included here for completeness:\n", "```\n", "diff -urwB slurm-rest-api-client/slurm_rest_api_client/models/v0036_node_allocation.py slurm-rest-api-client-patched/slurm_rest_api_client/models/v0036_node_allocation.py\n", "--- slurm-rest-api-client/slurm_rest_api_client/models/v0036_node_allocation.py 2021-11-17 18:58:51.510567435 +0000\n", "+++ slurm-rest-api-client-patched/slurm_rest_api_client/models/v0036_node_allocation.py 2021-11-03 22:10:51.405977583 +0000\n", "@@ -50,6 +50,8 @@\n", "\n", " @classmethod\n", " def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:\n", "+ if isinstance(src_dict, str):\n", "+ src_dict={}\n", " d = src_dict.copy()\n", " memory = d.pop(\"memory\", UNSET)\n", " \n", "```" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Directory slurm-rest-api-client found, module already created\n", "patching file slurm-rest-api-client/slurm_rest_api_client/models/v0036_node_allocation.py\n", "Reversed (or previously applied) patch detected! Assume -R? [n] \n", "Apply anyway? [n] \n", "Skipping patch.\n", "1 out of 1 hunk ignored -- saving rejects to file slurm-rest-api-client/slurm_rest_api_client/models/v0036_node_allocation.py.rej\n", "Processing /home/ec2-user/SageMaker/aws-research-workshops/notebooks/parallelcluster/slurm-rest-api-client\n", " Installing build dependencies: started\n", " Installing build dependencies: finished with status 'done'\n", " Getting requirements to build wheel: started\n", " Getting requirements to build wheel: finished with status 'done'\n", " Preparing wheel metadata: started\n", " Preparing wheel metadata: finished with status 'done'\n", "Requirement already satisfied: python-dateutil<3.0.0,>=2.8.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from slurm-rest-api-client==0.0.36) (2.8.1)\n", "Requirement already satisfied: attrs<22.0.0,>=20.1.0 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from slurm-rest-api-client==0.0.36) (21.2.0)\n", "Requirement already satisfied: httpx<0.21.0,>=0.15.4 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from slurm-rest-api-client==0.0.36) (0.20.0)\n", "Requirement already satisfied: httpcore<0.14.0,>=0.13.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (0.13.7)\n", "Requirement already satisfied: sniffio in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (1.2.0)\n", "Requirement already satisfied: async-generator in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (1.10)\n", "Requirement already satisfied: certifi in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (2021.5.30)\n", "Requirement already satisfied: rfc3986[idna2008]<2,>=1.3 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (1.5.0)\n", "Requirement already satisfied: charset-normalizer in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (2.0.6)\n", "Requirement already satisfied: anyio==3.* in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (3.3.4)\n", "Requirement already satisfied: h11<0.13,>=0.11 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (0.12.0)\n", "Requirement already satisfied: idna>=2.8 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from anyio==3.*->httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (3.1)\n", "Requirement already satisfied: typing-extensions in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from anyio==3.*->httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (3.10.0.2)\n", "Requirement already satisfied: dataclasses in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from anyio==3.*->httpcore<0.14.0,>=0.13.3->httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (0.8)\n", "Requirement already satisfied: contextvars>=2.1 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from sniffio->httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (2.4)\n", "Requirement already satisfied: immutables>=0.9 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from contextvars>=2.1->sniffio->httpx<0.21.0,>=0.15.4->slurm-rest-api-client==0.0.36) (0.15)\n", "Requirement already satisfied: six>=1.5 in /home/ec2-user/anaconda3/envs/python3/lib/python3.6/site-packages (from python-dateutil<3.0.0,>=2.8.0->slurm-rest-api-client==0.0.36) (1.15.0)\n", "Building wheels for collected packages: slurm-rest-api-client\n", " Building wheel for slurm-rest-api-client (PEP 517): started\n", " Building wheel for slurm-rest-api-client (PEP 517): finished with status 'done'\n", " Created wheel for slurm-rest-api-client: filename=slurm_rest_api_client-0.0.36-py3-none-any.whl size=178319 sha256=57aa79de8ca67631bb0ec86706462657d22738efb8625773a7d0958e1a73d349\n", " Stored in directory: /home/ec2-user/.cache/pip/wheels/d1/9b/51/2e4d30fada72e87ac46cdb7b9686be85c236b2750065146c8a\n", "Successfully built slurm-rest-api-client\n", "Installing collected packages: slurm-rest-api-client\n", " Attempting uninstall: slurm-rest-api-client\n", " Found existing installation: slurm-rest-api-client 0.0.36\n", " Uninstalling slurm-rest-api-client-0.0.36:\n", " Successfully uninstalled slurm-rest-api-client-0.0.36\n", "Successfully installed slurm-rest-api-client-0.0.36\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " DEPRECATION: A future pip version will change local packages to be built in-place without first copying to a temporary directory. We recommend you use --use-feature=in-tree-build to test your packages with this new behavior before it becomes the default.\n", " pip 21.3 will remove support for this functionality. You can find discussion regarding this at https://github.com/pypa/pip/issues/7555.\n", "WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.\n", "You should consider upgrading via the '/home/ec2-user/anaconda3/envs/python3/bin/python -m pip install --upgrade pip' command.\n" ] } ], "source": [ "%%bash\n", "if [ ! -d slurm-rest-api-client ] \n", "then\n", " openapi-python-client generate --path slurmrestapi.json\n", "else\n", " echo \"Directory slurm-rest-api-client found, module already created\"\n", "fi\n", "\n", "if [ -d slurm-rest-api-client ] \n", "then\n", " patch -p0 < slurmrestapi-20.11.7.patch\n", " cd slurm-rest-api-client\n", " python -m pip install .\n", "else\n", " echo \"Directory slurm-rest-api-client not found, something must have gone wrong when building\"\n", "fi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example useage of the Client API Created from the OpenAPI Specification" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 1: Querying Node Information\n", "\n", "First, we will show some standard queries to obtain information about the cluster nodes. The output of each client module function is an object containing data obtained from the API call. For the purpose of this demonstration, only selective portions of the output data are printed.\n", "\n", "In the cell below, you can:\n", "* Check if the REST API is responding with 200\n", "* Get the status of the Head Node with the ping API\n", "* Get the names and states of Compute Nodes using the get_nodes API" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Response is 200\n", "ip-172-31-46-225 responds UP\n", "big-dy-c5n2xlarge-1 state is idle\n", "big-dy-c5n2xlarge-2 state is idle\n", "big-dy-c5n2xlarge-3 state is idle\n", "big-dy-c5n2xlarge-4 state is idle\n", "big-dy-c5n2xlarge-5 state is idle\n", "big-dy-c5n2xlarge-6 state is idle\n", "big-dy-c5n2xlarge-7 state is idle\n", "big-dy-c5n2xlarge-8 state is idle\n", "big-dy-c5n2xlarge-9 state is idle\n", "big-dy-c5n2xlarge-10 state is idle\n", "small-dy-t2micro-1 state is idle\n", "small-dy-t2micro-2 state is idle\n", "small-dy-t2micro-3 state is idle\n", "small-dy-t2micro-4 state is idle\n", "small-dy-t2micro-5 state is idle\n", "small-dy-t2micro-6 state is idle\n", "small-dy-t2micro-7 state is idle\n", "small-dy-t2micro-8 state is idle\n", "small-dy-t2micro-9 state is idle\n", "small-dy-t2micro-10 state is idle\n" ] } ], "source": [ "import slurm_rest_api_client as slurm\n", "from slurm_rest_api_client.api.slurm import slurmctld_ping\n", "from slurm_rest_api_client.api.slurm import slurmctld_get_nodes\n", "\n", "client = slurm.Client(base_url=slurm_rest, headers=get_headers)\n", "\n", "response: slurm.types.Response[slurm.models.V0036Pings] = slurmctld_ping.sync_detailed(client=client)\n", "output: slurm.models.V0036Pings = slurmctld_ping.sync(client=client)\n", " \n", "if response.status_code is not 200:\n", " print(\"The REST API returned a non-200 exit code, try refreshing the JWT using the cell above\")\n", "else:\n", " print(\"Response is 200\")\n", "if output is not None:\n", " for ping in output.pings:\n", " print(ping.hostname + \" responds \" + str(ping.ping))\n", " \n", "#response: slurm.types.Response[V0036JobsResponse] = slurmctld_get_jobs.sync_detailed(client=client)\n", "output: slurm.models.V0036NodesResponse = slurmctld_get_nodes.sync(client=client)\n", "\n", "if output is not None:\n", " for node in output.nodes:\n", " print(node.hostname + \" state is \" + str(node.state))\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 2: Submit jobs\n", "\n", "Let's submit a series of Test jobs to demonstrate the submit job API. Each job will echo a phrase containing a random number generated in the Jupyter notebook in order to identify it uniquely, then sleep for a short time in order to be able to query it in Example 3.\n", "\n", "We will then use S3 to transfer the file from the cluster to the notebook host, and print the downloaded job output to the notebook cell.\n", "\n", "You can use Example 3 in order to check the status of the job." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Random integer submitted is 763516996\n", "test0 -- Job submitted: #113\n", "Random integer submitted is 724693664\n", "test1 -- Job submitted: #114\n", "Random integer submitted is 1933122879\n", "test2 -- Job submitted: #115\n", "Random integer submitted is 1182797700\n", "test3 -- Job submitted: #116\n", "Random integer submitted is 1377528152\n", "test4 -- Job submitted: #117\n" ] } ], "source": [ "from slurm_rest_api_client.api.slurm import slurmctld_submit_job\n", "\n", "njobs=5 # How many test jobs to submit\n", "tsleep=60 # Delay in seconds for each job to sit idle before completing\n", "\n", "for jobn in range(njobs):\n", " randi=random.randint(1,2147483647)\n", " print(\"Random integer submitted is \" + str(randi))\n", " job_name=\"test\" + str(jobn)\n", " job_dir=\"/shared/\"\n", " job_spec={ \n", " \"job\": { \n", " \"name\": job_name, \n", " \"ntasks\":2, \n", " \"nodes\": 2, \n", " \"partition\": \"small\",\n", " \"current_working_directory\": job_dir, \n", " \"standard_input\": \"/dev/null\", \n", " \"standard_output\": job_dir + job_name + \".out\", \n", " \"standard_error\": job_dir + job_name + \".err\", \n", " \"environment\": {\"PATH\": \"/bin:/usr/bin/:/usr/local/bin/\",\"LD_LIBRARY_PATH\": \"/lib/:/lib64/:/usr/local/lib\"} \n", " },\n", " \"script\": \"#!/bin/bash\\n\"\n", " \"echo I am from a Jupyter Notebook and Slurm Job $SLURM_JOB_ID\\n\" +\n", " \"sleep \" + str(tsleep) + \"\\n\" +\n", " \"echo My random integer is \" + str(randi) + \"\\n\" +\n", " \"aws s3 cp \" + job_name + \".out s3://\" + s3bucket + \"/\" + job_name + \".out\"\n", " }\n", "\n", " #response: slurm.types.Response[slurm.models.V0036JobSubmissionResponse] = slurmctld_submit_job.sync_detailed(client=client, json_body=job_spec)\n", " output: slurm.models.V0036JobSubmissionResponse = slurmctld_submit_job.sync(client=client, json_body=job_spec)\n", " if output is not None:\n", " print(job_name + \" -- Job submitted: #\" + str(output.job_id))\n", " else:\n", " print(\"Job not submitted\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### We will now use S3 to download the set of job outputs and print the result\n", "\n", "This will download the stout from the tests. If the file hasn't been created at job completion, it will not be found. You can check the job status in Example 3." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "test0.out -- I am from a Jupyter Notebook and Slurm Job 113\n", "\n", "test0.out -- My random integer is 763516996\n", "\n", "test1.out -- I am from a Jupyter Notebook and Slurm Job 114\n", "\n", "test1.out -- My random integer is 724693664\n", "\n", "test2.out -- I am from a Jupyter Notebook and Slurm Job 115\n", "\n", "test2.out -- My random integer is 1933122879\n", "\n", "test3.out -- I am from a Jupyter Notebook and Slurm Job 116\n", "\n", "test3.out -- My random integer is 1182797700\n", "\n", "test4.out -- I am from a Jupyter Notebook and Slurm Job 117\n", "\n", "test4.out -- My random integer is 1377528152\n", "\n" ] } ], "source": [ "s3 = boto3.client('s3')\n", "for jobn in range(njobs):\n", " outfilename=\"test\" + str(jobn) + \".out\"\n", " try: \n", " s3.download_file(s3bucket, outfilename, outfilename)\n", " with open(outfilename) as f:\n", " for line in f.readlines():\n", " print(outfilename + \" -- \" + str(line))\n", " except(ClientError) as e:\n", " print(outfilename + \" -- \" + str(e.response[\"Error\"][\"Message\"]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 3: Get jobs (like squeue)\n", "\n", "The get_jobs API can be used to get information on the jobs in the queue." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Job 108 is COMPLETED on small-dy-t2micro-1\n", "Job 109 is COMPLETED on small-dy-t2micro-3\n", "Job 110 is COMPLETED on small-dy-t2micro-5\n", "Job 111 is COMPLETED on small-dy-t2micro-7\n", "Job 112 is COMPLETED on small-dy-t2micro-9\n", "Job 113 is COMPLETED on small-dy-t2micro-1\n", "Job 114 is COMPLETED on small-dy-t2micro-3\n", "Job 115 is COMPLETED on small-dy-t2micro-5\n", "Job 116 is COMPLETED on small-dy-t2micro-7\n", "Job 117 is COMPLETED on small-dy-t2micro-9\n" ] } ], "source": [ "from slurm_rest_api_client.api.slurm import slurmctld_get_jobs\n", "\n", "output: slurm.models.V0036JobsResponse = slurmctld_get_jobs.sync(client=client)\n", " \n", "if output is not None:\n", " for job in output.jobs:\n", " print('Job ' + str(job.job_id) + \" is \" + job.job_state + \" on \" + job.batch_host)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.9" } }, "nbformat": 4, "nbformat_minor": 4 }