open-nomad/ui/app/serializers/job.js
2020-07-29 19:07:24 -07:00

103 lines
2.8 KiB
JavaScript

import { assign } from '@ember/polyfills';
import ApplicationSerializer from './application';
import queryString from 'query-string';
export default class JobSerializer extends ApplicationSerializer {
attrs = {
parameterized: 'ParameterizedJob',
};
normalize(typeHash, hash) {
hash.NamespaceID = hash.Namespace;
// ID is a composite of both the job ID and the namespace the job is in
hash.PlainId = hash.ID;
hash.ID = JSON.stringify([hash.ID, hash.NamespaceID || 'default']);
// ParentID comes in as "" instead of null
if (!hash.ParentID) {
hash.ParentID = null;
} else {
hash.ParentID = JSON.stringify([hash.ParentID, hash.NamespaceID || 'default']);
}
// Job Summary is always at /:job-id/summary, but since it can also come from
// the job list, it's better for Ember Data to be linked by ID association.
hash.SummaryID = hash.ID;
// Periodic is a boolean on list and an object on single
if (hash.Periodic instanceof Object) {
hash.PeriodicDetails = hash.Periodic;
hash.Periodic = true;
}
// Parameterized behaves like Periodic
if (hash.ParameterizedJob instanceof Object) {
hash.ParameterizedDetails = hash.ParameterizedJob;
hash.ParameterizedJob = true;
}
// If the hash contains summary information, push it into the store
// as a job-summary model.
if (hash.JobSummary) {
this.store.pushPayload('job-summary', {
'job-summary': [hash.JobSummary],
});
}
return super.normalize(typeHash, hash);
}
extractRelationships(modelClass, hash) {
const namespace =
!hash.NamespaceID || hash.NamespaceID === 'default' ? undefined : hash.NamespaceID;
const { modelName } = modelClass;
const [jobURL] = this.store
.adapterFor(modelName)
.buildURL(modelName, hash.ID, hash, 'findRecord')
.split('?');
return assign(super.extractRelationships(...arguments), {
allocations: {
links: {
related: buildURL(`${jobURL}/allocations`, { namespace }),
},
},
versions: {
links: {
related: buildURL(`${jobURL}/versions`, { namespace, diffs: true }),
},
},
deployments: {
links: {
related: buildURL(`${jobURL}/deployments`, { namespace }),
},
},
latestDeployment: {
links: {
related: buildURL(`${jobURL}/deployment`, { namespace }),
},
},
evaluations: {
links: {
related: buildURL(`${jobURL}/evaluations`, { namespace }),
},
},
scaleState: {
links: {
related: buildURL(`${jobURL}/scale`, { namespace }),
},
},
});
}
}
function buildURL(path, queryParams) {
const qpString = queryString.stringify(queryParams);
if (qpString) {
return `${path}?${qpString}`;
}
return path;
}