创建了openwhisk操作,但在guest中显示为私有java,因此无法调用它

时间:2017-07-17 19:38:00

标签: openwhisk

尝试遵循指示,我使用此命令在流浪者图像中创建了一个动作(例如,在vagrant ssh之后):

wsk action create ProcessFuzzyMatch /vagrant/ildMicroServices-1.0.jar --main com.xxx.micro.services.ProcessFuzzyMatch

我可以看到它已创建:

wsk action list
actions
/guest/ProcessFuzzyMatch                                               private java

然而,客人并未列为套餐:

wsk package list /whisk.system
packages
/whisk.system/weather                                                  shared
/whisk.system/combinators                                              shared
/whisk.system/websocket                                                shared
/whisk.system/watson-translator                                        shared
/whisk.system/samples                                                  shared
/whisk.system/watson-speechToText                                      shared
/whisk.system/watson-textToSpeech                                      shared
/whisk.system/slack                                                    shared
/whisk.system/github                                                   shared
/whisk.system/utils                                                    shared

并尝试通过curl调用操作失败并出现身份验证错误,但这似乎与请求标头无关。相反,我猜它与我注册的动作的私有java性质有关。我相信这是因为我无法使用wsk命令显示我已注册的操作的摘要信息:

wsk package get --summary /whisk.system/guest/ProcessFuzzyMatch
error: Unable to get package 'guest/ProcessFuzzyMatch': The requested resource could not be found. (code 364)

首先创建一个包是正确的顺序,然后在注册我的动作时使用该包吗?

感谢您提供任何建议。

4 个答案:

答案 0 :(得分:2)

由于您有本地版本,guest是您的默认命名空间名称。该套餐为default(又名_),因为您没有指定一个。您可以使用以下命令查找命名空间的名称:

 wsk namespace list

它被标记为私有,因为它是你的,并没有发布到世界各地。

您可以使用以下方式调用您的操作:

wsk action invoke ProcessFuzzyMatch -r

如果你想把你的行动放在名为“" demo"”的名称空间中,你可以使用:

wsk package create demo
wsk action create demo/ProcessFuzzyMatch /vagrant/ildMicroServices-1.0.jar --main com.xxx.micro.services.ProcessFuzzyMatch

您现在可以使用以下方式调用您的操作:

wsk action invoke demo/ProcessFuzzyMatch -r

最后在单独的终端窗口中运行wsk activation poll有助于查看调用操作时发生的情况。

答案 1 :(得分:1)

  • 您是否尝试在网址中使用/guest/default/ProcessFuzzyMatch而不是/guest/ProcessFuzzyMatch

    The fully qualified name of the action must include its package name, which is "default" if the action is not in a named package.

  • 如果是authentication errors,您需要使用-H

    将auth作为标头参数传递

    curl -k -H "Authorization: Basic <encoded value>" https://<host>/api/v1/namespaces/guest/default/ProcessFuzzyMatch

  • 您还可以尝试使用wsk CLI调用操作,看看它是否被调用。

    wsk -i action invoke ProcessFuzzyMatch --result=true

答案 2 :(得分:1)

您没有为您的操作创建包。您创建的默认包中的操作不会显示在包列表中。

此外,您还会在whisk.system命名空间中创建操作时列出guest命名空间。

因此,如果您想将操作放在whisk.system包中,则需要使用该API密钥并首先创建包。

wsk package create mypkg -u <whisk.system key>

wsk action create mypkg/ProcessFuzzyMatch ... -u <whisk.system key>

否则,您可以使用访客密钥获取操作

wsk action get ProcessFuzzyMatch --summary

或同样

wsk action get /guest/ProcessFuzzyMatch --summary

请注意,如果操作没有任何注释,则当前不会生成摘要(请参阅https://github.com/apache/incubator-openwhisk/issues/2270)。

答案 3 :(得分:0)

这个答案是因为关注了所有其他帖子的建议并尝试了不同的方法。花了一段时间,因为我不得不移植所有基于文件的函数来调用Cloudant而且由于要加载的工件的大小以及Java中的附件API的问题,我不得不使用一种解决方法(因为数据字段返回空)。

我尝试使用--web = true来避免安全问题,这让我非常接近。但是,当我收到200响应代码的回复时,有效负载为空(Content-Length:0)。所以,我在-v中使用了wsk调用动作,我能够看到在流浪者虚拟机中如何在本地进行调用,然后能够从虚拟机外部使用它。

基本上,这些是我遵循的步骤:     wsk包创建ild 创建我自己的包,它成为/ guest的子包,如命令所示:

wsk package list
/guest/ild

然后我使用gradle基于jar构建创建了我的动作(因此它包含除了gson.JsonObject之外的所有依赖类,因为它已经在运行时环境中)。

wsk action create /guest/ild/ProcessFuzzyMatch /vagrant/ildMicroServices-1.0.jar --main com.xxx.ild.micro.services.ProcessFuzzyMatch --web true

因为我的服务需要一个包含text和workspaceID的JsonObject,所以我在vagrant VM中运行了以下命令:

 wsk action invoke -v -br ild/ProcessFuzzyMatch -p "text" "borken window" -p "workspaceID" "bc3d43ab-1529-41c8-8571-b7155e53e3ff"

这显示了正确的反应。通过检查请求标头,我可以看到该动作是如何被引用的,因此我可以创建一个shell脚本,指向VM外部的主机192.168.33.13。

工作shell脚本如下所示:

#! /bin/bash
curl -s -v -k https://192.168.33.13/api/v1/namespaces/guest/actions/ild/ProcessFuzzyMatch?blocking=true \
-H "Authorization: Basic MjNiYzQ2YjEtNzFmNi00ZWQ1LThjNTQtODE2YWE0ZjhjNTAyOjEyM3pPM3haQ0xyTU42djJCS0sxZFhZRnBYbFBrY2NPRnFtMTJDZEFzTWdSVTRWck5aOWx5R1ZDR3VNREdJd1A=" \
-X POST -H "Content-Type: application/json" \
-d '{"text":"borken window","workspaceID":"bc3d43ab-1529-41c8-8571-b7155e53e3ff"}' 

假设POST,则不需要-X POST。授权是从我在localhost(在VM中)上运行的版本的头文件中看到的复制而来的,但它是〜/ openwhisk / ansible / files / auth.guest内容的Base64编码(在VM通过&#34; vagrant ssh&#34;命令)。这也可以像使用-u参数一样传递给curl。

理论上,由于在注册操作时使用了--web = true,因此不需要进行身份验证,但我发现从外部调用VM时需要进行身份验证。没有标题,它会返回此错误:

{
    "error": "The resource requires authentication, which was not supplied with the request",
    "code": 2259
    * Connection #0 to host 192.168.33.13 left intact
 }

我认为让外部调用工作的关键是在包/操作名称之前提供正确的URI并确保传递了blocking = true参数:

https://192.168.33.13/api/v1/namespaces/guest/actions/

我将对所有其他回复进行投票,因为它们都帮助我弄清楚需要什么。

相关问题