performance: do not delete backup and helper actions on exit by default
add --cleanup option to do so and warn user about the behavior
diff --git a/index.js b/index.js
index 18d13ff..6724d6a 100644
--- a/index.js
+++ b/index.js
@@ -192,6 +192,11 @@
group: "Agent options:",
describe: "Ngrok region to use. Defaults to 'us'."
});
+ yargs.option("cleanup", {
+ type: "boolean",
+ group: "Agent options:",
+ describe: "Remove backup and any helper actions on exit. Makes shutdown slower."
+ });
// nodejs options
yargs.option("inspect", {
diff --git a/src/agentmgr.js b/src/agentmgr.js
index e12e9f7..3275b72 100644
--- a/src/agentmgr.js
+++ b/src/agentmgr.js
@@ -199,7 +199,7 @@
agentCode = await this.getConcurrencyAgent();
} else {
- console.log("This OpenWhisk does not support action concurrency. Debugging will be a bit slower. Consider using '--ngrok' which might be a faster option.");
+ console.warn("This OpenWhisk does not support action concurrency. Debugging will be a bit slower. Consider using '--ngrok' which might be a faster option.");
agentName = "polling activation db";
agentCode = await this.getPollingActivationDbAgent();
@@ -454,13 +454,24 @@
});
debug("restore: restored original action");
- // remove the backup
- await this.wsk.actions.delete(copy);
- debug("restore: deleted backup copy");
+ if (this.argv.cleanup) {
+ console.log("Removing extra actions due to --cleanup...");
+ // remove the backup
+ await this.wsk.actions.delete(copy);
+ debug("restore: deleted backup copy");
- // remove any helpers if they exist
- await deleteActionIfExists(this.wsk, `${this.actionName}_wskdebug_invoked`);
- await deleteActionIfExists(this.wsk, `${this.actionName}_wskdebug_completed`);
+ // remove any helpers if they exist
+ await deleteActionIfExists(this.wsk, `${this.actionName}_wskdebug_invoked`);
+ await deleteActionIfExists(this.wsk, `${this.actionName}_wskdebug_completed`);
+
+ } else {
+ console.warn(`Skipping removal of extra actions. Remove using --cleanup if desired:`);
+ console.warn(`- ${copy}`);
+ if (!this.concurrency) {
+ console.warn(`- ${this.actionName}_wskdebug_invoked`);
+ console.warn(`- ${this.actionName}_wskdebug_completed`);
+ }
+ }
return original;
diff --git a/test/agentmgr.test.js b/test/agentmgr.test.js
index b7fae8d..77a2d66 100644
--- a/test/agentmgr.test.js
+++ b/test/agentmgr.test.js
@@ -39,10 +39,7 @@
test.afterEach();
});
- it("should use non-concurrrent agent if openwhisk does not support concurrency", async function() {
- const action = "myaction";
- const code = `const main = () => ({ msg: 'WRONG' });`;
-
+ function mockActivationDbAgent(action, code) {
test.mockAction(action, code);
test.mockCreateBackupAction(action);
@@ -78,7 +75,6 @@
.matchHeader("authorization", test.openwhiskApiAuthHeader())
.reply(200, test.nodejsActionDescription(action));
-
// invocation
test.openwhiskNock()
.get(`${test.openwhiskApiUrl()}/activations`)
@@ -123,31 +119,17 @@
// shutdown/restore process
test.mockRestoreAction(action, code);
- test.mockRemoveBackupAction(action);
- test.openwhiskNock()
- .get(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_invoked?code=false`)
- .matchHeader("authorization", test.openwhiskApiAuthHeader())
- .reply(200, {});
- test.openwhiskNock()
- .delete(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_invoked`)
- .matchHeader("authorization", test.openwhiskApiAuthHeader())
- .reply(200, {});
- test.openwhiskNock()
- .get(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_completed?code=false`)
- .matchHeader("authorization", test.openwhiskApiAuthHeader())
- .reply(200, {});
- test.openwhiskNock()
- .delete(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_completed`)
- .matchHeader("authorization", test.openwhiskApiAuthHeader())
- .reply(200, {});
+ }
+ it("should use non-concurrent agent if openwhisk does not support concurrency", async function() {
+ const action = "myaction";
+ const code = `const main = () => ({ msg: 'CORRECT' });`;
- process.chdir("test/nodejs/plain-flat");
+ mockActivationDbAgent(action, code);
+
const argv = {
port: test.port,
- action: "myaction",
- sourcePath: `${process.cwd()}/action.js`,
- invokeParams: '{ "key": "invocationOnSourceModification" }'
+ action: "myaction"
};
const dbgr = new Debugger(argv);
@@ -212,8 +194,6 @@
.matchHeader("authorization", test.openwhiskApiAuthHeader())
.reply(200, agentDescriptionWithoutCode);
- test.mockRemoveBackupAction(action);
-
// 4. install agent
test.openwhiskNock()
.put(
@@ -234,7 +214,6 @@
// 6. restore
test.mockRestoreAction(action, actionCode);
- test.mockRemoveBackupAction(action);
// -----------------
@@ -242,4 +221,94 @@
test.assertAllNocksInvoked();
});
+
+ it("should remove backup action if --cleanup is set", async function() {
+ const action = "myaction";
+ const code = `const main = () => ({ msg: 'CORRECT' });`;
+
+ test.mockActionAndInvocation(
+ action,
+ code,
+ {},
+ { msg: "CORRECT" }
+ );
+
+ test.mockRemoveBackupAction(action);
+ test.openwhiskNock()
+ .get(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_invoked?code=false`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+ test.openwhiskNock()
+ .delete(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_invoked`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+ test.openwhiskNock()
+ .get(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_completed?code=false`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+ test.openwhiskNock()
+ .delete(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_completed`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+
+ const argv = {
+ port: test.port,
+ action: "myaction",
+ cleanup: true
+ };
+
+ const dbgr = new Debugger(argv);
+ await dbgr.start();
+ dbgr.run();
+
+ // wait a bit
+ await test.sleep(500);
+
+ await dbgr.stop();
+
+ test.assertAllNocksInvoked();
+ });
+
+ it("should remove helper actions if --cleanup is set and activation db agent is used", async function() {
+ const action = "myaction";
+ const code = `const main = () => ({ msg: 'CORRECT' });`;
+
+ mockActivationDbAgent(action, code);
+
+ test.mockRemoveBackupAction(action);
+ test.openwhiskNock()
+ .get(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_invoked?code=false`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+ test.openwhiskNock()
+ .delete(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_invoked`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+ test.openwhiskNock()
+ .get(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_completed?code=false`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+ test.openwhiskNock()
+ .delete(`${test.openwhiskApiUrlActions()}/${action}_wskdebug_completed`)
+ .matchHeader("authorization", test.openwhiskApiAuthHeader())
+ .reply(200, {});
+
+ const argv = {
+ port: test.port,
+ action: "myaction",
+ cleanup: true
+ };
+
+ const dbgr = new Debugger(argv);
+ await dbgr.start();
+ dbgr.run();
+
+ // wait a bit
+ await test.sleep(500);
+
+ await dbgr.stop();
+
+ test.assertAllNocksInvoked();
+ });
+
});
diff --git a/test/ngrok.test.js b/test/ngrok.test.js
index b9485e6..88e2c4b 100644
--- a/test/ngrok.test.js
+++ b/test/ngrok.test.js
@@ -156,7 +156,6 @@
.reply(200, test.nodejsActionDescription(actionName));
test.mockRestoreAction(actionName, code);
- test.mockRemoveBackupAction(actionName);
// wskdebug myaction action.js --ngrok -p ${test.port}
const argv = {
diff --git a/test/test.js b/test/test.js
index d59e77e..d81bee1 100644
--- a/test/test.js
+++ b/test/test.js
@@ -192,7 +192,6 @@
// shutdown/restore process
mockRestoreAction(name, code, binary);
- mockRemoveBackupAction(name);
}
function nockActivation(name, bodyFn) {