github.com/anuvu/nomad@v0.8.7-atom1/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    'rolling-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    waitUntil: null,
    58  
    59    withPlacementFailures: trait({
    60      status: 'blocked',
    61      afterCreate(evaluation, server) {
    62        assignJob(evaluation, server);
    63        const taskGroups = server.db.taskGroups.where({ jobId: evaluation.jobId });
    64  
    65        const taskGroupNames = taskGroups.mapBy('name');
    66        const failedTaskGroupsCount = faker.random.number({ min: 1, max: taskGroupNames.length });
    67        const failedTaskGroupNames = [];
    68        for (let i = 0; i < failedTaskGroupsCount; i++) {
    69          failedTaskGroupNames.push(
    70            ...taskGroupNames.splice(faker.random.number(taskGroupNames.length - 1), 1)
    71          );
    72        }
    73  
    74        const placementFailures = failedTaskGroupNames.reduce((hash, name) => {
    75          hash[name] = {
    76            CoalescedFailures: faker.random.number({ min: 1, max: 20 }),
    77            NodesEvaluated: faker.random.number({ min: 1, max: 100 }),
    78            NodesExhausted: faker.random.number({ min: 1, max: 100 }),
    79  
    80            NodesAvailable: Math.random() > 0.7 ? generateNodesAvailable() : null,
    81            ClassFiltered: Math.random() > 0.7 ? generateClassFiltered() : null,
    82            ConstraintFiltered: Math.random() > 0.7 ? generateConstraintFiltered() : null,
    83            ClassExhausted: Math.random() > 0.7 ? generateClassExhausted() : null,
    84            DimensionExhausted: Math.random() > 0.7 ? generateDimensionExhausted() : null,
    85            QuotaExhausted: Math.random() > 0.7 ? generateQuotaExhausted() : null,
    86            Scores: Math.random() > 0.7 ? generateScores() : null,
    87          };
    88          return hash;
    89        }, {});
    90  
    91        evaluation.update({
    92          failedTGAllocs: placementFailures,
    93        });
    94      },
    95    }),
    96  
    97    afterCreate(evaluation, server) {
    98      assignJob(evaluation, server);
    99    },
   100  });
   101  
   102  function assignJob(evaluation, server) {
   103    Ember.assert(
   104      '[Mirage] No jobs! make sure jobs are created before evaluations',
   105      server.db.jobs.length
   106    );
   107  
   108    const job = evaluation.jobId ? server.db.jobs.find(evaluation.jobId) : pickOne(server.db.jobs);
   109    evaluation.update({
   110      jobId: job.id,
   111      job_id: job.id,
   112    });
   113  }