我正在使用反应模式在 Python 中开发 juju charm。我的所有钩子都使用“基本”基础层提供的装饰器调用。在尝试部署 charm 时,我遇到了一个错误。为了解决错误,我使用了“juju debug-hooks”和“juju dhx -r”(dhx 调试插件),但我找不到使用 Python 按照反应模式运行 charm 代码的方法……据我了解,(例如,当使用 dhx 进行调试时)charm 执行将返回到导致错误的钩子之前的状态,并且开发人员将登录到远程调试会话。运行钩子是开发人员的责任。通常这些钩子位于 /hooks 目录下,只需执行它们即可运行。使用反应模式无法做到这一点,因为钩子没有入口点,但一切都只是对状态的反应级联……
如何在调试会话期间按照反应模式运行用 python 编写的 juju charm 代码?
答案1
我遇到了同样的问题,因为set_state('myservice.installed')
即使我收到安装挂钩失败的错误,我的也会以某种方式被触发。我没有找到运行特定代码段的具体解决方案,但一个好的解决方法是更改通常会触发代码并重新运行的事件hooks/install
。我只尝试了 和juju debug-hooks
,没有尝试juju dhx
,但这对我来说是可行的。
在我的例子中,我看到我的当前状态设置为“已安装”。通过更改我的事件来触发代码,我能够重新运行我的安装挂钩。debug-hooks
然后,在我的会话中,我可以看到我的挂钩失败的地方。
from charms.reactive import when, set_state
import charms.apt
@when('myservice.installed')
def install():
charms.apt.queue_install(['some-package'])
// do some extra stuff
set_state('myservice.installed')
答案2
如何在调试会话期间运行反应式超级按钮?
您可以通过在目录中运行钩子来运行反应式魅力hooks/
。该钩子将启动反应框架并发起“状态级联”。
目录中的钩子文件hooks/
是由layer-basic
和创建的charm build
。确保包括layer-basic
layer.yaml
如果目录中没有钩子文件,则在您的文件中hooks/
。
您可以在以下位置找到有关调试反应式超级按钮的更多信息Juju 文档。