From 52192694b210434f6f2be11b654cae302f9efbcf Mon Sep 17 00:00:00 2001 From: Dino Chiesa Date: Fri, 15 Dec 2023 14:58:00 -0800 Subject: [PATCH] fix: correct case on commands for case-sensitive filesystems (#235) This corrects the renaming of command modules for case-sensitive filesystems. --- .npmignore | 5 + lib/commands/addEntryToKVM.js | 1 + lib/commands/assignUserRole.js | 42 +- lib/commands/attachFlowHook.js | 1 + lib/commands/clearCache.js | 2 + lib/commands/commands.js | 214 +++--- lib/commands/{createapp.js => createApp.js} | 0 ...{createdeveloper.js => createDeveloper.js} | 0 lib/commands/createKVM.js | 61 -- lib/commands/createKVMmap.js | 76 +++ .../{createproduct.js => createProduct.js} | 0 lib/commands/createRole.js | 37 +- lib/commands/createTargetServer.js | 1 + lib/commands/delete.js | 123 ++-- lib/commands/{deleteapp.js => deleteApp.js} | 0 lib/commands/deleteCache.js | 2 +- ...{deletedeveloper.js => deleteDeveloper.js} | 0 lib/commands/deleteKVM.js | 49 -- lib/commands/deleteKVMentry.js | 73 +- lib/commands/deleteKVMmap.js | 67 ++ lib/commands/deleteProduct.js | 80 +++ lib/commands/deleteRole.js | 35 +- lib/commands/deleteSharedflow.js | 118 ++++ lib/commands/deleteTargetServer.js | 37 +- lib/commands/deleteproduct.js | 70 -- lib/commands/deletesharedflow.js | 110 --- lib/commands/deployExistingRevision.js | 2 +- lib/commands/deployHostedTarget.js | 407 ++++++----- lib/commands/deployNodeApp.js | 547 +++++++++------ .../{deployproxy.js => deployProxy.js} | 2 +- lib/commands/deploySharedflow.js | 632 ++++++++++++++++++ lib/commands/deploysharedflow.js | 508 -------------- lib/commands/detachFlowHook.js | 40 +- lib/commands/{fetchproxy.js => fetchProxy.js} | 11 +- lib/commands/fetchSharedflow.js | 106 +++ lib/commands/fetchsharedflow.js | 85 --- lib/commands/getCache.js | 2 + lib/commands/getFlowHook.js | 37 +- lib/commands/getKVMentry.js | 68 +- lib/commands/getKVMmap.js | 64 ++ lib/commands/getRole.js | 35 +- lib/commands/getRolePermissions.js | 35 +- lib/commands/getTargetServer.js | 2 + lib/commands/getkvmmap.js | 47 -- lib/commands/listCaches.js | 34 +- lib/commands/listDeployments.js | 73 +- lib/commands/listProxies.js | 27 +- lib/commands/listRoleUsers.js | 34 +- lib/commands/listRoles.js | 29 +- ...yments.js => listSharedflowDeployments.js} | 78 ++- lib/commands/listSharedflows.js | 34 +- lib/commands/listTargetServers.js | 33 +- ...arsedeployments.js => parseDeployments.js} | 0 lib/commands/removeUserRole.js | 38 +- lib/commands/setRolePermissions.js | 1 + lib/commands/undeploy.js | 187 +++--- ...loysharedflow.js => undeploySharedflow.js} | 169 +++-- lib/commands/updateKVMentry.js | 65 +- lib/commands/updateTargetServer.js | 138 ++-- lib/commands/verifyUserRole.js | 38 +- package-lock.json | 4 +- package.json | 2 +- test/testcli.js | 162 +++-- 63 files changed, 2822 insertions(+), 2158 deletions(-) rename lib/commands/{createapp.js => createApp.js} (100%) rename lib/commands/{createdeveloper.js => createDeveloper.js} (100%) delete mode 100644 lib/commands/createKVM.js create mode 100644 lib/commands/createKVMmap.js rename lib/commands/{createproduct.js => createProduct.js} (100%) rename lib/commands/{deleteapp.js => deleteApp.js} (100%) rename lib/commands/{deletedeveloper.js => deleteDeveloper.js} (100%) delete mode 100644 lib/commands/deleteKVM.js create mode 100644 lib/commands/deleteKVMmap.js create mode 100644 lib/commands/deleteProduct.js create mode 100644 lib/commands/deleteSharedflow.js delete mode 100644 lib/commands/deleteproduct.js delete mode 100644 lib/commands/deletesharedflow.js rename lib/commands/{deployproxy.js => deployProxy.js} (99%) create mode 100644 lib/commands/deploySharedflow.js delete mode 100644 lib/commands/deploysharedflow.js rename lib/commands/{fetchproxy.js => fetchProxy.js} (89%) create mode 100644 lib/commands/fetchSharedflow.js delete mode 100644 lib/commands/fetchsharedflow.js create mode 100644 lib/commands/getKVMmap.js delete mode 100644 lib/commands/getkvmmap.js rename lib/commands/{listsharedflowdeployments.js => listSharedflowDeployments.js} (57%) rename lib/commands/{parsedeployments.js => parseDeployments.js} (100%) rename lib/commands/{undeploysharedflow.js => undeploySharedflow.js} (53%) diff --git a/.npmignore b/.npmignore index b540c45..6cc5dd1 100644 --- a/.npmignore +++ b/.npmignore @@ -5,3 +5,8 @@ test.zip testdir.zip .idea *.iml +notes--DO-NOT-COMMIT.txt + +**/*.*~ +**/#*.*# +**/node_modules/* diff --git a/lib/commands/addEntryToKVM.js b/lib/commands/addEntryToKVM.js index 5af9733..504b3c5 100644 --- a/lib/commands/addEntryToKVM.js +++ b/lib/commands/addEntryToKVM.js @@ -38,6 +38,7 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { console.log('addEntryToKVM: %j', opts); } diff --git a/lib/commands/assignUserRole.js b/lib/commands/assignUserRole.js index d639c91..53ea738 100644 --- a/lib/commands/assignUserRole.js +++ b/lib/commands/assignUserRole.js @@ -1,19 +1,19 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true }, email: { - name: 'Developer email', + name: "Developer email", required: true, prompt: true } @@ -21,19 +21,25 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('assignUserRole: %j', opts); + console.log("assignUserRole: %j", opts); } - let body = util.format('id=%s', encodeURIComponent(opts.email)); - let uri = util.format('%s/v1/o/%s/userroles/%s/users', opts.baseuri, opts.organization, opts.roleName); + let body = util.format("id=%s", encodeURIComponent(opts.email)); + let uri = util.format( + "%s/v1/o/%s/userroles/%s/users", + opts.baseuri, + opts.organization, + opts.roleName + ); let requestOptions = { - uri, - method:'POST', - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - body, - json:true - }; - command_utils.run('assignUserRole', opts,requestOptions, cb); + uri, + method: "POST", + headers: { "Content-Type": "application/x-www-form-urlencoded" }, + body, + json: true + }; + command_utils.run("assignUserRole", opts, requestOptions, cb); }; diff --git a/lib/commands/attachFlowHook.js b/lib/commands/attachFlowHook.js index 727535b..ec0e8f9 100644 --- a/lib/commands/attachFlowHook.js +++ b/lib/commands/attachFlowHook.js @@ -28,6 +28,7 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { console.log('attachFlowHook: %j', opts); } diff --git a/lib/commands/clearCache.js b/lib/commands/clearCache.js index c5d94b7..8eb6ac7 100644 --- a/lib/commands/clearCache.js +++ b/lib/commands/clearCache.js @@ -1,5 +1,6 @@ const util = require('util'), defaults = require('../defaults'), + options = require('../options'), command_utils = require('./command-utils'); var descriptor = defaults.defaultDescriptor({ @@ -19,6 +20,7 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { console.log('clearCache: %j', opts); } diff --git a/lib/commands/commands.js b/lib/commands/commands.js index 2d5989f..f2c348c 100644 --- a/lib/commands/commands.js +++ b/lib/commands/commands.js @@ -1,239 +1,241 @@ -const Table = require('cli-table'); -const options = require('../options'); +const Table = require("cli-table"); +const options = require("../options"); const Commands = { attachFlowHook: { - description: 'Attach a Shared Flow to a Flow Hook', - load: () => require('./attachFlowHook') + description: "Attach a Shared Flow to a Flow Hook", + load: () => require("./attachFlowHook") }, detachFlowHook: { - description: 'Detach a Shared Flow from a Flow Hook', - load: () => require('./detachFlowHook') + description: "Detach a Shared Flow from a Flow Hook", + load: () => require("./detachFlowHook") }, getFlowHook: { - description: 'Get the Shared Flow attached to a Flow Hook', - load: () => require('./getFlowHook') + description: "Get the Shared Flow attached to a Flow Hook", + load: () => require("./getFlowHook") }, createTargetServer: { - description: 'Create a Target Server', - load: () => require('./createTargetServer') + description: "Create a Target Server", + load: () => require("./createTargetServer") }, deleteTargetServer: { - description: 'Delete a Target Server', - load: () => require('./deleteTargetServer') + description: "Delete a Target Server", + load: () => require("./deleteTargetServer") }, getTargetServer: { - description: 'Get a Target Server', - load: () => require('./getTargetServer') + description: "Get a Target Server", + load: () => require("./getTargetServer") }, listTargetServers: { - description: 'List Target Servers', - load: () => require('./listTargetServers') + description: "List Target Servers", + load: () => require("./listTargetServers") }, updateTargetServer: { - description: 'Update a Target Server', - load: () => require('./updateTargetServer') + description: "Update a Target Server", + load: () => require("./updateTargetServer") }, listProxies: { - description: 'List Proxies', - load: () => require('./listProxies') + description: "List Proxies", + load: () => require("./listProxies") }, listSharedflows: { - description: 'List Shared Flows', - load: () => require('./listSharedflows') + description: "List Shared Flows", + load: () => require("./listSharedflows") }, - createkvmmap: { - description: 'Create a KVM map', - load: () => require('./createKVM') + createKVMmap: { + description: "Create a KVM map", + load: () => require("./createKVMmap") }, addEntryToKVM: { - description: 'Add an entry to a KVM map', - load: () => require('./addEntryToKVM') + description: "Add an entry to a KVM map", + load: () => require("./addEntryToKVM") }, getKVMentry: { - description: 'Get an unencrypted KVM entry', - load: () => require('./getKVMentry') + description: "Get an unencrypted KVM entry", + load: () => require("./getKVMentry") }, updateKVMEntry: { description: "Updates an entry in a KVM map", - load: () => require('./updateKVMentry') + load: () => require("./updateKVMentry") }, - getkvmmap: { - description: 'Get a KVM map', - load: () => require('./getKVMmap') + getKVMmap: { + description: "Get a KVM map", + load: () => require("./getKVMmap") }, deleteKVMentry: { - description: 'Delete a single KVM entry', - load: () => require('./deleteKVMentry') + description: "Delete a single KVM entry", + load: () => require("./deleteKVMentry") }, - deletekvmmap: { - description: 'Delete an entire KVM map', - load: () => require('./deleteKVM') + deleteKVMmap: { + description: "Delete an entire KVM map", + load: () => require("./deleteKVMmap") }, - deployproxy: { - description: 'Deploy API Proxy', - load: () => require('./deployProxy') + deployProxy: { + description: "Deploy API Proxy", + load: () => require("./deployProxy") }, - deploynodeapp: { - description: 'Deploy Node.js Application', - load: () => require('./deployNodeApp') + deployNodeApp: { + description: "Deploy Node.js Application", + load: () => require("./deployNodeApp") }, - deployhostedtarget: { - description: 'Deploy application as a Hosted Target proxy', - load: () => require('./deployHostedTarget') + deployHostedTarget: { + description: "Deploy application as a Hosted Target proxy", + load: () => require("./deployHostedTarget") }, - listdeployments: { - description: 'List Deployments', - load: () => require('./listDeployments') + listDeployments: { + description: "List Deployments", + load: () => require("./listDeployments") }, undeploy: { - description: 'Undeploy Proxy or Node.js Application', - load: () => require('./undeploy') + description: "Undeploy Proxy or Node.js Application", + load: () => require("./undeploy") }, - fetchproxy: { - description: 'Download Proxy bundle', - load: () => require('./fetchProxy') + fetchProxy: { + description: "Download Proxy bundle", + load: () => require("./fetchProxy") }, getlogs: { - description: 'Get Application logs', - load: () => require('./getlogs') + description: "Get Application logs", + load: () => require("./getlogs") }, delete: { - description: 'Delete undeployed Proxy or Node.js Application', - load: () => require('./delete') + description: "Delete undeployed Proxy or Node.js Application", + load: () => require("./delete") }, createCache: { - description: 'Create a new Cache Resource in the environment', - load: () => require('./createCache') + description: "Create a new Cache Resource in the environment", + load: () => require("./createCache") }, getCache: { - description: 'Get a KVM map', - load: () => require('./getCache') + description: "Get a KVM map", + load: () => require("./getCache") }, deleteCache: { - description: 'Deletes a Cache Resource in the environment', - load: () => require('./deleteCache') + description: "Deletes a Cache Resource in the environment", + load: () => require("./deleteCache") }, listCaches: { - description: 'Lists Cache Resources in the environment', - load: () => require('./listCaches') + description: "Lists Cache Resources in the environment", + load: () => require("./listCaches") }, clearCache: { - description: 'Clears the entries in a named Cache Resource in the environment', - load: () => require('./clearCache') + description: + "Clears the entries in a named Cache Resource in the environment", + load: () => require("./clearCache") }, createProduct: { - description: 'Create a new API Product', - load: () => require('./createProduct') + description: "Create a new API Product", + load: () => require("./createProduct") }, deleteProduct: { - description: 'Delete a API Product', - load: () => require('./deleteProduct') + description: "Delete a API Product", + load: () => require("./deleteProduct") }, createDeveloper: { - description: 'Create a new Developer', - load: () => require('./createDeveloper') + description: "Create a new Developer", + load: () => require("./createDeveloper") }, deleteDeveloper: { - description: 'Delete a Developer', - load: () => require('./deleteDeveloper') + description: "Delete a Developer", + load: () => require("./deleteDeveloper") }, createApp: { - description: 'Create a new App', - load: () => require('./createApp') + description: "Create a new App", + load: () => require("./createApp") }, createAppKey: { - description: 'Create a new App', - load: () => require('./createAppKey') + description: "Create a new App", + load: () => require("./createAppKey") }, deleteApp: { - description: 'Delete a App', - load: () => require('./deleteApp') + description: "Delete a App", + load: () => require("./deleteApp") }, deploySharedflow: { - description: 'Deploy SharedFlow', - load: () => require('./deploySharedflow') + description: "Deploy SharedFlow", + load: () => require("./deploySharedflow") }, undeploySharedflow: { description: "Undeploy SharedFlow", - load: () => require('./undeploySharedflow') + load: () => require("./undeploySharedflow") }, fetchSharedflow: { description: "Download SharedFlow bundle", - load: () => require('./fetchSharedflow') + load: () => require("./fetchSharedflow") }, listSharedflowDeployments: { description: "List SharedFlow deployments", - load: () => require('./listSharedflowDeployments') + load: () => require("./listSharedflowDeployments") }, deleteSharedflow: { description: "Delete undeployed SharedFlow", - load: () => require('./deleteSharedflow') + load: () => require("./deleteSharedflow") }, deployExistingRevision: { description: "Deploy an existing revision to an environment", - load: () => require('./deployExistingRevision') + load: () => require("./deployExistingRevision") }, listRoles: { description: "List roles in an organziation", - load: () => require('./listRoles') + load: () => require("./listRoles") }, createRole: { description: "Create a userrole in an organziation", - load: () => require('./createRole') + load: () => require("./createRole") }, getRole: { description: "Get a userrole in an organziation", - load: () => require('./getRole') + load: () => require("./getRole") }, deleteRole: { description: "Delete a userrole in an organziation", - load: () => require('./deleteRole') + load: () => require("./deleteRole") }, getRolePermissions: { description: "Get resource permissions for a role", - load: () => require('./getRolePermissions') + load: () => require("./getRolePermissions") }, setRolePermissions: { description: "Set resource permissions for a role", - load: () => require('./setRolePermissions') + load: () => require("./setRolePermissions") }, assignUserRole: { description: "Assign user to a role", - load: () => require('./assignUserRole') + load: () => require("./assignUserRole") }, removeUserRole: { description: "Remove user from a role", - load: () => require('./removeUserRole') + load: () => require("./removeUserRole") }, verifyUserRole: { description: "Verify a user is in a role", - load: () => require('./verifyUserRole') + load: () => require("./verifyUserRole") }, listRoleUsers: { description: "List users in role", - load: () => require('./listRoleUsers') + load: () => require("./listRoleUsers") } }; -module.exports.printCommandHelp = function() { +module.exports.printCommandHelp = function () { console.error(); - console.error('Valid commands:'); + console.error("Valid commands:"); let tab = new Table(options.TableFormat); Object.keys(Commands) .sort() - .forEach(key => { + .forEach((key) => { tab.push([key, Commands[key].description]); }); console.error(tab.toString()); }; -module.exports.getCommand = function(n) { - let commandKey = Object.keys(Commands) - .find(key => key.toLowerCase() === n.toLowerCase()); +module.exports.getCommand = function (n) { + let commandKey = Object.keys(Commands).find( + (key) => key.toLowerCase() === n.toLowerCase() + ); return Commands[commandKey]; }; diff --git a/lib/commands/createapp.js b/lib/commands/createApp.js similarity index 100% rename from lib/commands/createapp.js rename to lib/commands/createApp.js diff --git a/lib/commands/createdeveloper.js b/lib/commands/createDeveloper.js similarity index 100% rename from lib/commands/createdeveloper.js rename to lib/commands/createDeveloper.js diff --git a/lib/commands/createKVM.js b/lib/commands/createKVM.js deleted file mode 100644 index f7af067..0000000 --- a/lib/commands/createKVM.js +++ /dev/null @@ -1,61 +0,0 @@ -/* jshint node: true */ -'use strict'; - -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); - -var descriptor = defaults.defaultDescriptor({ - environment: { - name: 'Environment', - shortOption: 'e', - required: false - }, - api: { - name: 'API', - shortOption: 'n', - required: false - }, - mapName:{ - name:'Map Name', - required: true, - prompt: true - }, - encrypted: { - name: 'Encrypted', - required: false, - toggle: true - }, -}); - -module.exports.descriptor = descriptor; - -module.exports.run = function(opts, cb) { - if (opts.debug) { - console.log('createKeyVaueMap: %j', opts); - } - var payload = { - name : opts.mapName, - encrypted: opts.encrypted - }; - - var uri = util.format('%s/v1/o/%s/keyvaluemaps', opts.baseuri, opts.organization); - - if (opts.api) { - uri = util.format('%s/v1/o/%s/apis/%s/keyvaluemaps', opts.baseuri, opts.organization, opts.api); - } - - if (opts.environment) { - uri = util.format('%s/v1/o/%s/e/%s/keyvaluemaps', opts.baseuri, opts.organization, opts.environment); - } - - var requestOpts = { - uri: uri, - method:'POST', - body: payload, - json:true - }; - - command_utils.run('createKeyValueMap',opts, requestOpts, cb); -}; diff --git a/lib/commands/createKVMmap.js b/lib/commands/createKVMmap.js new file mode 100644 index 0000000..47dae58 --- /dev/null +++ b/lib/commands/createKVMmap.js @@ -0,0 +1,76 @@ +/* jshint node: true */ +"use strict"; + +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); + +var descriptor = defaults.defaultDescriptor({ + environment: { + name: "Environment", + shortOption: "e", + required: false + }, + api: { + name: "API", + shortOption: "n", + required: false + }, + mapName: { + name: "Map Name", + required: true, + prompt: true + }, + encrypted: { + name: "Encrypted", + required: false, + toggle: true + } +}); + +module.exports.descriptor = descriptor; + +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); + if (opts.debug) { + console.log("createKVMmap: %j", opts); + } + var payload = { + name: opts.mapName, + encrypted: opts.encrypted + }; + + var uri = util.format( + "%s/v1/o/%s/keyvaluemaps", + opts.baseuri, + opts.organization + ); + + if (opts.api) { + uri = util.format( + "%s/v1/o/%s/apis/%s/keyvaluemaps", + opts.baseuri, + opts.organization, + opts.api + ); + } + + if (opts.environment) { + uri = util.format( + "%s/v1/o/%s/e/%s/keyvaluemaps", + opts.baseuri, + opts.organization, + opts.environment + ); + } + + var requestOpts = { + uri: uri, + method: "POST", + body: payload, + json: true + }; + + command_utils.run("createKeyValueMap", opts, requestOpts, cb); +}; diff --git a/lib/commands/createproduct.js b/lib/commands/createProduct.js similarity index 100% rename from lib/commands/createproduct.js rename to lib/commands/createProduct.js diff --git a/lib/commands/createRole.js b/lib/commands/createRole.js index 2f90f3b..d8ddf0b 100644 --- a/lib/commands/createRole.js +++ b/lib/commands/createRole.js @@ -1,14 +1,14 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true } @@ -16,22 +16,25 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('createRole: %j', opts); + console.log("createRole: %j", opts); } - var payload = { - "role" : [ - {"name" : opts.roleName} - ] + var payload = { + role: [{ name: opts.roleName }] }; - let uri = util.format('%s/v1/o/%s/userroles', opts.baseuri, opts.organization); + let uri = util.format( + "%s/v1/o/%s/userroles", + opts.baseuri, + opts.organization + ); let requestOptions = { uri, - method:'POST', + method: "POST", body: payload, - json:true - }; - command_utils.run('createRole', opts, requestOptions, cb); + json: true + }; + command_utils.run("createRole", opts, requestOptions, cb); }; diff --git a/lib/commands/createTargetServer.js b/lib/commands/createTargetServer.js index a457d47..a942309 100644 --- a/lib/commands/createTargetServer.js +++ b/lib/commands/createTargetServer.js @@ -39,6 +39,7 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { console.log('createTargetServer: %j', opts); } diff --git a/lib/commands/delete.js b/lib/commands/delete.js index ce54090..18f212d 100644 --- a/lib/commands/delete.js +++ b/lib/commands/delete.js @@ -1,15 +1,15 @@ /* jshint node: true */ -'use strict'; +"use strict"; // this only works if the proxy/app has already been undeployed -const util = require('util'), - path = require('path'), - async = require('async'), - fs = require('fs'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); +const util = require("util"), + path = require("path"), + async = require("async"), + fs = require("fs"), + defaults = require("../defaults"), + options = require("../options"), + parseDeployments = require("./parseDeployments"); /* Usage: delete -o [organization] -n [proxy name] @@ -26,83 +26,96 @@ const util = require('util'), var descriptor = defaults.defaultDescriptor({ api: { - name: 'API Name', - shortOption: 'n', + name: "API Name", + shortOption: "n", required: true } }); module.exports.descriptor = descriptor; -module.exports.format = function(r) { +module.exports.format = function (r) { if (r.name) { return parseDeployments.formatDeployment(r); } else { - return ''; + return ""; } }; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { options.validateSync(opts, descriptor); if (opts.debug) { - console.log('undeploy: %j', opts); + console.log("undeploy: %j", opts); } var request = defaults.defaultRequest(opts); // Run each function in series, and collect an array of results. - doDelete(opts, request, function(err, results) { - if (err) { - cb(err); - } else { - if (opts.debug) { - console.log('results: %j', results); - } - - cb(undefined, {}); + doDelete(opts, request, function (err, results) { + if (err) { + cb(err); + } else { + if (opts.debug) { + console.log("results: %j", results); } - }); + + cb(undefined, {}); + } + }); }; function doDelete(opts, request, done) { if (opts.verbose) { - console.log('Deleting %s', opts.api); + console.log("Deleting %s", opts.api); } - var uri = util.format('%s/v1/o/%s/apis/%s', opts.baseuri, opts.organization, opts.api); + var uri = util.format( + "%s/v1/o/%s/apis/%s", + opts.baseuri, + opts.organization, + opts.api + ); if (opts.debug) { - console.log('Going to send DELETE to %s', uri); + console.log("Going to send DELETE to %s", uri); } - request({ - uri: uri, - method: 'DELETE', - json: false, - headers: { 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json' } - }, function(err, req, body) { - var jsonBody = (body ? JSON.parse(body) : null); - if (err) { - done(err); - } else if (req.statusCode === 200) { - if (opts.verbose) { - console.log('Delete successful'); + request( + { + uri: uri, + method: "DELETE", + json: false, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json" } - if (opts.debug) { - console.log('%s', body); - } - done(undefined, jsonBody); - } else { - if (opts.verbose) { - console.error('Delete result: %j', body); - } - - var errMsg; - if (jsonBody && (jsonBody.message)) { - errMsg = jsonBody.message; + }, + function (err, req, body) { + var jsonBody = body ? JSON.parse(body) : null; + if (err) { + done(err); + } else if (req.statusCode === 200) { + if (opts.verbose) { + console.log("Delete successful"); + } + if (opts.debug) { + console.log("%s", body); + } + done(undefined, jsonBody); } else { - errMsg = util.format('Delete failed with status code %d', req.statusCode); + if (opts.verbose) { + console.error("Delete result: %j", body); + } + + var errMsg; + if (jsonBody && jsonBody.message) { + errMsg = jsonBody.message; + } else { + errMsg = util.format( + "Delete failed with status code %d", + req.statusCode + ); + } + done(new Error(errMsg)); } - done(new Error(errMsg)); } - }); + ); } diff --git a/lib/commands/deleteapp.js b/lib/commands/deleteApp.js similarity index 100% rename from lib/commands/deleteapp.js rename to lib/commands/deleteApp.js diff --git a/lib/commands/deleteCache.js b/lib/commands/deleteCache.js index f272556..b0c0e5d 100644 --- a/lib/commands/deleteCache.js +++ b/lib/commands/deleteCache.js @@ -23,7 +23,7 @@ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { options.validateSync(opts, descriptor); if (opts.debug) { - console.log('deletecache: %j', opts); + console.log('deleteCache: %j', opts); } var request = defaults.defaultRequest(opts); deleteCache(opts, request, function(err, results) { diff --git a/lib/commands/deletedeveloper.js b/lib/commands/deleteDeveloper.js similarity index 100% rename from lib/commands/deletedeveloper.js rename to lib/commands/deleteDeveloper.js diff --git a/lib/commands/deleteKVM.js b/lib/commands/deleteKVM.js deleted file mode 100644 index 7bdb2ff..0000000 --- a/lib/commands/deleteKVM.js +++ /dev/null @@ -1,49 +0,0 @@ -/* jshint node: true */ -'use strict'; - -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); - -var descriptor = defaults.defaultDescriptor({ - environment: { - name: 'Environment', - shortOption: 'e', - required: false - }, - api: { - name: 'API', - shortOption: 'n', - required: false - }, - mapName:{ - name:'Map Name', - required: true, - prompt: true - } -}); - -module.exports.descriptor = descriptor; - -module.exports.run = function(opts, cb) { - if (opts.debug) { - console.log('deleteKeyVaueMap: %j', opts); - } - - let uri = util.format('%s/v1/o/%s/keyvaluemaps/%s', opts.baseuri, opts.organization, opts.mapName); - - if (opts.api) { - uri = util.format('%s/v1/o/%s/apis/%s/keyvaluemaps/%s', opts.baseuri, opts.organization, opts.api, opts.mapName); - } - - if (opts.environment) { - uri = util.format('%s/v1/o/%s/e/%s/keyvaluemaps/%s', opts.baseuri, opts.organization, opts.environment, opts.mapName); - } - - let requestOpts = { - uri, - method:'DELETE' - }; - command_utils.run('deleteKeyValueMap',opts, requestOpts, cb); -}; diff --git a/lib/commands/deleteKVMentry.js b/lib/commands/deleteKVMentry.js index f18494a..ba9f46c 100644 --- a/lib/commands/deleteKVMentry.js +++ b/lib/commands/deleteKVMentry.js @@ -1,29 +1,29 @@ /* jshint node: true */ -'use strict'; +"use strict"; -var util = require('util'); - -var defaults = require('../defaults'); -var command_utils = require('./command-utils') +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: false }, api: { - name: 'API', - shortOption: 'n', + name: "API", + shortOption: "n", required: false }, - mapName:{ - name:'Map Name', + mapName: { + name: "Map Name", required: true, prompt: true }, entryName: { - name:'Entry Name', + name: "Entry Name", required: true, prompt: true } @@ -31,24 +31,45 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('deleteKVMentry: %j', opts); - } - - var uri = util.format('%s/v1/o/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.mapName, opts.entryName); - + console.log("deleteKVMentry: %j", opts); + } + + var uri = util.format( + "%s/v1/o/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.mapName, + opts.entryName + ); + if (opts.api) { - uri = util.format('%s/v1/o/%s/apis/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.api, opts.mapName, opts.entryName); + uri = util.format( + "%s/v1/o/%s/apis/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.api, + opts.mapName, + opts.entryName + ); } if (opts.environment) { - uri = util.format('%s/v1/o/%s/e/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.environment, opts.mapName, opts.entryName); + uri = util.format( + "%s/v1/o/%s/e/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.mapName, + opts.entryName + ); } - - var requestOpts = { - uri: uri, - method:'DELETE' - } - command_utils.run('deleteKVMentry',opts, requestOpts, cb) + + var requestOpts = { + uri: uri, + method: "DELETE" + }; + command_utils.run("deleteKVMentry", opts, requestOpts, cb); }; diff --git a/lib/commands/deleteKVMmap.js b/lib/commands/deleteKVMmap.js new file mode 100644 index 0000000..d27dac8 --- /dev/null +++ b/lib/commands/deleteKVMmap.js @@ -0,0 +1,67 @@ +/* jshint node: true */ +"use strict"; + +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); + +var descriptor = defaults.defaultDescriptor({ + environment: { + name: "Environment", + shortOption: "e", + required: false + }, + api: { + name: "API", + shortOption: "n", + required: false + }, + mapName: { + name: "Map Name", + required: true, + prompt: true + } +}); + +module.exports.descriptor = descriptor; + +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); + if (opts.debug) { + console.log("deleteKeyVaueMap: %j", opts); + } + + let uri = util.format( + "%s/v1/o/%s/keyvaluemaps/%s", + opts.baseuri, + opts.organization, + opts.mapName + ); + + if (opts.api) { + uri = util.format( + "%s/v1/o/%s/apis/%s/keyvaluemaps/%s", + opts.baseuri, + opts.organization, + opts.api, + opts.mapName + ); + } + + if (opts.environment) { + uri = util.format( + "%s/v1/o/%s/e/%s/keyvaluemaps/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.mapName + ); + } + + let requestOpts = { + uri, + method: "DELETE" + }; + command_utils.run("deleteKeyValueMap", opts, requestOpts, cb); +}; diff --git a/lib/commands/deleteProduct.js b/lib/commands/deleteProduct.js new file mode 100644 index 0000000..f9cc345 --- /dev/null +++ b/lib/commands/deleteProduct.js @@ -0,0 +1,80 @@ +/* jshint node: true */ +"use strict"; + +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"); + +var descriptor = defaults.defaultDescriptor({ + productName: { + name: "Product Name", + required: true + } +}); + +module.exports.descriptor = descriptor; + +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); + if (opts.debug) { + console.log("deleteProduct: %j", opts); + } + var request = defaults.defaultRequest(opts); + deleteProduct(opts, request, function (err, results) { + if (err) { + cb(err); + } else { + if (opts.debug) { + console.log("results: %j", results); + } + cb(undefined, results); + } + }); +}; + +function deleteProduct(opts, request, done) { + var uri = util.format( + "%s/v1/o/%s/apiproducts/%s", + opts.baseuri, + opts.organization, + opts.productName + ); + request( + { + uri: uri, + method: "DELETE", + json: true + }, + function (err, res, body) { + var jsonBody = body; + if (err) { + if (opts.debug) { + console.log("Error occured %s", err); + } + done(err); + } else if (res.statusCode === 200) { + if (opts.verbose) { + console.log("Delete successful"); + } + if (opts.debug) { + console.log("%s", body); + } + done(undefined, jsonBody); + } else { + if (opts.verbose) { + console.error("Delete Product result: %j", body); + } + var errMsg; + if (jsonBody && jsonBody.message) { + errMsg = jsonBody.message; + } else { + errMsg = util.format( + "Delete Product failed with status code %d", + res.statusCode + ); + } + done(new Error(errMsg)); + } + } + ); +} diff --git a/lib/commands/deleteRole.js b/lib/commands/deleteRole.js index dce0356..4b94f24 100644 --- a/lib/commands/deleteRole.js +++ b/lib/commands/deleteRole.js @@ -1,14 +1,14 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true } @@ -16,16 +16,21 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('deleteRole: %j', opts); + console.log("deleteRole: %j", opts); } - let uri = util.format('%s/v1/o/%s/userroles/%s', - opts.baseuri, opts.organization, opts.roleName); + let uri = util.format( + "%s/v1/o/%s/userroles/%s", + opts.baseuri, + opts.organization, + opts.roleName + ); let requestOptions = { - uri, - method:'DELETE', - json:true - }; - command_utils.run('deleteRole', opts, requestOptions, cb); + uri, + method: "DELETE", + json: true + }; + command_utils.run("deleteRole", opts, requestOptions, cb); }; diff --git a/lib/commands/deleteSharedflow.js b/lib/commands/deleteSharedflow.js new file mode 100644 index 0000000..42896e6 --- /dev/null +++ b/lib/commands/deleteSharedflow.js @@ -0,0 +1,118 @@ +/* jshint node: true */ +"use strict"; + +// this works only if the proxy/app has already been undeployed + +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + parseDeployments = require("./parseDeployments"); + +/* + Usage: delete -o [organization] -n [proxy name] + -u [username] -p [password] + -l [Apigee URL] + + -o Apigee organization name + -n Apigee proxy name + -u Apigee user name + -p Apigee password + -l Apigee API URL (optional, defaults to https://api.enterprise.apigee.com) + -h Print this message + */ + +var descriptor = defaults.defaultDescriptor({ + name: { + name: "SharedFlow Name", + shortOption: "n", + required: true + } +}); +module.exports.descriptor = descriptor; + +module.exports.format = function (r) { + if (r.name) { + return parseDeployments.formatDeployment(r); + } else { + return ""; + } +}; + +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); + if (opts.debug) { + console.log("undeploySharedFlow: %j", opts); + } + + var request = defaults.defaultRequest(opts); + + // Run each function in series, and collect an array of results. + doDelete(opts, request, function (err, results) { + if (err) { + cb(err); + } else { + if (opts.debug) { + console.log("results: %j", results); + } + + cb(undefined, {}); + } + }); +}; + +function doDelete(opts, request, done) { + if (opts.verbose) { + console.log("Deleting %s", opts.name); + } + + var uri = util.format( + "%s/v1/o/%s/sharedflows/%s", + opts.baseuri, + opts.organization, + opts.name + ); + if (opts.debug) { + console.log("Going to send DELETE to %s", uri); + } + + request( + { + uri: uri, + method: "DELETE", + json: false, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json" + } + }, + function (err, req, body) { + var jsonBody = body ? JSON.parse(body) : null; + if (err) { + done(err); + } else if (req.statusCode === 200) { + if (opts.verbose) { + console.log("Delete successful"); + } + if (opts.debug) { + console.log("%s", body); + } + done(undefined, jsonBody); + } else { + if (opts.verbose) { + console.error("Delete result: %j", body); + } + + var errMsg; + if (jsonBody && jsonBody.message) { + errMsg = jsonBody.message; + } else { + errMsg = util.format( + "Delete failed with status code %d", + req.statusCode + ); + } + done(new Error(errMsg)); + } + } + ); +} diff --git a/lib/commands/deleteTargetServer.js b/lib/commands/deleteTargetServer.js index 1a6a86f..9501f38 100644 --- a/lib/commands/deleteTargetServer.js +++ b/lib/commands/deleteTargetServer.js @@ -1,16 +1,17 @@ -const util = require('util'), - defaults = require('../defaults'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: true, prompt: true }, targetServerName: { - name: 'Target Server Name', + name: "Target Server Name", required: true, prompt: true } @@ -18,16 +19,22 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('deleteTargetServer: %j', opts); + console.log("deleteTargetServer: %j", opts); } - let uri = util.format('%s/v1/o/%s/e/%s/targetservers/%s', - opts.baseuri, opts.organization, opts.environment,opts.targetServerName); + let uri = util.format( + "%s/v1/o/%s/e/%s/targetservers/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.targetServerName + ); let requestOptions = { - uri, - method:'DELETE', - json:true - }; - command_utils.run('deleteTargetServer', opts, requestOptions, cb); + uri, + method: "DELETE", + json: true + }; + command_utils.run("deleteTargetServer", opts, requestOptions, cb); }; diff --git a/lib/commands/deleteproduct.js b/lib/commands/deleteproduct.js deleted file mode 100644 index 7763701..0000000 --- a/lib/commands/deleteproduct.js +++ /dev/null @@ -1,70 +0,0 @@ -/* jshint node: true */ -'use strict'; - -var util = require('util'); - -var defaults = require('../defaults'); -var options = require('../options'); - -var descriptor = defaults.defaultDescriptor({ - 'productName': { - name: 'Product Name', - required: true - } -}); - -module.exports.descriptor = descriptor; - -module.exports.run = function(opts, cb) { - options.validateSync(opts, descriptor); - if (opts.debug) { - console.log('deleteProduct: %j', opts); - } - var request = defaults.defaultRequest(opts); - deleteProduct(opts, request, function(err, results) { - if (err) { - cb(err); - } else { - if (opts.debug) { - console.log('results: %j', results); - } - cb(undefined, results); - } - }); -}; - -function deleteProduct(opts,request,done){ - var uri = util.format('%s/v1/o/%s/apiproducts/%s', opts.baseuri, opts.organization,opts.productName); - request({ - uri: uri, - method:'DELETE', - json:true - },function(err,res,body){ - var jsonBody = body - if(err){ - if (opts.debug) { - console.log('Error occured %s', err); - } - done(err) - }else if (res.statusCode === 200) { - if (opts.verbose) { - console.log('Delete successful'); - } - if (opts.debug) { - console.log('%s', body); - } - done(undefined, jsonBody); - }else { - if (opts.verbose) { - console.error('Delete Product result: %j', body); - } - var errMsg; - if (jsonBody && (jsonBody.message)) { - errMsg = jsonBody.message; - } else { - errMsg = util.format('Delete Product failed with status code %d', res.statusCode); - } - done(new Error(errMsg)); - } - }) -} diff --git a/lib/commands/deletesharedflow.js b/lib/commands/deletesharedflow.js deleted file mode 100644 index 0b0df99..0000000 --- a/lib/commands/deletesharedflow.js +++ /dev/null @@ -1,110 +0,0 @@ -/* jshint node: true */ -'use strict'; - -// this works only if the proxy/app has already been undeployed - -const util = require('util'), - path = require('path'), - async = require('async'), - fs = require('fs'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); - -/* - Usage: delete -o [organization] -n [proxy name] - -u [username] -p [password] - -l [Apigee URL] - - -o Apigee organization name - -n Apigee proxy name - -u Apigee user name - -p Apigee password - -l Apigee API URL (optional, defaults to https://api.enterprise.apigee.com) - -h Print this message - */ - -var descriptor = defaults.defaultDescriptor({ - name: { - name: 'SharedFlow Name', - shortOption: 'n', - required: true - } -}); -module.exports.descriptor = descriptor; - -module.exports.format = function (r) { - if (r.name) { - return parseDeployments.formatDeployment(r); - } else { - return ''; - } -}; - -module.exports.run = function (opts, cb) { - options.validateSync(opts, descriptor); - if (opts.debug) { - console.log('undeploySharedFlow: %j', opts); - } - - var request = defaults.defaultRequest(opts); - - // Run each function in series, and collect an array of results. - doDelete(opts, request, function (err, results) { - if (err) { - cb(err); - } else { - if (opts.debug) { - console.log('results: %j', results); - } - - cb(undefined, {}); - } - }); -}; - -function doDelete(opts, request, done) { - if (opts.verbose) { - console.log('Deleting %s', opts.name); - } - - var uri = util.format('%s/v1/o/%s/sharedflows/%s', opts.baseuri, opts.organization, opts.name); - if (opts.debug) { - console.log('Going to send DELETE to %s', uri); - } - - request({ - uri: uri, - method: 'DELETE', - json: false, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json' - } - }, function (err, req, body) { - var jsonBody = (body ? JSON.parse(body) : null); - if (err) { - done(err); - } else if (req.statusCode === 200) { - if (opts.verbose) { - console.log('Delete successful'); - } - if (opts.debug) { - console.log('%s', body); - } - done(undefined, jsonBody); - } else { - if (opts.verbose) { - console.error('Delete result: %j', body); - } - - var errMsg; - if (jsonBody && (jsonBody.message)) { - errMsg = jsonBody.message; - } else { - errMsg = util.format('Delete failed with status code %d', req.statusCode); - } - done(new Error(errMsg)); - } - }); -} diff --git a/lib/commands/deployExistingRevision.js b/lib/commands/deployExistingRevision.js index 5e1fd12..07669d3 100644 --- a/lib/commands/deployExistingRevision.js +++ b/lib/commands/deployExistingRevision.js @@ -5,7 +5,7 @@ const async = require('async'), util = require('util'), defaults = require('../defaults'), options = require('../options'), - parseDeployments = require('./parsedeployments'); + parseDeployments = require('./parseDeployments'); const DeploymentDelay = 60; diff --git a/lib/commands/deployHostedTarget.js b/lib/commands/deployHostedTarget.js index 8961ca9..731658e 100644 --- a/lib/commands/deployHostedTarget.js +++ b/lib/commands/deployHostedTarget.js @@ -1,84 +1,84 @@ -const util = require('util'), - path = require('path'), - async = require('async'), - fs = require('fs-extra'), - mustache = require('mustache'), - tmp = require('tmp'); +const util = require("util"), + path = require("path"), + async = require("async"), + fs = require("fs-extra"), + mustache = require("mustache"), + tmp = require("tmp"); tmp.setGracefulCleanup(); -const defaults = require('../defaults'), - options = require('../options'), - ziputils = require('../ziputils'), - parseDeployments = require('./parsedeployments'), - fetchProxy = require('./fetchProxy'), - deployProxy1 = require('./deployProxy'), - createApiProxy = require('../deploycommon').createApiProxy, - createProxy = require('../deploycommon').createProxy, - deployProxy2 = require('../deploycommon').deployProxy, - unzipProxy = require('../deploycommon').unzipProxy, - copyFile = require('../deploycommon').copyFile, - handleUploadResult = require('../deploycommon').handleUploadResult, - usePackedSource = require('../deploycommon').usePackedSource, - uploadSource = require('../deploycommon').uploadSource; - -const APP_YAML = 'app.yaml'; +const defaults = require("../defaults"), + options = require("../options"), + ziputils = require("../ziputils"), + parseDeployments = require("./parseDeployments"), + fetchProxy = require("./fetchProxy"), + deployProxy1 = require("./deployProxy"), + createApiProxy = require("../deploycommon").createApiProxy, + createProxy = require("../deploycommon").createProxy, + deployProxy2 = require("../deploycommon").deployProxy, + unzipProxy = require("../deploycommon").unzipProxy, + copyFile = require("../deploycommon").copyFile, + handleUploadResult = require("../deploycommon").handleUploadResult, + usePackedSource = require("../deploycommon").usePackedSource, + uploadSource = require("../deploycommon").uploadSource; + +const APP_YAML = "app.yaml"; var descriptor = defaults.defaultDescriptor({ api: { - name: 'API Name', - shortOption: 'n', + name: "API Name", + shortOption: "n", required: true }, environments: { - name: 'Environments', - shortOption: 'e', + name: "Environments", + shortOption: "e", required: true }, directory: { - name: 'Directory', - shortOption: 'd', + name: "Directory", + shortOption: "d", required: false }, virtualhosts: { - name: 'Virtual Hosts', - shortOption: 'v' + name: "Virtual Hosts", + shortOption: "v" }, - 'base-path': { - name: 'Base Path', - shortOption: 'b' + "base-path": { + name: "Base Path", + shortOption: "b" }, - 'import-only': { - name: 'Import Only', - shortOption: 'i', + "import-only": { + name: "Import Only", + shortOption: "i", toggle: true }, - 'preserve-policies': { - name: 'Preserve policies from previous revision', - shortOption: 'P', + "preserve-policies": { + name: "Preserve policies from previous revision", + shortOption: "P", toggle: true }, - 'bundled-dependencies' : { - name: 'Upload dependencies from bundledDependencies', + "bundled-dependencies": { + name: "Upload dependencies from bundledDependencies", toggle: true }, - 'upload-modules': { - name: 'Upload Modules', - shortOption: 'U', + "upload-modules": { + name: "Upload Modules", + shortOption: "U", toggle: true } }); module.exports.descriptor = descriptor; -module.exports.format = function(r) { - var result = ''; - r.forEach(function(e) { +module.exports.format = function (r) { + var result = ""; + r.forEach(function (e) { result = result + parseDeployments.formatDeployment(e); }); return result; }; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { if (!opts.directory) { opts.directory = process.cwd(); } @@ -86,116 +86,137 @@ module.exports.run = function(opts, cb) { descriptor.api.required = true; options.validateSync(opts, descriptor); if (opts.debug) { - console.log('deployhostedtarget: %j', opts); + console.log("deployhostedtarget: %j", opts); } try { - fs.statSync(path.join(opts.directory, APP_YAML)) - } catch(err) { + fs.statSync(path.join(opts.directory, APP_YAML)); + } catch (err) { return cb(new Error("missing required 'app.yaml'")); } var request = defaults.defaultRequest(opts); - getDeploymentInfo(opts, request, function(err) { - if (err) { return cb(err); } + getDeploymentInfo(opts, request, function (err) { + if (err) { + return cb(err); + } // if preserve-policies, we do something entirely different... - if (opts['preserve-policies'] && opts.deploymentVersion > 1) { + if (opts["preserve-policies"] && opts.deploymentVersion > 1) { return preservePoliciesRun(opts, cb); } opts.remoteNpm = true; - if (opts['upload-modules'] && (opts['upload-modules'] === true)) { + if (opts["upload-modules"] && opts["upload-modules"] === true) { opts.remoteNpm = false; } var steps = [ - function(done) { + function (done) { createApiProxy(opts, request, done); } - ] + ]; - if (opts['bundled-dependencies']) { + if (opts["bundled-dependencies"]) { opts.remoteNpm = false; - steps.push(function(done) { - usePackedSource(opts.directory, opts, function(err, packedDirectory) { + steps.push(function (done) { + usePackedSource(opts.directory, opts, function (err, packedDirectory) { // set the target directory to upload to the packed directory - opts.directory = packedDirectory + opts.directory = packedDirectory; return done(err); }); - }) + }); } steps = steps.concat([ - function(done) { - uploadSource(opts.directory, 'hosted', opts, request, done); + function (done) { + uploadSource(opts.directory, "hosted", opts, request, done); }, - function(done) { + function (done) { createTarget(opts, request, done); }, - function(done) { + function (done) { createProxy(opts, request, done); }, - function(done) { + function (done) { deployProxy2(opts, request, done); } - ]) + ]); // Run each function in series, and collect an array of results. - async.series(steps, - function(err, results) { - if (err) { return cb(err); } - if (opts.debug) { console.log('results: %j', results); } - - async.map(Object.values(results[results.length - 1]), - function(result, cb) { - - if (opts.debug) { console.log('result: %j', result); } - - var deployment = parseDeployments.parseDeploymentResult(result); - if (deployment) { - // Look up the deployed URI for user-friendliness - parseDeployments.getPathInfo([ deployment ], opts, function(err) { - // Ignore this error because deployment worked - if (err && opts.verbose) { console.log('Error looking up deployed path: %s', err); } - cb(undefined, deployment); - }); - } else { - // Probably import-only -- do nothing - cb(undefined, {}); - } - }, - cb); - }); + async.series(steps, function (err, results) { + if (err) { + return cb(err); + } + if (opts.debug) { + console.log("results: %j", results); + } + + async.map( + Object.values(results[results.length - 1]), + function (result, cb) { + if (opts.debug) { + console.log("result: %j", result); + } + + var deployment = parseDeployments.parseDeploymentResult(result); + if (deployment) { + // Look up the deployed URI for user-friendliness + parseDeployments.getPathInfo([deployment], opts, function (err) { + // Ignore this error because deployment worked + if (err && opts.verbose) { + console.log("Error looking up deployed path: %s", err); + } + cb(undefined, deployment); + }); + } else { + // Probably import-only -- do nothing + cb(undefined, {}); + } + }, + cb + ); + }); }); }; function preservePoliciesRun(opts, cb) { - // download the proxy to a temporary zip file - tmp.file(function(err, fetchedProxyZip) { - if (err) { return cb(err); } + tmp.file(function (err, fetchedProxyZip) { + if (err) { + return cb(err); + } opts.revision = opts.deploymentVersion - 1; opts.file = fetchedProxyZip; - if (opts.verbose) { console.log('Downloading proxy %s revision %d', opts.name, opts.revision); } - fetchProxy.run(opts, function(err) { - if (err) { return cb(err); } + if (opts.verbose) { + console.log("Downloading proxy %s revision %d", opts.name, opts.revision); + } + fetchProxy.run(opts, function (err) { + if (err) { + return cb(err); + } // set up temporary project dir - tmp.dir({ unsafeCleanup: false }, function(err, tmpDir) { - if (err) { return cb(err); } + tmp.dir({ unsafeCleanup: false }, function (err, tmpDir) { + if (err) { + return cb(err); + } - unzipProxy(opts, tmpDir, 'apiproxy/resources/hosted', function(err) { - if (err) { return cb(err); } + unzipProxy(opts, tmpDir, "apiproxy/resources/hosted", function (err) { + if (err) { + return cb(err); + } // copy hosted files to tmpDir hosted directory - var sourcesDir = path.resolve(tmpDir, 'apiproxy/resources/hosted'); - copySources(opts, sourcesDir, function(err) { - if (err) { return cb(err); } + var sourcesDir = path.resolve(tmpDir, "apiproxy/resources/hosted"); + copySources(opts, sourcesDir, function (err) { + if (err) { + return cb(err); + } // deploy proxy at tmpDir opts.directory = tmpDir; @@ -208,39 +229,60 @@ function preservePoliciesRun(opts, cb) { } function copySources(opts, targetDir, cb) { - - if (opts.verbose) { console.log('Copying sources into proxy'); } + if (opts.verbose) { + console.log("Copying sources into proxy"); + } // Get a list of entries, broken down by which are directories - ziputils.enumerateDirectory(opts.directory, 'hosted', opts.remoteNpm, function(err, entries) { - if (err) { return cb(err); } - - if (opts.debug) { console.log('Directories to copy: %j', entries); } - - function copyResource(entry, done) { - - if (entry.directory) { - // ZIP up all directories, possibly with additional file prefixes - if (opts.verbose) { console.log('Zipping: %s', entry.fileName); } - ziputils.zipDirectory(entry.fileName, entry.zipEntryName, function(err, zipBuf) { - if (err) { return done(err); } - - // write zipBuf -> file - var zipFileName = path.resolve(targetDir, entry.resourceName); + ziputils.enumerateDirectory( + opts.directory, + "hosted", + opts.remoteNpm, + function (err, entries) { + if (err) { + return cb(err); + } - if (opts.verbose) { console.log('Writing zip file: %s', zipFileName); } - fs.writeFile(zipFileName, zipBuf, done); - }); + if (opts.debug) { + console.log("Directories to copy: %j", entries); + } - } else { // entry.file - var targetFileName = path.resolve(targetDir, entry.resourceName); - if (opts.verbose) { console.log('copy %s %s', entry.fileName, targetDir); } - copyFile(entry.fileName, targetFileName, done); + function copyResource(entry, done) { + if (entry.directory) { + // ZIP up all directories, possibly with additional file prefixes + if (opts.verbose) { + console.log("Zipping: %s", entry.fileName); + } + ziputils.zipDirectory( + entry.fileName, + entry.zipEntryName, + function (err, zipBuf) { + if (err) { + return done(err); + } + + // write zipBuf -> file + var zipFileName = path.resolve(targetDir, entry.resourceName); + + if (opts.verbose) { + console.log("Writing zip file: %s", zipFileName); + } + fs.writeFile(zipFileName, zipBuf, done); + } + ); + } else { + // entry.file + var targetFileName = path.resolve(targetDir, entry.resourceName); + if (opts.verbose) { + console.log("copy %s %s", entry.fileName, targetDir); + } + copyFile(entry.fileName, targetFileName, done); + } } - } - async.each(entries, copyResource, cb); - }); + async.each(entries, copyResource, cb); + } + ); } function getDeploymentInfo(opts, request, done) { @@ -249,71 +291,104 @@ function getDeploymentInfo(opts, request, done) { try { ds = fs.statSync(opts.directory); } catch (e) { - done(new Error(util.format('Proxy base directory %s does not exist', - opts.directory))); + done( + new Error( + util.format("Proxy base directory %s does not exist", opts.directory) + ) + ); return; } if (!ds.isDirectory()) { - done(new Error(util.format('Proxy base directory %s is not a directory', - opts.directory))); + done( + new Error( + util.format( + "Proxy base directory %s is not a directory", + opts.directory + ) + ) + ); return; } // Find out which revision we should be creating - request.get(util.format('%s/v1/o/%s/apis/%s', - opts.baseuri, opts.organization, opts.api), - function(err, req, body) { + request.get( + util.format( + "%s/v1/o/%s/apis/%s", + opts.baseuri, + opts.organization, + opts.api + ), + function (err, req, body) { if (err) { done(err); } else if (req.statusCode === 404) { opts.deployNewApi = true; opts.deploymentVersion = 1; if (opts.verbose) { - console.log('API %s does not exist. Going to create revision 1', - opts.api); + console.log( + "API %s does not exist. Going to create revision 1", + opts.api + ); } done(); } else if (req.statusCode === 200) { // get the next revision opts.deploymentVersion = body.revision - .map(v => parseInt(v)) - .reduce((a, b) => ((a>b)?a:b), 0) + 1; + .map((v) => parseInt(v)) + .reduce((a, b) => (a > b ? a : b), 0) + 1; if (opts.verbose) { - console.log('Going to create revision %d of API %s', - opts.deploymentVersion, opts.api); + console.log( + "Going to create revision %d of API %s", + opts.deploymentVersion, + opts.api + ); } done(); } else { - done(new Error(util.format('Get API info returned status %d', req.statusCode))); + done( + new Error( + util.format("Get API info returned status %d", req.statusCode) + ) + ); } - }); + } + ); } // Create a target endpoint that references the Hosted Target target function createTarget(opts, request, done) { var targetDoc = mustache.render( '' + - '' + - '' + - '' + - '', opts); - - var uri = util.format('%s/v1/o/%s/apis/%s/revisions/%d/targets?name=default', - opts.baseuri, opts.organization, opts.api, - opts.deploymentVersion); + '' + + '' + + "" + + "", + opts + ); + + var uri = util.format( + "%s/v1/o/%s/apis/%s/revisions/%d/targets?name=default", + opts.baseuri, + opts.organization, + opts.api, + opts.deploymentVersion + ); if (opts.verbose) { - console.log('Creating the target endpoint'); + console.log("Creating the target endpoint"); } - request({ - uri: uri, - method: 'POST', - json: false, - headers: { 'Content-Type': 'application/xml' }, - body: targetDoc - }, function(err, req, body) { - handleUploadResult(err, req, 'targets/default.xml', done); - }); + request( + { + uri: uri, + method: "POST", + json: false, + headers: { "Content-Type": "application/xml" }, + body: targetDoc + }, + function (err, req, body) { + handleUploadResult(err, req, "targets/default.xml", done); + } + ); } diff --git a/lib/commands/deployNodeApp.js b/lib/commands/deployNodeApp.js index 9bc2505..db264f0 100644 --- a/lib/commands/deployNodeApp.js +++ b/lib/commands/deployNodeApp.js @@ -1,116 +1,115 @@ -const util = require('util'), - path = require('path'), - async = require('async'), - fs = require('fs'), - mustache = require('mustache'), - tmp = require('tmp'); +const util = require("util"), + path = require("path"), + async = require("async"), + fs = require("fs"), + mustache = require("mustache"), + tmp = require("tmp"); tmp.setGracefulCleanup(); -const defaults = require('../defaults'), - options = require('../options'), - ziputils = require('../ziputils'), - parseDeployments = require('./parsedeployments'), - fetchProxy = require('./fetchProxy'), - deployProxy1 = require('./deployProxy'), - createApiProxy = require('../deploycommon').createApiProxy, - createProxy = require('../deploycommon').createProxy, - deployProxy2 = require('../deploycommon').deployProxy, - unzipProxy = require('../deploycommon').unzipProxy, - copyFile = require('../deploycommon').copyFile, - handleUploadResult = require('../deploycommon').handleUploadResult, - usePackedSource = require('../deploycommon').usePackedSource, - uploadSource = require('../deploycommon').uploadSource; - -var cleanResults = require('../utils').cleanResults; +const defaults = require("../defaults"), + options = require("../options"), + ziputils = require("../ziputils"), + parseDeployments = require("./parseDeployments"), + fetchProxy = require("./fetchProxy"), + deployProxy1 = require("./deployProxy"), + createApiProxy = require("../deploycommon").createApiProxy, + createProxy = require("../deploycommon").createProxy, + deployProxy2 = require("../deploycommon").deployProxy, + unzipProxy = require("../deploycommon").unzipProxy, + copyFile = require("../deploycommon").copyFile, + handleUploadResult = require("../deploycommon").handleUploadResult, + usePackedSource = require("../deploycommon").usePackedSource, + uploadSource = require("../deploycommon").uploadSource; + +var cleanResults = require("../utils").cleanResults; var DeploymentDelay = 60; -var ProxyBase = 'apiproxy'; +var ProxyBase = "apiproxy"; // By default, do not run NPM remotely var DefaultResolveModules = false; var descriptor = defaults.defaultDescriptor({ api: { - name: 'API Name', - shortOption: 'n', + name: "API Name", + shortOption: "n", required: false }, environments: { - name: 'Environments', - shortOption: 'e', + name: "Environments", + shortOption: "e", required: true }, directory: { - name: 'Directory', - shortOption: 'd', + name: "Directory", + shortOption: "d", required: false }, main: { - name: 'Main Script', - shortOption: 'm', + name: "Main Script", + shortOption: "m", required: false }, virtualhosts: { - name: 'Virtual Hosts', - shortOption: 'v' + name: "Virtual Hosts", + shortOption: "v" }, - 'base-path': { - name: 'Base Path', - shortOption: 'b' + "base-path": { + name: "Base Path", + shortOption: "b" }, - 'import-only': { - name: 'Import Only', - shortOption: 'i', + "import-only": { + name: "Import Only", + shortOption: "i", toggle: true }, - 'resolve-modules': { - name: 'Resolve Modules', - shortOption: 'R', + "resolve-modules": { + name: "Resolve Modules", + shortOption: "R", toggle: true }, - 'bundled-dependencies' : { - name: 'Upload dependencies from bundledDependencies', + "bundled-dependencies": { + name: "Upload dependencies from bundledDependencies", toggle: true }, - 'upload-modules': { - name: 'Upload Modules', - shortOption: 'U', + "upload-modules": { + name: "Upload Modules", + shortOption: "U", toggle: true }, - 'preserve-policies': { - name: 'Preserve policies from previous revision', - shortOption: 'P', + "preserve-policies": { + name: "Preserve policies from previous revision", + shortOption: "P", toggle: true }, - 'wait-after-import': { - name: 'Wait N seconds after importing proxy before deploying', - shortOption: 'W', + "wait-after-import": { + name: "Wait N seconds after importing proxy before deploying", + shortOption: "W", required: false }, - 'production': { - name: 'Run resolve modules with npm install --production, default true', + production: { + name: "Run resolve modules with npm install --production, default true", required: false } }); module.exports.descriptor = descriptor; -module.exports.format = function(r) { - var result = ''; - r.forEach(function(e) { +module.exports.format = function (r) { + var result = ""; + r.forEach(function (e) { result = result + parseDeployments.formatDeployment(e); }); return result; }; - -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { // Setup Delay for after import if set opts.waitAfterImportDelay = 0; - if (opts['wait-after-import'] !== undefined) { - opts.waitAfterImportDelay = parseInt(opts['wait-after-import']); + if (opts["wait-after-import"] !== undefined) { + opts.waitAfterImportDelay = parseInt(opts["wait-after-import"]); if (isNaN(opts.waitAfterImportDelay)) { - console.error('invalid int for wait-after-import'); + console.error("invalid int for wait-after-import"); process.exit(1); } } @@ -120,8 +119,8 @@ module.exports.run = function(opts, cb) { } if (!opts.main || !opts.api) { try { - var packageFile = path.resolve(opts.directory, 'package.json'); - var packageObj = JSON.parse(fs.readFileSync(packageFile, 'utf8')); + var packageFile = path.resolve(opts.directory, "package.json"); + var packageObj = JSON.parse(fs.readFileSync(packageFile, "utf8")); if (!opts.main) { opts.main = packageObj.main; } @@ -130,7 +129,7 @@ module.exports.run = function(opts, cb) { } } catch (err) { if (opts.debug) { - console.error('unable to read package.json', err); + console.error("unable to read package.json", err); } } } @@ -138,115 +137,136 @@ module.exports.run = function(opts, cb) { descriptor.api.required = true; options.validateSync(opts, descriptor); if (opts.debug) { - console.log('deploynodeapp: %j', opts); + console.log("deploynodeapp: %j", opts); } var request = defaults.defaultRequest(opts); - getDeploymentInfo(opts, request, function(err) { - if (err) { return cb(err); } + getDeploymentInfo(opts, request, function (err) { + if (err) { + return cb(err); + } // if preserve-policies, we do something entirely different... - if (opts['preserve-policies'] && opts.deploymentVersion > 1) { + if (opts["preserve-policies"] && opts.deploymentVersion > 1) { return preservePoliciesRun(opts, cb); } var steps = [ - function(done) { + function (done) { createApiProxy(opts, request, done); } - ] + ]; - if (opts['bundled-dependencies']) { + if (opts["bundled-dependencies"]) { opts.remoteNpm = false; - steps.push(function(done) { - usePackedSource(opts.directory, opts, function(err, packedDirectory) { + steps.push(function (done) { + usePackedSource(opts.directory, opts, function (err, packedDirectory) { // set the target directory to upload to the packed directory - opts.directory = packedDirectory + opts.directory = packedDirectory; return done(err); }); - }) + }); } steps = steps.concat([ - function(done) { - uploadSource(opts.directory, 'node', opts, request, done); + function (done) { + uploadSource(opts.directory, "node", opts, request, done); }, - function(done) { + function (done) { createTarget(opts, request, done); }, - function(done) { + function (done) { createProxy(opts, request, done); }, - function(done) { + function (done) { runNpm(opts, request, done); }, - function(done) { + function (done) { deployProxy2(opts, request, done); } - ]) + ]); // Run each function in series, and collect an array of results. - async.series(steps, - function(err, results) { - if (err) { return cb(err); } + async.series(steps, function (err, results) { + if (err) { + return cb(err); + } - results = cleanResults(results); + results = cleanResults(results); - if (opts.debug) { console.log('results: %j', results); } + if (opts.debug) { + console.log("results: %j", results); + } - if (opts['import-only']) { - return cb(undefined, results) - } + if (opts["import-only"]) { + return cb(undefined, results); + } - async.map(Object.values(results[results.length - 1]), - function(result, cb) { - - if (opts.debug) { console.log('result: %j', result); } - - var deployment = parseDeployments.parseDeploymentResult(result); - if (deployment) { - // Look up the deployed URI for user-friendliness - parseDeployments.getPathInfo([ deployment ], opts, function(err) { - // Ignore this error because deployment worked - if (err && opts.verbose) { console.log('Error looking up deployed path: %s', err); } - cb(undefined, deployment); - }); - } else { - // Probably import-only -- do nothing - cb(undefined, {}); - } - }, - cb); - }); + async.map( + Object.values(results[results.length - 1]), + function (result, cb) { + if (opts.debug) { + console.log("result: %j", result); + } + + var deployment = parseDeployments.parseDeploymentResult(result); + if (deployment) { + // Look up the deployed URI for user-friendliness + parseDeployments.getPathInfo([deployment], opts, function (err) { + // Ignore this error because deployment worked + if (err && opts.verbose) { + console.log("Error looking up deployed path: %s", err); + } + cb(undefined, deployment); + }); + } else { + // Probably import-only -- do nothing + cb(undefined, {}); + } + }, + cb + ); + }); }); }; function preservePoliciesRun(opts, cb) { - // download the proxy to a temporary zip file - tmp.file(function(err, fetchedProxyZip) { - if (err) { return cb(err); } + tmp.file(function (err, fetchedProxyZip) { + if (err) { + return cb(err); + } opts.revision = opts.deploymentVersion - 1; opts.file = fetchedProxyZip; - if (opts.verbose) { console.log('Downloading proxy %s revision %d', opts.name, opts.revision); } - fetchProxy.run(opts, function(err) { - if (err) { return cb(err); } + if (opts.verbose) { + console.log("Downloading proxy %s revision %d", opts.name, opts.revision); + } + fetchProxy.run(opts, function (err) { + if (err) { + return cb(err); + } // set up temporary project dir - tmp.dir({ unsafeCleanup: false }, function(err, tmpDir) { - if (err) { return cb(err); } + tmp.dir({ unsafeCleanup: false }, function (err, tmpDir) { + if (err) { + return cb(err); + } - unzipProxy(opts, tmpDir, 'apiproxy/resources/node', function(err) { - if (err) { return cb(err); } + unzipProxy(opts, tmpDir, "apiproxy/resources/node", function (err) { + if (err) { + return cb(err); + } // copy node files to tmpDir node directory - var nodeResourceDir = path.resolve(tmpDir, 'apiproxy/resources/node'); - copyNodeSource(opts, nodeResourceDir, function(err) { - if (err) { return cb(err); } + var nodeResourceDir = path.resolve(tmpDir, "apiproxy/resources/node"); + copyNodeSource(opts, nodeResourceDir, function (err) { + if (err) { + return cb(err); + } // deploy proxy at tmpDir opts.directory = tmpDir; @@ -259,40 +279,61 @@ function preservePoliciesRun(opts, cb) { } function copyNodeSource(opts, targetDir, cb) { - - if (opts.verbose) { console.log('Copying node source into proxy'); } + if (opts.verbose) { + console.log("Copying node source into proxy"); + } // Get a list of entries, broken down by which are directories, // and with special handling for the node_modules directory. - ziputils.enumerateDirectory(opts.directory, 'node', opts.remoteNpm, function(err, entries) { - if (err) { return cb(err); } - - if (opts.debug) { console.log('Directories to copy: %j', entries); } - - function copyResource(entry, done) { - - if (entry.directory) { - // ZIP up all directories, possibly with additional file prefixes - if (opts.verbose) { console.log('Zipping: %s', entry.fileName); } - ziputils.zipDirectory(entry.fileName, entry.zipEntryName, function(err, zipBuf) { - if (err) { return done(err); } - - // write zipBuf -> file - var zipFileName = path.resolve(targetDir, entry.resourceName); + ziputils.enumerateDirectory( + opts.directory, + "node", + opts.remoteNpm, + function (err, entries) { + if (err) { + return cb(err); + } - if (opts.verbose) { console.log('Writing zip file: %s', zipFileName); } - fs.writeFile(zipFileName, zipBuf, done); - }); + if (opts.debug) { + console.log("Directories to copy: %j", entries); + } - } else { // entry.file - var targetFileName = path.resolve(targetDir, entry.resourceName); - if (opts.verbose) { console.log('copy %s %s', entry.fileName, targetDir); } - copyFile(entry.fileName, targetFileName, done); + function copyResource(entry, done) { + if (entry.directory) { + // ZIP up all directories, possibly with additional file prefixes + if (opts.verbose) { + console.log("Zipping: %s", entry.fileName); + } + ziputils.zipDirectory( + entry.fileName, + entry.zipEntryName, + function (err, zipBuf) { + if (err) { + return done(err); + } + + // write zipBuf -> file + var zipFileName = path.resolve(targetDir, entry.resourceName); + + if (opts.verbose) { + console.log("Writing zip file: %s", zipFileName); + } + fs.writeFile(zipFileName, zipBuf, done); + } + ); + } else { + // entry.file + var targetFileName = path.resolve(targetDir, entry.resourceName); + if (opts.verbose) { + console.log("copy %s %s", entry.fileName, targetDir); + } + copyFile(entry.fileName, targetFileName, done); + } } - } - async.each(entries, copyResource, cb); - }); + async.each(entries, copyResource, cb); + } + ); } function getDeploymentInfo(opts, request, done) { @@ -301,13 +342,22 @@ function getDeploymentInfo(opts, request, done) { try { ds = fs.statSync(opts.directory); } catch (e) { - done(new Error(util.format('Proxy base directory %s does not exist', - opts.directory))); + done( + new Error( + util.format("Proxy base directory %s does not exist", opts.directory) + ) + ); return; } if (!ds.isDirectory()) { - done(new Error(util.format('Proxy base directory %s is not a directory', - opts.directory))); + done( + new Error( + util.format( + "Proxy base directory %s is not a directory", + opts.directory + ) + ) + ); return; } @@ -316,130 +366,181 @@ function getDeploymentInfo(opts, request, done) { opts.main = path.relative(opts.directory, opts.main); } if (!fs.existsSync(path.join(opts.directory, opts.main))) { - done(new Error(util.format('Main script file %s does not seem to exist', opts.main))); + done( + new Error( + util.format("Main script file %s does not seem to exist", opts.main) + ) + ); return; } - if (path.dirname(opts.main) !== '.') { - done(new Error(util.format('Main script file %s must be in the top level directory', - opts.main))); - return; + if (path.dirname(opts.main) !== ".") { + done( + new Error( + util.format( + "Main script file %s must be in the top level directory", + opts.main + ) + ) + ); + return; } // Check out some specific parameters that aren't caught by the generic stuff opts.remoteNpm = DefaultResolveModules; - if (opts['upload-modules'] && (opts['upload-modules'] === true)) { + if (opts["upload-modules"] && opts["upload-modules"] === true) { opts.remoteNpm = false; } - if (opts['resolve-modules'] && (opts['resolve-modules'] === true)) { + if (opts["resolve-modules"] && opts["resolve-modules"] === true) { opts.remoteNpm = true; } if (opts.debug) { - console.log('Resolve NPM modules = %s', opts.remoteNpm); + console.log("Resolve NPM modules = %s", opts.remoteNpm); } // Find out which revision we should be creating - request.get(util.format('%s/v1/o/%s/apis/%s', - opts.baseuri, opts.organization, opts.api), - function(err, req, body) { + request.get( + util.format( + "%s/v1/o/%s/apis/%s", + opts.baseuri, + opts.organization, + opts.api + ), + function (err, req, body) { if (err) { done(err); } else if (req.statusCode === 404) { opts.deployNewApi = true; opts.deploymentVersion = 1; if (opts.verbose) { - console.log('API %s does not exist. Going to create revision 1', - opts.api); + console.log( + "API %s does not exist. Going to create revision 1", + opts.api + ); } done(); } else if (req.statusCode === 200) { // get the next revision opts.deploymentVersion = body.revision - .map(v => parseInt(v)) - .reduce((a, b) => ((a>b)?a:b), 0) + 1; + .map((v) => parseInt(v)) + .reduce((a, b) => (a > b ? a : b), 0) + 1; if (opts.verbose) { - console.log('Going to create revision %d of API %s', - opts.deploymentVersion, opts.api); + console.log( + "Going to create revision %d of API %s", + opts.deploymentVersion, + opts.api + ); } done(); } else { - done(new Error(util.format('Get API info returned status %d', req.statusCode))); + done( + new Error( + util.format("Get API info returned status %d", req.statusCode) + ) + ); } - }); + } + ); } // Create a target endpoint that references the Node.js script function createTarget(opts, request, done) { var targetDoc = mustache.render( '' + - '' + - '' + - '' + - 'node://{{main}}' + - '' + - '', opts); - - var uri = util.format('%s/v1/o/%s/apis/%s/revisions/%d/targets?name=default', - opts.baseuri, opts.organization, opts.api, - opts.deploymentVersion); + '' + + '' + + "" + + "node://{{main}}" + + "" + + "", + opts + ); + + var uri = util.format( + "%s/v1/o/%s/apis/%s/revisions/%d/targets?name=default", + opts.baseuri, + opts.organization, + opts.api, + opts.deploymentVersion + ); if (opts.verbose) { - console.log('Creating the target endpoint'); + console.log("Creating the target endpoint"); } - request({ - uri: uri, - method: 'POST', - json: false, - headers: { 'Content-Type': 'application/xml' }, - body: targetDoc - }, function(err, req, body) { - handleUploadResult(err, req, 'targets/default.xml', done); - }); + request( + { + uri: uri, + method: "POST", + json: false, + headers: { "Content-Type": "application/xml" }, + body: targetDoc + }, + function (err, req, body) { + handleUploadResult(err, req, "targets/default.xml", done); + } + ); } function runNpm(opts, request, done) { - if (!opts.remoteNpm && !opts['bundled-dependencies']) { + if (!opts.remoteNpm && !opts["bundled-dependencies"]) { done(); } else { if (opts.verbose) { - console.log('Running "npm install" at Apigee. This may take several minutes.'); + console.log( + 'Running "npm install" at Apigee. This may take several minutes.' + ); } - var installURI = util.format('%s/v1/o/%s/apis/%s/revisions/%d/npm?command=install', - opts.baseuri, opts.organization, opts.api, opts.deploymentVersion) + var installURI = util.format( + "%s/v1/o/%s/apis/%s/revisions/%d/npm?command=install", + opts.baseuri, + opts.organization, + opts.api, + opts.deploymentVersion + ); - if (opts.production === 'false') { - installURI = util.format("%s&production=false", installURI) + if (opts.production === "false") { + installURI = util.format("%s&production=false", installURI); } if (opts.debug) { - installURI = util.format("%s&verbose=true", installURI) + installURI = util.format("%s&verbose=true", installURI); } - request({ - uri: installURI, - method: 'POST', - headers: { - 'Accept': 'text/plain' + request( + { + uri: installURI, + method: "POST", + headers: { + Accept: "text/plain" + }, + json: false }, - json: false - }, function(err, req, body) { - if (err) { - done(err); - } else if (req.statusCode === 200) { - if (opts.verbose) { - console.log('NPM complete.'); - console.log(body); - } - done(); - } else { - if (opts.verbose) { - console.log('NPM failed with %d', req.statusCode); - console.log(body); + function (err, req, body) { + if (err) { + done(err); + } else if (req.statusCode === 200) { + if (opts.verbose) { + console.log("NPM complete."); + console.log(body); + } + done(); + } else { + if (opts.verbose) { + console.log("NPM failed with %d", req.statusCode); + console.log(body); + } + done( + new Error( + util.format( + "NPM install failed with status code %d", + req.statusCode + ) + ) + ); } - done(new Error(util.format('NPM install failed with status code %d', req.statusCode))); } - }); + ); } } diff --git a/lib/commands/deployproxy.js b/lib/commands/deployProxy.js similarity index 99% rename from lib/commands/deployproxy.js rename to lib/commands/deployProxy.js index 64e90ed..efe56c2 100644 --- a/lib/commands/deployproxy.js +++ b/lib/commands/deployProxy.js @@ -12,7 +12,7 @@ var defaults = require('../defaults'); var fsutils = require('../fsutils'); var options = require('../options'); var ziputils = require('../ziputils'); -var parseDeployments = require('./parsedeployments'); +var parseDeployments = require('./parseDeployments'); var usePackedSource = require('../deploycommon').usePackedSource; var uploadSource = require('../deploycommon').uploadSource; var cleanResults = require('../utils').cleanResults; diff --git a/lib/commands/deploySharedflow.js b/lib/commands/deploySharedflow.js new file mode 100644 index 0000000..2e85476 --- /dev/null +++ b/lib/commands/deploySharedflow.js @@ -0,0 +1,632 @@ +/* jshint node: true */ +"use strict"; + +const util = require("util"), + path = require("path"), + async = require("async"), + fs = require("fs"), + mustache = require("mustache"); + +const defaults = require("../defaults"), + fsutils = require("../fsutils"), + options = require("../options"), + ziputils = require("../ziputils"), + parseDeployments = require("./parseDeployments"); + +const SharedFlowBase = "sharedflowbundle", + XmlExp = /(.+)\.xml$/i, + DeploymentDelay = 60; + +var descriptor = defaults.defaultDescriptor({ + name: { + name: "SharedFlow Name", + shortOption: "n", + required: true + }, + environments: { + name: "Environments", + shortOption: "e", + required: true + }, + directory: { + name: "Directory", + shortOption: "d", + required: false + }, + "import-only": { + name: "Import Only", + shortOption: "i", + toggle: true + } +}); +module.exports.descriptor = descriptor; + +module.exports.format = function (r) { + var result = ""; + r.forEach(function (e) { + result = result + parseDeployments.formatDeployment(e); + }); + return result; +}; + +module.exports.run = function (opts, cb) { + if (!opts.directory) { + opts.directory = process.cwd(); + } + options.validateSync(opts, descriptor); + if (opts.debug) { + console.log("deploysharedflow: %j", opts); + } + var request = defaults.defaultRequest(opts); + + // Run each function in series, and collect an array of results. + async.series( + [ + function (done) { + getDeploymentInfo(opts, request, done); + }, + function (done) { + createSharedFlowBundle(opts, request, done); + }, + function (done) { + uploadResources(opts, request, done); + }, + function (done) { + uploadPolicies(opts, request, done); + }, + function (done) { + uploadSharedFlows(opts, request, done); + }, + function (done) { + deploySharedFlow(opts, request, done); + } + ], + function (err, results) { + if (err) { + return cb(err); + } + if (opts.debug) { + console.log("results: %j", results); + } + + async.map( + Object.values(results[results.length - 1]), + function (result, cb) { + if (opts.debug) { + console.log("result: %j", result); + } + + var deployment = parseDeployments.parseDeploymentResult(result); // FIXME SF deployment would be different + if (deployment) { + // Look up the deployed URI for user-friendliness + parseDeployments.getPathInfo([deployment], opts, function (err) { + // Ignore this error because deployment worked + if (err && opts.verbose) { + console.log("Error looking up deployed path: %s", err); + } + cb(undefined, deployment); + }); + } else { + // Probably import-only -- do nothing + cb(undefined, {}); + } + }, + cb + ); + } + ); +}; + +function getDeploymentInfo(opts, request, done) { + // Find out if the root directory is a directory + var ds; + try { + ds = fs.statSync(path.join(opts.directory, SharedFlowBase)); + } catch (e) { + done( + new Error( + util.format( + "SharedFlow base directory %s does not exist", + opts.directory + ) + ) + ); + return; + } + if (!ds.isDirectory()) { + done( + new Error( + util.format( + "SharedFlow base directory %s is not a directory", + opts.directory + ) + ) + ); + return; + } + + // Find out which revision we should be creating + request.get( + util.format( + "%s/v1/o/%s/sharedflows/%s", + opts.baseuri, + opts.organization, + opts.name + ), + function (err, req, body) { + if (err) { + done(err); + } else if (req.statusCode === 404) { + opts.deployNewApi = true; + opts.deploymentVersion = 1; + if (opts.verbose) { + console.log( + "SharedFlow %s does not exist. Going to create revision 1", + opts.name + ); + } + done(); + } else if (req.statusCode === 200) { + // get the next revision + opts.deploymentVersion = + body.revision + .map((v) => parseInt(v)) + .reduce((a, b) => (a > b ? a : b), 0) + 1; + + if (opts.verbose) { + console.log( + "Going to create revision %d of SharedFlow %s", + opts.deploymentVersion, + opts.name + ); + } + done(); + } else { + done( + new Error( + util.format( + "Get SharedFlow info returned status %d", + req.statusCode + ) + ) + ); + } + } + ); +} + +function createSharedFlowBundle(opts, request, done) { + // Is there a single XML file in the root directory? + // If not, then create one + var rootDoc; + var rootEntryName; + + var pd = path.join(opts.directory, SharedFlowBase); + var topFiles = fsutils.readdirSyncFilesOnly(pd); + if (topFiles.length === 1) { + var fn = path.join(pd, topFiles[0]); + rootEntryName = topFiles[0]; + if (opts.verbose) { + console.log("Using %s as the root file", fn); + } + rootDoc = fs.readFileSync(fn); + } else { + rootEntryName = opts.name + ".xml"; + rootDoc = mustache.render('', opts); + } + + var uri = util.format( + "%s/v1/o/%s/sharedflows?action=import&validate=false&name=%s", + opts.baseuri, + opts.organization, + opts.name + ); + if (opts.debug) { + console.log("Calling %s", uri); + } + if (opts.verbose) { + console.log( + "Creating revision %d of SharedFlow %s", + opts.deploymentVersion, + opts.name + ); + } + + ziputils + .makeOneFileZip(SharedFlowBase, rootEntryName, rootDoc) + .then((zipBuf) => { + // For debugging + //fs.writeFileSync('./test.zip', zipBuf); + request( + { + uri: uri, + headers: { "Content-Type": "application/octet-stream" }, + json: false, + method: "POST", + body: zipBuf + }, + function (err, req, body) { + sharedFlowCreationDone(err, req, body, opts, done); + } + ); + }); +} + +function sharedFlowCreationDone(err, req, body, opts, done) { + if (err) { + done(err); + } else if (req.statusCode === 200 || req.statusCode === 201) { + done(); + } else { + if (opts.verbose) { + console.error("SharedFlowBundle creation error:", body); + } + done( + new Error( + util.format( + "SharedFlowBundle creation failed. Status code %d", + req.statusCode + ) + ) + ); + } +} + +function uploadResources(opts, request, done) { + var resBaseDir = path.join(opts.directory, SharedFlowBase, "resources"); + // Produce a list of entries to either ZIP or upload. + var entries; + try { + entries = ziputils.enumerateResourceDirectory(resBaseDir, opts.remoteNpm); + } catch (e) { + if (e.code === "ENOENT") { + if (opts.verbose) { + console.error("No resources found"); + } + done(); + } else { + done(e); + } + return; + } + + async.eachLimit( + entries, + opts.asynclimit, + function (entry, entryDone) { + var uri = util.format( + "%s/v1/o/%s/sharedflows/%s/revisions/%d/resources?type=%s&name=%s", + opts.baseuri, + opts.organization, + opts.name, + opts.deploymentVersion, + entry.resourceType, + entry.resourceName + ); + if (entry.directory) { + // ZIP up all directories, possibly with additional file prefixes + ziputils.zipDirectory( + entry.fileName, + entry.zipEntryName, + function (err, zipBuf) { + if (err) { + console.log(err); + entryDone(err); + } else { + if (opts.verbose) { + console.log( + "Uploading %s resource %s", + entry.resourceType, + entry.resourceName + ); + } + request( + { + uri: uri, + method: "POST", + json: false, + headers: { "Content-Type": "application/octet-stream" }, + body: zipBuf + }, + function (err, req, body) { + handleUploadResult(err, req, entryDone); + } + ); + } + } + ); + } else { + if (opts.verbose) { + console.log( + "Uploading %s resource %s", + entry.resourceType, + entry.resourceName + ); + } + var httpReq = request( + { + uri: uri, + method: "POST", + json: false, + headers: { "Content-Type": "application/octet-stream" } + }, + function (err, req, body) { + handleUploadResult(err, req, entryDone); + } + ); + + var fileStream = fs.createReadStream(entry.fileName); + fileStream.pipe(httpReq); + } + }, + function (err) { + done(err); + } + ); +} + +function handleUploadResult(err, req, itemDone) { + if (err) { + itemDone(err); + } else if (req.statusCode === 200 || req.statusCode === 201) { + itemDone(); + } else { + itemDone( + new Error(util.format("Error uploading resource: %d", req.statusCode)) + ); + } +} + +function uploadPolicies(opts, request, done) { + var baseDir = path.join(opts.directory, SharedFlowBase, "policies"); + var fileNames; + try { + fileNames = fs.readdirSync(baseDir); + } catch (e) { + if (e.code === "ENOENT") { + if (opts.verbose) { + console.log("No policies found"); + } + done(); + } else { + done(e); + } + return; + } + + async.eachLimit( + fileNames, + opts.asynclimit, + function (fileName, itemDone) { + var rp = path.join(baseDir, fileName); + var stat = fs.statSync(rp); + if (!XmlExp.test(fileName)) { + if (opts.verbose) { + console.log("Skipping file %s which is not an XML file", rp); + } + return itemDone(); + } + if (!stat.isFile()) { + if (opts.verbose) { + console.log("Skipping file %s which is not a regular file", rp); + } + return itemDone(); + } + + if (opts.verbose) { + console.log("Uploading policy %s", fileName); + } + var uri = util.format( + "%s/v1/o/%s/sharedflows/%s/revisions/%d/policies", + opts.baseuri, + opts.organization, + opts.name, + opts.deploymentVersion + ); + var postReq = request( + { + uri: uri, + headers: { "Content-Type": "application/xml" }, + json: false, + method: "POST" + }, + function (err, req, body) { + if (err) { + itemDone(err); + } else if (req.statusCode === 200 || req.statusCode === 201) { + itemDone(); + } else { + itemDone( + new Error( + util.format("Error uploading policy: %s", req.statusCode) + ) + ); + } + } + ); + + var rf = fs.createReadStream(rp); + rf.pipe(postReq); + }, + function (err) { + done(err); + } + ); +} + +function uploadSharedFlows(opts, request, done) { + var baseDir = path.join(opts.directory, SharedFlowBase, "sharedflows"); + var fileNames; + try { + fileNames = fs.readdirSync(baseDir); + } catch (e) { + if (e.code === "ENOENT") { + if (opts.verbose) { + console.log("No sharedflows found"); + } + done(); + } else { + done(e); + } + return; + } + + async.eachLimit( + fileNames, + opts.asynclimit, + function (fileName, itemDone) { + var rp = path.join(baseDir, fileName); + var stat = fs.statSync(rp); + var isXml = XmlExp.exec(fileName); + if (!isXml) { + if (opts.verbose) { + console.log("Skipping file %s which is not an XML file", rp); + } + return itemDone(); + } + if (!stat.isFile()) { + if (opts.verbose) { + console.log("Skipping file %s which is not a regular file", rp); + } + return itemDone(); + } + + if (opts.verbose) { + console.log("Uploading sharedflows %s", isXml[1]); + } + var uri = util.format( + "%s/v1/o/%s/sharedflows/%s/revisions/%d/sharedflows?name=%s", + opts.baseuri, + opts.organization, + opts.name, + opts.deploymentVersion, + isXml[1] + ); + var postReq = request( + { + uri: uri, + headers: { "Content-Type": "application/xml" }, + json: false, + method: "POST" + }, + function (err, req, body) { + if (err) { + itemDone(err); + } else if (req.statusCode === 200 || req.statusCode === 201) { + itemDone(); + } else { + itemDone( + new Error( + util.format("Error uploading sharedflow: %s", req.statusCode) + ) + ); + } + } + ); + + var rf = fs.createReadStream(rp); + rf.pipe(postReq); + }, + function (err) { + done(err); + } + ); +} + +function deploySharedFlow(opts, request, done) { + if (opts["import-only"]) { + if (opts.verbose) { + console.log("Not deploying the sharedflow right now"); + } + done(); + return; + } + + if (opts.verbose) { + console.log( + "Deploying revision %d of %s to %s", + opts.deploymentVersion, + opts.name, + opts.environments + ); + } + + var environments = opts.environments.split(","); + + function deployToEnvironment(environment, done) { + var uri = util.format( + "%s/v1/o/%s/e/%s/sharedflows/%s/revisions/%d/deployments", + opts.baseuri, + opts.organization, + environment, + opts.name, + opts.deploymentVersion + ); + if (opts.debug) { + console.log("Going to POST to %s", uri); + } + + var deployCmd = util.format( + "action=deploy&override=true&delay=%d", + DeploymentDelay + ); + if (opts["base-path"]) { + deployCmd = util.format("%s&basepath=%s", deployCmd, opts["base-path"]); + } + if (opts.debug) { + console.log("Going go send command %s", deployCmd); + } + + request( + { + uri: uri, + method: "POST", + json: false, + body: deployCmd, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json" + } + }, + function (err, req, body) { + if (err) { + return done(err); + } + + var jsonBody = body ? JSON.parse(body) : null; + + if (req.statusCode === 200) { + if (opts.verbose) { + console.log("Deployment on %s successful", environment); + } + if (opts.debug) { + console.log("%j", jsonBody); + } + return done(undefined, jsonBody); + } + + if (opts.verbose) { + console.error("Deployment on %s result: %j", environment, body); + } + var errMsg; + if (jsonBody && jsonBody.message) { + errMsg = jsonBody.message; + } else { + errMsg = util.format( + "Deployment on %s failed with status code %d", + environment, + req.statusCode + ); + } + done(new Error(errMsg)); + } + ); + } + + var tasks = {}; + environments.forEach(function (env) { + tasks[env] = deployToEnvironment.bind(this, env); + }); + + async.parallel(tasks, done); +} diff --git a/lib/commands/deploysharedflow.js b/lib/commands/deploysharedflow.js deleted file mode 100644 index d2bae2b..0000000 --- a/lib/commands/deploysharedflow.js +++ /dev/null @@ -1,508 +0,0 @@ -/* jshint node: true */ -'use strict'; - -const constants = require('constants'), - util = require('util'), - path = require('path'), - async = require('async'), - fs = require('fs'), - mustache = require('mustache'); - -const defaults = require('../defaults'), - fsutils = require('../fsutils'), - options = require('../options'), - ziputils = require('../ziputils'), - parseDeployments = require('./parsedeployments'); - -const SharedFlowBase = 'sharedflowbundle', - XmlExp = /(.+)\.xml$/i, - DeploymentDelay = 60; - -var descriptor = defaults.defaultDescriptor({ - name: { - name: 'SharedFlow Name', - shortOption: 'n', - required: true - }, - environments: { - name: 'Environments', - shortOption: 'e', - required: true - }, - directory: { - name: 'Directory', - shortOption: 'd', - required: false - }, - 'import-only': { - name: 'Import Only', - shortOption: 'i', - toggle: true - } -}); -module.exports.descriptor = descriptor; - -module.exports.format = function (r) { - var result = ''; - r.forEach(function (e) { - result = result + parseDeployments.formatDeployment(e); - }); - return result; -}; - -module.exports.run = function (opts, cb) { - if (!opts.directory) { - opts.directory = process.cwd(); - } - options.validateSync(opts, descriptor); - if (opts.debug) { - console.log('deploysharedflow: %j', opts); - } - var request = defaults.defaultRequest(opts); - - // Run each function in series, and collect an array of results. - async.series([ - function (done) { - getDeploymentInfo(opts, request, done); - }, - function (done) { - createSharedFlowBundle(opts, request, done); - }, - function (done) { - uploadResources(opts, request, done); - }, - function (done) { - uploadPolicies(opts, request, done); - }, - function (done) { - uploadSharedFlows(opts, request, done); - }, - function (done) { - deploySharedFlow(opts, request, done); - } - ], - function (err, results) { - if (err) { - return cb(err); - } - if (opts.debug) { - console.log('results: %j', results); - } - - async.map(Object.values(results[results.length - 1]), - function (result, cb) { - - if (opts.debug) { - console.log('result: %j', result); - } - - var deployment = parseDeployments.parseDeploymentResult(result); // FIXME SF deployment would be different - if (deployment) { - // Look up the deployed URI for user-friendliness - parseDeployments.getPathInfo([deployment], opts, function (err) { - // Ignore this error because deployment worked - if (err && opts.verbose) { - console.log('Error looking up deployed path: %s', err); - } - cb(undefined, deployment); - - }); - } else { - // Probably import-only -- do nothing - cb(undefined, {}); - } - }, - cb); - }); -}; - -function getDeploymentInfo(opts, request, done) { - // Find out if the root directory is a directory - var ds; - try { - ds = fs.statSync(path.join(opts.directory, SharedFlowBase)); - } catch (e) { - done(new Error(util.format('SharedFlow base directory %s does not exist', - opts.directory))); - return; - } - if (!ds.isDirectory()) { - done(new Error(util.format('SharedFlow base directory %s is not a directory', - opts.directory))); - return; - } - - // Find out which revision we should be creating - request.get(util.format('%s/v1/o/%s/sharedflows/%s', - opts.baseuri, opts.organization, opts.name), - function (err, req, body) { - if (err) { - done(err); - } else if (req.statusCode === 404) { - opts.deployNewApi = true; - opts.deploymentVersion = 1; - if (opts.verbose) { - console.log('SharedFlow %s does not exist. Going to create revision 1', - opts.name); - } - done(); - } else if (req.statusCode === 200) { - // get the next revision - opts.deploymentVersion = - body.revision - .map(v => parseInt(v)) - .reduce((a, b) => ((a>b)?a:b), 0) + 1; - - if (opts.verbose) { - console.log('Going to create revision %d of SharedFlow %s', - opts.deploymentVersion, opts.name); - } - done(); - } else { - done(new Error(util.format('Get SharedFlow info returned status %d', req.statusCode))); - } - }); -} - -function createSharedFlowBundle(opts, request, done) { - // Is there a single XML file in the root directory? - // If not, then create one - var rootDoc; - var rootEntryName; - - var pd = path.join(opts.directory, SharedFlowBase); - var topFiles = fsutils.readdirSyncFilesOnly(pd); - if (topFiles.length === 1) { - var fn = path.join(pd, topFiles[0]); - rootEntryName = topFiles[0]; - if (opts.verbose) { - console.log('Using %s as the root file', fn); - } - rootDoc = fs.readFileSync(fn); - } else { - rootEntryName = opts.name + '.xml'; - rootDoc = mustache.render('', opts); - } - - var uri = util.format('%s/v1/o/%s/sharedflows?action=import&validate=false&name=%s', - opts.baseuri, opts.organization, opts.name); - if (opts.debug) { - console.log('Calling %s', uri); - } - if (opts.verbose) { - console.log('Creating revision %d of SharedFlow %s', opts.deploymentVersion, - opts.name); - } - - ziputils.makeOneFileZip(SharedFlowBase, rootEntryName, rootDoc) - .then(zipBuf => { - // For debugging - //fs.writeFileSync('./test.zip', zipBuf); - request({ - uri: uri, - headers: {'Content-Type': 'application/octet-stream'}, - json: false, - method: 'POST', - body: zipBuf - }, function (err, req, body) { - sharedFlowCreationDone(err, req, body, opts, done); - }); - }); -} - -function sharedFlowCreationDone(err, req, body, opts, done) { - if (err) { - done(err); - } else if ((req.statusCode === 200) || (req.statusCode === 201)) { - done(); - } else { - if (opts.verbose) { - console.error('SharedFlowBundle creation error:', body); - } - done(new Error(util.format('SharedFlowBundle creation failed. Status code %d', - req.statusCode))); - } -} - -function uploadResources(opts, request, done) { - var resBaseDir = path.join(opts.directory, SharedFlowBase, 'resources'); - // Produce a list of entries to either ZIP or upload. - var entries; - try { - entries = ziputils.enumerateResourceDirectory(resBaseDir, opts.remoteNpm); - } catch (e) { - if (e.code === 'ENOENT') { - if (opts.verbose) { - console.error('No resources found'); - } - done(); - } else { - done(e); - } - return; - } - - async.eachLimit(entries, opts.asynclimit, function (entry, entryDone) { - var uri = - util.format('%s/v1/o/%s/sharedflows/%s/revisions/%d/resources?type=%s&name=%s', - opts.baseuri, opts.organization, opts.name, - opts.deploymentVersion, entry.resourceType, entry.resourceName); - if (entry.directory) { - // ZIP up all directories, possibly with additional file prefixes - ziputils.zipDirectory(entry.fileName, entry.zipEntryName, function (err, zipBuf) { - if (err) { - console.log(err); - entryDone(err); - } else { - if (opts.verbose) { - console.log('Uploading %s resource %s', entry.resourceType, entry.resourceName); - } - request({ - uri: uri, - method: 'POST', - json: false, - headers: {'Content-Type': 'application/octet-stream'}, - body: zipBuf - }, function (err, req, body) { - handleUploadResult(err, req, entryDone); - }); - } - }); - - } else { - if (opts.verbose) { - console.log('Uploading %s resource %s', entry.resourceType, entry.resourceName); - } - var httpReq = request({ - uri: uri, - method: 'POST', - json: false, - headers: {'Content-Type': 'application/octet-stream'} - }, function (err, req, body) { - handleUploadResult(err, req, entryDone); - }); - - var fileStream = fs.createReadStream(entry.fileName); - fileStream.pipe(httpReq); - } - }, function (err) { - done(err); - }); -} - -function handleUploadResult(err, req, itemDone) { - if (err) { - itemDone(err); - } else if ((req.statusCode === 200) || (req.statusCode === 201)) { - itemDone(); - } else { - itemDone(new Error(util.format('Error uploading resource: %d', - req.statusCode))); - } -} - -function uploadPolicies(opts, request, done) { - var baseDir = path.join(opts.directory, SharedFlowBase, 'policies'); - var fileNames; - try { - fileNames = fs.readdirSync(baseDir); - } catch (e) { - if (e.code === 'ENOENT') { - if (opts.verbose) { - console.log('No policies found'); - } - done(); - } else { - done(e); - } - return; - } - - async.eachLimit(fileNames, opts.asynclimit, function (fileName, itemDone) { - var rp = path.join(baseDir, fileName); - var stat = fs.statSync(rp); - if (!XmlExp.test(fileName)) { - if (opts.verbose) { - console.log('Skipping file %s which is not an XML file', rp); - } - return itemDone(); - } - if (!stat.isFile()) { - if (opts.verbose) { - console.log('Skipping file %s which is not a regular file', rp); - } - return itemDone(); - } - - if (opts.verbose) { - console.log('Uploading policy %s', fileName); - } - var uri = util.format('%s/v1/o/%s/sharedflows/%s/revisions/%d/policies', - opts.baseuri, opts.organization, opts.name, - opts.deploymentVersion); - var postReq = request({ - uri: uri, - headers: {'Content-Type': 'application/xml'}, - json: false, - method: 'POST' - }, function (err, req, body) { - if (err) { - itemDone(err); - } else if ((req.statusCode === 200) || (req.statusCode === 201)) { - itemDone(); - } else { - itemDone(new Error(util.format('Error uploading policy: %s', - req.statusCode))); - } - }); - - var rf = fs.createReadStream(rp); - rf.pipe(postReq); - - }, function (err) { - done(err); - }); -} - -function uploadSharedFlows(opts, request, done) { - var baseDir = path.join(opts.directory, SharedFlowBase, 'sharedflows'); - var fileNames; - try { - fileNames = fs.readdirSync(baseDir); - } catch (e) { - if (e.code === 'ENOENT') { - if (opts.verbose) { - console.log('No sharedflows found'); - } - done(); - } else { - done(e); - } - return; - } - - async.eachLimit(fileNames, opts.asynclimit, function (fileName, itemDone) { - var rp = path.join(baseDir, fileName); - var stat = fs.statSync(rp); - var isXml = XmlExp.exec(fileName); - if (!isXml) { - if (opts.verbose) { - console.log('Skipping file %s which is not an XML file', rp); - } - return itemDone(); - } - if (!stat.isFile()) { - if (opts.verbose) { - console.log('Skipping file %s which is not a regular file', rp); - } - return itemDone(); - } - - if (opts.verbose) { - console.log('Uploading sharedflows %s', isXml[1]); - } - var uri = util.format('%s/v1/o/%s/sharedflows/%s/revisions/%d/sharedflows?name=%s', - opts.baseuri, opts.organization, opts.name, - opts.deploymentVersion, isXml[1]); - var postReq = request({ - uri: uri, - headers: {'Content-Type': 'application/xml'}, - json: false, - method: 'POST' - }, function (err, req, body) { - if (err) { - itemDone(err); - } else if ((req.statusCode === 200) || (req.statusCode === 201)) { - itemDone(); - } else { - itemDone(new Error(util.format('Error uploading sharedflow: %s', - req.statusCode))); - } - }); - - var rf = fs.createReadStream(rp); - rf.pipe(postReq); - - }, function (err) { - done(err); - }); -} - -function deploySharedFlow(opts, request, done) { - if (opts['import-only']) { - if (opts.verbose) { - console.log('Not deploying the sharedflow right now'); - } - done(); - return; - } - - if (opts.verbose) { - console.log('Deploying revision %d of %s to %s', opts.deploymentVersion, - opts.name, opts.environments); - } - - var environments = opts.environments.split(','); - - function deployToEnvironment(environment, done) { - - var uri = util.format('%s/v1/o/%s/e/%s/sharedflows/%s/revisions/%d/deployments', - opts.baseuri, opts.organization, environment, opts.name, opts.deploymentVersion); - if (opts.debug) { - console.log('Going to POST to %s', uri); - } - - var deployCmd = util.format('action=deploy&override=true&delay=%d', DeploymentDelay); - if (opts['base-path']) { - deployCmd = util.format('%s&basepath=%s', deployCmd, opts['base-path']); - } - if (opts.debug) { - console.log('Going go send command %s', deployCmd); - } - - request({ - uri: uri, - method: 'POST', - json: false, - body: deployCmd, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json' - } - }, function (err, req, body) { - if (err) { - return done(err); - } - - var jsonBody = (body ? JSON.parse(body) : null); - - if (req.statusCode === 200) { - if (opts.verbose) { - console.log('Deployment on %s successful', environment); - } - if (opts.debug) { - console.log('%j', jsonBody); - } - return done(undefined, jsonBody); - } - - if (opts.verbose) { - console.error('Deployment on %s result: %j', environment, body); - } - var errMsg; - if (jsonBody && (jsonBody.message)) { - errMsg = jsonBody.message; - } else { - errMsg = util.format('Deployment on %s failed with status code %d', environment, req.statusCode); - } - done(new Error(errMsg)); - }); - } - - var tasks = {}; - environments.forEach(function (env) { - tasks[env] = deployToEnvironment.bind(this, env); - }); - - async.parallel(tasks, done); -} diff --git a/lib/commands/detachFlowHook.js b/lib/commands/detachFlowHook.js index 197094c..0ac4ee7 100644 --- a/lib/commands/detachFlowHook.js +++ b/lib/commands/detachFlowHook.js @@ -1,20 +1,20 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: true, prompt: true }, flowHookName: { - name: 'One of: PreProxyFlowHook\n PreTargetFlowHook\n PostTargetFlowHook\n PostProxyFlowHook', + name: "One of: PreProxyFlowHook\n PreTargetFlowHook\n PostTargetFlowHook\n PostProxyFlowHook", required: true, prompt: true } @@ -22,17 +22,23 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('detachFlowHook: %j', opts); + console.log("detachFlowHook: %j", opts); } - let uri = util.format('%s/v1/o/%s/e/%s/flowhooks/%s', - opts.baseuri, opts.organization, opts.environment, opts.flowHookName); + let uri = util.format( + "%s/v1/o/%s/e/%s/flowhooks/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.flowHookName + ); let requestOpts = { - uri, - method:'DELETE', - json:true - }; - command_utils.run('detachFlowHook',opts, requestOpts, cb); + uri, + method: "DELETE", + json: true + }; + command_utils.run("detachFlowHook", opts, requestOpts, cb); }; diff --git a/lib/commands/fetchproxy.js b/lib/commands/fetchProxy.js similarity index 89% rename from lib/commands/fetchproxy.js rename to lib/commands/fetchProxy.js index 2c3615a..7cee019 100644 --- a/lib/commands/fetchproxy.js +++ b/lib/commands/fetchProxy.js @@ -1,13 +1,10 @@ /* jshint node: true */ 'use strict'; -var fs = require('fs'); -var request = require('postman-request'); -var util = require('util'); - -var defaults = require('../defaults'); -var options = require('../options'); -var parseDeployments = require('./parsedeployments'); +const fs = require('fs'), + util = require('util'), + defaults = require('../defaults'), + options = require('../options'); var descriptor = defaults.defaultDescriptor({ api: { diff --git a/lib/commands/fetchSharedflow.js b/lib/commands/fetchSharedflow.js new file mode 100644 index 0000000..57d2e75 --- /dev/null +++ b/lib/commands/fetchSharedflow.js @@ -0,0 +1,106 @@ +/* jshint node: true */ +"use strict"; + +const fs = require("fs"), + util = require("util"), + defaults = require("../defaults"), + options = require("../options"); + +// FIXME: If you specify both org and env, org becomes env +var descriptor = defaults.defaultDescriptor({ + name: { + name: "Shared Flow Name", + shortOption: "n", + required: true + }, + revision: { + name: "Revision", + shortOption: "r", + required: true + }, + file: { + name: "fileName", + shortOption: "f" + } +}); + +module.exports.descriptor = descriptor; + +module.exports.run = function (opts, cb) { + var uri; + + options.validateSync(opts, descriptor); + if (opts.debug) { + console.log("fetchSharedFlow: %j", opts); + } + + if (opts.name && opts.revision) { + uri = util.format( + "%s/v1/o/%s/sharedflows/%s/revisions/%s?format=bundle", + opts.baseuri, + opts.organization, + opts.name, + opts.revision + ); + } else { + cb( + new Error( + "org, sharedflow name, and revision must all be specified! " + + JSON.stringify(opts) + ) + ); + return; + } + + // Call the standard "deployments" API to get the list of what's deployed + var request = defaults.defaultRequest(opts); + if (opts.debug) { + console.log('Going to invoke "%s"', uri); + } + + //let's default to apiname.zip for the file to save + var f = opts.file ? opts.file : opts.name + ".zip"; + + request.get({ uri: uri, encoding: "binary" }, function (err, res, body) { + if (err) { + cb(err); + } else { + if (opts.debug) { + console.log( + "Received: " + + res.statusCode + + " the following headers: " + + JSON.stringify(res.headers) + ); + } + if (res.statusCode !== 200) { + cb( + new Error( + util.format( + "Received error %d when fetching shared flow: %s", + res.statusCode, + body + ) + ) + ); + } else { + fs.writeFile(f, body, "binary", function (err) { + if (err) { + console.log("Failed to write file: " + f); + console.log("Error text: " + err); + cb(err); + } else { + if (opts.verbose) { + console.log("Save file: " + f); + } + let responseBody = { + status: res.statusCode, + filename: f + }; + cb(undefined, responseBody); + } + }); + } + } + }); +}; diff --git a/lib/commands/fetchsharedflow.js b/lib/commands/fetchsharedflow.js deleted file mode 100644 index 20cccc3..0000000 --- a/lib/commands/fetchsharedflow.js +++ /dev/null @@ -1,85 +0,0 @@ -/* jshint node: true */ -'use strict'; - -const fs = require('fs'), - request = require('postman-request'), - util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); - -// FIXME: If you specify both org and env, org becomes env -var descriptor = defaults.defaultDescriptor({ - name: { - name: 'Shared Flow Name', - shortOption: 'n', - required: true - }, - revision: { - name: 'Revision', - shortOption: 'r', - required: true - }, - file: { - name: 'fileName', - shortOption: 'f' - } -}); - -module.exports.descriptor = descriptor; - -module.exports.run = function (opts, cb) { - var uri; - - options.validateSync(opts, descriptor); - if (opts.debug) { - console.log('fetchSharedFlow: %j', opts); - } - - if (opts.name && opts.revision) { - uri = util.format('%s/v1/o/%s/sharedflows/%s/revisions/%s?format=bundle', - opts.baseuri, opts.organization, opts.name, opts.revision); - } else { - cb(new Error('org, sharedflow name, and revision must all be specified! ' + JSON.stringify(opts))); - return; - } - - // Call the standard "deployments" API to get the list of what's deployed - var request = defaults.defaultRequest(opts); - if (opts.debug) { - console.log('Going to invoke "%s"', uri); - } - - //let's default to apiname.zip for the file to save - var f = (opts.file) ? opts.file : opts.name + '.zip'; - - request.get({uri: uri, encoding: 'binary'}, function (err, res, body) { - if (err) { - cb(err); - } else { - if (opts.debug) { - console.log('Received: ' + res.statusCode + ' the following headers: ' + JSON.stringify(res.headers)); - } - if (res.statusCode !== 200) { - cb(new Error(util.format('Received error %d when fetching shared flow: %s', - res.statusCode, body))); - } else { - fs.writeFile(f, body, 'binary', function (err) { - if (err) { - console.log("Failed to write file: " + f); - console.log("Error text: " + err); - cb(err); - } - else { - if (opts.verbose) { console.log('Save file: ' + f); } - let responseBody = { - status: res.statusCode, - filename: f - }; - cb(undefined, responseBody); - } - }); - } - } - }); -}; diff --git a/lib/commands/getCache.js b/lib/commands/getCache.js index 9ac4660..6bd0ff0 100644 --- a/lib/commands/getCache.js +++ b/lib/commands/getCache.js @@ -1,5 +1,6 @@ const util = require('util'), defaults = require('../defaults'), + options = require('../options'), command_utils = require('./command-utils'); var descriptor = defaults.defaultDescriptor({ @@ -19,6 +20,7 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { console.log('getCache: %j', opts); } diff --git a/lib/commands/getFlowHook.js b/lib/commands/getFlowHook.js index 54b9258..ab28c42 100644 --- a/lib/commands/getFlowHook.js +++ b/lib/commands/getFlowHook.js @@ -1,20 +1,20 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: true, prompt: true }, flowHookName: { - name: 'One of: PreProxyFlowHook\n PreTargetFlowHook\n PostTargetFlowHook\n PostProxyFlowHook', + name: "One of: PreProxyFlowHook\n PreTargetFlowHook\n PostTargetFlowHook\n PostProxyFlowHook", required: true, prompt: true } @@ -22,19 +22,26 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('getFlowHook: %j', opts); + console.log("getFlowHook: %j", opts); } // if(opts.targetSSL){ // payload.sSLInfo = {enabled: true}; // } - let uri = util.format('%s/v1/o/%s/e/%s/flowhooks/%s', opts.baseuri, opts.organization, opts.environment, opts.flowHookName); + let uri = util.format( + "%s/v1/o/%s/e/%s/flowhooks/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.flowHookName + ); let requestOpts = { uri, - method:'GET', - json:true - }; - command_utils.run('getFlowHook', opts, requestOpts, cb); + method: "GET", + json: true + }; + command_utils.run("getFlowHook", opts, requestOpts, cb); }; diff --git a/lib/commands/getKVMentry.js b/lib/commands/getKVMentry.js index 7fc3e9a..eacb92b 100644 --- a/lib/commands/getKVMentry.js +++ b/lib/commands/getKVMentry.js @@ -1,55 +1,75 @@ /* jshint node: true */ -'use strict'; +"use strict"; -var util = require('util'); - -var defaults = require('../defaults'); -var command_utils = require('./command-utils') +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: false }, api: { - name: 'API', - shortOption: 'n', + name: "API", + shortOption: "n", required: false }, - mapName:{ - name:'Map Name', + mapName: { + name: "Map Name", required: true, prompt: true }, entryName: { - name:'Entry Name', + name: "Entry Name", required: true, prompt: true } - }); module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('getKVMentry: %j', opts); + console.log("getKVMentry: %j", opts); } - var uri = util.format('%s/v1/o/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.mapName, opts.entryName); - + var uri = util.format( + "%s/v1/o/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.mapName, + opts.entryName + ); + if (opts.api) { - uri = util.format('%s/v1/o/%s/apis/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.api, opts.mapName, opts.entryName); + uri = util.format( + "%s/v1/o/%s/apis/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.api, + opts.mapName, + opts.entryName + ); } if (opts.environment) { - uri = util.format('%s/v1/o/%s/e/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.environment, opts.mapName, opts.entryName); + uri = util.format( + "%s/v1/o/%s/e/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.mapName, + opts.entryName + ); } - var requestOpts = { - uri: uri, - method:'GET' - } - command_utils.run('getKVMentry',opts, requestOpts, cb) + var requestOpts = { + uri: uri, + method: "GET" + }; + command_utils.run("getKVMentry", opts, requestOpts, cb); }; diff --git a/lib/commands/getKVMmap.js b/lib/commands/getKVMmap.js new file mode 100644 index 0000000..c293312 --- /dev/null +++ b/lib/commands/getKVMmap.js @@ -0,0 +1,64 @@ +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); + +var descriptor = defaults.defaultDescriptor({ + environment: { + name: "Environment", + shortOption: "e", + required: false + }, + api: { + name: "API", + shortOption: "n", + required: false + }, + mapName: { + name: "Map Name", + required: true, + prompt: true + } +}); + +module.exports.descriptor = descriptor; + +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); + if (opts.debug) { + console.log("getKVMmap: %j", opts); + } + + let uri; + + if (opts.api) { + uri = util.format( + "%s/v1/o/%s/apis/%s/keyvaluemaps/%s", + opts.baseuri, + opts.organization, + opts.api, + opts.mapName + ); + } else if (opts.environment) { + uri = util.format( + "%s/v1/o/%s/e/%s/keyvaluemaps/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.mapName + ); + } else { + uri = util.format( + "%s/v1/o/%s/keyvaluemaps/%s", + opts.baseuri, + opts.organization, + opts.mapName + ); + } + + let requestOpts = { + uri, + method: "GET" + }; + command_utils.run("getkvmmap", opts, requestOpts, cb); +}; diff --git a/lib/commands/getRole.js b/lib/commands/getRole.js index f493c1c..06455c2 100644 --- a/lib/commands/getRole.js +++ b/lib/commands/getRole.js @@ -1,14 +1,14 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true } @@ -16,16 +16,21 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('getRole: %j', opts); + console.log("getRole: %j", opts); } - let uri = util.format('%s/v1/o/%s/userroles/%s', - opts.baseuri, opts.organization, opts.roleName); + let uri = util.format( + "%s/v1/o/%s/userroles/%s", + opts.baseuri, + opts.organization, + opts.roleName + ); let requestOptions = { - uri, - method:'GET', - json:true - }; - command_utils.run('getRole', opts, requestOptions, cb); + uri, + method: "GET", + json: true + }; + command_utils.run("getRole", opts, requestOptions, cb); }; diff --git a/lib/commands/getRolePermissions.js b/lib/commands/getRolePermissions.js index b161310..8b54cd3 100644 --- a/lib/commands/getRolePermissions.js +++ b/lib/commands/getRolePermissions.js @@ -1,14 +1,14 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true } @@ -16,16 +16,21 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('getRolePermissions: %j', opts); + console.log("getRolePermissions: %j", opts); } - let uri = util.format('%s/v1/o/%s/userroles/%s/permissions', - opts.baseuri, opts.organization, opts.roleName); + let uri = util.format( + "%s/v1/o/%s/userroles/%s/permissions", + opts.baseuri, + opts.organization, + opts.roleName + ); let requestOptions = { - uri, - method:'GET', - json:true - }; - command_utils.run('getRolePermissions', opts, requestOptions, cb); + uri, + method: "GET", + json: true + }; + command_utils.run("getRolePermissions", opts, requestOptions, cb); }; diff --git a/lib/commands/getTargetServer.js b/lib/commands/getTargetServer.js index 61e15ad..34dbc1e 100644 --- a/lib/commands/getTargetServer.js +++ b/lib/commands/getTargetServer.js @@ -1,5 +1,6 @@ const util = require('util'), defaults = require('../defaults'), + options = require('../options'), command_utils = require('./command-utils'); var descriptor = defaults.defaultDescriptor({ @@ -20,6 +21,7 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { console.log('getTargetServer: %j', opts); } diff --git a/lib/commands/getkvmmap.js b/lib/commands/getkvmmap.js deleted file mode 100644 index b26d50d..0000000 --- a/lib/commands/getkvmmap.js +++ /dev/null @@ -1,47 +0,0 @@ -const util = require('util'), - defaults = require('../defaults'), - command_utils = require('./command-utils'); - -var descriptor = defaults.defaultDescriptor({ - environment: { - name: 'Environment', - shortOption: 'e', - required: false - }, - api: { - name: 'API', - shortOption: 'n', - required: false - }, - mapName:{ - name:'Map Name', - required: true, - prompt: true - } -}); - -module.exports.descriptor = descriptor; - -module.exports.run = function(opts, cb) { - if (opts.debug) { - console.log('getkvmmap: %j', opts); - } - - let uri; - - if (opts.api) { - uri = util.format('%s/v1/o/%s/apis/%s/keyvaluemaps/%s', opts.baseuri, opts.organization, opts.api, opts.mapName); - } - else if (opts.environment) { - uri = util.format('%s/v1/o/%s/e/%s/keyvaluemaps/%s', opts.baseuri, opts.organization, opts.environment, opts.mapName); - } - else { - uri = util.format('%s/v1/o/%s/keyvaluemaps/%s', opts.baseuri, opts.organization, opts.mapName); - } - - let requestOpts = { - uri, - method:'GET' - }; - command_utils.run('getkvmmap', opts, requestOpts, cb); -}; diff --git a/lib/commands/listCaches.js b/lib/commands/listCaches.js index 40c0888..28f076a 100644 --- a/lib/commands/listCaches.js +++ b/lib/commands/listCaches.js @@ -1,11 +1,12 @@ -const util = require('util'), - defaults = require('../defaults'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: true, prompt: true } @@ -13,16 +14,21 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('listCaches: %j', opts); + console.log("listCaches: %j", opts); } - var uri = util.format('%s/v1/o/%s/e/%s/caches', - opts.baseuri, opts.organization, opts.environment); + var uri = util.format( + "%s/v1/o/%s/e/%s/caches", + opts.baseuri, + opts.organization, + opts.environment + ); let requestOptions = { - uri, - method: 'GET', - json: true - }; - command_utils.run('listCaches', opts, requestOptions, cb); + uri, + method: "GET", + json: true + }; + command_utils.run("listCaches", opts, requestOptions, cb); }; diff --git a/lib/commands/listDeployments.js b/lib/commands/listDeployments.js index e552eed..eecd382 100644 --- a/lib/commands/listDeployments.js +++ b/lib/commands/listDeployments.js @@ -1,55 +1,62 @@ -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + parseDeployments = require("./parseDeployments"); var descriptor = defaults.defaultDescriptor({ api: { - name: 'API Name', - shortOption: 'n' + name: "API Name", + shortOption: "n" }, environment: { - name: 'Environment', - shortOption: 'e' + name: "Environment", + shortOption: "e" }, revision: { - name: 'Revision', - shortOption: 'r' + name: "Revision", + shortOption: "r" }, long: { - name: 'Long', - shortOption: 'l', + name: "Long", + shortOption: "l", toggle: true } }); module.exports.descriptor = descriptor; -module.exports.format = function(r) { - return r.deployments.map( d => parseDeployments.formatDeployment(d)) - .join('\n'); +module.exports.format = function (r) { + return r.deployments + .map((d) => parseDeployments.formatDeployment(d)) + .join("\n"); }; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { var uri; var parser; options.validateSync(opts, descriptor); if (opts.debug) { - console.log('listdeployments: %j', opts); + console.log("listdeployments: %j", opts); } if (opts.api && !opts.environment) { - uri = util.format('%s/v1/o/%s/apis/%s/deployments', - opts.baseuri, opts.organization, opts.api); + uri = util.format( + "%s/v1/o/%s/apis/%s/deployments", + opts.baseuri, + opts.organization, + opts.api + ); parser = parseAPIBody; - } else if (opts.environment && !opts.api) { - uri = util.format('%s/v1/o/%s/e/%s/deployments', - opts.baseuri, opts.organization, opts.environment); + uri = util.format( + "%s/v1/o/%s/e/%s/deployments", + opts.baseuri, + opts.organization, + opts.environment + ); parser = parseEnvironmentBody; - } else if (opts.environment && opts.api) { - cb(new Error('Can\'t specify both API and environment options')); + cb(new Error("Can't specify both API and environment options")); return; } else { cb(new Error('Either "api" or "environment" must be specified')); @@ -61,27 +68,31 @@ module.exports.run = function(opts, cb) { if (opts.debug) { console.log('Going to invoke "%s"', uri); } - request.get(uri, function(err, req, body) { + request.get(uri, function (err, req, body) { if (err) { cb(err); } else { if (req.statusCode === 200) { if (opts.debug) { - console.log('List of deployed APIs: %j', body); + console.log("List of deployed APIs: %j", body); } var result = parser(body); if (opts.long) { - parseDeployments.getPathInfo(result.deployments, opts, function(err) { - cb(err, result); - }); + parseDeployments.getPathInfo( + result.deployments, + opts, + function (err) { + cb(err, result); + } + ); } else { if (opts.debug) { - console.log('All done'); + console.log("All done"); } cb(undefined, result); } } else { - cb(new Error(util.format('HTTP error %d', req.statusCode))); + cb(new Error(util.format("HTTP error %d", req.statusCode))); } } }); diff --git a/lib/commands/listProxies.js b/lib/commands/listProxies.js index aaac52b..f0b5894 100644 --- a/lib/commands/listProxies.js +++ b/lib/commands/listProxies.js @@ -1,41 +1,40 @@ -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"); -const descriptor = defaults.defaultDescriptor({ }); +const descriptor = defaults.defaultDescriptor({}); module.exports.descriptor = descriptor; -module.exports.format = function(r) { - return r.join('\n'); +module.exports.format = function (r) { + return r.join("\n"); }; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { options.validateSync(opts, descriptor); if (opts.debug) { - console.log('listproxies: %j', opts); + console.log("listproxies: %j", opts); } - let uri = util.format('%s/v1/o/%s/apis', opts.baseuri, opts.organization); + let uri = util.format("%s/v1/o/%s/apis", opts.baseuri, opts.organization); let request = defaults.defaultRequest(opts); if (opts.debug) { console.log('Going to invoke "%s"', uri); } - request.get(uri, function(err, req, body) { + request.get(uri, function (err, req, body) { if (err) { cb(err); } else { if (req.statusCode === 200) { if (opts.debug) { - console.log('List of APIs: %j', body); + console.log("List of APIs: %j", body); } if (opts.debug) { - console.log('All done'); + console.log("All done"); } cb(undefined, body); } else { - cb(new Error(util.format('HTTP error %d', req.statusCode))); + cb(new Error(util.format("HTTP error %d", req.statusCode))); } } }); diff --git a/lib/commands/listRoleUsers.js b/lib/commands/listRoleUsers.js index 975b382..6b7d716 100644 --- a/lib/commands/listRoleUsers.js +++ b/lib/commands/listRoleUsers.js @@ -1,14 +1,14 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - //options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); let descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true } @@ -16,16 +16,22 @@ let descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('getRoleUsers: %j', opts); + console.log("getRoleUsers: %j", opts); } - let uri = util.format('%s/v1/o/%s/userroles/%s/users', opts.baseuri, opts.organization, opts.roleName); + let uri = util.format( + "%s/v1/o/%s/userroles/%s/users", + opts.baseuri, + opts.organization, + opts.roleName + ); let requestOptions = { - uri, - method:'GET', - json:true - }; - command_utils.run('getRoleUsers', opts, requestOptions, cb); + uri, + method: "GET", + json: true + }; + command_utils.run("getRoleUsers", opts, requestOptions, cb); }; diff --git a/lib/commands/listRoles.js b/lib/commands/listRoles.js index b449622..7cce84d 100644 --- a/lib/commands/listRoles.js +++ b/lib/commands/listRoles.js @@ -1,24 +1,27 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({}); module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { if (opts.debug) { - console.log('listRoles: %j', opts); + console.log("listRoles: %j", opts); } - let uri = util.format('%s/v1/o/%s/userroles', opts.baseuri, opts.organization); + let uri = util.format( + "%s/v1/o/%s/userroles", + opts.baseuri, + opts.organization + ); let requestOptions = { - uri, - method:'GET', - json:true - }; - command_utils.run('listRoles', opts,requestOptions, cb); + uri, + method: "GET", + json: true + }; + command_utils.run("listRoles", opts, requestOptions, cb); }; diff --git a/lib/commands/listsharedflowdeployments.js b/lib/commands/listSharedflowDeployments.js similarity index 57% rename from lib/commands/listsharedflowdeployments.js rename to lib/commands/listSharedflowDeployments.js index bede50d..e897567 100644 --- a/lib/commands/listsharedflowdeployments.js +++ b/lib/commands/listSharedflowDeployments.js @@ -1,58 +1,66 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + parseDeployments = require("./parseDeployments"); var descriptor = defaults.defaultDescriptor({ name: { - name: 'SharedFlow name', - shortOption: 'n' + name: "SharedFlow name", + shortOption: "n" }, environment: { - name: 'Environment', - shortOption: 'e' + name: "Environment", + shortOption: "e" }, long: { - name: 'Long', - shortOption: 'l', + name: "Long", + shortOption: "l", toggle: true } }); module.exports.descriptor = descriptor; -module.exports.format = function(r) { +module.exports.format = function (r) { return r.deployments - .map(d => parseDeployments.formatDeployment(d)) - .join('\n'); + .map((d) => parseDeployments.formatDeployment(d)) + .join("\n"); }; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { var uri; var parser; options.validateSync(opts, descriptor); if (opts.debug) { - console.log('listsharedflowdeployments: %j', opts); + console.log("listsharedflowdeployments: %j", opts); } if (opts.name && !opts.environment) { - uri = util.format('%s/v1/o/%s/sharedflows/%s/deployments', - opts.baseuri, opts.organization, opts.name); + uri = util.format( + "%s/v1/o/%s/sharedflows/%s/deployments", + opts.baseuri, + opts.organization, + opts.name + ); parser = parseAPIBody; - } else if (opts.environment && !opts.name) { - uri = util.format('%s/v1/o/%s/e/%s/deployments?sharedFlows=true', - opts.baseuri, opts.organization, opts.environment); + uri = util.format( + "%s/v1/o/%s/e/%s/deployments?sharedFlows=true", + opts.baseuri, + opts.organization, + opts.environment + ); parser = parseEnvironmentBody; - } else if (opts.environment && opts.name) { - cb(new Error('Can\'t specify both SharedFlow name and environment options')); + cb(new Error("Can't specify both SharedFlow name and environment options")); return; } else { - cb(new Error('Either "SharedFlow name" or "environment" must be specified')); + cb( + new Error('Either "SharedFlow name" or "environment" must be specified') + ); return; } @@ -61,27 +69,31 @@ module.exports.run = function(opts, cb) { if (opts.debug) { console.log('Going to invoke "%s"', uri); } - request.get(uri, function(err, req, body) { + request.get(uri, function (err, req, body) { if (err) { cb(err); } else { if (req.statusCode === 200) { if (opts.debug) { - console.log('List of deployed SharedFlows: %j', body); + console.log("List of deployed SharedFlows: %j", body); } var result = parser(body); if (opts.long) { - parseDeployments.getPathInfo(result.deployments, opts, function(err) { - cb(err, result); - }); + parseDeployments.getPathInfo( + result.deployments, + opts, + function (err) { + cb(err, result); + } + ); } else { if (opts.debug) { - console.log('All done'); + console.log("All done"); } cb(undefined, result); } } else { - cb(new Error(util.format('HTTP error %d', req.statusCode))); + cb(new Error(util.format("HTTP error %d", req.statusCode))); } } }); @@ -101,7 +113,7 @@ function parseEnvironmentBody(b) { name: p.name, environment: env, revision: parseInt(pr.name), - state: pr.state, + state: pr.state }); } } @@ -122,7 +134,7 @@ function parseAPIBody(b) { name: name, environment: e.name, revision: parseInt(re.name), - state: re.state, + state: re.state }); } } diff --git a/lib/commands/listSharedflows.js b/lib/commands/listSharedflows.js index 6e8d57d..d5630e6 100644 --- a/lib/commands/listSharedflows.js +++ b/lib/commands/listSharedflows.js @@ -1,44 +1,48 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + parseDeployments = require("./parseDeployments"); -const descriptor = defaults.defaultDescriptor({ }); +const descriptor = defaults.defaultDescriptor({}); module.exports.descriptor = descriptor; -module.exports.format = function(r) { - return r.join('\n'); +module.exports.format = function (r) { + return r.join("\n"); }; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { options.validateSync(opts, descriptor); if (opts.debug) { - console.log('listsharedflows: %j', opts); + console.log("listsharedflows: %j", opts); } - let uri = util.format('%s/v1/o/%s/sharedflows', opts.baseuri, opts.organization); + let uri = util.format( + "%s/v1/o/%s/sharedflows", + opts.baseuri, + opts.organization + ); let request = defaults.defaultRequest(opts); if (opts.debug) { console.log('Going to invoke "%s"', uri); } - request.get(uri, function(err, req, body) { + request.get(uri, function (err, req, body) { if (err) { cb(err); } else { if (req.statusCode === 200) { if (opts.debug) { - console.log('List of sharedflows: %j', body); + console.log("List of sharedflows: %j", body); } if (opts.debug) { - console.log('All done'); + console.log("All done"); } cb(undefined, body); } else { - cb(new Error(util.format('HTTP error %d', req.statusCode))); + cb(new Error(util.format("HTTP error %d", req.statusCode))); } } }); diff --git a/lib/commands/listTargetServers.js b/lib/commands/listTargetServers.js index 29e2e14..d51d33d 100644 --- a/lib/commands/listTargetServers.js +++ b/lib/commands/listTargetServers.js @@ -1,11 +1,12 @@ -const util = require('util'), - defaults = require('../defaults'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: true, prompt: true } @@ -13,15 +14,21 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('listTargetServers: %j', opts); + console.log("listTargetServers: %j", opts); } - let uri = util.format('%s/v1/o/%s/e/%s/targetservers', opts.baseuri, opts.organization, opts.environment); + let uri = util.format( + "%s/v1/o/%s/e/%s/targetservers", + opts.baseuri, + opts.organization, + opts.environment + ); let requestOptions = { - uri, - method:'GET', - json:true - }; - command_utils.run('listTargetServers', opts, requestOptions, cb); + uri, + method: "GET", + json: true + }; + command_utils.run("listTargetServers", opts, requestOptions, cb); }; diff --git a/lib/commands/parsedeployments.js b/lib/commands/parseDeployments.js similarity index 100% rename from lib/commands/parsedeployments.js rename to lib/commands/parseDeployments.js diff --git a/lib/commands/removeUserRole.js b/lib/commands/removeUserRole.js index 14ed578..639726f 100644 --- a/lib/commands/removeUserRole.js +++ b/lib/commands/removeUserRole.js @@ -1,19 +1,19 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true }, email: { - name: 'Developer email', + name: "Developer email", required: true, prompt: true } @@ -21,17 +21,23 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('removeUserRole: %j', opts); + console.log("removeUserRole: %j", opts); } - let uri = util.format('%s/v1/o/%s/userroles/%s/users/%s', - opts.baseuri, opts.organization, opts.roleName, opts.email ); + let uri = util.format( + "%s/v1/o/%s/userroles/%s/users/%s", + opts.baseuri, + opts.organization, + opts.roleName, + opts.email + ); let requestOptions = { - uri, - method:'DELETE', - json:true - }; - command_utils.run('removeUserRole', opts, requestOptions, cb); + uri, + method: "DELETE", + json: true + }; + command_utils.run("removeUserRole", opts, requestOptions, cb); }; diff --git a/lib/commands/setRolePermissions.js b/lib/commands/setRolePermissions.js index caf0766..cde098f 100644 --- a/lib/commands/setRolePermissions.js +++ b/lib/commands/setRolePermissions.js @@ -22,6 +22,7 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; module.exports.run = function(opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { console.log('setRolePermissions: %j', opts); } diff --git a/lib/commands/undeploy.js b/lib/commands/undeploy.js index 0a01597..01d78a2 100644 --- a/lib/commands/undeploy.js +++ b/lib/commands/undeploy.js @@ -1,13 +1,11 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - path = require('path'), - async = require('async'), - fs = require('fs'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); +const util = require("util"), + async = require("async"), + defaults = require("../defaults"), + options = require("../options"), + parseDeployments = require("./parseDeployments"); /* From python apigeetool: @@ -33,54 +31,55 @@ const util = require('util'), var descriptor = defaults.defaultDescriptor({ api: { - name: 'API Name', - shortOption: 'n', + name: "API Name", + shortOption: "n", required: true }, environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: true }, revision: { - name: 'Revision', - shortOption: 'r', + name: "Revision", + shortOption: "r", required: false } }); module.exports.descriptor = descriptor; -module.exports.format = function(r) { +module.exports.format = function (r) { if (r.name) { return parseDeployments.formatDeployment(r); } else { - return ''; + return ""; } }; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { options.validateSync(opts, descriptor); if (opts.debug) { - console.log('undeploy: %j', opts); + console.log("undeploy: %j", opts); } var request = defaults.defaultRequest(opts); // Run each function in series, and collect an array of results. - async.series([ - function(done) { - getDeploymentInfo(opts, request, done); - }, - function(done) { - undeploy(opts, request, done); - } + async.series( + [ + function (done) { + getDeploymentInfo(opts, request, done); + }, + function (done) { + undeploy(opts, request, done); + } ], - function(err, results) { + function (err, results) { if (err) { cb(err); } else { if (opts.debug) { - console.log('results: %j', results); + console.log("results: %j", results); } var deployResult = results[results.length - 1]; @@ -92,11 +91,11 @@ module.exports.run = function(opts, cb) { cb(undefined, {}); } } - }); + } + ); }; function getDeploymentInfo(opts, request, done) { - // Just undeploy what we said if (opts.revision) { opts.deploymentVersion = opts.revision; @@ -105,84 +104,116 @@ function getDeploymentInfo(opts, request, done) { } // Find out which revision we should be undeploying - request.get(util.format('%s/v1/o/%s/environments/%s/apis/%s/deployments', - opts.baseuri, opts.organization, opts.environment, opts.api), - function(err, req, body) { + request.get( + util.format( + "%s/v1/o/%s/environments/%s/apis/%s/deployments", + opts.baseuri, + opts.organization, + opts.environment, + opts.api + ), + function (err, req, body) { if (err) { done(err); } else if (req.statusCode === 404) { if (opts.verbose) { - console.log('API %s does not exist.', opts.api); + console.log("API %s does not exist.", opts.api); } done(); } else if (req.statusCode === 400) { - done(new Error(console.log(body.message))); + done(new Error(console.log(body.message))); } else if (req.statusCode === 200) { opts.deploymentVersion = parseInt(body.revision[0].name); if (opts.verbose) { - console.log('Going to undeploy revision %d of API %s', - opts.deploymentVersion, opts.api); + console.log( + "Going to undeploy revision %d of API %s", + opts.deploymentVersion, + opts.api + ); } done(); } else { - done(new Error(util.format('Get API info returned status %d', req.statusCode))); + done( + new Error( + util.format("Get API info returned status %d", req.statusCode) + ) + ); } - }); + } + ); } function undeploy(opts, request, done) { if (opts.verbose) { - console.log('Undeploying revision %d of %s to %s', opts.deploymentVersion, - opts.api, opts.environment); + console.log( + "Undeploying revision %d of %s to %s", + opts.deploymentVersion, + opts.api, + opts.environment + ); } - var uri = util.format('%s/v1/o/%s/apis/%s/deployments', - opts.baseuri, opts.organization, opts.api); + var uri = util.format( + "%s/v1/o/%s/apis/%s/deployments", + opts.baseuri, + opts.organization, + opts.api + ); if (opts.debug) { - console.log('Going to POST to %s', uri); + console.log("Going to POST to %s", uri); } - var deployCmd = util.format('action=undeploy&revision=%d&env=%s', - opts.deploymentVersion, opts.environment); - if (opts['base-path']) { - deployCmd = util.format('%s&basepath=%s', deployCmd, opts['base-path']); + var deployCmd = util.format( + "action=undeploy&revision=%d&env=%s", + opts.deploymentVersion, + opts.environment + ); + if (opts["base-path"]) { + deployCmd = util.format("%s&basepath=%s", deployCmd, opts["base-path"]); } if (opts.debug) { - console.log('Going go send command %s', deployCmd); + console.log("Going go send command %s", deployCmd); } - request({ - uri: uri, - method: 'POST', - json: false, - body: deployCmd, - headers: { 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json' } - }, function(err, req, body) { - var jsonBody = (body ? JSON.parse(body) : null); - if (err) { - done(err); - } else if (req.statusCode === 200) { - if (opts.verbose) { - console.log('Undeployment successful'); + request( + { + uri: uri, + method: "POST", + json: false, + body: deployCmd, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json" } - if (opts.debug) { - console.log('%s', body); - } - done(undefined, jsonBody); - } else { - if (opts.verbose) { - console.error('Undeployment result: %j', body); - } - - var errMsg; - if (jsonBody && (jsonBody.message)) { - errMsg = jsonBody.message; + }, + function (err, req, body) { + var jsonBody = body ? JSON.parse(body) : null; + if (err) { + done(err); + } else if (req.statusCode === 200) { + if (opts.verbose) { + console.log("Undeployment successful"); + } + if (opts.debug) { + console.log("%s", body); + } + done(undefined, jsonBody); } else { - errMsg = util.format('Undeployment failed with status code %d', - req.statusCode); + if (opts.verbose) { + console.error("Undeployment result: %j", body); + } + + var errMsg; + if (jsonBody && jsonBody.message) { + errMsg = jsonBody.message; + } else { + errMsg = util.format( + "Undeployment failed with status code %d", + req.statusCode + ); + } + done(new Error(errMsg)); } - done(new Error(errMsg)); } - }); + ); } diff --git a/lib/commands/undeploysharedflow.js b/lib/commands/undeploySharedflow.js similarity index 53% rename from lib/commands/undeploysharedflow.js rename to lib/commands/undeploySharedflow.js index e7f6376..4646939 100644 --- a/lib/commands/undeploysharedflow.js +++ b/lib/commands/undeploySharedflow.js @@ -1,13 +1,13 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - path = require('path'), - async = require('async'), - fs = require('fs'), - defaults = require('../defaults'), - options = require('../options'), - parseDeployments = require('./parsedeployments'); +const util = require("util"), + path = require("path"), + async = require("async"), + fs = require("fs"), + defaults = require("../defaults"), + options = require("../options"), + parseDeployments = require("./parseDeployments"); /* From python apigeetool: @@ -33,18 +33,18 @@ const util = require('util'), var descriptor = defaults.defaultDescriptor({ name: { - name: 'Shared Flow Name', - shortOption: 'n', + name: "Shared Flow Name", + shortOption: "n", required: true }, environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: true }, revision: { - name: 'Revision', - shortOption: 'r', + name: "Revision", + shortOption: "r", required: false } }); @@ -54,20 +54,21 @@ module.exports.format = function (r) { if (r.name) { return parseDeployments.formatDeployment(r); } else { - return ''; + return ""; } }; module.exports.run = function (opts, cb) { options.validateSync(opts, descriptor); if (opts.debug) { - console.log('undeploy: %j', opts); + console.log("undeploy: %j", opts); } var request = defaults.defaultRequest(opts); // Run each function in series, and collect an array of results. - async.series([ + async.series( + [ function (done) { getDeploymentInfo(opts, request, done); }, @@ -80,7 +81,7 @@ module.exports.run = function (opts, cb) { cb(err); } else { if (opts.debug) { - console.log('results: %j', results); + console.log("results: %j", results); } var deployResult = results[results.length - 1]; @@ -92,11 +93,11 @@ module.exports.run = function (opts, cb) { cb(undefined, {}); } } - }); + } + ); }; function getDeploymentInfo(opts, request, done) { - // Just undeploy what we said if (opts.revision) { opts.deploymentVersion = opts.revision; @@ -106,14 +107,19 @@ function getDeploymentInfo(opts, request, done) { // Find out which revision we should be undeploying - request.get(util.format('%s/v1/o/%s/sharedflows/%s/deployments', - opts.baseuri, opts.organization, opts.name), + request.get( + util.format( + "%s/v1/o/%s/sharedflows/%s/deployments", + opts.baseuri, + opts.organization, + opts.name + ), function (err, req, body) { if (err) { done(err); } else if (req.statusCode === 404) { if (opts.verbose) { - console.log('SharedFlow %s does not exist.', opts.name); + console.log("SharedFlow %s does not exist.", opts.name); } done(); } else if (req.statusCode === 200) { @@ -121,7 +127,7 @@ function getDeploymentInfo(opts, request, done) { var envFound = false; var curEnv; var i = 0; - while ( (i < body.environment.length) && (!envFound) ) { + while (i < body.environment.length && !envFound) { curEnv = body.environment[i]; if (curEnv.name == opts.environment) { envFound = true; @@ -130,64 +136,97 @@ function getDeploymentInfo(opts, request, done) { i++; } if (!envFound) { - done(new Error(util.format('SharedFlow not deployed to environment %s', opts.environment))); + done( + new Error( + util.format( + "SharedFlow not deployed to environment %s", + opts.environment + ) + ) + ); } if (opts.verbose) { - console.log('Going to undeploy revision %d of SharedFlow %s', - opts.deploymentVersion, opts.name); + console.log( + "Going to undeploy revision %d of SharedFlow %s", + opts.deploymentVersion, + opts.name + ); } done(); } else { - done(new Error(util.format('Get SharedFlow info returned status %d', req.statusCode))); + done( + new Error( + util.format( + "Get SharedFlow info returned status %d", + req.statusCode + ) + ) + ); } - }); + } + ); } function undeploy(opts, request, done) { if (opts.verbose) { - console.log('Undeploying revision %d of %s to %s', opts.deploymentVersion, - opts.name, opts.environment); + console.log( + "Undeploying revision %d of %s to %s", + opts.deploymentVersion, + opts.name, + opts.environment + ); } - var uri = util.format('%s/v1/o/%s/e/%s/sharedflows/%s/revisions/%s/deployments', - opts.baseuri, opts.organization, opts.environment, opts.name, opts.deploymentVersion); + var uri = util.format( + "%s/v1/o/%s/e/%s/sharedflows/%s/revisions/%s/deployments", + opts.baseuri, + opts.organization, + opts.environment, + opts.name, + opts.deploymentVersion + ); if (opts.debug) { - console.log('Going to POST to %s', uri); + console.log("Going to POST to %s", uri); } - request({ - uri: uri, - method: 'DELETE', - json: false, - headers: { - 'Content-Type': 'application/octet-stream', - 'Accept': 'application/json' - } - }, function (err, req, body) { - var jsonBody = (body ? JSON.parse(body) : null); - if (err) { - done(err); - } else if (req.statusCode === 200) { - if (opts.verbose) { - console.log('Undeployment successful'); - } - if (opts.debug) { - console.log('%s', body); + request( + { + uri: uri, + method: "DELETE", + json: false, + headers: { + "Content-Type": "application/octet-stream", + Accept: "application/json" } - done(undefined, jsonBody); - } else { - if (opts.verbose) { - console.error('Undeployment result: %j', body); - } - - var errMsg; - if (jsonBody && (jsonBody.message)) { - errMsg = jsonBody.message; + }, + function (err, req, body) { + var jsonBody = body ? JSON.parse(body) : null; + if (err) { + done(err); + } else if (req.statusCode === 200) { + if (opts.verbose) { + console.log("Undeployment successful"); + } + if (opts.debug) { + console.log("%s", body); + } + done(undefined, jsonBody); } else { - errMsg = util.format('Undeployment failed with status code %d', - req.statusCode); + if (opts.verbose) { + console.error("Undeployment result: %j", body); + } + + var errMsg; + if (jsonBody && jsonBody.message) { + errMsg = jsonBody.message; + } else { + errMsg = util.format( + "Undeployment failed with status code %d", + req.statusCode + ); + } + done(new Error(errMsg)); } - done(new Error(errMsg)); } - }); + ); } diff --git a/lib/commands/updateKVMentry.js b/lib/commands/updateKVMentry.js index 7a48ce7..11cc21e 100644 --- a/lib/commands/updateKVMentry.js +++ b/lib/commands/updateKVMentry.js @@ -1,56 +1,77 @@ -const util = require('util'), - defaults = require('../defaults'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ environment: { - name: 'Environment', - shortOption: 'e', + name: "Environment", + shortOption: "e", required: false }, api: { - name: 'API', - shortOption: 'n', + name: "API", + shortOption: "n", required: false }, mapName: { - name: 'Map Name', + name: "Map Name", required: true, prompt: true }, entryName: { - name: 'Entry Name', + name: "Entry Name", required: true, prompt: true } - }); module.exports.descriptor = descriptor; module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('updateKVMentry: %j', opts); + console.log("updateKVMentry: %j", opts); } - var uri = util.format('%s/v1/o/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.mapName, opts.entryName); + var uri = util.format( + "%s/v1/o/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.mapName, + opts.entryName + ); var payload = { - name: opts.entryName, - value: opts.entryValue - }; + name: opts.entryName, + value: opts.entryValue + }; if (opts.api) { - uri = util.format('%s/v1/o/%s/apis/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.api, opts.mapName, opts.entryName); + uri = util.format( + "%s/v1/o/%s/apis/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.api, + opts.mapName, + opts.entryName + ); } if (opts.environment) { - uri = util.format('%s/v1/o/%s/e/%s/keyvaluemaps/%s/entries/%s', opts.baseuri, opts.organization, opts.environment, opts.mapName, opts.entryName); + uri = util.format( + "%s/v1/o/%s/e/%s/keyvaluemaps/%s/entries/%s", + opts.baseuri, + opts.organization, + opts.environment, + opts.mapName, + opts.entryName + ); } let requestOpts = { - uri, - method: 'POST', - body: payload, - }; - command_utils.run('updateKVMentry', opts, requestOpts, cb); + uri, + method: "POST", + body: payload + }; + command_utils.run("updateKVMentry", opts, requestOpts, cb); }; diff --git a/lib/commands/updateTargetServer.js b/lib/commands/updateTargetServer.js index 519efe9..d2ad81b 100644 --- a/lib/commands/updateTargetServer.js +++ b/lib/commands/updateTargetServer.js @@ -1,79 +1,93 @@ -const util = require('util'), - defaults = require('../defaults'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ - environments: { - name: 'Environments', - shortOption: 'e', - required: true, - prompt: true - }, - targetServerName: { - name: 'Target Server Name', - shortOption: 'n', - required: true, - prompt: true - }, - targetHost: { - name: 'Target Host', - /* required: true, */ - prompt: true - }, - targetEnabled: { - name: 'Target Enabled' - }, - targetPort: { - name: 'Target Port', - /* required: true, */ - prompt: true - }, - targetSSL: { - name: 'SSL Info' - } - }); + environments: { + name: "Environments", + shortOption: "e", + required: true, + prompt: true + }, + targetServerName: { + name: "Target Server Name", + shortOption: "n", + required: true, + prompt: true + }, + targetHost: { + name: "Target Host", + /* required: true, */ + prompt: true + }, + targetEnabled: { + name: "Target Enabled" + }, + targetPort: { + name: "Target Port", + /* required: true, */ + prompt: true + }, + targetSSL: { + name: "SSL Info" + } +}); module.exports.descriptor = descriptor; module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('updateTargetServer: %j', opts); + console.log("updateTargetServer: %j", opts); } - let uri = util.format('%s/v1/organizations/%s/environments/%s/targetservers/%s', - opts.baseuri, opts.organization, opts.environments, opts.targetServerName); + let uri = util.format( + "%s/v1/organizations/%s/environments/%s/targetservers/%s", + opts.baseuri, + opts.organization, + opts.environments, + opts.targetServerName + ); - let {targetHost, targetPort, targetEnabled} = opts; + let { targetHost, targetPort, targetEnabled } = opts; - let readTargetConfig = - function(cb) { - let requestOpts = { - uri, - method: 'GET', - json: true - }; - command_utils.run('readTargetServerConfig', opts, requestOpts, (e, json) => { + let readTargetConfig = function (cb) { + let requestOpts = { + uri, + method: "GET", + json: true + }; + command_utils.run( + "readTargetServerConfig", + opts, + requestOpts, + (e, json) => { if (e) return cb(e); // fill in any options not specified - if ( ! targetHost) targetHost = json.host; - if ( ! targetPort) targetPort = json.port; - if ( ! ('targetEnabled' in opts)) targetEnabled = json.isEnabled; + if (!targetHost) targetHost = json.host; + if (!targetPort) targetPort = json.port; + if (!("targetEnabled" in opts)) targetEnabled = json.isEnabled; cb(); - }); - }; + } + ); + }; let noop = (cb) => cb(); // might need to retrieve the existing configuration - let prepFn = (!targetHost || !targetPort || !('targetEnabled' in opts)) ? readTargetConfig : noop; + let prepFn = + !targetHost || !targetPort || !("targetEnabled" in opts) + ? readTargetConfig + : noop; - prepFn( e => { + prepFn((e) => { if (e) return cb(e); let payload = { - name: opts.targetServerName, - host: targetHost, - isEnabled: targetEnabled, - port: targetPort - }; + name: opts.targetServerName, + host: targetHost, + isEnabled: targetEnabled, + port: targetPort + }; if (opts.targetSSL) { // TODO: allow update of SSLInfo details @@ -81,11 +95,11 @@ module.exports.run = function (opts, cb) { } let requestOpts = { - uri, - method: 'PUT', - body: payload, - json: true - }; - command_utils.run('updateTargetServer', opts, requestOpts, cb); + uri, + method: "PUT", + body: payload, + json: true + }; + command_utils.run("updateTargetServer", opts, requestOpts, cb); }); }; diff --git a/lib/commands/verifyUserRole.js b/lib/commands/verifyUserRole.js index 63e1aa6..43e6f5e 100644 --- a/lib/commands/verifyUserRole.js +++ b/lib/commands/verifyUserRole.js @@ -1,19 +1,19 @@ /* jshint node: true */ -'use strict'; +"use strict"; -const util = require('util'), - defaults = require('../defaults'), - options = require('../options'), - command_utils = require('./command-utils'); +const util = require("util"), + defaults = require("../defaults"), + options = require("../options"), + command_utils = require("./command-utils"); var descriptor = defaults.defaultDescriptor({ roleName: { - name: 'Role Name', + name: "Role Name", required: true, prompt: true }, email: { - name: 'EMail for the user', + name: "EMail for the user", required: true, prompt: true } @@ -21,17 +21,23 @@ var descriptor = defaults.defaultDescriptor({ module.exports.descriptor = descriptor; -module.exports.run = function(opts, cb) { +module.exports.run = function (opts, cb) { + options.validateSync(opts, descriptor); if (opts.debug) { - console.log('verifyUserRole: %j', opts); + console.log("verifyUserRole: %j", opts); } - let uri = util.format('%s/v1/o/%s/userroles/%s/users/%s', - opts.baseuri, opts.organization, opts.roleName, opts.email ); + let uri = util.format( + "%s/v1/o/%s/userroles/%s/users/%s", + opts.baseuri, + opts.organization, + opts.roleName, + opts.email + ); let requestOptions = { - uri, - method:'GET', - json:true - }; - command_utils.run('verifyUserRole', opts,requestOptions, cb); + uri, + method: "GET", + json: true + }; + command_utils.run("verifyUserRole", opts, requestOptions, cb); }; diff --git a/package-lock.json b/package-lock.json index c50741e..a60471d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "apigeetool", - "version": "0.16.3", + "version": "0.16.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "apigeetool", - "version": "0.16.3", + "version": "0.16.4", "license": "MIT", "dependencies": { "async": "^3.2.3", diff --git a/package.json b/package.json index e64629a..4d128a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "apigeetool", - "version": "0.16.3", + "version": "0.16.4", "description": "A CLI for Apigee Edge", "main": "lib/main.js", "bin": { diff --git a/test/testcli.js b/test/testcli.js index 2f1f6b0..4bdc16a 100644 --- a/test/testcli.js +++ b/test/testcli.js @@ -1,111 +1,109 @@ -const assert = require('assert'), - path = require('path'), - childProcess = require('child_process'); +const assert = require("assert"), + path = require("path"), + childProcess = require("child_process"); const commandsToTest = [ - "attachFlowHook", - "detachFlowHook", - "getFlowHook", - "createTargetServer", - "deleteTargetServer", - "getTargetServer", - "updateTargetServer", - "listTargetServers", - "createkvmmap", - "addEntryToKVM", - "getKVMentry", - "updateKVMentry", - "getkvmmap", - "deleteKVMentry", - "deletekvmmap", - "deployproxy", - "deploynodeapp", - "deployhostedtarget", - "listdeployments", - "undeploy", - "fetchproxy", - "getlogs", - "delete", - "createcache", - "getCache", - "listCaches", - "clearCache", - "deletecache", - "createProduct", - "deleteProduct", - "createDeveloper", - "deleteDeveloper", - "createApp", - "createAppKey", - "deleteApp", - "deploySharedflow", - "undeploySharedflow", - "fetchSharedflow", - "listSharedflowDeployments", - "deleteSharedflow", - "deployExistingRevision", - "listRoles", - "createRole", - "getRole", - "deleteRole", - "getRolePermissions", - "setRolePermissions", - "assignUserRole", - "removeUserRole", - "verifyUserRole", - "listRoleUsers" - ]; - -describe('CLI invocation Test', function() { - it('invoke cli with invalid arg', function(done) { + "attachFlowHook", + "detachFlowHook", + "getFlowHook", + "createTargetServer", + "deleteTargetServer", + "getTargetServer", + "updateTargetServer", + "listTargetServers", + "createKVMmap", + "addEntryToKVM", + "getKVMentry", + "updateKVMentry", + "getKVMmap", + "deleteKVMentry", + "deleteKVMmap", + "deployProxy", + "deployNodeApp", + "deployHostedTarget", + "listDeployments", + "undeploy", + "fetchProxy", + "getlogs", + "delete", + "createCache", + "getCache", + "listCaches", + "clearCache", + "deleteCache", + "createProduct", + "deleteProduct", + "createDeveloper", + "deleteDeveloper", + "createApp", + "createAppKey", + "deleteApp", + "deploySharedflow", + "undeploySharedflow", + "fetchSharedflow", + "listSharedflowDeployments", + "deleteSharedflow", + "deployExistingRevision", + "listRoles", + "createRole", + "getRole", + "deleteRole", + "getRolePermissions", + "setRolePermissions", + "assignUserRole", + "removeUserRole", + "verifyUserRole", + "listRoleUsers" +]; +describe("CLI invocation Test", function () { + it("invoke cli with invalid arg", function (done) { let child = childProcess.spawnSync( - "node", - [path.join(__dirname, "../lib/cli.js"), "--invalid_arg"], - { encoding : 'utf8' }); + "node", + [path.join(__dirname, "../lib/cli.js"), "--invalid_arg"], + { encoding: "utf8" } + ); assert(!child.error); - assert( ! child.stdout); + assert(!child.stdout); assert(child.stderr); - assert(child.stderr.split('\n').length > 32); + assert(child.stderr.split("\n").length > 32); done(); }); - it('invoke cli with no arg, get help', function(done) { - + it("invoke cli with no arg, get help", function (done) { let child = childProcess.spawnSync( - "node", - [path.join(__dirname, "../lib/cli.js")], - { encoding : 'utf8' }); + "node", + [path.join(__dirname, "../lib/cli.js")], + { encoding: "utf8" } + ); assert(!child.error); assert(!child.stdout); assert(child.stderr); - assert(child.stderr.split('\n').length > 32); + assert(child.stderr.split("\n").length > 32); done(); }); - commandsToTest - .forEach( c => { + commandsToTest.forEach((c) => { let maxLines = 0; - it(`invoke cli with ${c}, get help`, function(done) { - + it(`invoke cli with ${c}, get help`, function (done) { let child = childProcess.spawnSync( - "node", - [path.join(__dirname, "../lib/cli.js"), c], - { encoding : 'utf8' }); + "node", + [path.join(__dirname, "../lib/cli.js"), c], + { encoding: "utf8" } + ); - assert(!child.error, `error ${c}` ); - assert(child.stdout, `stdout ${c}` ); - let lines = child.stdout.trim().split('\n'); + assert(!child.error, `error ${c}`); + assert(child.stdout, `stdout ${c}`); + let lines = child.stdout.trim().split("\n"); assert(lines); maxLines = Math.max(maxLines, lines.length); assert(lines.length > 16, `lines ${c}`); assert.equal(lines[0], "Usage:", `lines[0] ${c}`); - assert(child.stderr, `!stderr ${c}` ); - assert(child.stdout.split('\n').length > 3); + assert(child.stderr, `!stderr ${c}`); + assert(child.stdout.split("\n").length > 3); done(); }); }); - });