github.com/hspak/nomad@v0.7.2-0.20180309000617-bc4ae22a39a5/ui/mirage/factories/evaluation.js (about)

     1  import Ember from 'ember';
     2  import { Factory, faker, trait } from 'ember-cli-mirage';
     3  import { provide, pickOne } from '../utils';
     4  import { DATACENTERS } from '../common';
     5  
     6  const EVAL_TYPES = ['system', 'service', 'batch'];
     7  const EVAL_STATUSES = ['pending', 'complete', 'failed', 'canceled'];
     8  const EVAL_TRIGGERED_BY = [
     9    'job-register',
    10    'job-deregister',
    11    'periodic-job',
    12    'node-update',
    13    'scheduled',
    14    'roling-update',
    15    'deployment-watcher',
    16    'failed-follow-up',
    17    'max-plan-attempts',
    18  ];
    19  
    20  const generateCountMap = (keysCount, list) => () => {
    21    const sample = Array(keysCount)
    22      .fill(null)
    23      .map(() => pickOne(list))
    24      .uniq();
    25    return sample.reduce((hash, key) => {
    26      hash[key] = faker.random.number({ min: 1, max: 5 });
    27      return hash;
    28    }, {});
    29  };
    30  
    31  const generateNodesAvailable = generateCountMap(5, DATACENTERS);
    32  const generateClassFiltered = generateCountMap(3, provide(10, faker.hacker.abbreviation));
    33  const generateClassExhausted = generateClassFiltered;
    34  const generateDimensionExhausted = generateCountMap(1, ['cpu', 'mem', 'disk', 'iops']);
    35  const generateQuotaExhausted = generateDimensionExhausted;
    36  const generateScores = generateCountMap(1, ['binpack', 'job-anti-affinity']);
    37  const generateConstraintFiltered = generateCountMap(2, [
    38    'prop = val',
    39    'driver = docker',
    40    'arch = x64',
    41  ]);
    42  
    43  export default Factory.extend({
    44    id: () => faker.random.uuid(),
    45  
    46    priority: () => faker.random.number(100),
    47  
    48    type: faker.list.random(...EVAL_TYPES),
    49    triggeredBy: faker.list.random(...EVAL_TRIGGERED_BY),
    50    status: faker.list.random(...EVAL_STATUSES),
    51    statusDescription: () => faker.lorem.sentence(),
    52  
    53    failedTGAllocs: null,
    54  
    55    modifyIndex: () => faker.random.number({ min: 10, max: 2000 }),
    56  
    57    withPlacementFailures: trait({
    58      status: 'blocked',
    59      afterCreate(evaluation, server) {
    60        assignJob(evaluation, server);
    61        const taskGroups = server.db.taskGroups.where({ jobId: evaluation.jobId });
    62  
    63        const taskGroupNames = taskGroups.mapBy('name');
    64        const failedTaskGroupsCount = faker.random.number({ min: 1, max: taskGroupNames.length });
    65        const failedTaskGroupNames = [];
    66        for (let i = 0; i < failedTaskGroupsCount; i++) {
    67          failedTaskGroupNames.push(
    68            ...taskGroupNames.splice(faker.random.number(taskGroupNames.length - 1), 1)
    69          );
    70        }
    71  
    72        const placementFailures = failedTaskGroupNames.reduce((hash, name) => {
    73          hash[name] = {
    74            CoalescedFailures: faker.random.number({ min: 1, max: 20 }),
    75            NodesEvaluated: faker.random.number({ min: 1, max: 100 }),
    76            NodesExhausted: faker.random.number({ min: 1, max: 100 }),
    77  
    78            NodesAvailable: Math.random() > 0.7 ? generateNodesAvailable() : null,
    79            ClassFiltered: Math.random() > 0.7 ? generateClassFiltered() : null,
    80            ConstraintFiltered: Math.random() > 0.7 ? generateConstraintFiltered() : null,
    81            ClassExhausted: Math.random() > 0.7 ? generateClassExhausted() : null,
    82            DimensionExhausted: Math.random() > 0.7 ? generateDimensionExhausted() : null,
    83            QuotaExhausted: Math.random() > 0.7 ? generateQuotaExhausted() : null,
    84            Scores: Math.random() > 0.7 ? generateScores() : null,
    85          };
    86          return hash;
    87        }, {});
    88  
    89        evaluation.update({
    90          failedTGAllocs: placementFailures,
    91        });
    92      },
    93    }),
    94  
    95    afterCreate(evaluation, server) {
    96      assignJob(evaluation, server);
    97    },
    98  });
    99  
   100  function assignJob(evaluation, server) {
   101    Ember.assert(
   102      '[Mirage] No jobs! make sure jobs are created before evaluations',
   103      server.db.jobs.length
   104    );
   105  
   106    const job = evaluation.jobId ? server.db.jobs.find(evaluation.jobId) : pickOne(server.db.jobs);
   107    evaluation.update({
   108      jobId: job.id,
   109    });
   110  }