github.com/hspak/nomad@v0.7.2-0.20180309000617-bc4ae22a39a5/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 'roling-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 withPlacementFailures: trait({ 58 status: 'blocked', 59 afterCreate(evaluation, server) { 60 assignJob(evaluation, server); 61 const taskGroups = server.db.taskGroups.where({ jobId: evaluation.jobId }); 62 63 const taskGroupNames = taskGroups.mapBy('name'); 64 const failedTaskGroupsCount = faker.random.number({ min: 1, max: taskGroupNames.length }); 65 const failedTaskGroupNames = []; 66 for (let i = 0; i < failedTaskGroupsCount; i++) { 67 failedTaskGroupNames.push( 68 ...taskGroupNames.splice(faker.random.number(taskGroupNames.length - 1), 1) 69 ); 70 } 71 72 const placementFailures = failedTaskGroupNames.reduce((hash, name) => { 73 hash[name] = { 74 CoalescedFailures: faker.random.number({ min: 1, max: 20 }), 75 NodesEvaluated: faker.random.number({ min: 1, max: 100 }), 76 NodesExhausted: faker.random.number({ min: 1, max: 100 }), 77 78 NodesAvailable: Math.random() > 0.7 ? generateNodesAvailable() : null, 79 ClassFiltered: Math.random() > 0.7 ? generateClassFiltered() : null, 80 ConstraintFiltered: Math.random() > 0.7 ? generateConstraintFiltered() : null, 81 ClassExhausted: Math.random() > 0.7 ? generateClassExhausted() : null, 82 DimensionExhausted: Math.random() > 0.7 ? generateDimensionExhausted() : null, 83 QuotaExhausted: Math.random() > 0.7 ? generateQuotaExhausted() : null, 84 Scores: Math.random() > 0.7 ? generateScores() : null, 85 }; 86 return hash; 87 }, {}); 88 89 evaluation.update({ 90 failedTGAllocs: placementFailures, 91 }); 92 }, 93 }), 94 95 afterCreate(evaluation, server) { 96 assignJob(evaluation, server); 97 }, 98 }); 99 100 function assignJob(evaluation, server) { 101 Ember.assert( 102 '[Mirage] No jobs! make sure jobs are created before evaluations', 103 server.db.jobs.length 104 ); 105 106 const job = evaluation.jobId ? server.db.jobs.find(evaluation.jobId) : pickOne(server.db.jobs); 107 evaluation.update({ 108 jobId: job.id, 109 }); 110 }