github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/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 }