f92390204f
Newer versions of puppet are throwing catalog failures for resources that are not being included in the testing. In this case, the references should be updated to use our anchors from the neutron::deps class which resolves the failures under the latest version of puppet. Change-Id: I7ac3c90eb18118f90f0b92dabd3323a6575dac4c Closes-Bug: #1702964
352 lines
13 KiB
Ruby
352 lines
13 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe 'neutron::agents::ml2::ovs' do
|
|
let :pre_condition do
|
|
"class { 'neutron': rabbit_password => 'passw0rd' }"
|
|
end
|
|
|
|
let :default_params do
|
|
{ :package_ensure => 'present',
|
|
:enabled => true,
|
|
:bridge_uplinks => [],
|
|
:bridge_mappings => [],
|
|
:integration_bridge => 'br-int',
|
|
:local_ip => false,
|
|
:tunnel_types => [],
|
|
:tunnel_bridge => 'br-tun',
|
|
:drop_flows_on_start => false,
|
|
:firewall_driver => 'iptables_hybrid',
|
|
:manage_vswitch => true,
|
|
:purge_config => false,
|
|
:enable_dpdk => false,
|
|
}
|
|
end
|
|
|
|
let :params do
|
|
{}
|
|
end
|
|
|
|
shared_examples_for 'neutron plugin ovs agent with ml2 plugin' do
|
|
let :p do
|
|
default_params.merge(params)
|
|
end
|
|
|
|
it { is_expected.to contain_class('neutron::params') }
|
|
|
|
it 'passes purge to resource' do
|
|
is_expected.to contain_resources('neutron_agent_ovs').with({
|
|
:purge => false
|
|
})
|
|
end
|
|
|
|
it 'configures plugins/ml2/openvswitch_agent.ini' do
|
|
is_expected.to contain_neutron_agent_ovs('agent/polling_interval').with_value('<SERVICE DEFAULT>')
|
|
is_expected.to contain_neutron_agent_ovs('agent/l2_population').with_value('<SERVICE DEFAULT>')
|
|
is_expected.to contain_neutron_agent_ovs('agent/arp_responder').with_value('<SERVICE DEFAULT>')
|
|
is_expected.to contain_neutron_agent_ovs('agent/drop_flows_on_start').with_value(p[:drop_flows_on_start])
|
|
is_expected.to contain_neutron_agent_ovs('agent/extensions').with_value(['<SERVICE DEFAULT>'])
|
|
is_expected.to contain_neutron_agent_ovs('agent/minimize_polling').with_value(['<SERVICE DEFAULT>'])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/datapath_type').with_value(['<SERVICE DEFAULT>'])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/vhostuser_socket_dir').with_value(['<SERVICE DEFAULT>'])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/ovsdb_interface').with_value(['<SERVICE DEFAULT>'])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/of_interface').with_value(['<SERVICE DEFAULT>'])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/integration_bridge').with_value(p[:integration_bridge])
|
|
is_expected.to contain_neutron_agent_ovs('securitygroup/firewall_driver').\
|
|
with_value(p[:firewall_driver])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/tunnel_bridge').with_ensure('absent')
|
|
is_expected.to contain_neutron_agent_ovs('ovs/local_ip').with_ensure('absent')
|
|
is_expected.to contain_neutron_agent_ovs('ovs/int_peer_patch_port').with_ensure('absent')
|
|
is_expected.to contain_neutron_agent_ovs('ovs/tun_peer_patch_port').with_ensure('absent')
|
|
end
|
|
|
|
it 'installs neutron ovs agent package' do
|
|
if platform_params.has_key?(:ovs_agent_package)
|
|
is_expected.to contain_package('neutron-ovs-agent').with(
|
|
:name => platform_params[:ovs_agent_package],
|
|
:ensure => p[:package_ensure],
|
|
:tag => ['openstack', 'neutron-package'],
|
|
)
|
|
else
|
|
end
|
|
end
|
|
|
|
it 'configures neutron ovs agent service' do
|
|
is_expected.to contain_service('neutron-ovs-agent-service').with(
|
|
:name => platform_params[:ovs_agent_service],
|
|
:enable => true,
|
|
:ensure => 'running',
|
|
:tag => ['neutron-service', 'neutron-db-sync-service'],
|
|
)
|
|
is_expected.to contain_service('neutron-ovs-agent-service').that_subscribes_to('Anchor[neutron::service::begin]')
|
|
is_expected.to contain_service('neutron-ovs-agent-service').that_notifies('Anchor[neutron::service::end]')
|
|
end
|
|
|
|
context 'with manage_service as false' do
|
|
before :each do
|
|
params.merge!(:manage_service => false)
|
|
end
|
|
it 'should not start/stop service' do
|
|
is_expected.to contain_service('neutron-ovs-agent-service').without_ensure
|
|
end
|
|
end
|
|
|
|
context 'when supplying a firewall driver' do
|
|
before :each do
|
|
params.merge!(:firewall_driver => false)
|
|
end
|
|
it 'should configure firewall driver' do
|
|
is_expected.to contain_neutron_agent_ovs('securitygroup/firewall_driver').with_ensure('absent')
|
|
end
|
|
end
|
|
|
|
context 'when enabling ARP responder' do
|
|
before :each do
|
|
params.merge!(:arp_responder => true)
|
|
end
|
|
it 'should enable ARP responder' do
|
|
is_expected.to contain_neutron_agent_ovs('agent/arp_responder').with_value(true)
|
|
end
|
|
end
|
|
|
|
context 'when enabling DVR' do
|
|
before :each do
|
|
params.merge!(:enable_distributed_routing => true,
|
|
:l2_population => true )
|
|
end
|
|
it 'should enable DVR' do
|
|
is_expected.to contain_neutron_agent_ovs('agent/enable_distributed_routing').with_value(true)
|
|
end
|
|
end
|
|
|
|
context 'when supplying bridge mappings for provider networks' do
|
|
before :each do
|
|
params.merge!(:bridge_uplinks => ['br-ex:eth2'],:bridge_mappings => ['default:br-ex'])
|
|
end
|
|
|
|
it 'should require vswitch::ovs' do
|
|
is_expected.to contain_class('vswitch::ovs')
|
|
end
|
|
|
|
it 'configures bridge mappings' do
|
|
is_expected.to contain_neutron_agent_ovs('ovs/bridge_mappings')
|
|
end
|
|
|
|
it 'should configure bridge mappings' do
|
|
is_expected.to contain_neutron__plugins__ovs__bridge(params[:bridge_mappings].join(',')).with(
|
|
:before => 'Service[neutron-ovs-agent-service]'
|
|
)
|
|
end
|
|
|
|
it 'should configure bridge uplinks' do
|
|
is_expected.to contain_neutron__plugins__ovs__port(params[:bridge_uplinks].join(',')).with(
|
|
:before => 'Service[neutron-ovs-agent-service]'
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'when supplying bridge mappings for provider networks with manage vswitch set to false' do
|
|
before :each do
|
|
params.merge!(:bridge_uplinks => ['br-ex:eth2'],:bridge_mappings => ['default:br-ex'], :manage_vswitch => false)
|
|
end
|
|
|
|
it 'should not require vswitch::ovs' do
|
|
is_expected.not_to contain_class('vswitch::ovs')
|
|
end
|
|
|
|
it 'configures bridge mappings' do
|
|
is_expected.to contain_neutron_agent_ovs('ovs/bridge_mappings')
|
|
end
|
|
|
|
it 'should not configure bridge mappings' do
|
|
is_expected.not_to contain_neutron__plugins__ovs__bridge(params[:bridge_mappings].join(',')).with(
|
|
:before => 'Service[neutron-ovs-agent-service]'
|
|
)
|
|
end
|
|
|
|
it 'should not configure bridge uplinks' do
|
|
is_expected.not_to contain_neutron__plugins__ovs__port(params[:bridge_uplinks].join(',')).with(
|
|
:before => 'Service[neutron-ovs-agent-service]'
|
|
)
|
|
end
|
|
end
|
|
|
|
context 'when supplying extensions for ML2 plugin' do
|
|
before :each do
|
|
params.merge!(:extensions => ['qos'])
|
|
end
|
|
|
|
it 'configures extensions' do
|
|
is_expected.to contain_neutron_agent_ovs('agent/extensions').with_value(params[:extensions].join(','))
|
|
end
|
|
end
|
|
|
|
context 'when supplying DPDK specific options' do
|
|
before :each do
|
|
params.merge!(:datapath_type => 'netdev', :vhostuser_socket_dir => '/var/run/openvswitch')
|
|
end
|
|
|
|
it 'configures ovs for DPDK' do
|
|
is_expected.to contain_neutron_agent_ovs('ovs/datapath_type').with_value(params[:datapath_type])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/vhostuser_socket_dir').with_value(params[:vhostuser_socket_dir])
|
|
end
|
|
end
|
|
|
|
context 'when enabling tunneling' do
|
|
context 'without local ip address' do
|
|
before :each do
|
|
params.merge!(:tunnel_types => ['vxlan'])
|
|
end
|
|
|
|
it_raises 'a Puppet::Error', /Local ip for ovs agent must be set when tunneling is enabled/
|
|
end
|
|
context 'with default params' do
|
|
before :each do
|
|
params.merge!(:tunnel_types => ['vxlan'], :local_ip => '127.0.0.1' )
|
|
end
|
|
it 'should configure ovs for tunneling' do
|
|
is_expected.to contain_neutron_agent_ovs('ovs/tunnel_bridge').with_value(default_params[:tunnel_bridge])
|
|
is_expected.to contain_neutron_agent_ovs('ovs/local_ip').with_value('127.0.0.1')
|
|
is_expected.to contain_neutron_agent_ovs('ovs/int_peer_patch_port').with_value('<SERVICE DEFAULT>')
|
|
is_expected.to contain_neutron_agent_ovs('ovs/tun_peer_patch_port').with_value('<SERVICE DEFAULT>')
|
|
end
|
|
end
|
|
|
|
context 'with vxlan tunneling' do
|
|
before :each do
|
|
params.merge!(:local_ip => '127.0.0.1',
|
|
:tunnel_types => ['vxlan'],
|
|
:vxlan_udp_port => '4789')
|
|
end
|
|
|
|
it 'should perform vxlan network configuration' do
|
|
is_expected.to contain_neutron_agent_ovs('agent/tunnel_types').with_value(params[:tunnel_types])
|
|
is_expected.to contain_neutron_agent_ovs('agent/vxlan_udp_port').with_value(params[:vxlan_udp_port])
|
|
end
|
|
end
|
|
|
|
context 'when l2 population is disabled and DVR and tunneling enabled' do
|
|
before :each do
|
|
params.merge!(:enable_distributed_routing => true,
|
|
:l2_population => false,
|
|
:tunnel_types => ['vxlan'],
|
|
:local_ip => '127.0.0.1' )
|
|
end
|
|
|
|
it_raises 'a Puppet::Error', /L2 population must be enabled when DVR and tunneling are enabled/
|
|
end
|
|
|
|
context 'when DVR is enabled and l2 population and tunneling are disabled' do
|
|
before :each do
|
|
params.merge!(:enable_distributed_routing => true,
|
|
:l2_population => false,
|
|
:tunnel_types => [] )
|
|
end
|
|
|
|
it 'should enable DVR without L2 population' do
|
|
is_expected.to contain_neutron_agent_ovs('agent/enable_distributed_routing').with_value(true)
|
|
is_expected.to contain_neutron_agent_ovs('agent/l2_population').with_value(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when supplying ovsdb_interface' do
|
|
context 'with incorrect value' do
|
|
before :each do
|
|
params.merge!(:ovsdb_interface => 'random')
|
|
end
|
|
it_raises 'a Puppet::Error', /A value of \$ovsdb_interface is incorrect. The allowed values are vsctl and native/
|
|
end
|
|
|
|
context 'with supported value' do
|
|
before :each do
|
|
params.merge!(:ovsdb_interface => 'native')
|
|
end
|
|
it 'should configure ovsdb_interface for ovs' do
|
|
is_expected.to contain_neutron_agent_ovs('ovs/ovsdb_interface').with_value('native')
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when supplying of_interface' do
|
|
context 'with incorrect value' do
|
|
before :each do
|
|
params.merge!(:of_interface => 'random')
|
|
end
|
|
it_raises 'a Puppet::Error', /A value of \$of_interface is incorrect. The allowed values are ovs-ofctl and native/
|
|
end
|
|
|
|
context 'with supported value' do
|
|
before :each do
|
|
params.merge!(:of_interface => 'native')
|
|
end
|
|
it 'should configure of_interface for ovs' do
|
|
is_expected.to contain_neutron_agent_ovs('ovs/of_interface').with_value('native')
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when enabling dpdk with manage vswitch disabled' do
|
|
before :each do
|
|
params.merge!(:enable_dpdk => true, :manage_vswitch => false)
|
|
end
|
|
|
|
it_raises 'a Puppet::Error',/Enabling DPDK without manage vswitch does not have any effect/
|
|
end
|
|
end
|
|
|
|
shared_examples_for 'neutron::agents::ml2::ovs on Debian' do
|
|
# placeholder for debian specific tests
|
|
end
|
|
|
|
shared_examples_for 'neutron::agents::ml2::ovs on RedHat' do
|
|
it 'configures neutron ovs cleanup service' do
|
|
is_expected.to contain_service('ovs-cleanup-service').with(
|
|
:name => platform_params[:ovs_cleanup_service],
|
|
:enable => true
|
|
).that_requires('Anchor[neutron::install::end]')
|
|
is_expected.to contain_package('neutron-ovs-agent').that_requires('Anchor[neutron::install::begin]')
|
|
is_expected.to contain_package('neutron-ovs-agent').that_notifies('Anchor[neutron::install::end]')
|
|
end
|
|
|
|
context 'when enabling dpdk with manage vswitch is default' do
|
|
let :pre_condition do
|
|
"class { 'vswitch::dpdk': host_core_list => '1,2', memory_channels => '1' }"
|
|
end
|
|
before :each do
|
|
params.merge!(:enable_dpdk => true,
|
|
:datapath_type => 'netdev',
|
|
:vhostuser_socket_dir => '/var/run/openvswitch')
|
|
end
|
|
|
|
it 'should require vswitch::dpdk' do
|
|
is_expected.to contain_class('vswitch::dpdk')
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
on_supported_os({
|
|
:supported_os => OSDefaults.get_supported_os
|
|
}).each do |os,facts|
|
|
context "on #{os}" do
|
|
let (:facts) do
|
|
facts.merge!(OSDefaults.get_facts())
|
|
end
|
|
|
|
let (:platform_params) do
|
|
case facts[:osfamily]
|
|
when 'Debian'
|
|
{ :ovs_agent_package => 'neutron-openvswitch-agent',
|
|
:ovs_agent_service => 'neutron-openvswitch-agent' }
|
|
when 'RedHat'
|
|
{ :ovs_cleanup_service => 'neutron-ovs-cleanup',
|
|
:ovs_agent_service => 'neutron-openvswitch-agent' }
|
|
end
|
|
end
|
|
|
|
it_behaves_like 'neutron plugin ovs agent with ml2 plugin'
|
|
it_behaves_like "neutron::agents::ml2::ovs on #{facts[:osfamily]}"
|
|
end
|
|
end
|
|
end
|