github.com/manicqin/nomad@v0.9.5/ui/mirage/factories/evaluation.js (about)

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