github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/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 28 if (task.lifecycleName) { 29 lifecycles[`${task.lifecycleName}s`].push(taskOrState); 30 } 31 }); 32 33 const phases = []; 34 const stateActiveIterator = (state) => state.state === 'running'; 35 36 if (lifecycles.mains.length < tasksOrStates.length) { 37 phases.push({ 38 name: 'Prestart', 39 isActive: lifecycles['prestart-ephemerals'].some(stateActiveIterator), 40 }); 41 42 phases.push({ 43 name: 'Main', 44 isActive: 45 lifecycles.mains.some(stateActiveIterator) || 46 lifecycles['poststart-ephemerals'].some(stateActiveIterator), 47 }); 48 49 // Poststart is rendered as a subphase of main and therefore has no independent active state 50 phases.push({ 51 name: 'Poststart', 52 }); 53 54 phases.push({ 55 name: 'Poststop', 56 isActive: lifecycles.poststops.some(stateActiveIterator), 57 }); 58 } 59 60 return phases; 61 } 62 63 @sort('taskStates', function (a, b) { 64 return getTaskSortPrefix(a.task).localeCompare(getTaskSortPrefix(b.task)); 65 }) 66 sortedLifecycleTaskStates; 67 68 @sort('tasks', function (a, b) { 69 return getTaskSortPrefix(a).localeCompare(getTaskSortPrefix(b)); 70 }) 71 sortedLifecycleTasks; 72 } 73 74 const lifecycleNameSortPrefix = { 75 'prestart-ephemeral': 0, 76 'prestart-sidecar': 1, 77 main: 2, 78 'poststart-sidecar': 3, 79 'poststart-ephemeral': 4, 80 poststop: 5, 81 }; 82 83 function getTaskSortPrefix(task) { 84 return `${lifecycleNameSortPrefix[task.lifecycleName]}-${task.name}`; 85 }