Showing with 263 additions and 1 deletion.
  1. +2 −1 lib/jitsu.js
  2. +179 −0 lib/jitsu/commands/tokens.js
  3. +1 −0 lib/jitsu/usage.js
  4. +81 −0 test/commands/tokens-test.js
@@ -102,6 +102,7 @@ jitsu.api.Databases = require('nodejitsu-api').Databases;
jitsu.api.Logs = require('nodejitsu-api').Logs;
jitsu.api.Snapshots = require('nodejitsu-api').Snapshots;
jitsu.api.Users = require('nodejitsu-api').Users;
jitsu.api.Tokens = require('nodejitsu-api').Tokens;

//
// ### function welcome ()
@@ -241,7 +242,7 @@ jitsu.setup = function (callback) {
return callback();
}

['Users', 'Apps', 'Snapshots', 'Databases', 'Logs'].forEach(function (key) {
['Users', 'Apps', 'Snapshots', 'Databases', 'Logs', 'Tokens'].forEach(function (key) {
var k = key.toLowerCase();
jitsu[k] = new jitsu.api[key](jitsu.config);
jitsu[k].on('debug::request', debug);
@@ -0,0 +1,179 @@
/*
* tokens.js: Commands related to tokens from Nodejitsu.
*
* (C) 2010, Nodejitsu Inc.
*
*/

var jitsu = require('../../jitsu'),
fs = require('fs'),
utile = jitsu.common;

var tokens = exports;

tokens.usage = [
'`jitsu tokens *` commands enable management of tokens',
'Valid commands are:',
'',
'jitsu tokens list [<user>]',
'jitsu tokens create [[<user>] <token name>]',
'jitsu tokens destroy [<user>] <token name>',
];



tokens.destroy = function (username, tokenName, callback) {
var authuser = jitsu.config.get('username') || '';

if(arguments.length) {
var args = utile.args(arguments);
callback = args.callback;
tokenName = args[1] || args[0];
username = args[0] || authuser;
if(tokenName === args[0]){
username = authuser;
}
if(tokenName === null || tokenName === undefined){
jitsu.log.warn("You need to specify a token ID or name.")
return callback();
}
}

if (authuser === '') {
return jitsu.commands.users.login(function (err) {
if (err) {
return callback(err);
}

jitsu.commands.tokens.destroy(username, tokenName, callback);
});
}

jitsu.log.info('Deleting token '+ tokenName.yellow +' for ' + username.magenta);

jitsu.tokens.destroy(username, tokenName,function cb(err, result) {
if(err){
callback(err);
} else {
jitsu.log.info( 'Token '+ tokenName.yellow +' Destroyed!');
callback(null, tokenName);
}
});
};

//
// Usage for `jitsu tokens delete <key>`
//
tokens.destroy.usage = [
'Deletes the specified token ID',
'',
'jitsu tokens destroy [<user>] <token name>'
];


tokens.create = function (username, tokenName, callback) {
var authuser = jitsu.config.get('username') || '';

if(arguments.length) {
var args = utile.args(arguments);
callback = args.callback;
tokenName = args[1] || args[0];
username = args[0] || authuser;
if(tokenName === args[0]){
username = authuser;
}
}

if (authuser === '') {
return jitsu.commands.users.login(function (err) {
if (err) {
return callback(err);
}

jitsu.commands.tokens.create(username, tokenName, callback);
});
}

jitsu.log.info('Creating a token for ' + username.magenta);

jitsu.tokens.create(username, tokenName,function cb(err, result) {
if(err){
callback(err);
} else {
var token = Object.getOwnPropertyNames(result).filter(function(n){return n !== 'operation'}).pop();
jitsu.log.info( 'Token Created: ');
jitsu.log.data( token + ' : ' + result[token]);
callback(null, token, result[token]);
}
});
};

//
// Usage for `jitsu tokens create [[<user>] <token name>]`
//
tokens.create.usage = [
'Creates a token , optionally with a token name',
'',
'jitsu tokens create [[<user>] <token name>]'
];


tokens.list = function (username, callback) {
var authuser = jitsu.config.get('username') || '';

if(arguments.length) {
var args = utile.args(arguments);
callback = args.callback;
username = args[0] || authuser;
}

if (authuser === '') {
return jitsu.commands.users.login(function (err) {
if (err) {
return callback(err);
}

jitsu.commands.tokens.list(username, callback);
});
}

jitsu.log.info('Listing all tokens for ' + username.magenta);

jitsu.tokens.list(username, function cb(err, result) {
if(err){
callback(err);
} else {
var tokens = result.apiTokens;
if (!tokens || Object.keys(tokens).length === 0) {
jitsu.log.warn('No tokens exist.');
jitsu.log.help('Try creating one with ' + 'jitsu tokens create'.magenta);
return callback();
}

var rows = [['name', 'token']],
colors = ['underline', 'underline'];
Object.getOwnPropertyNames(tokens).sort().forEach(function (tokenName) {

rows.push([
tokenName,
tokens[tokenName]
]);
});

jitsu.inspect.putRows('data', rows, colors);
callback();
}
});

};


//
// Usage for `jitsu tokens list`
//
tokens.list.usage = [
'Lists all tokens in the user account',
'',
'jitsu tokens list [<user>]'
];

@@ -54,5 +54,6 @@ module.exports = [
' jitsu users',
' jitsu databases',
' jitsu snapshots',
' jitsu tokens',
' jitsu logout'
];
@@ -0,0 +1,81 @@
/*
* apps-test.js: Tests for `jitsu apps *` command(s).
*
* (C) 2010, Nodejitsu Inc.
*
*/

var assert = require('assert'),
fs = require('fs'),
path = require('path'),
nock = require('nock'),
vows = require('vows'),
jitsu = require('../../lib/jitsu'),
macros = require('../helpers/macros');

var shouldNodejitsuOk = macros.shouldNodejitsuOk,
useAppFixture = macros.useAppFixture;

var mainDirectory = process.cwd();

vows.describe('jitsu/commands/tokens').addBatch({
'tokens list': shouldNodejitsuOk(function setup () {
nock('http://api.mockjitsu.com')
.get('/users/tester/tokens')
.reply(200, {"apiTokens":{}}, { 'x-powered-by': 'Nodejitsu' })
})
}).addBatch({
'tokens list adam': shouldNodejitsuOk( function setup () {
nock('http://api.mockjitsu.com')
.get('/users/adam/tokens')
.reply(200, {"apiTokens":{}}, { 'x-powered-by': 'Nodejitsu' });
})
}).addBatch({
'tokens create': shouldNodejitsuOk( function setup () {
nock('http://api.mockjitsu.com')
.post('/users/tester/tokens', {})
.reply(201, {"operation":"insert"}, { 'x-powered-by': 'Nodejitsu' });
})
}).addBatch({
'tokens create test-token': shouldNodejitsuOk(function setup () {
nock('http://api.mockjitsu.com')
.put('/users/tester/tokens/test-token', {})
.reply(201, {"operation":"insert"}, { 'x-powered-by': 'Nodejitsu' });
})
}).addBatch({
'tokens list': shouldNodejitsuOk( function setup () {
nock('http://api.mockjitsu.com')
.get('/users/tester/tokens')
.reply(200, {"apiTokens":{"test-token":"bbe261ea-aa43-4f6d-a3cf-b971301d459b"}}, { 'x-powered-by': 'Nodejitsu' });
})
}).addBatch({
'tokens destroy test-token': shouldNodejitsuOk(function setup () {
nock('http://api.mockjitsu.com')
.delete('/users/tester/tokens/test-token', {})
.reply(201, {"ok":true,"id":"test-token"}, { 'x-powered-by': 'Nodejitsu' });
})
})/*.addBatch({
'tokens create adam': shouldNodejitsuOk(function setup () {
nock('http://api.mockjitsu.com')
.post('/users/adam/tokens', {})
.reply(201, {"operation":"insert"}, { 'x-powered-by': 'Nodejitsu' });
})
})*/.addBatch({
'tokens create adam test-token': shouldNodejitsuOk(function setup () {
nock('http://api.mockjitsu.com')
.put('/users/adam/tokens/test-token', {})
.reply(201, {"operation":"insert"}, { 'x-powered-by': 'Nodejitsu' });
})
}).addBatch({
'tokens list adam': shouldNodejitsuOk( function setup () {
nock('http://api.mockjitsu.com')
.get('/users/adam/tokens')
.reply(200, {"apiTokens":{"test-token":"bbe261ea-aa43-4f6d-a3cf-b971301d459b"}}, { 'x-powered-by': 'Nodejitsu' });
})
}).addBatch({
'tokens destroy adam test-token': shouldNodejitsuOk(function setup () {
nock('http://api.mockjitsu.com')
.delete('/users/adam/tokens/test-token', {})
.reply(201, {"ok":true,"id":"test-token"}, { 'x-powered-by': 'Nodejitsu' });
})
}).export(module);