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

Created openwhisk action but shows in guest as private java so can't call it

按照指示,我使用以下命令在 vagrant 映像中创建了一个操作(例如,在 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 调用操作失败并出现身份验证错误,但这似乎与请求 headers 无关。相反,我猜这与我注册的操作的私有 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)

在注册我的操作时先创建包然后使用该包的顺序是否正确?

感谢您提供的任何建议。

因为你有一个本地构建,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 在单独的终端中 window 有助于查看调用操作时发生的情况。

  • 您是否尝试过在 url 中使用 /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

    作为 header 参数传递身份验证

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

  • 您也可以尝试使用 wsk CLI 调用操作并查看它是否被调用。

    wsk -i action invoke ProcessFuzzyMatch --result=true

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

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

因此,如果您想将操作放入 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),目前不会生成摘要。

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

我尝试使用 --web=true 来避免安全问题,这让我非常接近。然而,当我收到一个包含 200 响应代码的回复时,有效载荷是空的 (Content-Length: 0)。因此,我将 wsk 调用操作与 -v 一起使用,我能够看到调用是如何在 vag运行t VM 中本地进行的,然后能够让它从 VM 外部工作。

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

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

因为我的服务需要一个包含文本和 workspaceID 的 JsonObject 我 运行 在 vag运行t VM 中执行以下命令:

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

这显示了正确的响应。通过检查请求 headers,我可以看到该操作是如何被引用的,因此我可以创建一个 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"}' 

不需要 -X POST,因为假定 POST。授权是从我在 headers 中看到的本地主机(在 VM 中)版本 运行 中看到的内容复制的,但它是 ~/openwhisk/ansible/files/auth.guest 的 Base64 编码内容(在 VM 中通过 "vagrant ssh" 命令)。这也可以通过使用 -u 参数来卷曲来传递。

理论上,由于在注册操作时使用了--web=true,因此不需要进行身份验证,但我发现从外部调用虚拟机时需要进行身份验证。没有 header,它 returns 这个错误:

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

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

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

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