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 }