@yawetse/pkgcloud
Version:
An infrastructure-as-a-service agnostic cloud library for node.js
146 lines (128 loc) • 4.2 kB
JavaScript
/*
* securityGroups.js: Instance methods for working with security groups
* for Openstack Networking
*
* (C) 2015 Rackspace
* Shaunak Kashyap
* MIT LICENSE
*/
var urlJoin = require('url-join');
var securityGroupsResourcePath = '/security-groups';
// Declaring variables for helper functions defined later
var _convertSecurityGroupToWireFormat;
/**
* client.getSecurityGroups
*
* @description get the list of security groups for an account
*
* @param {object|Function} options
* @param {Function} callback
*/
exports.getSecurityGroups = function (options, callback) {
var self = this;
if (typeof options === 'function') {
callback = options;
options = {};
}
var getSecurityGroupOpts = {
path: securityGroupsResourcePath
};
this._request(getSecurityGroupOpts, function (err, body) {
if (err) {
return callback(err);
}
else if (!body || !body.security_groups || !(body.security_groups instanceof Array)) {
return new Error('Malformed API Response');
}
return callback(err, body.security_groups.map(function (securityGroup) {
return new self.models.SecurityGroup(self, securityGroup);
}));
});
};
/**
* client.getSecurityGroup
*
* @description get the details for a specific securityGroup
*
* @param {String|object} securityGroup the securityGroup or securityGroupId
* @param callback
*/
exports.getSecurityGroup = function (securityGroup, callback) {
var self = this,
securityGroupId = securityGroup instanceof this.models.SecurityGroup ? securityGroup.id : securityGroup;
self.emit('log::trace', 'Getting details for security group', securityGroupId);
this._request({
path: urlJoin(securityGroupsResourcePath, securityGroupId),
method: 'GET'
}, function (err, body) {
if (err) {
return callback(err);
}
if (!body ||!body.security_group) {
return new Error('Malformed API Response');
}
callback(err, new self.models.SecurityGroup(self, body.security_group));
});
};
/**
* client.createSecurityGroup
*
* @description create a new security group
*
* @param object securityGroup
* @param string securityGroup.name Name of security group.
* @param {string} securityGroup.description Description of security group.
* @param {string} securityGroup.tenantId The ID of the tenant who owns the security group. Only administrative users can specify a tenant ID other than their own.
* @param callback
*/
exports.createSecurityGroup = function (securityGroup, callback) {
var self = this;
securityGroup = _convertSecurityGroupToWireFormat(securityGroup);
var createSecurityGroupOpts = {
method: 'POST',
path: securityGroupsResourcePath,
body: { 'security_group': securityGroup }
};
self.emit('log::trace', 'Creating security group', securityGroup);
this._request(createSecurityGroupOpts, function (err,body) {
return err
? callback(err)
: callback(err, new self.models.SecurityGroup(self, body.securityGroup));
});
};
/**
* client.destroySecurityGroup
*
* @description Delete a specific securityGroup
*
* @param {String|object} securityGroup the securityGroup or securityGroup ID
* @param callback
*/
exports.destroySecurityGroup = function (securityGroup, callback) {
var self = this,
securityGroupId = securityGroup instanceof this.models.SecurityGroup ? securityGroup.id : securityGroup;
self.emit('log::trace', 'Deleting security group', securityGroupId);
this._request({
path: urlJoin(securityGroupsResourcePath,securityGroupId),
method: 'DELETE'
}, function (err) {
if (err) {
return callback(err);
}
callback(err, securityGroupId);
});
};
/**
* _convertSecurityGroupToWireFormat
*
* @description convert SecurityGroup instance into its wire representation.
*
* @param {object} details the SecurityGroup instance.
*/
_convertSecurityGroupToWireFormat = function (details){
var wireFormat = {};
wireFormat.name = details.name;
wireFormat.description = details.description;
wireFormat.tenant_id = details.tenant_id || details.tenantId;
return wireFormat;
};