github.com/zoomfoo/nomad@v0.8.5-0.20180907175415-f28fd3a1a056/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] = generateTaskGroupFailures();
    76          return hash;
    77        }, {});
    78  
    79        evaluation.update({
    80          failedTGAllocs: placementFailures,
    81        });
    82      },
    83    }),
    84  
    85    afterCreate(evaluation, server) {
    86      assignJob(evaluation, server);
    87    },
    88  });
    89  
    90  function assignJob(evaluation, server) {
    91    Ember.assert(
    92      '[Mirage] No jobs! make sure jobs are created before evaluations',
    93      server.db.jobs.length
    94    );
    95  
    96    const job = evaluation.jobId ? server.db.jobs.find(evaluation.jobId) : pickOne(server.db.jobs);
    97    evaluation.update({
    98      jobId: job.id,
    99      job_id: job.id,
   100    });
   101  }
   102  
   103  export function generateTaskGroupFailures() {
   104    return {
   105      CoalescedFailures: faker.random.number({ min: 1, max: 20 }),
   106      NodesEvaluated: faker.random.number({ min: 1, max: 100 }),
   107      NodesExhausted: faker.random.number({ min: 1, max: 100 }),
   108  
   109      NodesAvailable: Math.random() > 0.7 ? generateNodesAvailable() : null,
   110      ClassFiltered: Math.random() > 0.7 ? generateClassFiltered() : null,
   111      ConstraintFiltered: Math.random() > 0.7 ? generateConstraintFiltered() : null,
   112      ClassExhausted: Math.random() > 0.7 ? generateClassExhausted() : null,
   113      DimensionExhausted: Math.random() > 0.7 ? generateDimensionExhausted() : null,
   114      QuotaExhausted: Math.random() > 0.7 ? generateQuotaExhausted() : null,
   115      Scores: Math.random() > 0.7 ? generateScores() : null,
   116    };
   117  }