github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/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(
    35    3,
    36    provide(10, faker.hacker.abbreviation)
    37  );
    38  const generateClassExhausted = generateClassFiltered;
    39  const generateDimensionExhausted = generateCountMap(1, [
    40    'cpu',
    41    'mem',
    42    'disk',
    43    'iops',
    44  ]);
    45  const generateQuotaExhausted = generateDimensionExhausted;
    46  const generateScores = generateCountMap(1, ['binpack', 'job-anti-affinity']);
    47  const generateConstraintFiltered = generateCountMap(2, [
    48    'prop = val',
    49    'driver = docker',
    50    'arch = x64',
    51  ]);
    52  
    53  export default Factory.extend({
    54    id: () => faker.random.uuid(),
    55  
    56    priority: () => faker.random.number(100),
    57  
    58    type: () => faker.helpers.randomize(EVAL_TYPES),
    59    triggeredBy: () => faker.helpers.randomize(EVAL_TRIGGERED_BY),
    60    status: () => faker.helpers.randomize(EVAL_STATUSES),
    61    statusDescription: () => faker.lorem.sentence(),
    62  
    63    failedTGAllocs: null,
    64  
    65    modifyIndex: () => faker.random.number({ min: 10, max: 2000 }),
    66    modifyTime: () => faker.date.past(2 / 365, REF_TIME) * 1000000,
    67  
    68    createIndex: () => faker.random.number({ min: 10, max: 2000 }),
    69    createTime() {
    70      return (
    71        faker.date.past(2 / 365, new Date(this.modifyTime / 1000000)) * 1000000
    72      );
    73    },
    74  
    75    waitUntil: null,
    76  
    77    withPlacementFailures: trait({
    78      status: 'blocked',
    79      afterCreate(evaluation, server) {
    80        assignJob(evaluation, server);
    81        const taskGroups = server.db.taskGroups.where({
    82          jobId: evaluation.jobId,
    83        });
    84  
    85        const taskGroupNames = taskGroups.mapBy('name');
    86        const failedTaskGroupsCount = faker.random.number({
    87          min: 1,
    88          max: taskGroupNames.length,
    89        });
    90        const failedTaskGroupNames = [];
    91        for (let i = 0; i < failedTaskGroupsCount; i++) {
    92          failedTaskGroupNames.push(
    93            ...taskGroupNames.splice(
    94              faker.random.number(taskGroupNames.length - 1),
    95              1
    96            )
    97          );
    98        }
    99  
   100        const placementFailures = failedTaskGroupNames.reduce((hash, name) => {
   101          hash[name] = generateTaskGroupFailures();
   102          return hash;
   103        }, {});
   104  
   105        evaluation.update({
   106          failedTGAllocs: placementFailures,
   107        });
   108      },
   109    }),
   110  
   111    afterCreate(evaluation, server) {
   112      if (!evaluation.nodeId) {
   113        assignJob(evaluation, server);
   114      }
   115    },
   116  });
   117  
   118  function assignJob(evaluation, server) {
   119    Ember.assert(
   120      '[Mirage] No jobs! make sure jobs are created before evaluations',
   121      server.db.jobs.length
   122    );
   123  
   124    const job = evaluation.jobId
   125      ? server.db.jobs.find(evaluation.jobId)
   126      : pickOne(server.db.jobs);
   127    evaluation.update({
   128      jobId: job.id,
   129    });
   130  }
   131  
   132  export function generateTaskGroupFailures() {
   133    return {
   134      CoalescedFailures: faker.random.number({ min: 1, max: 20 }),
   135      NodesEvaluated: faker.random.number({ min: 1, max: 100 }),
   136      NodesExhausted: faker.random.number({ min: 1, max: 100 }),
   137  
   138      NodesAvailable:
   139        faker.random.number(10) >= 7 ? generateNodesAvailable() : null,
   140      ClassFiltered:
   141        faker.random.number(10) >= 7 ? generateClassFiltered() : null,
   142      ConstraintFiltered:
   143        faker.random.number(10) >= 7 ? generateConstraintFiltered() : null,
   144      ClassExhausted:
   145        faker.random.number(10) >= 7 ? generateClassExhausted() : null,
   146      DimensionExhausted:
   147        faker.random.number(10) >= 7 ? generateDimensionExhausted() : null,
   148      QuotaExhausted:
   149        faker.random.number(10) >= 7 ? generateQuotaExhausted() : null,
   150      Scores: faker.random.number(10) >= 7 ? generateScores() : null,
   151    };
   152  }