UNPKG

@maap-jupyterlab/dps-jupyter-extension

Version:

A JupyterLab extension for submitting and viewing jobs.

252 lines (251 loc) 9.19 kB
import { PageConfig, URLExt } from '@jupyterlab/coreutils'; import { ServerConnection } from '@jupyterlab/services'; import { getAlgorithmMetadata } from '../utils/ogc_parsers'; /** * Call the API extension * * @param endPoint API REST end point for the extension * @param init Initial values for the request * @returns The response body interpreted as JSON */ export async function requestAPI(endPoint = '', init = {}) { // Make request to Jupyter API const settings = ServerConnection.makeSettings(); const requestUrl = URLExt.join(settings.baseUrl, 'jupyter-server-extension', // API Namespace endPoint); let response; try { response = await ServerConnection.makeRequest(requestUrl, init, settings); } catch (error) { throw new ServerConnection.NetworkError(error); } let data = await response.text(); if (data.length > 0) { try { data = JSON.parse(data); } catch (error) { console.log('Not a JSON response body.', response); } } if (!response.ok) { throw new ServerConnection.ResponseError(response, data.message || data); } return data; } export async function getJobs(username) { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/listJobs'); requestUrl.searchParams.append("username", username); requestUrl.searchParams.append("proxy-ticket", ""); let response = await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }); if (response.status >= 200 && response.status < 400) { console.log("request went well"); } else { console.log("something went wrong with request!!!"); } return response.json(); } const sortAlphabetically = (a, b) => { return a.label > b.label ? 1 : b.label > a.label ? -1 : 0; }; const filterOptions = (options, inputValue) => { const candidate = inputValue.toLowerCase(); return options.filter(({ label }) => label.toLowerCase().includes(candidate)); }; export async function getAlgorithms(inputValue, callback) { let algorithms_tmp = []; var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/listAlgorithms'); requestUrl.searchParams.append("visibility", "all"); await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }).then((response) => response.json()) .then((data) => { data["response"]["algorithms"].forEach((item) => { let algorithm = {}; algorithm["value"] = item["type"] + ':' + item["version"]; algorithm["label"] = item["type"] + ':' + item["version"]; algorithms_tmp.push(algorithm); }); const filtered = filterOptions(algorithms_tmp, inputValue); // sort algorithms_tmp = filtered.sort(sortAlphabetically); callback(filtered); return algorithms_tmp; }); return algorithms_tmp; } export async function describeAlgorithms(algo_id) { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/describeAlgorithms'); var body = {}; requestUrl.searchParams.append("algo_id", algo_id); await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }).then((response) => response.json()) .then((data) => { body = getAlgorithmMetadata(data["response"]); return body; }); return body; } export async function getJobStatus(job_id) { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/getJobStatus'); requestUrl.searchParams.append("job_id", job_id); let response = await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }); let body = ""; if (response.status >= 200 && response.status < 400) { console.log("Query submitted for: ", job_id); body = response.json(); } else { console.log("something went wrong with request!!!"); } return body; } export async function getCMRCollections() { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/getCMRCollections'); var collections = []; await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }).then((response) => response.json()) .then((data) => { data["response"].forEach((item) => { let collection = {}; collection["value"] = item["Collection"]["ShortName"]; collection["label"] = item["Collection"]["ShortName"]; collection["ShortName"] = item["Collection"]["ShortName"]; collection["ScienceKeywords"] = item["Collection"]["ScienceKeywords"]; collection["Description"] = item["Collection"]["Description"]; collection["concept-id"] = item["concept-id"]; collections.push(collection); }); return collections; }); return collections; } export async function submitJob(data) { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/submitJob'); Object.keys(data).map((key, index) => (requestUrl.searchParams.append(key, data[key]))); // print request url and test it out on postman to make sure it works let response = await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }); var body = response.json(); if (response.status >= 200 && response.status < 400) { console.log("job submitted"); } else { console.log("something went wrong with job submission request!!!"); } return body; } export async function getResources(inputValue, callback) { var resources = []; var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/getQueues'); await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }).then((response) => response.json()) .then((data) => { data["response"].forEach((item) => { let resource = {}; resource["value"] = item; resource["label"] = item; resources.push(resource); }); const filtered = filterOptions(resources, inputValue); callback(filtered); return resources; }); return resources; } export async function getJobResult(job_id) { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/getJobResult'); requestUrl.searchParams.append("job_id", job_id); // print request url and test it out on postman to make sure it works let response = await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }); var body = response.json(); if (response.status >= 200 && response.status < 400) { console.log("got job result"); } else { console.log("something went wrong with job result request!!!"); } return body; } export async function getJobMetrics(job_id) { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/getJobMetrics'); requestUrl.searchParams.append("job_id", job_id); console.log("Request url for get result: ", requestUrl); // print request url and test it out on postman to make sure it works let response = await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }); var body = response.json(); if (response.status >= 200 && response.status < 400) { console.log("got job result"); } else { console.log("something went wrong with job metrics request!!!"); } return body; } export async function getUserJobs(username) { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/listUserJobs'); requestUrl.searchParams.append("username", username); console.log("Request url: ", requestUrl); // print request url and test it out on postman to make sure it works let response = await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }); var body = response.json(); if (response.status >= 200 && response.status < 400) { console.log("got user jobs"); } else { console.log("something went wrong with user jobs list request!!!"); } return body; } export async function getEnvironmentInfo() { var requestUrl = new URL(PageConfig.getBaseUrl() + 'jupyter-server-extension/getConfig'); console.log("Request url: ", requestUrl); // print request url and test it out on postman to make sure it works let response = await fetch(requestUrl.href, { headers: { 'Content-Type': 'application/json' } }); var body = response.json(); if (response.status >= 200 && response.status < 400) { console.log("got environment info"); } else { console.log("something went wrong with user jobs list request!!!"); } return body; }