创建了 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/
我将对所有其他回复投赞成票,因为它们都帮助我弄清楚了需要什么。
按照指示,我使用以下命令在 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.
在
作为 header 参数传递身份验证authentication errors
的情况下,您需要使用-H
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/
我将对所有其他回复投赞成票,因为它们都帮助我弄清楚了需要什么。