github.com/blixtra/nomad@v0.7.2-0.20171221000451-da9a1d7bb050/ui/app/models/job.js (about) 1 import Ember from 'ember'; 2 import Model from 'ember-data/model'; 3 import attr from 'ember-data/attr'; 4 import { belongsTo, hasMany } from 'ember-data/relationships'; 5 import { fragmentArray } from 'ember-data-model-fragments/attributes'; 6 import sumAggregation from '../utils/properties/sum-aggregation'; 7 8 const { computed } = Ember; 9 10 export default Model.extend({ 11 region: attr('string'), 12 name: attr('string'), 13 plainId: attr('string'), 14 type: attr('string'), 15 priority: attr('number'), 16 allAtOnce: attr('boolean'), 17 18 status: attr('string'), 19 statusDescription: attr('string'), 20 createIndex: attr('number'), 21 modifyIndex: attr('number'), 22 23 periodic: attr('boolean'), 24 parameterized: attr('boolean'), 25 26 datacenters: attr(), 27 taskGroups: fragmentArray('task-group', { defaultValue: () => [] }), 28 taskGroupSummaries: fragmentArray('task-group-summary'), 29 30 // Aggregate allocation counts across all summaries 31 queuedAllocs: sumAggregation('taskGroupSummaries', 'queuedAllocs'), 32 startingAllocs: sumAggregation('taskGroupSummaries', 'startingAllocs'), 33 runningAllocs: sumAggregation('taskGroupSummaries', 'runningAllocs'), 34 completeAllocs: sumAggregation('taskGroupSummaries', 'completeAllocs'), 35 failedAllocs: sumAggregation('taskGroupSummaries', 'failedAllocs'), 36 lostAllocs: sumAggregation('taskGroupSummaries', 'lostAllocs'), 37 38 allocsList: computed.collect( 39 'queuedAllocs', 40 'startingAllocs', 41 'runningAllocs', 42 'completeAllocs', 43 'failedAllocs', 44 'lostAllocs' 45 ), 46 47 totalAllocs: computed.sum('allocsList'), 48 49 pendingChildren: attr('number'), 50 runningChildren: attr('number'), 51 deadChildren: attr('number'), 52 53 versions: hasMany('job-versions'), 54 allocations: hasMany('allocations'), 55 deployments: hasMany('deployments'), 56 evaluations: hasMany('evaluations'), 57 namespace: belongsTo('namespace'), 58 59 hasPlacementFailures: computed.bool('latestFailureEvaluation'), 60 61 latestEvaluation: computed('evaluations.@each.modifyIndex', 'evaluations.isPending', function() { 62 const evaluations = this.get('evaluations'); 63 if (!evaluations || evaluations.get('isPending')) { 64 return null; 65 } 66 return evaluations.sortBy('modifyIndex').get('lastObject'); 67 }), 68 69 latestFailureEvaluation: computed( 70 'evaluations.@each.modifyIndex', 71 'evaluations.isPending', 72 function() { 73 const evaluations = this.get('evaluations'); 74 if (!evaluations || evaluations.get('isPending')) { 75 return null; 76 } 77 78 const failureEvaluations = evaluations.filterBy('hasPlacementFailures'); 79 if (failureEvaluations) { 80 return failureEvaluations.sortBy('modifyIndex').get('lastObject'); 81 } 82 } 83 ), 84 85 supportsDeployments: computed.equal('type', 'service'), 86 87 runningDeployment: computed('deployments.@each.status', function() { 88 return this.get('deployments').findBy('status', 'running'); 89 }), 90 91 fetchRawDefinition() { 92 return this.store.adapterFor('job').fetchRawDefinition(this); 93 }, 94 95 statusClass: computed('status', function() { 96 const classMap = { 97 pending: 'is-pending', 98 running: 'is-primary', 99 dead: 'is-light', 100 }; 101 102 return classMap[this.get('status')] || 'is-dark'; 103 }), 104 });