@yawetse/pkgcloud
Version:
An infrastructure-as-a-service agnostic cloud library for node.js
216 lines (190 loc) • 6.22 kB
JavaScript
/*
* nodes.js: Rackspace loadbalancer client loadBalancers functionality
*
* (C) 2013 Rackspace
* Ken Perkins
* MIT LICENSE
*
*/
var urlJoin = require('url-join'),
pkgcloud = require('../../../../../lib/pkgcloud'),
_ = require('underscore'),
lb = pkgcloud.providers.rackspace.loadbalancer;
var _urlPrefix = 'loadbalancers';
module.exports = {
/**
* client.getNodes
*
* @description get an array of nodes for the provided load balancer
*
* @param {Object} loadBalancer the loadBalancer or loadBalancerId
* @param {function} callback
*/
getNodes: function (loadBalancer, callback) {
var self = this,
loadBalancerId =
loadBalancer instanceof lb.LoadBalancer ? loadBalancer.id : loadBalancer;
self._request({
path: urlJoin(_urlPrefix, loadBalancerId, 'nodes')
}, function (err, body, res) {
if (err) {
return callback(err);
}
else if (!body || !body.nodes) {
return callback(new Error('Unexpected empty response'));
}
else {
return callback(null, body.nodes.map(function (node) {
return new lb.Node(self,
_.extend(node, { loadBalancerId: loadBalancerId }));
}), res);
}
});
},
/**
* client.addNodes
*
* @description add a node or array of nodes to the provided load balancer. Each of the addresses must be unique to this load balancer.
*
* @param {Object} loadBalancer the loadBalancer or loadBalancerId
* @param {Object|Array} nodes list of nodes to add
* @param {function} callback
*
* Sample node
*
* {
* address: '192.168.10.1',
* port: 80,
* condition: 'ENABLED', // also supports 'DISABLED' & 'DRAINING'
* type: 'PRIMARY' // use 'SECONDARY' as a fail over node
* }
*
*/
addNodes: function(loadBalancer, nodes, callback) {
var self = this,
loadBalancerId =
loadBalancer instanceof lb.LoadBalancer ? loadBalancer.id : loadBalancer;
if (!Array.isArray(nodes)) {
nodes = [ nodes ];
}
var postOptions = {
path: urlJoin(_urlPrefix, loadBalancerId, 'nodes'),
method: 'POST',
body: { nodes: [] }
};
postOptions.body.nodes = _.map(nodes, function(node) {
return _.pick(node, ['address', 'port', 'condition', 'type', 'weight']);
});
self._request(postOptions, function (err, body, res) {
if (err) {
return callback(err);
}
else if (!body || !body.nodes) {
return callback(new Error('Unexpected empty response'));
}
else {
return callback(null, body.nodes.map(function (node) {
return new lb.Node(self,
_.extend(node, { loadBalancerId: loadBalancerId }));
}), res);
}
});
},
/**
* client.updateNode
*
* @description update a node condition, type, or weight
*
* @param {Object} loadBalancer the loadBalancer or loadBalancerId
* @param {Object} node the node to update
* @param {function} callback
*/
updateNode: function(loadBalancer, node, callback) {
var self = this,
loadBalancerId =
loadBalancer instanceof lb.LoadBalancer ? loadBalancer.id : loadBalancer;
if (!(node instanceof lb.Node) && (typeof node !== 'object')) {
throw new Error('node is a required argument and must be an object');
}
self._request({
path: urlJoin(_urlPrefix, loadBalancerId, 'nodes', node.id),
method: 'PUT',
body: {
node: _.pick(node, ['condition', 'type', 'weight'])
}
}, function (err) {
callback(err);
});
},
/**
* client.removeNode
*
* @description remove a node from a load balancer
*
* @param {Object} loadBalancer the loadBalancer or loadBalancerId
* @param {Object} node the node or nodeId to remove
* @param {function} callback
*/
removeNode: function (loadBalancer, node, callback) {
var self = this,
loadBalancerId =
loadBalancer instanceof lb.LoadBalancer ? loadBalancer.id : loadBalancer,
nodeId =
node instanceof lb.Node ? node.id : node;
self._request({
path: urlJoin(_urlPrefix, loadBalancerId, 'nodes', nodeId),
method: 'DELETE'
}, function (err) {
callback(err);
});
},
/**
* client.removeNodes
*
* @description remove an array of nodes or nodeIds from a load balancer
*
* @param {Object} loadBalancer the loadBalancer or loadBalancerId
* @param {Array} nodes the nodes or nodeIds to remove
* @param {function} callback
*/
removeNodes: function (loadBalancer, nodes, callback) {
var self = this,
loadBalancerId =
loadBalancer instanceof lb.LoadBalancer ? loadBalancer.id : loadBalancer;
// check for valid inputs
if (!nodes || nodes.length === 0 || !Array.isArray(nodes)) {
throw new Error('nodes must be an array of Node or nodeId');
}
// support passing either the javascript object or an array of ids
var list = nodes.map(function (item) {
return (typeof item === 'object') ? item.id : item;
});
self._request({
path: urlJoin(_urlPrefix, loadBalancerId, 'nodes', '?id=' + list.join('&id=')),
method: 'DELETE'
}, function (err) {
callback(err);
});
},
/**
* client.getNodeServiceEvents
*
* @description retrieve a list of events associated with the activity
* between the node and the load balancer
*
* @param {Object} loadBalancer the loadBalancer or loadBalancerId
* @param {function} callback
*/
getNodeServiceEvents: function (loadBalancer, callback) {
var self = this,
loadBalancerId =
loadBalancer instanceof lb.LoadBalancer ? loadBalancer.id : loadBalancer;
self._request({
path: urlJoin(_urlPrefix, loadBalancerId, 'nodes', 'events')
}, function (err, body) {
return err
? callback(err)
: callback(err, body.nodeServiceEvents);
});
}
};