This is an automated email from the ASF dual-hosted git repository. pdesai pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk-devtools.git
The following commit(s) were added to refs/heads/master by this push: new 072080e Distinguish between dedicated versus stem cell runtimes (#237) 072080e is described below commit 072080ee34883ed397a3c2d2b5a079df29f0e117 Author: Matt Rutkowski <mrutk...@us.ibm.com> AuthorDate: Tue Apr 2 13:32:15 2019 -0500 Distinguish between dedicated versus stem cell runtimes (#237) --- .../runtimes/javascript/platform/knative.js | 107 +++++++++++++++++++-- .../runtimes/javascript/platform/platform.js | 5 +- knative-build/runtimes/javascript/src/service.js | 7 +- 3 files changed, 101 insertions(+), 18 deletions(-) diff --git a/knative-build/runtimes/javascript/platform/knative.js b/knative-build/runtimes/javascript/platform/knative.js index cf08873..f1a69db 100644 --- a/knative-build/runtimes/javascript/platform/knative.js +++ b/knative-build/runtimes/javascript/platform/knative.js @@ -22,6 +22,86 @@ const OW_ENV_PREFIX = "__OW_"; const CONTENT_TYPE = "Content-Type"; /** + * Determine if runtime is a "stem" cell, i.e., can be initialized with request init. data + * @param env + * @returns {boolean} + */ +function isStemCell(env) { + let actionCode = env.__OW_ACTION_CODE; + // It is a stem cell if valid code is "built into" the runtime's process environment. + return (typeof actionCode === 'undefined' || actionCode.length === 0); +} + +/** + * Determine if the request (body) contains valid activation data. + * @param req + * @returns {boolean} + */ +function hasActivationData(req) { + // it is a valid activation if the body contains an activation and value keys with data. + if (typeof req.body !== "undefined" && + typeof req.body.activation !== "undefined" && + typeof req.body.value !== "undefined") { + return true; + } + return false; +} + +/** + * Determine if the request (body) contains valid init data. + * @param req + * @returns {boolean} + */ +function hasInitData(req) { + // it is a valid init. if the body contains an init key with data. + if (typeof req.body !== "undefined" && + typeof req.body.init !== "undefined") { + return true; + } + return false; +} + +/** + * Determine if runtime is a "stem" cell, i.e., can be initialized with request init. data + * @param env + * @returns {boolean} + */ +function isStemCell(env) { + let actionCode = env.__OW_ACTION_CODE; + // It is a stem cell if valid code is "built into" the runtime's process environment. + return (typeof actionCode === 'undefined' || actionCode.length === 0); +} + +/** + * Determine if the request (body) contains valid activation data. + * @param req + * @returns {boolean} + */ +function hasActivationData(req) { + // it is a valid activation if the body contains an activation and value keys with data. + if (typeof req.body !== "undefined" && + typeof req.body.activation !== "undefined" && + typeof req.body.value !== "undefined") { + return true; + } + return false; +} + +/** + * Determine if the request (body) contains valid init data. + * @param req + * @returns {boolean} + */ +function hasInitData(req) { + // it is a valid init. if the body contains an init key with data. + if (typeof req.body !== "undefined" && + typeof req.body.init !== "undefined") { + return true; + } + return false; +} + +/** * Pre-process the incoming */ function preProcessInitData(env, initdata, valuedata, activationdata) { @@ -54,13 +134,19 @@ function preProcessInitData(env, initdata, valuedata, activationdata) { if (initdata.code && typeof initdata.code === 'string') { code = initdata.code; } - if (initdata.binary && typeof initdata.binary === 'boolean') { - // TODO: Throw error if BINARY is not 'true' or 'false' - binary = initdata.binary; + if (initdata.binary) { + if (typeof initdata.binary === 'boolean') { + binary = initdata.binary; + } else { + throw ("Invalid Init. data; expected boolean for key 'binary'."); + } } - if (initdata.raw && typeof initdata.raw === 'boolean') { - // TODO: Throw error if RAW is not 'true' or 'false' - raw = initdata.raw; + if (initdata.raw ) { + if (typeof initdata.raw === 'boolean') { + raw = initdata.raw; + } else { + throw ("Invalid Init. data; expected boolean for key 'raw'."); + } } } @@ -81,7 +167,6 @@ function preProcessInitData(env, initdata, valuedata, activationdata) { activationdata.action_name = actionName; } } - DEBUG.dumpObject(valuedata.main, "valuedata.main"); DEBUG.dumpObject(valuedata.code , "valuedata.code"); DEBUG.dumpObject(valuedata.binary, "valuedata.binary"); @@ -167,7 +252,7 @@ function preProcessHTTPContext(req, valueData) { */ function preProcessRequest(req){ DEBUG.functionStart(); - try{ + try { // Get or create valid references to the various data we might encounter // in a request such as Init., Activation and function parameter data. let body = req.body || {}; @@ -296,7 +381,6 @@ function postProcessResponse(req, result, res) { DEBUG.functionEnd(); } - function PlatformKnativeImpl(platformFactory) { DEBUG.functionStart(); DEBUG.dumpObject(platformFactory, "platformFactory" ); @@ -318,13 +402,16 @@ function PlatformKnativeImpl(platformFactory) { this.run = function(req, res) { try { - DEBUG.dumpObject(service.initialized(),"service.initialized()"); // Process request and process env. variables to provide them in the manner // an OpenWhisk Action expects them, as well as enable additional Http features. preProcessRequest(req); + // Do not process requests with init. data if this is not a "stem" cell + if (hasInitData(req) && !isStemCell(process.env)) + throw ("Cannot initialize a runtime with a dedicated function."); + service.initCode(req).then(function () { service.runCode(req).then(function (result) { postProcessResponse(req, result, res) diff --git a/knative-build/runtimes/javascript/platform/platform.js b/knative-build/runtimes/javascript/platform/platform.js index 2af5874..8e792a0 100644 --- a/knative-build/runtimes/javascript/platform/platform.js +++ b/knative-build/runtimes/javascript/platform/platform.js @@ -84,7 +84,7 @@ module.exports = class PlatformFactory { * validate if a platform ID is a known, supported value * @param id Platform Id */ - static isSupportedPlatform(id){ + static isSupportedPlatform(id) { if (SUPPORTED_PLATFORMS.indexOf(id) > -1) { return true; } @@ -96,8 +96,7 @@ module.exports = class PlatformFactory { * @param id Platform ID * @returns {PlatformImpl} Platform instance (interface), as best can be done with NodeJS */ - // TODO remove "app" parameter once we have a valid openwhisk platformImpl. - createPlatformImpl(id){ + createPlatformImpl(id) { DEBUG.functionStart(); DEBUG.dumpObject(id,"id"); // Load the appropriate implementation module and return reference to it diff --git a/knative-build/runtimes/javascript/src/service.js b/knative-build/runtimes/javascript/src/service.js index b0d335e..726e167 100644 --- a/knative-build/runtimes/javascript/src/service.js +++ b/knative-build/runtimes/javascript/src/service.js @@ -68,11 +68,8 @@ function NodeActionService(cfg) { * created a NodeActionRunner. * @returns {boolean} */ - this.initialized = function isIntialized(){ - if( userCodeRunner === undefined ){ - return false; - } - return true; + this.initialized = function isInitialized(){ + return (typeof userCodeRunner !== "undefined"); }; /**