UNPKG

@yawetse/pkgcloud

Version:

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

145 lines (133 loc) 4.11 kB
/* * client.js: Database client for RedisToGo Cloud Databases * * (C) 2011 Charlie Robbins, Ken Perkins, Ross Kukulinski & the Contributors. * */ var util = require('util'), request = require('request'), pkgcloud = require('../../../../pkgcloud'), errs = require('errs'); var Client = exports.Client = function (options) { this.username = options.username; this.password = options.password; this._url = options.url || 'https://redistogo.com'; }; Client.prototype._getUrl = function () { return this._url; }; // // Wrapper for all http requests with RedisToGo // Client.prototype._request = function (options, callback) { var self = this; options.headers['User-Agent'] = util.format('nodejs-pkgcloud/%s', pkgcloud.version); request(options, function (err, response, body) { if (err) { return callback(err); } if (response.statusCode == 401 || response.statusCode == 403) { return callback('Unauthorized'); } if (options.method !== 'DELETE') { var database; if (typeof body !== 'object') { try { database = JSON.parse(body); } catch (e) { return callback('Bad response from server.', body); } } else { database = body; } database = self.formatResponse(database); return callback(null, database); } else { return callback(null, 'deleted'); } }); }; // Create a new database at redistogo // Need a correct plan // ### @attrs {Object} Map of options // ##### @attrs['plan'] Plan for the database.(required) Client.prototype.create = function (attrs, callback) { // Check for options. if (!attrs || typeof attrs === 'function') { return errs.handle(errs.create({ message: 'Options required for create a database.' }), Array.prototype.slice.call(arguments).pop()); } // Check for plan. if (!attrs['plan']) { attrs['plan'] = 'nano'; } // // TODO: Add validation for options.plan types // var options = { uri : this._getUrl() + '/instances.json', method : 'POST', body : 'instance%5Bplan%5D=' + attrs.plan, headers: { 'Authorization': 'Basic ' + new Buffer(this.username + ':' + this.password).toString('base64') } }; this._request(options, callback); }; // Get information about specific database // Need the database ID // ### @id {String} ID of the database.(required) Client.prototype.get = function (id, callback) { // Check for id if (!id || typeof id === 'function') { return errs.handle(errs.create({ message: 'ID is a required argument' }), Array.prototype.slice.call(arguments).pop()); } var options, path = '/instances'; if (id !== null) { path = path + '/' + id; } options = { uri : this._getUrl() + path + '.json', method : 'GET', headers: { 'Authorization': 'Basic ' + new Buffer(this.username + ':' + this.password).toString('base64') } }; this._request(options, callback); }; // Removes one Redis instance by id // Need the database ID // ### @id {String} ID of the database.(required) Client.prototype.remove = function (id, callback) { // Check for id if (!id || typeof id === 'function') { return errs.handle(errs.create({ message: 'ID is a required argument' }), Array.prototype.slice.call(arguments).pop()); } var options, path = '/instances/' + id; options = { uri : this._getUrl() + path + '.json', method : 'DELETE', headers: { 'Authorization': 'Basic ' + new Buffer(this.username + ':' + this.password).toString('base64'), 'Content-Length': 0 } }; this._request(options, callback); }; Client.prototype.formatResponse = function (response) { var database = { id: response.id, port: response.port, host: response.label.split('-')[0] + '.redistogo.com', uri: 'redis://nodejitsu:' + response.password + '@' + response.label.split('-')[0] + '.redistogo.com:' + response.port, username: 'nodejitsu', password: response.password, metadata: response }; return database; };