Назад | Перейти на главную страницу

Как протестировать установку Chef Server с помощью ChefSpec?

Я начинаю писать тесты для своих кулинарных книг от шеф-повара. я использую ChefSpec для модульного тестирования моих кулинарных книг. Мне нужно установить 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 cookbook не может установить последнюю версию пакета chef-server.

Как мне написать или смоделировать свой тест, чтобы я мог правильно проверить, что Chef Server установлен успешно?

Так что это во многом связано с новым экземпляром класса с именем OmnitruckClient создается в рецепте по умолчанию для chef-server. OmnitruckClient - это, по сути, HTTP-вызов конечной точки Omnitruck, который предназначен для возврата URL-адреса, откуда рецепт шеф-сервера затем загрузит пакет.

Я могу придумать несколько способов справиться с тестированием этого поведения.

Поскольку нативная виртуальная «платформа» ChefSpec называется chefsepc, сервис Omnitruck никогда ответьте правильной URL-ссылкой, поэтому одним из методов может быть предоставление платформы и версии для теста Spec, которые позже могут иметь другие значения.

Вы можете предоставить эти варианты выбора либо в общей конфигурации для RSpec, либо в каждом тестовом примере (или даже в каждом из них).

Я считаю, что проще всего установить их в файле spec_helper.rb. Видеть Вот для получения дополнительной информации о параметрах конфигурации.

Другой режим может заключаться в том, чтобы попытаться высмеять / заглушить класс OmnitruckClient (или метод Net :: HTTP.get, который он использует), но казалось, что это может быть немного более запутанным, и я пока не мог заставить это работать .