如何使用 Amulet 框架部署本地 Juju Charm?

Dmi*_*mov 5 testing python juju

我使用 amulet 作为我们开发的护身符的测试框架。我已经尝试重现https://jujucharms.com/docs/stable/tools-amulet 上提供的示例,并且工作正常。但是现在我正在尝试对魅力进行相同的基本设置,它是在硬盘驱动器上开发和存储的('cf-nats' 魅力是从 github 克隆的)。这是我的操作列表(我使用本地环境进行部署):

Python 3.2.3 (default, Feb 27 2014, 21:31:18) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import amulet
>>> import requests
>>> d = amulet.Deployment(series='trusty')
>>> d.add('cf-nats', charm = '/home/ubuntu/cf-charms/charms/trusty/cf-nats')
>>> d.setup()
Run Code Online (Sandbox Code Playgroud)

我得到了下一个输出:

2014-03-10 10:56:09 Starting deployment of local
Traceback (most recent call last):
  File "/usr/bin/juju-deployer", line 9, in <module>
    load_entry_point('juju-deployer==0.2.5', 'console_scripts', 'juju-deployer')()
  File "/usr/lib/python2.7/dist-packages/deployer/cli.py", line 118, in main
    run()
  File "/usr/lib/python2.7/dist-packages/deployer/cli.py", line 204, in run
    importer.Importer(env, deployment, options).run()
  File "/usr/lib/python2.7/dist-packages/deployer/action/importer.py", line 142, in run
    self.get_charms()
  File "/usr/lib/python2.7/dist-packages/deployer/action/importer.py", line 47, in get_charms
    no_local_mods=self.options.no_local_mods)
  File "/usr/lib/python2.7/dist-packages/deployer/deployment.py", line 112, in fetch_charms
    charm.fetch()
  File "/usr/lib/python2.7/dist-packages/deployer/charm.py", line 98, in fetch
    self.vcs.branch()
AttributeError: 'NoneType' object has no attribute 'branch'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/amulet/deployer.py", line 175, in setup
    self.juju_env], cwd=self.deployer_dir)
  File "/usr/lib/python3.2/subprocess.py", line 489, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['juju-deployer', '-W', '-c', '/tmp/amulet-juju-deployer-myb41r.json', '-e', 'local', 'local']' returned non-zero exit status 1
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 juju 命令行界面手动部署相同的魅力,它的工作。

这是来自的输出 d.schema()

>>> d.schema()
{'local': {'services': {'cf-nats-sentry': {'_has_sentry': True, 'expose': True, 'branch': '/tmp/sentry-sub_16ocg4/cf-nats-sentry'}, 'cf-nats': {'_has_sentry': True, 'branch': '/home/ubuntu/cf-charms/charms/trusty/cf-nats'}, 'relation-sentry': {'expose': True, 'branch': '/tmp/sentry_5cdg4t/relation-sentry'}}, 'series': 'trusty', 'relations': [['cf-nats:juju-info', 'cf-nats-sentry:juju-info']]}}
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?如何使用 amulet 框架部署我的本地魅力?应该安装什么样的python包?

先感谢您。

Mar*_*ppi 3

我相信我看到了你的问题。所以,你从 github 中获取了这个魅力,这很好。但是,测试通常是在tests目录中编写和运行的。因此,护身符应用了一点魔法来使用磁盘上的魅力进行部署,因此您不必明确地放入charm=d.add行。但是,由于您是从交互式 shell 运行,因此这样做是有意义的。问题是,它不是 Juju Deployer 所期望的 Bazaar 分支。

通常,当您进行d.add('cf-nats')魅力测试时,会发生什么情况,魅力树会被复制到临时位置,并创建一个 bzr 存储库(如果尚不存在)。然后,新的临时位置将被提供给部署者。但是,由于您已经给了它一个固定的文件路径,因此该部分不会发生(按设计),并且它假设您有一个包含 bzr 存储库的魅力,并且它只会使用它。

解决这个问题的方法是在从( ) 启动 Python3 shell 之前或创建set之后运行export JUJU_TEST_CHARM="cf-nats"(以及 juju 测试插件设置的环境变量)。然后只需执行,amulet 就会看到 getcwd 的基本名称与 Charm 名称相同,并透明地执行它的一点点魔法。$CHARM_DIR/home/ubuntu/cf-charms/charms/trusty/cf-natsd = amulet.Deployment()d.charm_name = 'cf-nats'd.add('cf-nats')

应该可以做到这一点。理想情况下,向 juju 部署程序添加对基于 git 的超级按钮的支持将解决所有这些问题,但请尝试一下,如果它不适合您,请告诉我。