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 }