github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/ui/app/components/lifecycle-chart.js (about) 1 import Component from '@ember/component'; 2 import { computed } from '@ember/object'; 3 import { sort } from '@ember/object/computed'; 4 import { tagName } from '@ember-decorators/component'; 5 import classic from 'ember-classic-decorator'; 6 7 @classic 8 @tagName('') 9 export default class LifecycleChart extends Component { 10 tasks = null; 11 taskStates = null; 12 13 @computed('tasks.@each.lifecycle', 'taskStates.@each.state') 14 get lifecyclePhases() { 15 const tasksOrStates = this.taskStates || this.tasks; 16 const lifecycles = { 17 'prestart-ephemerals': [], 18 'prestart-sidecars': [], 19 'poststart-ephemerals': [], 20 'poststart-sidecars': [], 21 poststops: [], 22 mains: [], 23 }; 24 25 tasksOrStates.forEach(taskOrState => { 26 const task = taskOrState.task || taskOrState; 27 lifecycles[`${task.lifecycleName}s`].push(taskOrState); 28 }); 29 30 const phases = []; 31 const stateActiveIterator = state => state.state === 'running'; 32 33 if (lifecycles.mains.length < tasksOrStates.length) { 34 phases.push({ 35 name: 'Prestart', 36 isActive: lifecycles['prestart-ephemerals'].some(stateActiveIterator), 37 }); 38 39 phases.push({ 40 name: 'Main', 41 isActive: 42 lifecycles.mains.some(stateActiveIterator) || 43 lifecycles['poststart-ephemerals'].some(stateActiveIterator), 44 }); 45 46 // Poststart is rendered as a subphase of main and therefore has no independent active state 47 phases.push({ 48 name: 'Poststart', 49 }); 50 51 phases.push({ 52 name: 'Poststop', 53 isActive: lifecycles.poststops.some(stateActiveIterator), 54 }); 55 } 56 57 return phases; 58 } 59 60 @sort('taskStates', function(a, b) { 61 return getTaskSortPrefix(a.task).localeCompare(getTaskSortPrefix(b.task)); 62 }) 63 sortedLifecycleTaskStates; 64 65 @sort('tasks', function(a, b) { 66 return getTaskSortPrefix(a).localeCompare(getTaskSortPrefix(b)); 67 }) 68 sortedLifecycleTasks; 69 } 70 71 const lifecycleNameSortPrefix = { 72 'prestart-ephemeral': 0, 73 'prestart-sidecar': 1, 74 main: 2, 75 'poststart-sidecar': 3, 76 'poststart-ephemeral': 4, 77 poststop: 5, 78 }; 79 80 function getTaskSortPrefix(task) { 81 return `${lifecycleNameSortPrefix[task.lifecycleName]}-${task.name}`; 82 }