github.com/emate/nomad@v0.8.2-wo-binpacking/ui/app/models/deployment.js (about) 1 import { alias } from '@ember/object/computed'; 2 import { computed } from '@ember/object'; 3 import Model from 'ember-data/model'; 4 import attr from 'ember-data/attr'; 5 import { belongsTo, hasMany } from 'ember-data/relationships'; 6 import { fragmentArray } from 'ember-data-model-fragments/attributes'; 7 import shortUUIDProperty from '../utils/properties/short-uuid'; 8 import sumAggregation from '../utils/properties/sum-aggregation'; 9 10 export default Model.extend({ 11 shortId: shortUUIDProperty('id'), 12 13 job: belongsTo('job'), 14 versionNumber: attr('number'), 15 16 // If any task group is not promoted yet requires promotion and the deployment 17 // is still running, the deployment needs promotion. 18 requiresPromotion: computed('taskGroupSummaries.@each.promoted', function() { 19 return ( 20 this.get('status') === 'running' && 21 this.get('taskGroupSummaries') 22 .toArray() 23 .some(summary => summary.get('requiresPromotion') && !summary.get('promoted')) 24 ); 25 }), 26 27 status: attr('string'), 28 statusDescription: attr('string'), 29 taskGroupSummaries: fragmentArray('task-group-deployment-summary'), 30 allocations: hasMany('allocations'), 31 32 version: computed('versionNumber', 'job.versions.content.@each.number', function() { 33 return (this.get('job.versions') || []).findBy('number', this.get('versionNumber')); 34 }), 35 36 // Dependent keys can only go one level past an @each so an alias is needed 37 versionSubmitTime: alias('version.submitTime'), 38 39 placedCanaries: sumAggregation('taskGroupSummaries', 'placedCanaries'), 40 desiredCanaries: sumAggregation('taskGroupSummaries', 'desiredCanaries'), 41 desiredTotal: sumAggregation('taskGroupSummaries', 'desiredTotal'), 42 placedAllocs: sumAggregation('taskGroupSummaries', 'placedAllocs'), 43 healthyAllocs: sumAggregation('taskGroupSummaries', 'healthyAllocs'), 44 unhealthyAllocs: sumAggregation('taskGroupSummaries', 'unhealthyAllocs'), 45 46 statusClass: computed('status', function() { 47 const classMap = { 48 running: 'is-running', 49 successful: 'is-primary', 50 paused: 'is-light', 51 failed: 'is-error', 52 cancelled: 'is-cancelled', 53 }; 54 55 return classMap[this.get('status')] || 'is-dark'; 56 }), 57 });