Improve ChefSpec test speed by enabling caching

This updates all references of let(:chef_run) to cached(:chef_run) to speed up
tests. By doing this, we have to create a new cached(:chef_run) block whenever
we need to adjust node attributes for testing.

Some additional fixes include:
- Add default['openstack']['common']['search_count_max'] attribute to allow speed
  ups during testing.
- Improved a few tests
- Adjusted some formatting
- Remove deprecated ChefSpec::Coverage.start function
- Show warnings
- Use major version for redhat platform
- Update to Ubuntu 18.04

Speed was improved from 4 minutes 16 seconds to 41.98 seconds.

Change-Id: Icb9147036a01f92ec48a24c692dd022258e294c0
This commit is contained in:
Lance Albertson 2019-12-07 16:29:45 -08:00
parent d5e2d175cd
commit 4000e8aa96
17 changed files with 279 additions and 113 deletions

View File

@ -321,6 +321,10 @@ end
# The location of the OSC bash completion file # The location of the OSC bash completion file
default['openstack']['common']['bash_complete'] = '/etc/bash_completion.d/osc.bash_completion' default['openstack']['common']['bash_complete'] = '/etc/bash_completion.d/osc.bash_completion'
# Set maximum count for searches [1]
# [1] https://review.opendev.org/60126
default['openstack']['common']['search_count_max'] = 7
# The name of the Chef role that installs the Keystone Service API # The name of the Chef role that installs the Keystone Service API
default['openstack']['identity_service_chef_role'] = 'os-identity' default['openstack']['identity_service_chef_role'] = 'os-identity'

View File

@ -29,7 +29,7 @@ module ::Openstack
recipe_query = "(chef_environment:#{node.chef_environment} AND recipes:#{r})".sub('::', '\:\:') recipe_query = "(chef_environment:#{node.chef_environment} AND recipes:#{r})".sub('::', '\:\:')
query = "#{role_query} OR #{recipe_query}" query = "#{role_query} OR #{recipe_query}"
count = 1 count = 1
sum = 7 sum = node['openstack']['common']['search_count_max']
while count < sum while count < sum
resp = search(:node, query, &block) resp = search(:node, query, &block)
break unless resp.nil? break unless resp.nil?

View File

@ -6,7 +6,7 @@ describe 'openstack-common::default' do
describe 'Openstack CLI' do describe 'Openstack CLI' do
let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
runner.converge(described_recipe) runner.converge(described_recipe)
end end
let(:subject) { Object.new.extend(Openstack) } let(:subject) { Object.new.extend(Openstack) }

View File

@ -0,0 +1,20 @@
# encoding: UTF-8
require_relative 'spec_helper'
describe 'openstack-common::client' do
describe 'redhat' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
cached(:chef_run) do
runner.converge(described_recipe)
end
it 'converges successfully' do
expect { chef_run }.to_not raise_error
end
it do
expect(chef_run).to upgrade_package('python-openstackclient')
end
end
end

View File

@ -5,10 +5,14 @@ describe 'openstack-common::client' do
describe 'ubuntu' do describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
runner.converge(described_recipe) runner.converge(described_recipe)
end end
it 'converges successfully' do
expect { chef_run }.to_not raise_error
end
it do it do
expect(chef_run).to upgrade_package('python3-openstackclient') expect(chef_run).to upgrade_package('python3-openstackclient')
end end

View File

@ -5,8 +5,18 @@ describe 'openstack-common::completions' do
describe 'ubuntu' do describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
runner.converge(described_recipe) runner.converge(described_recipe)
end end
it 'converges successfully' do
expect { chef_run }.to_not raise_error
end
it do
expect(chef_run).to run_execute('create OSC bash completions')
.with(
command: 'openstack complete > /etc/bash_completion.d/osc.bash_completion',
creates: '/etc/bash_completion.d/osc.bash_completion'
)
end
end end
end end

View File

@ -6,7 +6,7 @@ describe 'openstack-common::default' do
describe 'module Openstack config_helpers' do describe 'module Openstack config_helpers' do
let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
runner.converge(described_recipe) runner.converge(described_recipe)
end end
let(:subject) { Object.new.extend(Openstack) } let(:subject) { Object.new.extend(Openstack) }

View File

@ -4,13 +4,10 @@ require_relative 'spec_helper'
describe 'test-openstack-common-database::default' do describe 'test-openstack-common-database::default' do
let(:runner) do let(:runner) do
ChefSpec::SoloRunner.new(platform: 'ubuntu', ChefSpec::SoloRunner.new(CHEFSPEC_OPTS.dup.merge(step_into: ['openstack_common_database']))
version: '16.04',
log_level: :fatal,
step_into: ['openstack_common_database'])
end end
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
node.override['openstack']['use_databags'] = false node.override['openstack']['use_databags'] = false
node.override['openstack']['secret']['mysqlroot']['db'] = 'root_pass' node.override['openstack']['secret']['mysqlroot']['db'] = 'root_pass'
node.override['openstack']['db']['service'] = { service_type: 'mysql', port: 3306, db_name: 'service_db' } node.override['openstack']['db']['service'] = { service_type: 'mysql', port: 3306, db_name: 'service_db' }
@ -23,8 +20,12 @@ describe 'test-openstack-common-database::default' do
end end
context 'specific root user db endpoint' do context 'specific root user db endpoint' do
before do cached(:chef_run) do
node.override['openstack']['endpoints']['db']['host_for_db_root_user'] = 'localhost123' node.override['openstack']['endpoints']['db']['host_for_db_root_user'] = 'localhost123'
node.override['openstack']['use_databags'] = false
node.override['openstack']['secret']['mysqlroot']['db'] = 'root_pass'
node.override['openstack']['db']['service'] = { service_type: 'mysql', port: 3306, db_name: 'service_db' }
runner.converge(described_recipe)
end end
it 'connects to the database via a specific endpoint for the root user' do it 'connects to the database via a specific endpoint for the root user' do
expect(chef_run).to create_database('create database service_db') expect(chef_run).to create_database('create database service_db')

View File

@ -5,12 +5,15 @@ describe 'openstack-common::default' do
describe 'rhel-rdo' do describe 'rhel-rdo' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
node.override['openstack']['release'] = 'testrelease' node.override['openstack']['release'] = 'testrelease'
runner.converge(described_recipe) runner.converge(described_recipe)
end end
it 'converges successfully' do
expect { chef_run }.to_not raise_error
end
it do it do
expect(chef_run).to upgrade_package('centos-release-qemu-ev') expect(chef_run).to upgrade_package('centos-release-qemu-ev')
end end
@ -22,9 +25,11 @@ describe 'openstack-common::default' do
end end
context 'enabling RDO with gpgcheck enabled' do context 'enabling RDO with gpgcheck enabled' do
before do cached(:chef_run) do
node.override['openstack']['release'] = 'testrelease'
node.override['openstack']['yum']['rdo_enabled'] = true node.override['openstack']['yum']['rdo_enabled'] = true
node.override['openstack']['yum']['gpgcheck'] = true node.override['openstack']['yum']['gpgcheck'] = true
runner.converge(described_recipe)
end end
it 'adds RDO yum repository' do it 'adds RDO yum repository' do
@ -40,9 +45,11 @@ describe 'openstack-common::default' do
end end
context 'enabling RDO with gpgcheck disabled' do context 'enabling RDO with gpgcheck disabled' do
before do cached(:chef_run) do
node.override['openstack']['release'] = 'testrelease'
node.override['openstack']['yum']['rdo_enabled'] = true node.override['openstack']['yum']['rdo_enabled'] = true
node.override['openstack']['yum']['gpgcheck'] = false node.override['openstack']['yum']['gpgcheck'] = false
runner.converge(described_recipe)
end end
it 'adds RDO yum repository' do it 'adds RDO yum repository' do
@ -56,8 +63,10 @@ describe 'openstack-common::default' do
end end
context 'disabling RDO deps repo with is_release true' do context 'disabling RDO deps repo with is_release true' do
before do cached(:chef_run) do
node.override['openstack']['release'] = 'testrelease'
node.override['openstack']['is_release'] = true node.override['openstack']['is_release'] = true
runner.converge(described_recipe)
end end
it 'does not add the RDO deps yum repository' do it 'does not add the RDO deps yum repository' do
@ -66,8 +75,10 @@ describe 'openstack-common::default' do
end end
context 'disabling RDO' do context 'disabling RDO' do
before do cached(:chef_run) do
node.override['openstack']['release'] = 'testrelease'
node.override['openstack']['yum']['rdo_enabled'] = false node.override['openstack']['yum']['rdo_enabled'] = false
runner.converge(described_recipe)
end end
it 'removes RDO yum repository' do it 'removes RDO yum repository' do
@ -77,12 +88,6 @@ describe 'openstack-common::default' do
# https://github.com/sethvargo/chefspec#packaging-custom-matchers # https://github.com/sethvargo/chefspec#packaging-custom-matchers
expect(chef_run).to remove_yum_repository('RDO-testrelease') expect(chef_run).to remove_yum_repository('RDO-testrelease')
end end
it 'does nothing when RDO yum repository does not exist' do
repo = chef_run.find_resource('yum_repository', 'RDO-testrelease')
expect(repo.performed_actions).to be_empty
end
it 'does include yum-epel recipe' do it 'does include yum-epel recipe' do
expect(chef_run).to include_recipe('yum-epel') expect(chef_run).to include_recipe('yum-epel')
end end
@ -91,5 +96,17 @@ describe 'openstack-common::default' do
expect(chef_run).to_not create_remote_file('/etc/yum.repos.d/rdo-manager-release.repo') expect(chef_run).to_not create_remote_file('/etc/yum.repos.d/rdo-manager-release.repo')
end end
end end
context 'disabling RDO and repo file does not exist' do
cached(:chef_run) do
node.override['openstack']['release'] = 'testrelease'
node.override['openstack']['yum']['rdo_enabled'] = false
runner.converge(described_recipe)
end
it 'does nothing when RDO yum repository does not exist' do
allow(FileTest).to receive(:exist?).with('/etc/yum.repos.d/RDO-testrelease.repo').and_return(false)
expect(chef_run).to nothing_yum_repository('RDO-testrelease')
end
end
end end
end end

View File

@ -6,60 +6,94 @@ describe 'openstack-common::default' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:mq_services) { %w(bare_metal block_storage compute database image telemetry network orchestration) } let(:mq_services) { %w(bare_metal block_storage compute database image telemetry network orchestration) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
runner.converge(described_recipe) runner.converge(described_recipe)
end end
it 'converges successfully' do
expect { chef_run }.to_not raise_error
end
it 'does not include apt for apt-get update' do it 'does not include apt for apt-get update' do
expect(chef_run).to_not include_recipe 'apt' expect(chef_run).to_not include_recipe 'apt'
end end
it 'updates apt cache before installing packages' do context 'update_apt_cache true' do
node.override['openstack']['apt']['update_apt_cache'] = true cached(:chef_run) do
expect(chef_run).to update_apt_update 'default' node.override['openstack']['apt']['update_apt_cache'] = true
runner.converge(described_recipe)
end
it 'updates apt cache before installing packages' do
expect(chef_run).to update_apt_update 'default'
end
end
it do
expect(chef_run).to create_file('/etc/apt/apt.conf.d/confdef')
.with(
owner: 'root',
group: 'root',
mode: 00644,
content: "Dpkg::Options {\n \"--force-confdef\";\n \"--force-confold\";\n }"
)
end end
it 'upgrades ubuntu-cloud-keyring package' do it 'upgrades ubuntu-cloud-keyring package' do
expect(chef_run).to upgrade_package 'ubuntu-cloud-keyring' expect(chef_run).to upgrade_package 'ubuntu-cloud-keyring'
end end
it 'configures openstack repository' do context 'live_updates_enabled true' do
# Using cookbook(apt) LWRP custom matcher cached(:chef_run) do
# https://github.com/sethvargo/chefspec#packaging-custom-matchers node.override['openstack']['apt']['live_updates_enabled'] = true
node.override['openstack']['apt']['live_updates_enabled'] = true runner.converge(described_recipe)
expect(chef_run).to add_apt_repository('openstack-ppa').with( end
uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu', it 'configures openstack repository' do
distribution: 'xenial-updates/rocky', # Using cookbook(apt) LWRP custom matcher
components: ['main'], # https://github.com/sethvargo/chefspec#packaging-custom-matchers
cache_rebuild: true expect(chef_run).to add_apt_repository('openstack-ppa').with(
) uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu',
distribution: 'bionic-updates/rocky',
components: ['main'],
cache_rebuild: true
)
end
end end
it 'disables openstack live updates' do context 'live_updates_enabled false' do
node.override['openstack']['apt']['live_updates_enabled'] = false cached(:chef_run) do
expect(chef_run).to_not add_apt_repository('openstack-ppa').with( node.override['openstack']['apt']['live_updates_enabled'] = false
uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu', runner.converge(described_recipe)
distribution: 'xenial-updates/rocky', end
components: ['main'] it 'disables openstack live updates' do
) expect(chef_run).to_not add_apt_repository('openstack-ppa').with(
uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu',
distribution: 'bionic-updates/rocky',
components: ['main']
)
end
end end
it 'configures openstack proposed repository' do it 'configures openstack proposed repository' do
expect(chef_run).to add_apt_repository('openstack-ppa-proposed').with( expect(chef_run).to add_apt_repository('openstack-ppa-proposed').with(
uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu', uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu',
distribution: 'xenial-proposed/rocky', distribution: 'bionic-proposed/rocky',
components: ['main'], components: ['main'],
cache_rebuild: true cache_rebuild: true
) )
end end
it 'disables openstack proposed repository' do context 'is_release true' do
node.override['openstack']['is_release'] = true cached(:chef_run) do
expect(chef_run).to_not add_apt_repository('openstack-ppa-proposed').with( node.override['openstack']['is_release'] = true
uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu', runner.converge(described_recipe)
distribution: 'xenial-proposed/rocky', end
components: ['main'] it 'disables openstack proposed repository' do
) expect(chef_run).to_not add_apt_repository('openstack-ppa-proposed').with(
uri: 'http://ubuntu-cloud.archive.canonical.com/ubuntu',
distribution: 'bionic-proposed/rocky',
components: ['main']
)
end
end end
pkgs = %w(python3 python3-dev python3-pip python3-setuptools python3-virtualenv python3-wheel virtualenv) pkgs = %w(python3 python3-dev python3-pip python3-setuptools python3-virtualenv python3-wheel virtualenv)
@ -72,10 +106,14 @@ describe 'openstack-common::default' do
expect(chef_run).to_not install_chef_gem('chef-vault') expect(chef_run).to_not install_chef_gem('chef-vault')
end end
it 'installs the gem chef-vault if databag_type is vault' do context 'databag_type vault' do
node.override['openstack']['databag_type'] = 'vault' cached(:chef_run) do
expect(chef_run).to install_chef_gem('chef-vault') node.override['openstack']['databag_type'] = 'vault'
.with(version: '~> 3.2') runner.converge(described_recipe)
end
it 'installs the gem chef-vault if databag_type is vault' do
expect(chef_run).to install_chef_gem('chef-vault').with(version: '~> 3.2')
end
end end
context 'rabbit mq' do context 'rabbit mq' do
@ -94,6 +132,12 @@ describe 'openstack-common::default' do
'kombu_reconnect_delay' => 123.456, 'kombu_reconnect_delay' => 123.456,
'kombu_reconnect_timeout' => 123, 'kombu_reconnect_timeout' => 123,
} }
cached(:chef_run) do
rabbit_opts.each do |key, value|
node.override['openstack']['mq']['rabbitmq'][key] = value
end
runner.converge(described_recipe)
end
rabbit_opts.each do |key, value| rabbit_opts.each do |key, value|
it "configures rabbit mq #{key}" do it "configures rabbit mq #{key}" do
node.override['openstack']['mq']['rabbitmq'][key] = value node.override['openstack']['mq']['rabbitmq'][key] = value

View File

@ -7,7 +7,9 @@ describe 'openstack-common::default' do
describe 'Openstack endpoints' do describe 'Openstack endpoints' do
let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) } cached(:chef_run) do
runner.converge(described_recipe)
end
let(:subject) { Object.new.extend(Openstack) } let(:subject) { Object.new.extend(Openstack) }
%w(public internal).each do |ep_type| %w(public internal).each do |ep_type|
@ -109,19 +111,24 @@ describe 'openstack-common::default' do
expect(subject.rabbit_transport_url('compute')).to eq(expected) expect(subject.rabbit_transport_url('compute')).to eq(expected)
end end
it do context 'non-default mq attributes' do
node.override['openstack']['mq']['service_type'] = 'rabbit' cached(:chef_run) do
node.override['openstack']['mq']['cluster'] = true node.override['openstack']['mq']['service_type'] = 'rabbit'
node.override['openstack']['mq']['compute']['rabbit']['userid'] = 'rabbit2' node.override['openstack']['mq']['cluster'] = true
node.override['openstack']['endpoints']['mq']['port'] = 1234 node.override['openstack']['mq']['compute']['rabbit']['userid'] = 'rabbit2'
node.override['openstack']['mq']['servers'] = %w(10.0.0.1 10.0.0.2 10.0.0.3) node.override['openstack']['endpoints']['mq']['port'] = 1234
node.override['openstack']['mq']['vhost'] = '/anyhost' node.override['openstack']['mq']['servers'] = %w(10.0.0.1 10.0.0.2 10.0.0.3)
allow(subject).to receive(:node).and_return(chef_run.node) node.override['openstack']['mq']['vhost'] = '/anyhost'
allow(subject).to receive(:get_password) runner.converge(described_recipe)
.with('user', 'rabbit2') end
.and_return('mypass2') it do
expected = 'rabbit://rabbit2:mypass2@10.0.0.1:1234,rabbit2:mypass2@10.0.0.2:1234,rabbit2:mypass2@10.0.0.3:1234/anyhost' allow(subject).to receive(:node).and_return(chef_run.node)
expect(subject.rabbit_transport_url('compute')).to eq(expected) allow(subject).to receive(:get_password)
.with('user', 'rabbit2')
.and_return('mypass2')
expected = 'rabbit://rabbit2:mypass2@10.0.0.1:1234,rabbit2:mypass2@10.0.0.2:1234,rabbit2:mypass2@10.0.0.3:1234/anyhost'
expect(subject.rabbit_transport_url('compute')).to eq(expected)
end
end end
end end
@ -164,15 +171,20 @@ describe 'openstack-common::default' do
).to eq(expected) ).to eq(expected)
end end
it 'returns network db info hash when service found for sqlite with options' do context 'sqlite' do
node.override['openstack']['db']['service_type'] = 'sqlite' cached(:chef_run) do
node.override['openstack']['db']['options'] = { 'sqlite' => '?options' } node.override['openstack']['db']['service_type'] = 'sqlite'
node.override['openstack']['db']['network']['path'] = 'path' node.override['openstack']['db']['options'] = { 'sqlite' => '?options' }
allow(subject).to receive(:node).and_return(chef_run.node) node.override['openstack']['db']['network']['path'] = 'path'
expected = 'sqlite:///path?options' runner.converge(described_recipe)
expect( end
subject.db_uri('network', 'user', 'pass') it 'returns network db info hash when service found for sqlite with options' do
).to eq(expected) allow(subject).to receive(:node).and_return(chef_run.node)
expected = 'sqlite:///path?options'
expect(
subject.db_uri('network', 'user', 'pass')
).to eq(expected)
end
end end
it 'returns compute db info hash when service found for mariadb' do it 'returns compute db info hash when service found for mariadb' do

View File

@ -5,7 +5,7 @@ describe 'openstack-common::logging' do
describe 'ubuntu' do describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) } cached(:chef_run) { runner.converge(described_recipe) }
describe '/etc/openstack' do describe '/etc/openstack' do
let(:dir) { chef_run.directory('/etc/openstack') } let(:dir) { chef_run.directory('/etc/openstack') }

View File

@ -4,17 +4,48 @@ require ::File.join ::File.dirname(__FILE__), '..', 'libraries', 'network'
describe 'openstack-common::default' do describe 'openstack-common::default' do
describe 'Openstack address_for and bind_address' do describe 'Openstack address_for and bind_address' do
let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) } interfaces = {
let(:node) { runner.node } 'lo' => {
let(:chef_run) do 'addresses' => {
node.automatic['network']['interfaces'] = { '127.0.0.1' => {
'lo' => { 'addresses' => { '127.0.0.1' => { 'family' => 'inet', 'prefixlen' => '8', 'netmask' => '255.0.0.0', 'scope' => 'Node' }, 'family' => 'inet',
'::1' => { 'family' => 'inet6', 'prefixlen' => '128', 'scope' => 'Node' }, 'prefixlen' => '8',
'2001:db8::1' => { 'family' => 'inet6', 'prefixlen' => '64', 'scope' => 'Node' } } }, 'netmask' => '255.0.0.0',
'eth0' => { 'addresses' => { '10.0.0.2' => { 'family' => 'inet', 'prefixlen' => '32', 'netmask' => '255.255.255.255', 'scope' => 'Node' }, 'scope' => 'Node',
'10.0.0.3' => { 'family' => 'inet', 'prefixlen' => '24', 'netmask' => '255.255.255.0', 'scope' => 'Node' } } }, },
} '::1' => {
'family' => 'inet6',
'prefixlen' => '128',
'scope' => 'Node',
},
'2001:db8::1' => {
'family' => 'inet6',
'prefixlen' => '64',
'scope' => 'Node',
},
},
},
'eth0' => {
'addresses' => {
'10.0.0.2' => {
'family' => 'inet',
'prefixlen' => '32',
'netmask' => '255.255.255.255',
'scope' => 'Node',
},
'10.0.0.3' => {
'family' => 'inet',
'prefixlen' => '24',
'netmask' => '255.255.255.0',
'scope' => 'Node',
},
},
},
}
cached(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) }
cached(:node) { runner.node }
cached(:chef_run) do
node.automatic['network']['interfaces'] = interfaces
runner.converge(described_recipe) runner.converge(described_recipe)
end end
@ -48,9 +79,14 @@ describe 'openstack-common::default' do
end end
end end
describe '#address_for ipv6' do context '#address_for ipv6' do
it 'returns ipv6 address' do cached(:chef_run) do
node.automatic['network']['interfaces'] = interfaces
node.override['openstack']['endpoints']['family'] = 'inet6' node.override['openstack']['endpoints']['family'] = 'inet6'
runner.converge(described_recipe)
end
it 'returns ipv6 address' do
expect( expect(
subject.address_for('lo') subject.address_for('lo')
).to eq('2001:db8::1') ).to eq('2001:db8::1')
@ -81,9 +117,12 @@ describe 'openstack-common::default' do
subject.bind_address(node['openstack']['bind_service']['mq']) subject.bind_address(node['openstack']['bind_service']['mq'])
).to eq('127.0.0.1') ).to eq('127.0.0.1')
end end
describe 'mq interface set' do context 'mq interface set' do
before do cached(:chef_run) do
node.automatic['network']['interfaces'] = interfaces
node.override['openstack']['endpoints']['family'] = 'inet'
node.override['openstack']['bind_service']['mq']['interface'] = 'eth0' node.override['openstack']['bind_service']['mq']['interface'] = 'eth0'
runner.converge(described_recipe)
end end
it 'returns the interface address' do it 'returns the interface address' do
expect( expect(
@ -98,9 +137,12 @@ describe 'openstack-common::default' do
subject.bind_address(node['openstack']['bind_service']['db']) subject.bind_address(node['openstack']['bind_service']['db'])
).to eq('127.0.0.1') ).to eq('127.0.0.1')
end end
describe 'interface set' do context 'interface set' do
before do cached(:chef_run) do
node.automatic['network']['interfaces'] = interfaces
node.override['openstack']['endpoints']['family'] = 'inet'
node.override['openstack']['bind_service']['db']['interface'] = 'eth0' node.override['openstack']['bind_service']['db']['interface'] = 'eth0'
runner.converge(described_recipe)
end end
it 'returns the interface address' do it 'returns the interface address' do
expect( expect(

View File

@ -7,7 +7,7 @@ describe 'openstack-common::default' do
describe 'Passwords' do describe 'Passwords' do
let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) } cached(:chef_run) { runner.converge(described_recipe) }
let(:subject) { Object.new.extend(Openstack) } let(:subject) { Object.new.extend(Openstack) }
include_context 'library-stubs' include_context 'library-stubs'
@ -25,8 +25,9 @@ describe 'openstack-common::default' do
end end
context 'using chef-vault' do context 'using chef-vault' do
before do cached(:chef_run) do
node.override['openstack']['databag_type'] = 'vault' node.override['openstack']['databag_type'] = 'vault'
runner.converge(described_recipe)
end end
it 'returns the data from a chef vault item' do it 'returns the data from a chef vault item' do
allow(ChefVault::Item).to receive(:load) allow(ChefVault::Item).to receive(:load)
@ -66,7 +67,10 @@ describe 'openstack-common::default' do
end end
context 'stored in standard data bags' do context 'stored in standard data bags' do
before { node.override['openstack']['databag_type'] = 'standard' } cached(:chef_run) do
node.override['openstack']['databag_type'] = 'standard'
runner.converge(described_recipe)
end
describe '#secret' do describe '#secret' do
it 'returns databag' do it 'returns databag' do
value = { 'nova' => 'this' } value = { 'nova' => 'this' }
@ -101,7 +105,10 @@ describe 'openstack-common::default' do
end end
context 'stored in attributes as an alternative' do context 'stored in attributes as an alternative' do
before { node.override['openstack']['use_databags'] = false } cached(:chef_run) do
node.override['openstack']['use_databags'] = false
runner.converge(described_recipe)
end
describe '#get_password' do describe '#get_password' do
%w(service db user token).each do |type| %w(service db user token).each do |type|

View File

@ -6,13 +6,14 @@ describe 'openstack-common::default' do
describe 'Openstack Search' do describe 'Openstack Search' do
let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(CHEFSPEC_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) do cached(:chef_run) do
node.override['openstack']['mq']['server_role'] = 'openstack-ops-mq' node.override['openstack']['mq']['server_role'] = 'openstack-ops-mq'
node.override['openstack']['endpoints']['mq']['port'] = 5672 node.override['openstack']['endpoints']['mq']['port'] = 5672
# speed up tests
node.override['openstack']['common']['search_count_max'] = 2
runner.converge(described_recipe) runner.converge(described_recipe)
end end
let(:subject) { Object.new.extend(Openstack) } cached(:subject) { Object.new.extend(Openstack) }
describe '#search_for' do describe '#search_for' do
it 'returns results' do it 'returns results' do

View File

@ -2,22 +2,22 @@
require 'chefspec' require 'chefspec'
require 'chefspec/berkshelf' require 'chefspec/berkshelf'
ChefSpec::Coverage.start! { add_filter 'openstack-common' }
RSpec.configure do |config| RSpec.configure do |config|
config.color = true config.color = true
config.formatter = :documentation config.formatter = :documentation
config.log_level = :fatal config.log_level = :warn
end end
UBUNTU_OPTS = { UBUNTU_OPTS = {
platform: 'ubuntu', platform: 'ubuntu',
version: '16.04', version: '18.04',
}.freeze }.freeze
REDHAT_OPTS = { REDHAT_OPTS = {
platform: 'redhat', platform: 'redhat',
version: '7.4', version: '7',
}.freeze }.freeze
# We set a default platform for non-platform specific test cases # We set a default platform for non-platform specific test cases
CHEFSPEC_OPTS = UBUNTU_OPTS CHEFSPEC_OPTS = UBUNTU_OPTS

View File

@ -3,9 +3,16 @@ require_relative 'spec_helper'
describe 'openstack-common::sysctl' do describe 'openstack-common::sysctl' do
describe 'ubuntu' do describe 'ubuntu' do
sysctl_kv = {
'systcl_key1' => 'sysctl_value1',
'sysctl_key2' => 'sysctl_value2',
}
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) } let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node } let(:node) { runner.node }
let(:chef_run) { runner.converge(described_recipe) } cached(:chef_run) do
node.override['openstack']['sysctl'] = sysctl_kv
runner.converge(described_recipe)
end
describe 'sysctl.d directory' do describe 'sysctl.d directory' do
it 'should create /etc/systctl.d' do it 'should create /etc/systctl.d' do
@ -25,9 +32,6 @@ describe 'openstack-common::sysctl' do
end end
it 'sets the sysctl attributes' do it 'sets the sysctl attributes' do
sysctl_kv = { 'systcl_key1' => 'sysctl_value1',
'sysctl_key2' => 'sysctl_value2' }
node.override['openstack']['sysctl'] = sysctl_kv
sysctl_kv.each do |k, v| sysctl_kv.each do |k, v|
expect(chef_run).to render_file(file.name).with_content(/^#{k} = #{v}$/) expect(chef_run).to render_file(file.name).with_content(/^#{k} = #{v}$/)
end end