如何使用 ChefSpec 测试 Chef Server 的安装?

如何使用 ChefSpec 测试 Chef Server 的安装?

我开始为我的 Chef 食谱编写测试。我正在使用厨师规格对我的食谱进行单元测试。我需要在我的其中一台主机上安装 Chef Server,并想为此编写一个测试。到目前为止,我已经:

ChefSpec 测试文件位于spec/default_spec.rb

require 'chefspec'  
require 'chefspec/berkshelf'

describe 'my_chef_server::default' do
  let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }

  it 'includes the chef-server recipe' do
    expect(chef_run).to include_recipe('chef-server')
  end
end

metadata.rb声明chef-server食谱是依赖项的文件。

depends 'chef-server'

recipes/default.rb包含以下菜谱chef-server

include_recipe 'chef-server'

当我运行测试(使用rspec)时出现错误:

================================================================================
Recipe Compile Error in /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/my_chef_server/recipes/default.rb
================================================================================

RuntimeError
------------
Could not locate chef-server package matching version 'latest' for node.

Cookbook Trace:
---------------
  /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/chef-server/recipes/default.rb:31:in `from_file'
  /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/my_chef_server/recipes/default.rb:11:in `from_file'

Relevant File Content:
----------------------
/var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/chef-server/recipes/default.rb:

 24:      node['chef-server']['nightlies']
 25:      )
 26:    unless omnibus_package
 27:      err_msg = 'Could not locate chef-server'
 28:      err_msg << ' pre-release' if node['chef-server']['prereleases']
 29:      err_msg << ' nightly' if node['chef-server']['nightlies']
 30:      err_msg << " package matching version '#{node['chef-server']['version']}' for node."
 31>>     fail err_msg
 32:    end
 33:  else
 34:    omnibus_package = node['chef-server']['package_file']
 35:  end
 36:  
 37:  package_name = ::File.basename(omnibus_package)
 38:  package_local_path = "#{Chef::Config[:file_cache_path]}/#{package_name}"
 39:  
 40:  # Ensure :file_cache_path exists

F.

Failures:

  1) my_chef_server::default includes the chef-server recipe
     Failure/Error: let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
     RuntimeError:
       Could not locate chef-server package matching version 'latest' for node.
     # /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/chef-server/recipes/default.rb:31:in `from_file'
     # /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/my_chef_server/recipes/default.rb:11:in `from_file'
     # ./spec/default_spec.rb:6:in `block (2 levels) in <top (required)>'
     # ./spec/default_spec.rb:9:in `block (2 levels) in <top (required)>'

Finished in 0.28717 seconds
2 examples, 1 failure

Failed examples:

rspec ./spec/default_spec.rb:8 # my_chef_server::default includes the chef-server recipe

据我所知,ChefSpec 可以正确加载和执行我的食谱,并运行依赖的chef-server食谱。但是,错误显示chef-server食谱无法安装最新的 chef-server 包。

我应该如何编写或模拟我的测试以便能够正确测试 Chef Server 是否安装成功?

答案1

因此,这很大程度上是由于一个名为OmnitruckClient 正在创建在 chef-server 默认配方中。OmnitruckClient 基本上是对 Omnitruck 端点的 HTTP 调用,旨在返回一个 URL,chef-server 配方随后会从该 URL 下载包。

我能想到有几种方法可以测试这种行为。

由于原生 ChefSpec 虚拟“平台”被命名为chefsepc,Omnitruck 服务将绝不使用正确的 URL 链接进行响应,因此一种方法是向 Spec 测试提供平台和版本,以后可能会有其他值。

您可以在 RSpec 的常规配置或每个测试用例(甚至每个收敛)中提供这些选择。

我发现在 spec_helper.rb 文件中设置这些是最简单的。请参阅这里有关配置选项的更多信息。

另一种模式可能是尝试模拟/存根 OmnitruckClient 类(或它使用的 Net::HTTP.get 方法),但这似乎可能会更令人困惑,而且我实际上还无法让它发挥作用。

相关内容