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  }