0

尝试按照指示,我使用以下命令在 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

但是 guest 没有被列为一个包:

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

4 回答 4

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在单独的终端窗口中运行有助于查看调用操作时发生的情况。

于 2017-07-17T19:47:54.007 回答
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,您需要使用 auth 作为标头参数传递-H

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

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

    wsk -i action invoke ProcessFuzzyMatch --result=true

于 2017-07-17T20:05:05.290 回答
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)。

于 2017-07-17T21:07:35.893 回答
0

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

我尝试使用 --web=true 来避免安全问题,这让我非常接近。但是,当我收到 200 响应代码的回复时,有效负载为空(内容长度:0)。因此,我使用带有 -v 的 wsk 调用操作,我能够看到调用是如何在 vagrant VM 中本地进行的,然后能够使其从 VM 外部工作。

基本上,这些是我遵循的步骤: wsk package create 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

因为我的服务需要一个包含文本和 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"}' 

不需要 -X POST,因为假定为 POST。授权是从我在 localhost(在 VM 中)上运行的版本的标头中看到的,但它是 ~/openwhisk/ansible/files/auth.guest 内容的 Base64 编码(在 VM 中)通过“vagrant ssh”命令)。这也可以使用 -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/

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

于 2017-07-21T16:00:33.443 回答