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  });