open-nomad/ui/app/serializers/allocation.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

97 lines
3.1 KiB
JavaScript
Raw Normal View History

import { inject as service } from '@ember/service';
import { get } from '@ember/object';
2017-09-19 14:47:10 +00:00
import ApplicationSerializer from './application';
import classic from 'ember-classic-decorator';
2017-09-19 14:47:10 +00:00
const taskGroupFromJob = (job, taskGroupName) => {
const taskGroups = job && job.TaskGroups;
2021-12-28 16:08:12 +00:00
const taskGroup =
taskGroups && taskGroups.find((group) => group.Name === taskGroupName);
return taskGroup ? taskGroup : null;
};
2021-12-28 14:45:20 +00:00
const merge = (tasks) => {
const mergedResources = {
Cpu: { CpuShares: 0 },
Memory: { MemoryMB: 0 },
Disk: { DiskMB: 0 },
};
return tasks.reduce((resources, task) => {
resources.Cpu.CpuShares += (task.Cpu && task.Cpu.CpuShares) || 0;
resources.Memory.MemoryMB += (task.Memory && task.Memory.MemoryMB) || 0;
resources.Disk.DiskMB += (task.Disk && task.Disk.DiskMB) || 0;
return resources;
}, mergedResources);
};
@classic
export default class AllocationSerializer extends ApplicationSerializer {
@service system;
attrs = {
2017-09-19 14:47:10 +00:00
taskGroupName: 'TaskGroup',
states: 'TaskStates',
};
2017-09-19 14:47:10 +00:00
separateNanos = ['CreateTime', 'ModifyTime'];
2017-09-19 14:47:10 +00:00
normalize(typeHash, hash) {
// Transform the map-based TaskStates object into an array-based
// TaskState fragment list
const states = hash.TaskStates || {};
hash.TaskStates = Object.keys(states)
.sort()
2021-12-28 14:45:20 +00:00
.map((key) => {
const state = states[key] || {};
const summary = { Name: key };
2021-12-28 16:08:12 +00:00
Object.keys(state).forEach(
(stateKey) => (summary[stateKey] = state[stateKey])
);
summary.Resources =
hash.AllocatedResources && hash.AllocatedResources.Tasks[key];
return summary;
});
2017-09-19 14:47:10 +00:00
2021-12-28 16:08:12 +00:00
hash.JobVersion =
hash.JobVersion != null ? hash.JobVersion : get(hash, 'Job.Version');
2017-10-19 17:17:04 +00:00
hash.PlainJobId = hash.JobID;
hash.Namespace = hash.Namespace || get(hash, 'Job.Namespace') || 'default';
hash.JobID = JSON.stringify([hash.JobID, hash.Namespace]);
2018-04-25 22:50:15 +00:00
hash.RescheduleEvents = (hash.RescheduleTracker || {}).Events;
hash.IsMigrating = (hash.DesiredTransition || {}).Migrate;
// API returns empty strings instead of null
2021-12-28 16:08:12 +00:00
hash.PreviousAllocationID = hash.PreviousAllocation
? hash.PreviousAllocation
: null;
hash.NextAllocationID = hash.NextAllocation ? hash.NextAllocation : null;
2021-12-28 16:08:12 +00:00
hash.FollowUpEvaluationID = hash.FollowupEvalID
? hash.FollowupEvalID
: null;
2019-04-16 19:11:43 +00:00
hash.PreemptedAllocationIDs = hash.PreemptedAllocations || [];
hash.PreemptedByAllocationID = hash.PreemptedByAllocation || null;
2019-04-16 20:23:16 +00:00
hash.WasPreempted = !!hash.PreemptedByAllocationID;
2019-04-16 19:11:43 +00:00
const shared = hash.AllocatedResources && hash.AllocatedResources.Shared;
hash.AllocatedResources =
2021-12-28 16:08:12 +00:00
hash.AllocatedResources &&
merge(Object.values(hash.AllocatedResources.Tasks));
if (shared) {
hash.AllocatedResources.Ports = shared.Ports;
hash.AllocatedResources.Networks = shared.Networks;
}
// The Job definition for an allocation is only included in findRecord responses.
2021-12-28 16:08:12 +00:00
hash.AllocationTaskGroup = !hash.Job
? null
: taskGroupFromJob(hash.Job, hash.TaskGroup);
return super.normalize(typeHash, hash);
}
}