63 lines
1.5 KiB
JavaScript
63 lines
1.5 KiB
JavaScript
import { jingrowRequest } from 'jingrow-ui';
|
|
import { reactive } from 'vue';
|
|
|
|
let states = {};
|
|
export function pollJobStatus(jobId, stopFunction) {
|
|
if (!states[jobId]) {
|
|
states[jobId] = reactive({ status: null, loading: false });
|
|
}
|
|
let state = states[jobId];
|
|
state.loading = true;
|
|
fetchJobStatus(jobId).then(status => {
|
|
state.status = status;
|
|
});
|
|
if (stopFunction(state.status)) {
|
|
state.loading = false;
|
|
return;
|
|
}
|
|
setTimeout(() => {
|
|
pollJobStatus(jobId, stopFunction);
|
|
}, 1000);
|
|
return state;
|
|
}
|
|
|
|
function fetchJobStatus(jobId) {
|
|
return jingrowRequest({
|
|
url: 'jcloud.api.site.get_job_status',
|
|
params: { job_name: jobId }
|
|
}).then(result => result.status);
|
|
}
|
|
|
|
let runningJobs = reactive({});
|
|
export function subscribeToJobUpdates(socket) {
|
|
// listening to site's pg_update event
|
|
// check agent_job.py for more details
|
|
socket.on('pg_update', data => {
|
|
let job = runningJobs[data.id];
|
|
if (!job) {
|
|
job = data;
|
|
runningJobs[data.id] = job;
|
|
}
|
|
Object.assign(job, data);
|
|
});
|
|
}
|
|
|
|
export function getRunningJobs({ id, name, site, bench, server }) {
|
|
if (id) {
|
|
return runningJobs[id];
|
|
}
|
|
if (name) {
|
|
return Object.values(runningJobs).filter(job => job.name === name);
|
|
}
|
|
if (site) {
|
|
return Object.values(runningJobs).filter(job => job.site === site);
|
|
}
|
|
if (bench) {
|
|
return Object.values(runningJobs).filter(job => job.bench === bench);
|
|
}
|
|
if (server) {
|
|
return Object.values(runningJobs).filter(job => job.server === server);
|
|
}
|
|
return runningJobs;
|
|
}
|