【问题标题】:How to require cookbook libraries in kitchen serverspec tests如何在厨房服务器规范测试中要求食谱库
【发布时间】:2014-11-28 00:03:55
【问题描述】:

在一本食谱上,我定义了一个类 Rds::Checks,它共享为 bash/execute 资源和 Guards 构建 unix 命令的方法。文件库/checks.rb 的示例是:

module Rds
 class Checks
   class << self

     def ssh_config_entry_present host, config_file, key_name
       "cat #{config_file} | grep #{key_name}"   
     end

     def redmine_migrated user, pass, name
       "if [ `mysql -u#{user} -p#{pass} -e 'select count(id) FROM #{name}.users;' | sed -n '2 p'` -gt 0 ]; then echo '0'; else echo '1'; fi"
     end

   end
 end
end 

在 LWPR 提供程序、recipes 和 chefspec 测试中,文件加载没有问题,但是当我通过 kitchen verify 在 serverspec 中使用它时会引发错误。

paolo@tower:~/cookbooks/rds$ cat test/integration/install/serverspec/localhost/install_spec.rb
...
    it 'do migrations' do
      cmd = Rds::Checks.redmine_migrated 
      expect(command(cmd).stdout).to eq 0
    end
...


paolo@tower:~/cookbooks/rds$ kitchen verify

...

    NameError:
      uninitialized constant Rds

我真的很想将构建 bash/sh 命令的方法保留在一个公共层上,以便我可以单独对其进行测试,而不必在单元和集成测试中打扰它们

【问题讨论】:

    标签: ruby chef-infra test-kitchen serverspec


    【解决方案1】:

    您必须手动加载它,可能将保存食谱数据的临时文件夹添加到加载路径,我认为它在 /tmp/kitchen/cookbooks 下。添加正确的libraries/ 文件夹,然后正常要求。总体而言,收敛和验证阶段彼此无关,因为 test-kitchen 可以与 Chef 以外的东西一起使用。

    您可能想查看 minitest handler 之类的东西,它在 Chef 收敛上下文中运行测试,或者 audit mode proposal 执行类似的操作。

    使用类似的方法,您可以在说明书本身中编写测试,因此,converge 实际上既会聚合节点,又会运行测试,verify 要么是无操作,要么会运行额外的外部测试。

    【讨论】:

    • 可能是将此库共享为 gem 并将它们添加到 Gemfile 的解决方案?
    • 当然,不过还有很多工作要做。您可以强制 busser-serverspec 安装这样的自定义 gem,但这并不容易。
    • busser-rspec 和 busser-serverspec 接受 Gemfile,因此强制他们安装自定义 gem 也不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多