apache / openwhisk-cli

Apache OpenWhisk Command Line Interface (CLI)
https://openwhisk.apache.org/
Apache License 2.0
103 stars 99 forks source link

How to invoke a web action for .json context extension via wsk command? #465

Open JiniousChoi opened 4 years ago

JiniousChoi commented 4 years ago

apache/openwhisk#4712 Environment details:

local deployment

Steps to reproduce the issue:

  1. make a simple raw HTTP web action in python

    def main(args):
    val = args['__ow_headers']
    print(args)
    return { "response": args,
             "val": val }
  2. try to invoke it with wsk command

    $ wsk action invoke -r cs/jin-test
    {
    "error": "The action did not return a dictionary."
    }
  3. check out the activation log

    wsk activation get --last
    "logs": [
        "2019-12-06T04:11:54.832861208Z stderr: Traceback (most recent call last):",
        "2019-12-06T04:11:54.832914474Z stderr: File \"pythonrunner.py\", line 88, in run",
        "2019-12-06T04:11:54.832926486Z stderr: exec('fun = %s(param)' % self.mainFn, self.global_context)",
        "2019-12-06T04:11:54.832934019Z stderr: File \"<string>\", line 1, in <module>",
        "2019-12-06T04:11:54.832941Z    stderr: File \"__main__.py\", line 3, in main",
        "2019-12-06T04:11:54.833038393Z stderr: KeyError: '__ow_headers'"
    ],
  4. But it works with curl when invoked with .json context extension

    curl https://frisb.kakao.com/api/v1/web/jin.c/cs/jin-test.json
    {
    "response": {
    "__ow_body": "",
    "__ow_headers": {
      "accept": "*/*",
      "host": "controllers",
      "user-agent": "curl/7.54.0",
      "x-request-id": "e7e3d9a52c099c6a6e46bce11207d5a4"
    },
    "__ow_method": "get",
    "__ow_path": "",
    "__ow_query": ""
    },
    "val": {
    "accept": "*/*",
    "host": "controllers",
    "user-agent": "curl/7.54.0",
    "x-request-id": "e7e3d9a52c099c6a6e46bce11207d5a4"
    }

What I want

I'd love to know if there is a way for the wsk command to invoke a web action with context extensions. I learned that the default is .http in the docs and I wonder if there is no way for wsk to invoke an action other context extensions but .http.

style95 commented 4 years ago

I believe you can execute your web action with wsk. Could you replace the way you are getting inputs as follow:

def main(args):
    val = args.get('__ow_headers', "default")
    print(args)
    return { "response": args,
             "val": val }

I can invoke the action with your code.

$ wsk action invoke /style95/python-web -r
{
    "response": {},
    "val": "default"
}

When you invoke a web action with wsk, OW would not populate some information such as __ow_headers because it treats the action as a normal action.

upgle commented 4 years ago

There is no command to invoke a web action including extension. You should send the request directly using the curl command.

style95 commented 4 years ago

@JiniousChoi Currently, you can easily get the URL of a web action.

$ wsk action get python-web --url
ok: got action python-web
https://{HOST}/api/v1/web/style95/default/python-web

Is there any specific reason that you need to invoke it with wsk?

JiniousChoi commented 4 years ago

I suggest that wsk should provide a switch for web action invocation. Say, if there is an action named ACTION:

wsk action invoke -r ACTION -web=[http|json|text|svg|...]

or, we could be more explicit about this matter in wsk action invoke --help, regarding what's feasible and what isn't.

@style95 While we can make both normal/web action types with the command, we ONLY can invoke normal actions with it. And I don't see any explicit explanation about it.

It's a matter of UX. it seems inconsistent to me.

@style95 And that brings in one more hop here. A user who simply wants to check if one's web action is working or not would need to run like:

curl $(wsk action get python-web --url)

I think wsk action invoke python-web --web looks intuitive and nicer.

style95 commented 4 years ago

Interesting. Would be a good point to add.

I would move this issue to cli repo to proceed with it.

rabbah commented 4 years ago

Indeed a good idea.