Chefspec with Hashicorp Vault
Я пытаюсь использовать ChefSpec для тестирования реализации Chef и Hashicorp Vault
Рецепт
chef_gem 'vault' do
compile_time true if Chef::Resource::ChefGem.instance_methods(false).include?(:compile_time)
end
require 'vault'
Vault.address = 'https://address:8200'
Vault.token = citadel['foo/bar']
Vault.auth_token.renew_self
Тестовое задание
require_relative '../spec_helper'
describe 'wrapper::default' do
context 'role is foo' do
let(:chef_run) do
ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '14.04') do |node|
node.default['role'] = 'foo'
const_set(:Vault, Module.new)
end.converge(described_recipe)
end
before(:each) do
allow_any_instance_of(Chef::Recipe).to receive(:require).and_call_original
allow_any_instance_of(Chef::Recipe).to receive(:require).with('vault').and_return(true)
allow_any_instance_of(::Vault).to receive(:address).and_call_original
allow_any_instance_of(::Vault).to receive(:address).with('https://localhost:8200').and_return(true)
end
it 'install vault gem' do
expect(chef_run).to install_chef_gem('vault')
end
end
end
ошибка
Failure/Error: expect(Chef::Recipe::Vault).to receive(:address).and_call_original
NameError:
uninitialized constant Vault
Как заглушить переменные Vault? Это Хасикорп Хранилище, а не Шеф-Хранилище.
1 ответ
Я добрался сюда и все еще не мог понять это, поэтому я переместил свой код хранилища в свою собственную библиотеку, которую я включил в рецепт, чтобы я не мог высмеивать его во время запуска ChefSpec.
так что у меня под my-cookbook/libraries/my_vault.rb
с этим кодом:
require 'vault'
module MyVault
module Helpers
def get_vault_secret(secret)
Vault.configure do |config|
config.address = "#{node[:vault_url]}"
config.token = "#{node[:vault_token]}"
end
Vault.logical.read(secret)
end
end
end
и в моем рецепте:
Chef::Recipe.send(:include, MyVault::Helpers)
creds = get_vault_secret("secret/jmx")
user = creds.data[:user]
password = creds.data[:password]
template "/etc/app/jmx.password" do
source "jmx.password.erb"
mode 0600
owner "dev"
group "dev"
variables({
:user => user,
:password => password
})
end
и мой тест спецификации:
require 'chefspec'
require 'chefspec/berkshelf'
describe 'app::metrics' do
platform 'ubuntu', '14.04'
before do
response = Object.new
allow(response).to receive_messages(:data => {
:user => "benzi",
:password => "benzi"
})
allow_any_instance_of(Chef::Recipe).to receive(:get_vault_secret).and_return(response)
end
describe 'adds jmx.access to app folder' do
it { is_expected.to create_template('/etc/app/jmx.access')
.with(
user: 'dev',
group: 'dev',
mode: 0644
) }
end
Я уже ответил на ваше письмо, вы хотите allow_any_instance_of(::Vault)
и аналогичные, и вам, возможно, придется создать модуль (const_set(:Vault, Module.new)
) если он еще не существует