如何用chefspec测试幂等性

时间:2015-05-01 11:15:05

标签: chef chefspec

我想用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的原因)

3 个答案:

答案 0 :(得分:1)

test-kitchen因为版本1.18.0chef_*供应商的幂等性检查提供了工作支持(它是先前介绍的,但已经破解,只在最新版本中修复)。它没有记录,但你可以找到一些细节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。