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.

Additional fixes:
- Pull in openstack-network::ml2_core_plugin in server spec so that we get the
  default attributes set
- Remove unused shared_examples

Speed was improved from 4 minutes 18.7 seconds to 1 minute 2.73 seconds

Change-Id: Ib10a6828e6886a57527a5e5a506cc57364ec0c2a
This commit is contained in:
Lance Albertson 2019-12-18 09:40:53 -08:00
parent 70fda6ae3a
commit 1c40ad731e
20 changed files with 92 additions and 100 deletions

View File

@ -5,7 +5,7 @@ describe 'openstack-network::_bridge_config_example' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::db_migration' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
runner.converge(described_recipe)
end
@ -17,18 +17,24 @@ describe 'openstack-network::db_migration' do
)
end
it 'uses db upgrade head with timeout override for neutron-server' do
node.override['openstack']['network']['dbsync_timeout'] = 1234
expect(chef_run).to run_bash('migrate network database').with(
code: /upgrade head/,
timeout: 1234
)
context 'uses db upgrade head with timeout override for neutron-server' do
cached(:chef_run) do
node.override['openstack']['network']['dbsync_timeout'] = 1234
runner.converge(described_recipe)
end
it do
expect(chef_run).to run_bash('migrate network database').with(
code: /upgrade head/,
timeout: 1234
)
end
end
describe 'run db-migration when services are enabled' do
before do
context 'run db-migration when services are enabled' do
cached(:chef_run) do
node.override['openstack']['network_fwaas']['enabled'] = true
node.override['openstack']['network_lbaas']['enabled'] = true
node.override['openstack']['network']['core_plugin_config_file'] = '/etc/neutron/plugins/ml2/ml2_conf.ini'
runner.converge(described_recipe)
end
it 'uses db upgrade head when lbaas is enabled' do
migrate_cmd = %r{neutron-db-manage --subproject neutron-lbaas --config-file /etc/neutron/neutron.conf|
@ -47,9 +53,10 @@ describe 'openstack-network::db_migration' do
)
end
end
describe 'run db-migration when services are enabled' do
before do
context 'run db-migration when services are enabled' do
cached(:chef_run) do
node.override['openstack']['network']['core_plugin_config_file'] = '/etc/neutron/plugins/ml2/ml2_conf.ini'
runner.converge(described_recipe)
end
it 'does not use db upgrade head when fwaas is not enabled' do

View File

@ -5,7 +5,7 @@ describe 'openstack-network' do
describe 'redhat' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::dhcp_agent' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
runner.converge(described_recipe)
end

View File

@ -5,9 +5,8 @@ describe 'openstack-network::identity_registration' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::l3_agent' do
describe 'redhat' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
stub_command('ovs-vsctl br-exists br-ex').and_return(false)
runner.converge(described_recipe)

View File

@ -5,7 +5,7 @@ describe 'openstack-network::l3_agent' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['network_l3']['external_network_bridge_interface'] = 'enp0s8'
runner.converge(described_recipe)
end
@ -38,12 +38,15 @@ describe 'openstack-network::l3_agent' do
end
context 'template contents' do
cached(:chef_run) do
node.override['openstack']['network_l3']['conf']['DEFAULT']['external_network_bridge'] = 'network_l3_external_network_bridge_value'
runner.converge(described_recipe)
end
it_behaves_like 'common network attributes displayer', 'l3' do
let(:file_name) { file.name }
end
it 'displays the external_network_bridge l3 attribute' do
node.override['openstack']['network_l3']['conf']['DEFAULT']['external_network_bridge'] = 'network_l3_external_network_bridge_value'
stub_command('ovs-vsctl br-exists network_l3_external_network_bridge_value').and_return(false)
expect(chef_run).to render_file(file.name).with_content(/^external_network_bridge = network_l3_external_network_bridge_value$/)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::lbaas' do
describe 'redhat' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
node.override['openstack']['network']['lbaas']['enabled'] = 'True'
runner.converge(described_recipe)

View File

@ -5,7 +5,7 @@ describe 'openstack-network::lbaas' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::metadata_agent' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::metering_agent' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
runner.converge(described_recipe)
end

View File

@ -9,18 +9,14 @@ describe 'openstack-network::ml2_linuxbridge' do
describe 'redhat' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['network']['plugins']['linuxbridge']['path'] = '/etc/neutron/plugins/ml2'
node.override['openstack']['network']['plugins']['linuxbridge']['filename'] = 'linuxbridge_agent.ini'
runner.converge(described_recipe)
end
include_context 'neutron-stubs'
before do
node.override['openstack']['network']['plugins']['linuxbridge']['path'] =
'/etc/neutron/plugins/ml2'
node.override['openstack']['network']['plugins']['linuxbridge']['filename'] =
'linuxbridge_agent.ini'
end
it 'creates the /etc/neutron/plugins/ml2 agent directory' do
expect(chef_run).to create_directory('/etc/neutron/plugins/ml2').with(
owner: 'neutron',

View File

@ -9,19 +9,15 @@ describe 'openstack-network::ml2_linuxbridge' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
node.override['openstack']['network']['plugins']['linuxbridge']['path'] = '/etc/neutron/plugins/linuxbridge'
node.override['openstack']['network']['plugins']['linuxbridge']['filename'] = 'linuxbridge_conf.ini'
runner.converge(described_recipe)
end
include_context 'neutron-stubs'
before do
node.override['openstack']['network']['plugins']['linuxbridge']['path'] =
'/etc/neutron/plugins/linuxbridge'
node.override['openstack']['network']['plugins']['linuxbridge']['filename'] =
'linuxbridge_conf.ini'
end
it 'creates the /etc/neutron/plugins/linuxbridge agent directory' do
expect(chef_run).to create_directory('/etc/neutron/plugins/linuxbridge').with(
owner: 'neutron',

View File

@ -5,7 +5,7 @@ describe 'openstack-network::openvswitch_agent' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['network']['openvswitch']['integration_bridge'] = 'br-int'
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::openvswitch' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
runner.converge(described_recipe)
end

View File

@ -5,7 +5,7 @@ describe 'openstack-network::plugin_config' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['network']['plugins']['ml2'].tap do |ml2|
ml2['path'] = '/etc/neutron/more_plugins'
ml2['filename'] = 'ml2_conf.ini'

View File

@ -5,13 +5,11 @@ describe 'openstack-network::server' do
describe 'redhat' do
let(:runner) { ChefSpec::SoloRunner.new(REDHAT_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
cached(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
runner.converge(described_recipe)
end
before do
node.override['openstack']['network']['plugins']['ml2']['path'] = '/etc/neutron/plugins/ml2'
node.override['openstack']['network']['plugins']['ml2']['filename'] = 'openvswitch_agent.ini'
runner.converge(described_recipe)
end
include_context 'neutron-stubs'

View File

@ -5,13 +5,8 @@ describe 'openstack-network::server' do
describe 'ubuntu' do
let(:runner) { ChefSpec::SoloRunner.new(UBUNTU_OPTS) }
let(:node) { runner.node }
let(:chef_run) do
node.override['openstack']['compute']['network']['service_type'] = 'neutron'
runner.converge(described_recipe)
end
before do
node.override['openstack']['network']['plugins']['ml2']['path'] = '/etc/neutron/plugins/ml2'
node.override['openstack']['network']['plugins']['ml2']['filename'] = 'ml2_conf.ini'
cached(:chef_run) do
runner.converge('openstack-network::ml2_core_plugin', described_recipe)
end
include_context 'neutron-stubs'
@ -20,12 +15,16 @@ describe 'openstack-network::server' do
expect(chef_run).to upgrade_package 'neutron-server'
end
it 'allows overriding package names' do
cust_pkgs = ['my-neutron', 'my-other-neutron']
node.override['openstack']['network']['platform']['neutron_server_packages'] = cust_pkgs
cust_pkgs.each do |pkg|
expect(chef_run).to upgrade_package(pkg)
context 'allows overriding package names' do
cust_pkgs = %w(my-neutron my-other-neutron)
cached(:chef_run) do
node.override['openstack']['network']['platform']['neutron_server_packages'] = cust_pkgs
runner.converge('openstack-network::ml2_core_plugin', described_recipe)
end
it do
cust_pkgs.each do |pkg|
expect(chef_run).to upgrade_package(pkg)
end
end
end
@ -44,25 +43,38 @@ describe 'openstack-network::server' do
.to subscribe_to('template[/etc/neutron/neutron.conf]').on(:restart).delayed
end
it do
node.override['openstack']['network']['policyfile_url'] = 'http://www.someurl.com'
expect(neutron_service)
.to subscribe_to('remote_file[/etc/neutron/policy.json]').on(:restart).delayed
context 'set policyfile_url' do
cached(:chef_run) do
node.override['openstack']['network']['policyfile_url'] = 'http://www.someurl.com'
runner.converge('openstack-network::ml2_core_plugin', described_recipe)
end
it do
expect(neutron_service)
.to subscribe_to('remote_file[/etc/neutron/policy.json]').on(:restart).delayed
end
end
it 'allows overriding service names' do
node.override['openstack']['network']['platform']['neutron_server_service'] = 'my-neutron-server'
expect(chef_run).to enable_service('neutron-server').with(
service_name: 'my-neutron-server'
)
context 'allows overriding service names' do
cached(:chef_run) do
node.override['openstack']['network']['platform']['neutron_server_service'] = 'my-neutron-server'
runner.converge('openstack-network::ml2_core_plugin', described_recipe)
end
it do
expect(chef_run).to enable_service('neutron-server').with(
service_name: 'my-neutron-server'
)
end
end
it 'allows overriding package options' do
context 'allows overriding package options' do
cust_opts = ['-o', 'Dpkg::Options::=--force-confold', '-o', 'Dpkg::Options::=--force-confdef', '--force-yes']
node.override['openstack']['network']['platform']['package_overrides'] = cust_opts
expect(chef_run).to upgrade_package('neutron-server').with(options: cust_opts)
cached(:chef_run) do
node.override['openstack']['network']['platform']['package_overrides'] = cust_opts
runner.converge('openstack-network::ml2_core_plugin', described_recipe)
end
it do
expect(chef_run).to upgrade_package('neutron-server').with(options: cust_opts)
end
end
it 'does not upgrade openvswitch package or the agent' do

View File

@ -2,28 +2,25 @@
require 'chefspec'
require 'pry'
require 'chefspec/berkshelf'
ChefSpec::Coverage.start! { add_filter 'openstack-network' }
require 'chef/application'
RSpec.configure do |config|
config.color = true
config.formatter = :documentation
config.log_level = :fatal
config.log_level = :warn
end
REDHAT_OPTS = {
platform: 'redhat',
version: '7.4',
version: '7',
}.freeze
UBUNTU_OPTS = {
platform: 'ubuntu',
version: '16.04',
version: '18.04',
}.freeze
CENTOS_OPTS = {
platform: 'centos',
version: '7.4.1708',
version: '7',
}.freeze
shared_context 'neutron-stubs' do
@ -54,30 +51,14 @@ shared_context 'neutron-stubs' do
.with('network')
.and_return('rabbit://guest:mypass@127.0.0.1:5672')
end
shared_examples 'custom template banner displayer' do
it 'shows the custom banner' do
node.override['openstack']['network']['custom_template_banner'] = 'custom_template_banner_value'
expect(chef_run).to render_file(file_name).with_content(/^custom_template_banner_value$/)
end
end
shared_examples 'common network attributes displayer' do |plugin|
it 'displays the interface_driver common attribute' do
cached(:chef_run) do
node.override['openstack']["network_#{plugin}"]['conf']['DEFAULT']['interface_driver'] = 'network_interface_driver_value'
runner.converge(described_recipe)
end
it 'displays the interface_driver common attribute' do
expect(chef_run).to render_file(file_name).with_content(/^interface_driver = network_interface_driver_value$/)
end
end
shared_examples 'dhcp agent template configurator' do
it_behaves_like 'custom template banner displayer'
it_behaves_like 'common network attributes displayer', 'dhcp'
%w(resync_interval ovs_use_veth enable_isolated_metadata
enable_metadata_network dnsmasq_lease_max dhcp_delete_namespaces).each do |attr|
it "displays the #{attr} dhcp attribute" do
node.override['openstack']['network_dhcp']['conf']['DEFAULT'][attr] = "network_dhcp_#{attr}_value"
expect(chef_run).to render_file(file_name).with_content(/^#{attr} = network_dhcp_#{attr}_value$/)
end
end
end
end