github.com/anuvu/nomad@v0.8.7-atom1/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] = { 76 CoalescedFailures: faker.random.number({ min: 1, max: 20 }), 77 NodesEvaluated: faker.random.number({ min: 1, max: 100 }), 78 NodesExhausted: faker.random.number({ min: 1, max: 100 }), 79 80 NodesAvailable: Math.random() > 0.7 ? generateNodesAvailable() : null, 81 ClassFiltered: Math.random() > 0.7 ? generateClassFiltered() : null, 82 ConstraintFiltered: Math.random() > 0.7 ? generateConstraintFiltered() : null, 83 ClassExhausted: Math.random() > 0.7 ? generateClassExhausted() : null, 84 DimensionExhausted: Math.random() > 0.7 ? generateDimensionExhausted() : null, 85 QuotaExhausted: Math.random() > 0.7 ? generateQuotaExhausted() : null, 86 Scores: Math.random() > 0.7 ? generateScores() : null, 87 }; 88 return hash; 89 }, {}); 90 91 evaluation.update({ 92 failedTGAllocs: placementFailures, 93 }); 94 }, 95 }), 96 97 afterCreate(evaluation, server) { 98 assignJob(evaluation, server); 99 }, 100 }); 101 102 function assignJob(evaluation, server) { 103 Ember.assert( 104 '[Mirage] No jobs! make sure jobs are created before evaluations', 105 server.db.jobs.length 106 ); 107 108 const job = evaluation.jobId ? server.db.jobs.find(evaluation.jobId) : pickOne(server.db.jobs); 109 evaluation.update({ 110 jobId: job.id, 111 job_id: job.id, 112 }); 113 }