Hi,

These days I've been doing some work on creating an OpenWhisk action directly 
from a GitHub repo - issue link [1] ; initial implementation [2] . After 
successfully deploying a "hello-world" action - [3] I thought about updating 
the message with some information from an OAuth token. I've used the API 
Gateway to decorate the request with a "context" object. To achieve this I had 
to merge the context with the actual event payload. I've posted the snippet of 
the API Gateway code at [4] in a gist. Things are working fine and here is a 
sample of a response from the action; note the "context" object which was added 
by the API Gateway.


{

  "payload": "Hello, 1FF62BDC53C3662B from branch-1 !",

  "event": {

    "context": {

      "identity": {

        "user_id": "1FF62BDC53C3662B",

        "client_id": "demo_app",

        "scope": "openid,avatar"

      }

    }

  }

}


As a result of this experience I've learned a few things out of which the most 
important one that I'd like to open a discussion here on the list is: the 
mechanism to pass a context to an action.


At the moment the only way is to decorate the event with extra fields and I see 
a few drawbacks to this approach:

  * The fact that we need to unpack the request body and change it has an 
impact on performance

  * If we want to send binary payloads in a special format, the API Gateway or 
some other process in the middle has to know how to decode/encode that 
payload/Content-Type. So we're limited to what these intermediary processes 
know.


The same thing happens with default action parameters; they get merged with the 
event. Basically besides the event itself there's no other way to configure the 
action with extra params or pass it a context.


I'd like to get your feedback to see if we're ok to enhance the existing 
mechanism.


As an example,  AWS Lambda allows a similar mechanism to pass a "context" to a 
function. See [5]. Clients can provide a custom "clientContext" object . 
Besides this object, the AWS API Gateway also adds its own fields into the 
"context" object; see [6].


If we want, we could take a similar approach. The way it works in AWS is 
through headers. For instance the "clientContext" is passed as a Base64 
JSON-encoded header.


In OpenWhisk actions the main method signature would allow 2 params instead of 
1 (as it is today) and it could look like:

function main(event, context)


The clientContext would be accessible as:

context.clientContext


And context.identity.* would be something reserved for the OpenWhisk API 
Gateway to populate and it could also be based on special headers like 
"X-GW-Identity".


What I like about this approach with Headers is that no intermediary process 
needs to understand the body of the request; we could also support multiple 
content types easier as well.


WDYT ?


Thanks,

dragos dascalita haut | project lead, software development | adobe cloud 
platform

[1] - https://github.com/openwhisk/openwhisk/issues/1537
[2] - https://github.com/ddragosd/openwhisk-github-deployer
[3] - 
https://github.com/ddragosd/openwhisk-hello-package/blob/branch-1/src/greeting.js
[4] - 
https://gist.github.com/ddragosd/3afd5d8678e5dbda48b943a1125aad0c#file-zcloudfront-conf-L71-L93
[5] - 
http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestSyntax
[6] - 
http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#context-variable-reference

Reply via email to