我想用chefspec来测试我食谱的幂等性。
假设我有一个包含这两个资源语句的配方:
file '/etc/app.config' do
action :create
notifies :restart, "service[app]"
end
service 'app' do
action :enable
end
如果文件/etc/app.config
已经存在,我如何编写一个证明的chefspec示例,然后app
服务会 通知重启?
我可以做一些嘲弄'文件'资源认为该文件已存在吗?我可以运行ChefSpec :: ServerRunner两次,保持第一次运行状态(我假设没有,因为文件不会真的被创建)?或者我会被迫使用测试厨房和Vagrant来为realz做些什么吗?
(注意:我的实际食谱有一个自定义LWRP来构建配置文件。它从一个厨师服务器获取信息,这就是我使用ServerRunner的原因)
答案 0 :(得分:1)
test-kitchen
因为版本1.18.0
为chef_*
供应商的幂等性检查提供了工作支持(它是先前介绍的,但已经破解,只在最新版本中修复)。它没有记录,但你可以找到一些细节here。
基本上,您可以做的是将这两行添加到provisioner
定义中:
provisioner:
name: chef_zero
...
enforce_idempotency: true # force idempotence check
multiple_converge: 2 # how many times to run your provisioners
...
这将多次运行您的食谱并检查上次运行是否有0
个更新资源。它还为您提供了第二次运行时更新的资源清单。
答案 1 :(得分:0)
警告这是未经测试的。
我假设您可以模拟::File.exist?
以在此文件的规范中返回true。
allow_any_instance_of(File).to receive('exists?').with('/etc/app.config').and_return(true)
根据file provider,这是在提供程序中调用以获取当前状态的方法。
这样可以干净地处理您在问题中描述的文件资源。
但是,如果操作为:create
并且资源是使用checksum
属性或content
属性定义的,那么您必须设法模拟文件的内容或像这样的校验和
allow_any_instance_of(Chef::Digester).to receive('generate_checksum').with('/etc/app.config').and_return('The checksum of the file, do a sha256sum on your file to get this')
之后,您必须关注有关通知here
的ChefSpec文档resource = chef_run.file('/etc/app.config')
expect(resource).to_not notify('service[app]').to(:restart)
据我所知,Test-Kitchen旨在测试一次性运行以确保烹饪书是正确的,在同一测试中多次厨师运行不会被处理,你最终不得不决定你想要使用什么用于多次运行测试。
在关于基础设施测试的厨师邮件列表上有关于此的讨论,请参阅标签wiki以获取ML的链接(谈话不是最终答案,不适合SO)。
答案 2 :(得分:0)
看起来不同的起始条件只能通过实际收敛来实际测试。如果是这样,我的问题的正确答案是使用像测试厨房和Vagrant,而不是ChefSpec。