github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/mirage/factories/node.js (about) 1 import { Factory, trait } from 'ember-cli-mirage'; 2 import faker from 'nomad-ui/mirage/faker'; 3 import { provide } from '../utils'; 4 import { DATACENTERS, HOSTS, generateResources } from '../common'; 5 import moment from 'moment'; 6 7 const UUIDS = provide(100, faker.random.uuid.bind(faker.random)); 8 const NODE_STATUSES = ['initializing', 'ready', 'down']; 9 const NODE_CLASSES = provide(7, faker.company.bsBuzz.bind(faker.company)); 10 const NODE_VERSIONS = ['1.1.0-beta', '1.0.2-alpha+ent', ...provide(5, faker.system.semver)]; 11 const REF_DATE = new Date(); 12 13 export default Factory.extend({ 14 id: i => (i / 100 >= 1 ? `${UUIDS[i]}-${i}` : UUIDS[i]), 15 name: i => `nomad@${HOSTS[i % HOSTS.length]}`, 16 17 datacenter: () => faker.helpers.randomize(DATACENTERS), 18 nodeClass: () => faker.helpers.randomize(NODE_CLASSES), 19 drain: faker.random.boolean, 20 status: () => faker.helpers.randomize(NODE_STATUSES), 21 tlsEnabled: faker.random.boolean, 22 schedulingEligibility: () => (faker.random.boolean() ? 'eligible' : 'ineligible'), 23 24 createIndex: i => i, 25 modifyIndex: () => faker.random.number({ min: 10, max: 2000 }), 26 version: () => faker.helpers.randomize(NODE_VERSIONS), 27 28 httpAddr() { 29 return this.name.split('@')[1]; 30 }, 31 32 forceIPv4: trait({ 33 name: i => { 34 const ipv4Hosts = HOSTS.filter(h => !h.startsWith('[')); 35 return `nomad@${ipv4Hosts[i % ipv4Hosts.length]}`; 36 }, 37 }), 38 39 draining: trait({ 40 drain: true, 41 schedulingEligibility: 'ineligible', 42 drainStrategy: { 43 Deadline: faker.random.number({ min: 30 * 1000, max: 5 * 60 * 60 * 1000 }) * 1000000, 44 ForceDeadline: moment(REF_DATE).add(faker.random.number({ min: 1, max: 5 }), 'd'), 45 IgnoreSystemJobs: faker.random.boolean(), 46 }, 47 }), 48 49 forcedDraining: trait({ 50 drain: true, 51 schedulingEligibility: 'ineligible', 52 drainStrategy: { 53 Deadline: -1, 54 ForceDeadline: '0001-01-01T00:00:00Z', 55 IgnoreSystemJobs: faker.random.boolean(), 56 }, 57 }), 58 59 noDeadlineDraining: trait({ 60 drain: true, 61 schedulingEligibility: 'ineligible', 62 drainStrategy: { 63 Deadline: 0, 64 ForceDeadline: '0001-01-01T00:00:00Z', 65 IgnoreSystemJobs: faker.random.boolean(), 66 }, 67 }), 68 69 noHostVolumes: trait({ 70 hostVolumes: () => ({}), 71 }), 72 73 reserved: trait({ 74 reservedResources: generateResources({ 75 CPU: 1000, 76 MemoryMB: 2000, 77 }), 78 }), 79 80 drainStrategy: null, 81 82 drivers: makeDrivers, 83 84 hostVolumes: makeHostVolumes, 85 86 nodeResources: generateResources, 87 88 attributes() { 89 // TODO add variability to these 90 return { 91 'os.version': '10.12.5', 92 'cpu.modelname': 'Intel(R) Core(TM) i7-3615QM CPU @ 2.30GHz', 93 'nomad.revision': 'f551dcb83e3ac144c9dbb90583b6e82d234662e9', 94 'driver.docker.volumes.enabled': '1', 95 'driver.docker': '1', 96 'cpu.frequency': '2300', 97 'memory.totalbytes': '17179869184', 98 'driver.mock_driver': '1', 99 'kernel.version': '16.6.0', 100 'unique.network.ip-address': '127.0.0.1', 101 'nomad.version': '0.5.5dev', 102 'unique.hostname': 'bacon-mac', 103 'cpu.arch': 'amd64', 104 'os.name': 'darwin', 105 'kernel.name': 'darwin', 106 'unique.storage.volume': '/dev/disk1', 107 'driver.docker.version': '17.03.1-ce', 108 'cpu.totalcompute': '18400', 109 'unique.storage.bytestotal': '249783500800', 110 'cpu.numcores': '8', 111 'os.signals': 112 'SIGCONT,SIGSTOP,SIGSYS,SIGINT,SIGIOT,SIGXCPU,SIGSEGV,SIGUSR1,SIGTTIN,SIGURG,SIGUSR2,SIGABRT,SIGALRM,SIGCHLD,SIGFPE,SIGTSTP,SIGIO,SIGKILL,SIGQUIT,SIGXFSZ,SIGBUS,SIGHUP,SIGPIPE,SIGPROF,SIGTRAP,SIGTTOU,SIGILL,SIGTERM', 113 'driver.raw_exec': '1', 114 'unique.storage.bytesfree': '142954643456', 115 }; 116 }, 117 118 withMeta: trait({ 119 meta: { 120 just: 'some', 121 prop: 'erties', 122 'over.here': 100, 123 }, 124 }), 125 126 afterCreate(node, server) { 127 // Each node has a corresponding client stat resource that's queried via node IP. 128 // Create that record, even though it's not a relationship. 129 server.create('client-stat', { 130 id: node.httpAddr, 131 }); 132 133 const events = server.createList('node-event', faker.random.number({ min: 1, max: 10 }), { 134 nodeId: node.id, 135 }); 136 137 node.update({ 138 eventIds: events.mapBy('id'), 139 }); 140 141 server.create('client-stat', { 142 id: node.id, 143 }); 144 }, 145 }); 146 147 function makeDrivers() { 148 const generate = name => { 149 const detected = faker.random.number(10) >= 3; 150 const healthy = detected && faker.random.number(10) >= 3; 151 const attributes = { 152 [`driver.${name}.version`]: '1.0.0', 153 [`driver.${name}.status`]: 'awesome', 154 [`driver.${name}.more.details`]: 'yeah', 155 [`driver.${name}.more.again`]: 'we got that', 156 }; 157 return { 158 Detected: detected, 159 Healthy: healthy, 160 HealthDescription: healthy ? 'Driver is healthy' : 'Uh oh', 161 UpdateTime: faker.date.past(5 / 365, REF_DATE), 162 Attributes: faker.random.number(10) >= 3 && detected ? attributes : null, 163 }; 164 }; 165 166 return { 167 docker: generate('docker'), 168 rkt: generate('rkt'), 169 qemu: generate('qemu'), 170 exec: generate('exec'), 171 raw_exec: generate('raw_exec'), 172 java: generate('java'), 173 }; 174 } 175 176 function makeHostVolumes() { 177 const generate = () => ({ 178 Name: faker.internet.domainWord(), 179 Path: `/${faker.internet.userName()}/${faker.internet.domainWord()}/${faker.internet.color()}`, 180 ReadOnly: faker.random.boolean(), 181 }); 182 183 const volumes = provide(faker.random.number({ min: 1, max: 5 }), generate); 184 return volumes.reduce((hash, volume) => { 185 hash[volume.Name] = volume; 186 return hash; 187 }, {}); 188 }