UNPKG

@yawetse/pkgcloud

Version:

An infrastructure-as-a-service agnostic cloud library for node.js

177 lines (156 loc) 4.33 kB
/* * ports.js: Instance methods for working with ports * for Openstack porting * * (C) 2014 Hewlett-Packard Development Company, L.P. * */ var urlJoin = require('url-join'); var portsResourcePath = '/ports'; // Declaring variables for helper functions defined later var _convertPortToWireFormat; /** * client.getPorts * * @description get the list of ports for an account * * @param {object|Function} options * @param {Function} callback */ exports.getPorts = function (options, callback) { var self = this; if (typeof options === 'function') { callback = options; options = {}; } var getPortOpts = { path: portsResourcePath }; this._request(getPortOpts, function (err, body) { if (err) { return callback(err); } else if (!body || !body.ports || !(body.ports instanceof Array)) { return new Error('Malformed API Response'); } return callback(err, body.ports.map(function (port) { return new self.models.Port(self, port); })); }); }; /** * client.getPort * * @description get the details for a specific port * * @param {String|object} port the port or portId * @param callback */ exports.getPort = function (port, callback) { var self = this, portId = port instanceof this.models.Port ? port.id : port; self.emit('log::trace', 'Getting details for port', portId); this._request({ path: urlJoin(portsResourcePath, portId), method: 'GET' }, function (err, body) { if (err) { return callback(err); } if (!body ||!body.port) { return new Error('Malformed API Response'); } callback(err, new self.models.Port(self, body.port)); }); }; /** * client.createPort * * @description create a new port * * @param {object} options * @param {String} options.name the name of the new port * @param callback */ exports.createPort = function (options, callback) { var self = this, port = typeof options === 'object' ? options : { 'name' : options}; port = _convertPortToWireFormat(port); var createPortOpts = { method: 'POST', path: portsResourcePath, body: { 'port' : port} }; self.emit('log::trace', 'Creating port', port); this._request(createPortOpts, function (err,body) { return err ? callback(err) : callback(err, new self.models.Port(self, body.port)); }); }; /** * client.updatePort * * @description update an existing port * * @param {object} options * @param callback */ exports.updatePort = function (port, callback) { var self = this, portId = port.id; port = _convertPortToWireFormat(port); var updatePortOpts = { method: 'PUT', path: urlJoin(portsResourcePath, portId), contentType: 'application/json', body: { 'port' : port} }; self.emit('log::trace', 'Updating port', port); this._request(updatePortOpts, function (err,body) { return err ? callback(err) : callback(err, new self.models.Port(self, body.port)); }); }; /** * client.destroyPort * * @description Delete a specific port * * @param {String|object} port the port or port ID * @param callback */ exports.destroyPort = function (port, callback) { var self = this, portId = port instanceof this.models.Port ? port.id : port; self.emit('log::trace', 'Deleting port', portId); this._request({ path: urlJoin(portsResourcePath,portId), method: 'DELETE' }, function (err) { if (err) { return callback(err); } callback(err, portId); }); }; /** * _convertPortToWireFormat * * @description convert Port instance into its wire representation. * * @param {object} details the Port instance. */ _convertPortToWireFormat = function (details){ var wireFormat = {}; wireFormat.status = details.status; wireFormat.name = details.name; wireFormat.admin_state_up = details.admin_state_up || details.adminStateUp; wireFormat.tenant_id = details.tenant_id || details.tenantId; wireFormat.mac_address = details.mac_address || details.macAddress; wireFormat.fixed_ips = details.fixed_ips || details.fixedIps; wireFormat.security_groups = details.security_groups || details.securityGroups; wireFormat.network_id = details.network_id || details.networkId; return wireFormat; };