From e01babc05eaea15f19cdbe4f9baa0738f1f86915 Mon Sep 17 00:00:00 2001 From: Trent Mick Date: Tue, 25 Aug 2015 16:12:35 -0700 Subject: [PATCH] a quick 'triton package ID'; make 'cloudapi' command hidden from help output --- etc/badger | 21 +++++++++++++++ lib/cli.js | 8 ++++-- lib/cloudapi2.js | 46 +++++++++++++++++++++++---------- lib/do_badger.js | 29 +++++++++++++++++++++ lib/do_cloudapi.js | 2 ++ lib/do_image.js | 3 +-- lib/do_package.js | 64 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 8 files changed, 156 insertions(+), 19 deletions(-) create mode 100644 etc/badger create mode 100644 lib/do_badger.js create mode 100644 lib/do_package.js diff --git a/etc/badger b/etc/badger new file mode 100644 index 0000000..31bd741 --- /dev/null +++ b/etc/badger @@ -0,0 +1,21 @@ + +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        +                                                        + diff --git a/lib/cli.js b/lib/cli.js index 00617b9..e801445 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -65,7 +65,9 @@ function CLI() { { group: 'Images' }, 'images', 'image', - { group: 'Other', unmatched: true } + { group: 'Packages' }, + 'packages', + 'package' ] }); } @@ -111,9 +113,11 @@ CLI.prototype.do_instance_audit = require('./do_instance_audit'); // Packages CLI.prototype.do_packages = require('./do_packages'); +CLI.prototype.do_package = require('./do_package'); -// Row Cloud API +// Hidden commands CLI.prototype.do_cloudapi = require('./do_cloudapi'); +CLI.prototype.do_badger = require('./do_badger'); diff --git a/lib/cloudapi2.js b/lib/cloudapi2.js index 69349b9..00f316d 100644 --- a/lib/cloudapi2.js +++ b/lib/cloudapi2.js @@ -303,7 +303,7 @@ CloudAPI.prototype.getImage = function getImage(options, callback) { options = {}; } assert.object(options, 'options'); - assert.uuid(options.id, 'ID'); + assert.uuid(options.id, 'options.id'); assert.func(callback, 'callback'); var endpoint = this._path(format('/%s/images/%s', this.user, options.id)); @@ -313,6 +313,37 @@ CloudAPI.prototype.getImage = function getImage(options, callback) { }; +// ---- packages + +CloudAPI.prototype.listPackages = function listPackages(options, callback) { + var self = this; + if (typeof (options) === 'function') { + callback = options; + options = {}; + } + + var endpoint = self._path(format('/%s/packages', self.user), options); + self._request(endpoint, function (err, req, res, body) { + callback(err, body, res); + }); +}; + +CloudAPI.prototype.getPackage = function getPackage(options, callback) { + if (callback === undefined) { + callback = options; + options = {}; + } + assert.object(options, 'options'); + assert.uuid(options.id, 'options.id'); + assert.func(callback, 'callback'); + + var endpoint = this._path(format('/%s/packages/%s', this.user, options.id)); + this._request(endpoint, function (err, req, res, body) { + callback(err, body, res); + }); +}; + + // ---- machines /** @@ -433,19 +464,6 @@ CloudAPI.prototype.listMachines = function listMachines(options, callback) { ); }; -CloudAPI.prototype.listPackages = function listPackages(options, callback) { - var self = this; - if (typeof (options) === 'function') { - callback = options; - options = {}; - } - - var endpoint = self._path(format('/%s/packages', self.user), options); - self._request(endpoint, function (err, req, res, body) { - callback(err, body, res); - }); -}; - /** * List machine audit (successful actions on the machine). diff --git a/lib/do_badger.js b/lib/do_badger.js new file mode 100644 index 0000000..607d309 --- /dev/null +++ b/lib/do_badger.js @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015 Joyent Inc. All rights reserved. + * + * `triton package ...` + */ + +var fs = require('fs'); +var once = require('once'); +var path = require('path'); + + +function do_badger(subcmd, opts, args, callback) { + var callbackOnce = once(callback); + var badger = path.resolve(__dirname, '../etc/badger'); + var input = fs.createReadStream(badger) + input.pipe(process.stdout); + input.on('error', function (err) { + callbackOnce(err); + }); + input.on('end', function () { + callbackOnce(); + }); +}; + +do_badger.options = []; +do_badger.help = 'Rawr!'; +do_badger.hidden = true; + +module.exports = do_badger; diff --git a/lib/do_cloudapi.js b/lib/do_cloudapi.js index 447c0bf..ef6e722 100644 --- a/lib/do_cloudapi.js +++ b/lib/do_cloudapi.js @@ -64,5 +64,7 @@ do_cloudapi.help = ( + '{{options}}' ); +do_cloudapi.hidden = true; + module.exports = do_cloudapi; diff --git a/lib/do_image.js b/lib/do_image.js index 0841646..6227a08 100644 --- a/lib/do_image.js +++ b/lib/do_image.js @@ -5,7 +5,6 @@ */ var format = require('util').format; -var tabula = require('tabula'); var errors = require('./errors'); @@ -22,7 +21,7 @@ function do_image(subcmd, opts, args, callback) { var getOpts = { id: args[0] }; - this.triton.cloudapi.getImage(getOpts, function onRes(err, img, res) { + this.triton.cloudapi.getImage(getOpts, function onRes(err, img) { if (err) { return callback(err); } diff --git a/lib/do_package.js b/lib/do_package.js new file mode 100644 index 0000000..53cd8a5 --- /dev/null +++ b/lib/do_package.js @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015 Joyent Inc. All rights reserved. + * + * `triton package ...` + */ + +var format = require('util').format; + +var errors = require('./errors'); + + +function do_package(subcmd, opts, args, callback) { + if (opts.help) { + this.do_help('help', {}, [subcmd], callback); + return; + } else if (args.length !== 1) { + return callback(new errors.UsageError(format( + 'incorrect number of args (%d): %s', args.length, args.join(' ')))); + } + + var getOpts = { + id: args[0] + }; + this.triton.cloudapi.getPackage(getOpts, function onRes(err, pkg) { + if (err) { + return callback(err); + } + + if (opts.json) { + console.log(JSON.stringify(pkg)); + } else { + console.log(JSON.stringify(pkg, null, 4)); + } + callback(); + }); +}; + +do_package.options = [ + { + names: ['help', 'h'], + type: 'bool', + help: 'Show this help.' + }, + { + names: ['json', 'j'], + type: 'bool', + help: 'JSON stream output.' + } +]; +do_package.help = ( + /* BEGIN JSSTYLED */ + 'Get a package.\n' + + '\n' + + 'Note: Currently this dumps prettified JSON by default. That might change\n' + + 'in the future. Use "-j" to explicitly get JSON output.\n' + + '\n' + + 'Usage:\n' + + ' {{name}} package [] ID\n' + + '\n' + + '{{options}}' + /* END JSSTYLED */ +); + +module.exports = do_package; diff --git a/package.json b/package.json index 80f9374..2c2817b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "assert-plus": "0.1.5", "backoff": "2.4.1", "bunyan": "1.4.0", - "cmdln": "3.2.1", + "cmdln": "3.2.2", "dashdash": "1.10.0", "extsprintf": "1.0.2", "mkdirp": "0.5.1",