@maap-jupyterlab/dps-jupyter-extension
Version:
A JupyterLab extension for submitting and viewing jobs.
252 lines (251 loc) • 9.19 kB
JavaScript
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;
}