From 225410b4fce68804367091a8dc0e4fd82c1645b1 Mon Sep 17 00:00:00 2001 From: Dave Eddy Date: Fri, 22 Dec 2017 18:38:33 -0500 Subject: [PATCH] TRITON-24 node-triton ListNetworkIPs has unordered results Reviewed by: Trent Mick Approved by: Trent Mick --- CHANGES.md | 2 ++ lib/common.js | 28 +++++++++++++++++++++++++++- lib/do_network/do_ip/do_list.js | 25 ++++++++++++++++++++++++- package.json | 2 +- 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 79bd160..03ec7dc 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,8 @@ Known issues: - [TRITON-30] Add UpdateNetworkIP to node-triton, e.g. `triton network ip update` +- [TRITON-24] node-triton ListNetworkIPs has unordered results, e.g. + `triton network ip list NETWORK` ## 5.5.0 diff --git a/lib/common.js b/lib/common.js index 9db8f30..1dfb7b0 100644 --- a/lib/common.js +++ b/lib/common.js @@ -1387,6 +1387,31 @@ function validateObject(input, valid, opts) { } } +/* + * Convert an IPv4 address (as a string) to a number + */ +function ipv4ToLong(ip) { + var l = 0; + var spl; + + assert.string(ip, 'ip'); + spl = ip.split('.'); + assert.equal(spl.length, 4, 'ip octet length'); + + spl.forEach(function processIpOctet(octet) { + octet = parseInt(octet, 10); + + assert.number(octet, 'octet'); + assert(octet >= 0, 'octet >= 0'); + assert(octet < 256, 'octet < 256'); + + l <<= 8; + l += octet; + }); + + return l; +} + //---- exports module.exports = { @@ -1425,6 +1450,7 @@ module.exports = { jsonPredFromKv: jsonPredFromKv, monotonicTimeDiffMs: monotonicTimeDiffMs, readStdin: readStdin, - validateObject: validateObject + validateObject: validateObject, + ipv4ToLong: ipv4ToLong }; // vim: set softtabstop=4 shiftwidth=4: diff --git a/lib/do_network/do_ip/do_list.js b/lib/do_network/do_ip/do_list.js index 854045d..b241958 100644 --- a/lib/do_network/do_ip/do_list.js +++ b/lib/do_network/do_ip/do_list.js @@ -12,6 +12,7 @@ var format = require('util').format; +var assert = require('assert-plus'); var tabula = require('tabula'); var vasync = require('vasync'); @@ -41,7 +42,29 @@ function do_list(subcmd, opts, args, callback) { } columns = columns.split(','); - var sort = opts.s.split(','); + var sort = opts.s.split(',').map(function mapSort(field) { + var so = {}; + + field = field.trim(); + assert.ok(field, 'non-empty field'); + + if (field[0] === '-') { + so.field = field.slice(1); + so.reverse = true; + } else { + so.field = field; + } + + switch (so.field) { + case 'ip': + so.keyFunc = common.ipv4ToLong; + break; + default: + break; + } + + return so; + }); vasync.pipeline({arg: {cli: this.top}, funcs: [ common.cliSetupTritonApi, diff --git a/package.json b/package.json index 43a7a58..1096f50 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "sshpk": "1.10.2", "sshpk-agent": "1.4.2", "strsplit": "1.0.0", - "tabula": "1.9.0", + "tabula": "1.10.0", "vasync": "1.6.3", "verror": "1.10.0", "which": "1.2.4",