From 99b9286ef525ed9b6bb6138476e34c1236c1315e Mon Sep 17 00:00:00 2001 From: Francesco Vollero Date: Wed, 7 Aug 2013 22:28:18 +0200 Subject: [PATCH] Added support for QPID in Heat This patch is adding the support for Apache Qpid in Heat. Change-Id: I0ea4bd403e09426b0173a1aa3493d5c7c23fc688 Signed-off-by: Francesco Vollero --- manifests/init.pp | 92 +++++++++++++++++++++++++++------- spec/classes/heat_init_spec.rb | 65 ++++++++++++++++++++++-- 2 files changed, 134 insertions(+), 23 deletions(-) diff --git a/manifests/init.pp b/manifests/init.pp index 48557a43..c4d4e231 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -22,17 +22,46 @@ # password to connect to the rabbit_server. Optional. Defaults to empty. # [*rabbit_virtualhost*] # virtualhost to use. Optional. Defaults to '/' +# [*qpid_hostname*] +# [*qpid_port*] +# [*qpid_username*] +# [*qpid_password*] +# [*qpid_heartbeat*] +# [*qpid_protocol*] +# [*qpid_tcp_nodelay*] +# [*qpid_reconnect*] +# [*qpid_reconnect_timeout*] +# [*qpid_reconnect_limit*] +# [*qpid_reconnect_interval*] +# [*qpid_reconnect_interval_min*] +# [*qpid_reconnect_interval_max*] +# (optional) various QPID options # + class heat( $package_ensure = 'present', $verbose = 'False', $debug = 'False', + $rpc_backend = 'heat.openstack.common.rpc.impl_kombu', $rabbit_host = '127.0.0.1', $rabbit_port = 5672, $rabbit_hosts = undef, $rabbit_userid = 'guest', $rabbit_password = '', $rabbit_virtualhost = '/', + $qpid_hostname = 'localhost', + $qpid_port = 5672, + $qpid_username = 'guest', + $qpid_password = 'guest', + $qpid_heartbeat = 60, + $qpid_protocol = 'tcp', + $qpid_tcp_nodelay = true, + $qpid_reconnect = true, + $qpid_reconnect_timeout = 0, + $qpid_reconnect_limit = 0, + $qpid_reconnect_interval_min = 0, + $qpid_reconnect_interval_max = 0, + $qpid_reconnect_interval = 0, ) { include heat::params @@ -74,30 +103,57 @@ class heat( Package['heat-common'] -> Heat_config<||> - if $rabbit_hosts { - heat_config { 'DEFAULT/rabbit_host': ensure => absent } - heat_config { 'DEFAULT/rabbit_port': ensure => absent } - heat_config { 'DEFAULT/rabbit_hosts': - value => join($rabbit_hosts, ',') - } - } else { - heat_config { 'DEFAULT/rabbit_host': value => $rabbit_host } - heat_config { 'DEFAULT/rabbit_port': value => $rabbit_port } - heat_config { 'DEFAULT/rabbit_hosts': - value => "${rabbit_host}:${rabbit_port}" + if $rpc_backend == 'heat.openstack.common.rpc.impl_kombu' { + + if $rabbit_hosts { + heat_config { 'DEFAULT/rabbit_host': ensure => absent } + heat_config { 'DEFAULT/rabbit_port': ensure => absent } + heat_config { 'DEFAULT/rabbit_hosts': + value => join($rabbit_hosts, ',') + } + } else { + heat_config { 'DEFAULT/rabbit_host': value => $rabbit_host } + heat_config { 'DEFAULT/rabbit_port': value => $rabbit_port } + heat_config { 'DEFAULT/rabbit_hosts': + value => "${rabbit_host}:${rabbit_port}" + } } + + if size($rabbit_hosts) > 1 { + heat_config { 'DEFAULT/rabbit_ha_queues': value => true } + } else { + heat_config { 'DEFAULT/rabbit_ha_queues': value => false } + } + + heat_config { + 'DEFAULT/rabbit_userid' : value => $rabbit_userid; + 'DEFAULT/rabbit_password' : value => $rabbit_password; + 'DEFAULT/rabbit_virtualhost' : value => $rabbit_virtualhost; + } } - if size($rabbit_hosts) > 1 { - heat_config { 'DEFAULT/rabbit_ha_queues': value => true } - } else { - heat_config { 'DEFAULT/rabbit_ha_queues': value => false } + if $rpc_backend == 'heat.openstack.common.rpc.impl_qpid' { + + heat_config { + 'DEFAULT/qpid_hostname': value => $qpid_hostname; + 'DEFAULT/qpid_port': value => $qpid_port; + 'DEFAULT/qpid_username': value => $qpid_username; + 'DEFAULT/qpid_password': value => $qpid_password; + 'DEFAULT/qpid_heartbeat': value => $qpid_heartbeat; + 'DEFAULT/qpid_protocol': value => $qpid_protocol; + 'DEFAULT/qpid_tcp_nodelay': value => $qpid_tcp_nodelay; + 'DEFAULT/qpid_reconnect': value => $qpid_reconnect; + 'DEFAULT/qpid_reconnect_timeout': value => $qpid_reconnect_timeout; + 'DEFAULT/qpid_reconnect_limit': value => $qpid_reconnect_limit; + 'DEFAULT/qpid_reconnect_interval_min': value => $qpid_reconnect_interval_min; + 'DEFAULT/qpid_reconnect_interval_max': value => $qpid_reconnect_interval_max; + 'DEFAULT/qpid_reconnect_interval': value => $qpid_reconnect_interval; + } + } heat_config { - 'DEFAULT/rabbit_userid' : value => $rabbit_userid; - 'DEFAULT/rabbit_password' : value => $rabbit_password; - 'DEFAULT/rabbit_virtualhost' : value => $rabbit_virtualhost; + 'DEFAULT/rpc_backend' : value => $rpc_backend; 'DEFAULT/debug' : value => $debug; 'DEFAULT/verbose' : value => $verbose; } diff --git a/spec/classes/heat_init_spec.rb b/spec/classes/heat_init_spec.rb index 149d7b63..cfd0ae0f 100644 --- a/spec/classes/heat_init_spec.rb +++ b/spec/classes/heat_init_spec.rb @@ -15,6 +15,16 @@ describe 'heat' do } end + let :qpid_params do + { + :rpc_backend => "heat.openstack.common.rpc.impl_qpid", + :qpid_hostname => 'localhost', + :qpid_port => 5672, + :qpid_username => 'guest', + :qpid_password => 'guest', + } + end + shared_examples_for 'heat' do context 'with rabbit_host parameter' do @@ -35,6 +45,13 @@ describe 'heat' do it_configures 'rabbit with HA support' end end + + context 'with qpid instance' do + before {params.merge!(qpid_params) } + + it_configures 'a heat base installation' + it_configures 'qpid as rpc backend' + end end shared_examples_for 'a heat base installation' do @@ -84,11 +101,6 @@ describe 'heat' do ) end - it 'configures rabbit' do - should contain_heat_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] ) - should contain_heat_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] ) - should contain_heat_config('DEFAULT/rabbit_virtualhost').with_value( params[:rabbit_virtualhost] ) - end it 'configures debug and verbose' do should contain_heat_config('DEFAULT/debug').with_value( params[:debug] ) @@ -98,6 +110,11 @@ describe 'heat' do end shared_examples_for 'rabbit without HA support (with backward compatibility)' do + it 'configures rabbit' do + should contain_heat_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] ) + should contain_heat_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] ) + should contain_heat_config('DEFAULT/rabbit_virtualhost').with_value( params[:rabbit_virtualhost] ) + end it { should contain_heat_config('DEFAULT/rabbit_host').with_value( params[:rabbit_host] ) } it { should contain_heat_config('DEFAULT/rabbit_port').with_value( params[:rabbit_port] ) } it { should contain_heat_config('DEFAULT/rabbit_hosts').with_value( "#{params[:rabbit_host]}:#{params[:rabbit_port]}" ) } @@ -105,6 +122,11 @@ describe 'heat' do end shared_examples_for 'rabbit without HA support (without backward compatibility)' do + it 'configures rabbit' do + should contain_heat_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] ) + should contain_heat_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] ) + should contain_heat_config('DEFAULT/rabbit_virtualhost').with_value( params[:rabbit_virtualhost] ) + end it { should contain_heat_config('DEFAULT/rabbit_host').with_ensure('absent') } it { should contain_heat_config('DEFAULT/rabbit_port').with_ensure('absent') } it { should contain_heat_config('DEFAULT/rabbit_hosts').with_value( params[:rabbit_hosts].join(',') ) } @@ -112,12 +134,45 @@ describe 'heat' do end shared_examples_for 'rabbit with HA support' do + it 'configures rabbit' do + should contain_heat_config('DEFAULT/rabbit_userid').with_value( params[:rabbit_userid] ) + should contain_heat_config('DEFAULT/rabbit_password').with_value( params[:rabbit_password] ) + should contain_heat_config('DEFAULT/rabbit_virtualhost').with_value( params[:rabbit_virtualhost] ) + end it { should contain_heat_config('DEFAULT/rabbit_host').with_ensure('absent') } it { should contain_heat_config('DEFAULT/rabbit_port').with_ensure('absent') } it { should contain_heat_config('DEFAULT/rabbit_hosts').with_value( params[:rabbit_hosts].join(',') ) } it { should contain_heat_config('DEFAULT/rabbit_ha_queues').with_value('true') } end + + shared_examples_for 'qpid as rpc backend' do + context("with default parameters") do + it { should contain_heat_config('DEFAULT/qpid_reconnect').with_value(true) } + it { should contain_heat_config('DEFAULT/qpid_reconnect_timeout').with_value('0') } + it { should contain_heat_config('DEFAULT/qpid_reconnect_limit').with_value('0') } + it { should contain_heat_config('DEFAULT/qpid_reconnect_interval_min').with_value('0') } + it { should contain_heat_config('DEFAULT/qpid_reconnect_interval_max').with_value('0') } + it { should contain_heat_config('DEFAULT/qpid_reconnect_interval').with_value('0') } + it { should contain_heat_config('DEFAULT/qpid_heartbeat').with_value('60') } + it { should contain_heat_config('DEFAULT/qpid_protocol').with_value('tcp') } + it { should contain_heat_config('DEFAULT/qpid_tcp_nodelay').with_value(true) } + end + + context("with mandatory parameters set") do + it { should contain_heat_config('DEFAULT/rpc_backend').with_value('heat.openstack.common.rpc.impl_qpid') } + it { should contain_heat_config('DEFAULT/qpid_hostname').with_value( params[:qpid_hostname] ) } + it { should contain_heat_config('DEFAULT/qpid_port').with_value( params[:qpid_port] ) } + it { should contain_heat_config('DEFAULT/qpid_username').with_value( params[:qpid_username]) } + it { should contain_heat_config('DEFAULT/qpid_password').with_value(params[:qpid_password]) } + end + + context("failing if the rpc_backend is not present") do + before { params.delete( :rpc_backend) } + it { expect { should raise_error(Puppet::Error) } } + end + end + context 'on Debian platforms' do let :facts do { :osfamily => 'Debian' }