Como testar a instalação do Chef Server usando o ChefSpec?

2

Estou começando a escrever testes para meus livros de culinária do Chef. Estou usando o ChefSpec para testar meus livros de culinária. Eu preciso instalar um Chef Server em um dos meus hosts e gostaria de escrever um teste para isso. Até agora eu tenho:

Um arquivo de teste do ChefSpec em 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

Um arquivo metadata.rb que declara que o livro de receitas chef-server é uma dependência.

depends 'chef-server'

Um recipes/default.rb que inclui a receita chef-server :

include_recipe 'chef-server'

Quando executo meus testes (usando rspec ), recebo um erro:

================================================================================
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

Tanto quanto eu posso dizer, o ChefSpec está carregando e executando corretamente o meu livro de receitas e executando o livro de receitas dependente chef-server . No entanto, o erro mostra que o livro de receitas chef-server não consegue instalar o pacote chef-server mais recente.

Como devo escrever ou escarnecer do meu teste para que eu possa testar corretamente se o Chef Server foi instalado com sucesso?

    
por Andrew 30.04.2014 / 00:04

1 resposta

1

Portanto, isso se deve em grande parte a uma nova instância de uma classe chamada OmnitruckClient sendo criado na receita padrão do chef-servidor. O OmnitruckClient é basicamente uma chamada HTTP para o terminal Omnitruck, que deve retornar uma URL na qual a receita chef-servidor fará o download do pacote.

Existem algumas maneiras de lidar com o teste desse comportamento em que posso pensar.

Como a 'plataforma' virtual nativa ChefSpec é chamada de chefsepc , o serviço Omnitruck nunca responderá com um link de URL correto, então um método seria fornecer uma plataforma e uma versão para o Spec teste, que pode ter outros valores mais tarde.

Você pode fornecer essas seleções na configuração geral do RSpec ou no caso por teste (ou até mesmo em cada convergência).

Acho mais fácil configurá-los no arquivo spec_helper.rb. Veja aqui para mais informações sobre as opções de configuração.

Outro modo pode ser tentar zombar / arrancar a classe OmnitruckClient (ou o método Net :: HTTP.get que ele usa), mas parece que isso pode ser um pouco mais confuso, e eu realmente não consegui para trabalhar ainda.

    
por 04.10.2014 / 10:50

Tags