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  }