open-nomad/ui/app/adapters/job.js

122 lines
3.1 KiB
JavaScript
Raw Normal View History

import { inject as service } from '@ember/service';
import Watchable from './watchable';
2019-05-15 22:33:58 +00:00
import addToPath from 'nomad-ui/utils/add-to-path';
2017-09-19 14:47:10 +00:00
export default Watchable.extend({
system: service(),
2017-10-10 16:36:15 +00:00
findAll() {
const namespace = this.get('system.activeNamespace');
return this._super(...arguments).then(data => {
data.forEach(job => {
job.Namespace = namespace ? namespace.get('id') : 'default';
2017-10-10 16:36:15 +00:00
});
return data;
});
},
findRecord(store, type, id, snapshot) {
const [, namespace] = JSON.parse(id);
const namespaceQuery = namespace && namespace !== 'default' ? { namespace } : {};
return this._super(store, type, id, snapshot, namespaceQuery);
},
urlForFindAll() {
const url = this._super(...arguments);
const namespace = this.get('system.activeNamespace.id');
return associateNamespace(url, namespace);
},
urlForFindRecord(id, type, hash) {
const [name, namespace] = JSON.parse(id);
let url = this._super(name, type, hash);
return associateNamespace(url, namespace);
2017-09-19 14:47:10 +00:00
},
2018-08-21 23:39:47 +00:00
urlForUpdateRecord(id, type, hash) {
const [name, namespace] = JSON.parse(id);
let url = this._super(name, type, hash);
return associateNamespace(url, namespace);
},
xhrKey(url, method, options = {}) {
2018-05-25 16:15:45 +00:00
const plainKey = this._super(...arguments);
const namespace = options.data && options.data.namespace;
return associateNamespace(plainKey, namespace);
},
relationshipFallbackLinks: {
summary: '/summary',
},
2017-09-19 14:47:10 +00:00
fetchRawDefinition(job) {
const url = this.urlForFindRecord(job.get('id'), 'job');
return this.ajax(url, 'GET');
2017-09-19 14:47:10 +00:00
},
forcePeriodic(job) {
if (job.get('periodic')) {
const url = addToPath(this.urlForFindRecord(job.get('id'), 'job'), '/periodic/force');
return this.ajax(url, 'POST');
}
},
stop(job) {
const url = this.urlForFindRecord(job.get('id'), 'job');
return this.ajax(url, 'DELETE');
},
2018-08-15 00:29:51 +00:00
parse(spec) {
const url = addToPath(this.urlForFindAll('job'), '/parse');
return this.ajax(url, 'POST', {
data: {
JobHCL: spec,
Canonicalize: true,
},
});
},
plan(job) {
const jobId = job.get('id');
2019-03-26 07:46:44 +00:00
const store = this.store;
const url = addToPath(this.urlForFindRecord(jobId, 'job'), '/plan');
2018-08-15 00:29:51 +00:00
return this.ajax(url, 'POST', {
data: {
Job: job.get('_newDefinitionJSON'),
Diff: true,
},
}).then(json => {
json.ID = jobId;
store.pushPayload('job-plan', { jobPlans: [json] });
return store.peekRecord('job-plan', jobId);
2018-08-15 00:29:51 +00:00
});
},
2018-08-15 01:26:26 +00:00
// Running a job doesn't follow REST create semantics so it's easier to
// treat it as an action.
run(job) {
return this.ajax(this.urlForCreateRecord('job'), 'POST', {
data: {
Job: job.get('_newDefinitionJSON'),
},
});
},
2018-08-21 23:39:47 +00:00
update(job) {
return this.ajax(this.urlForUpdateRecord(job.get('id'), 'job'), 'POST', {
data: {
Job: job.get('_newDefinitionJSON'),
},
});
},
2017-09-19 14:47:10 +00:00
});
function associateNamespace(url, namespace) {
if (namespace && namespace !== 'default') {
url += `?namespace=${namespace}`;
}
return url;
}