ContainerHQ/arkis-api

View on GitHub
app/routes/api/v1/nodes.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict';

let _ = require('lodash'),
  express = require('express'),
  middlewares = require('../../../middlewares'),
  services = require('../../../services'),
  Node = require('../../../models').Node;

let router = express.Router();

const CREATE_PARAMS = ['name', 'master', 'labels', 'byon', 'region', 'size'],
      UPDATE_PARAMS = ['name', 'master', 'labels'];

router
.get('/', middlewares.pagination, (req, res, next) => {
  Node
  .scope('defaultScope',
    { method: ['filtered', req.query] },
    { method: ['cluster',  req.cluster.id] },
    { method: ['state',    req.query.state] }
  ).findAndCount(req.pagination).then(res.paginate('nodes')).catch(next);
})
.post('/', (req, res, next) => {
  let node  = Node.build(_.pick(req.body, CREATE_PARAMS)),
    machine = new services.MachineManager(req.cluster, node, req.user);

  return machine.deploy().then(action => {
    res.status(202).serialize({ node: node, action: action });
  }).catch(next);
})
.param('node_id', middlewares.modelFinder('node', {
  belongsTo: 'cluster',
  findBy: { id: 'UUID', name: 'Ascii' }
}))

.post('/:node_id/upgrade', (req, res, next) => {
  let daemon = new services.DaemonManager(req.cluster, req.node);

  daemon.upgrade().then(action => {
    res.status(202).serialize({ node: req.node, action: action });
  }).catch(next);
})
.use('/:node_id/actions', require('./action')({ resource: 'node' }))

.route('/:node_id')
.get((req, res) => {
  res.serialize({ node: req.node });
})
.patch((req, res, next) => {
  let daemon = new services.DaemonManager(req.cluster, req.node);

  daemon.update(_.pick(req.body, UPDATE_PARAMS)).then(action => {
    res.status(202).serialize({ node: req.node, action: action });
  }).catch(next);
})
.delete((req, res, next) => {
  let machine = new services.MachineManager(req.cluster, req.node, req.user);

  machine.destroy().then(res.noContent).catch(next);
});

module.exports = router;