From adb4c851b96aa4f2a4aedda4c41346e53bf52bcd Mon Sep 17 00:00:00 2001 From: Trent Mick Date: Thu, 31 Dec 2015 09:55:31 -0800 Subject: [PATCH] joyent/node-triton#68 Support specifying networks at instance create time --- CHANGES.md | 6 +++-- lib/cli.js | 27 ++++++++++++++++++++++ lib/do_create_instance.js | 36 +++++++++++++++++++----------- package.json | 5 ++--- test/unit/metadataFromOpts.test.js | 4 ++-- test/unit/tagsFromOpts.test.js | 4 ++-- 6 files changed, 60 insertions(+), 22 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index bc538a2..19d441f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,8 +1,10 @@ # node-triton changelog -## 3.5.1 (not yet released) +## 3.6.0 (not yet released) -(nothing yet) +- #67 Add `triton create --network,-N NETWORK ...` option for specifying + networks for instance creation. "NETWORK" is a network id, name, or + short id; or a comma-separated array of networks. ## 3.5.0 diff --git a/lib/cli.js b/lib/cli.js index fc9d6c7..e4d5dba 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -152,6 +152,33 @@ var OPTIONS = [ ]; + +// ---- other support stuff + +function parseCommaSepStringNoEmpties(option, optstr, arg) { + // JSSTYLED + return arg.trim().split(/\s*,\s*/g) + .filter(function (part) { return part; }); +} + +cmdln.dashdash.addOptionType({ + name: 'commaSepString', + takesArg: true, + helpArg: 'STRING', + parseArg: parseCommaSepStringNoEmpties +}); + +cmdln.dashdash.addOptionType({ + name: 'arrayOfCommaSepString', + takesArg: true, + helpArg: 'STRING', + parseArg: parseCommaSepStringNoEmpties, + array: true, + arrayFlatten: true +}); + + + //---- CLI class function CLI() { diff --git a/lib/do_create_instance.js b/lib/do_create_instance.js index 431c653..d778b9c 100644 --- a/lib/do_create_instance.js +++ b/lib/do_create_instance.js @@ -369,16 +369,24 @@ function do_create_instance(subcmd, opts, args, cb) { }); }, function getNets(ctx, next) { - if (!opts.networks) { + if (!opts.network) { return next(); } - self.tritonapi.getNetworks(opts.networks, function (err, nets) { - if (err) { - return next(err); + // TODO: want an error or warning on no networks? + ctx.nets = []; + vasync.forEachPipeline({ + inputs: opts.network, + func: function getOneNetwork(name, nextNet) { + self.tritonapi.getNetwork(name, function (err, net) { + if (err) { + nextNet(err); + } else { + ctx.nets.push(net); + nextNet(); + } + }); } - ctx.nets = nets; - next(); - }); + }, next); }, function createInst(ctx, next) { var createOpts = { @@ -548,12 +556,14 @@ do_create_instance.options = [ '(if first char is "{"), or a "@FILE" to have tags be ' + 'loaded from FILE. This option can be used multiple times.' }, - // XXX arrayOfCommaSepString dashdash type - //{ - // names: ['networks', 'nets'], - // type: 'arrayOfCommaSepString', - // help: 'One or more (comma-separated) networks IDs.' - //}, + { + names: ['network', 'N'], + type: 'arrayOfCommaSepString', + helpArg: 'NETWORK', + help: 'One or more comma-separated networks (ID, name or short id). ' + + 'This option can be used multiple times.' + }, + // XXX locality: near, far { diff --git a/package.json b/package.json index 51289e2..a6c92fa 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,14 @@ { "name": "triton", "description": "Joyent Triton CLI and client (https://www.joyent.com/triton)", - "version": "3.5.1", + "version": "3.6.0", "author": "Joyent (joyent.com)", "dependencies": { "assert-plus": "0.2.0", "backoff": "2.4.1", "bigspinner": "3.1.0", "bunyan": "1.5.1", - "cmdln": "3.3.0", - "dashdash": "1.10.0", + "cmdln": "3.4.2", "extsprintf": "1.0.2", "lomstream": "1.1.0", "mkdirp": "0.5.1", diff --git a/test/unit/metadataFromOpts.test.js b/test/unit/metadataFromOpts.test.js index b49c91e..67939de 100644 --- a/test/unit/metadataFromOpts.test.js +++ b/test/unit/metadataFromOpts.test.js @@ -13,7 +13,7 @@ */ var assert = require('assert-plus'); -var dashdash = require('dashdash'); +var cmdln = require('cmdln'); var format = require('util').format; var test = require('tape'); @@ -180,7 +180,7 @@ test('metadataFromOpts', function (tt) { tt.test(testName, function (t) { debug('--', num); debug('c: %j', c); - var parser = new dashdash.Parser({options: OPTIONS}); + var parser = new cmdln.dashdash.Parser({options: OPTIONS}); var opts = parser.parse({argv: c.argv}); debug('opts: %j', opts); diff --git a/test/unit/tagsFromOpts.test.js b/test/unit/tagsFromOpts.test.js index 9de3011..733543f 100644 --- a/test/unit/tagsFromOpts.test.js +++ b/test/unit/tagsFromOpts.test.js @@ -13,7 +13,7 @@ */ var assert = require('assert-plus'); -var dashdash = require('dashdash'); +var cmdln = require('cmdln'); var format = require('util').format; var test = require('tape'); @@ -146,7 +146,7 @@ test('tagsFromOpts', function (tt) { tt.test(testName, function (t) { debug('--', num); debug('c: %j', c); - var parser = new dashdash.Parser({options: OPTIONS}); + var parser = new cmdln.dashdash.Parser({options: OPTIONS}); var opts = parser.parse({argv: c.argv}); debug('opts: %j', opts);