我使用护身符作为我们开发的护身符的测试框架。我已经尝试重现了一个示例,该示例提供于https://jujucharms.com/docs/stable/tools-amulet并且运行良好。但现在我正尝试对 charm 进行相同的基本设置,该 charm 已开发并存储在硬盘上(“cf-nats” charm 是从 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()
我得到了以下输出:
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
我也尝试使用 juju 命令行界面手动部署相同的 charm,并且它可以工作。
以下是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']]}}
我的代码有什么问题?如何使用 amulet 框架部署本地 charm?应该安装哪种 python 包?
先感谢您。
答案1
我相信我明白你的问题了。所以,你从 github 拉取了这个 charm,这没问题。但是,测试通常是在目录中编写和运行的tests
。因此,amulet 使用磁盘上的 charm 来部署,因此你不必明确输入charm=
该d.add
行。但是,由于你是从交互式 shell 运行的,所以这样做是有意义的。问题是,它不是 Juju Deployer 所期望的 Bazaar 分支。
通常,当您d.add('cf-nats')
在 charm 测试中执行此操作时,charm 树会被复制到一个临时位置,并创建一个 bzr 存储库(如果尚不存在)。然后将该新临时位置提供给部署程序。但是,由于您已为其指定了固定文件路径,因此该部分不会发生(根据设计),并且它假定您有一个具有 bzr 存储库的 charm,并且它将使用该存储库。
解决此问题的方法是在从( )export JUJU_TEST_CHARM="cf-nats"
启动 Python3 shell 之前或创建set之后运行 (并设置 juju 测试插件的环境变量) 。然后只需执行,护身符就会看到 getcwd 的基本名称与 charm 名称相同,并透明地执行它的一点魔法。$CHARM_DIR
/home/ubuntu/cf-charms/charms/trusty/cf-nats
d = amulet.Deployment()
d.charm_name = 'cf-nats'
d.add('cf-nats')
应该可以。理想情况下,为 juju deployer 添加对基于 git 的 charms 的支持将解决所有问题,但请尝试一下,如果它不适合您,请告诉我。