From af46891c9112953ccb8f06333b651b21fe16b1b3 Mon Sep 17 00:00:00 2001 From: Dan Bode Date: Fri, 30 Mar 2012 01:13:21 -0700 Subject: [PATCH 1/4] Add Rakefile for running spec tests --- Rakefile | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Rakefile diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..6242a3704 --- /dev/null +++ b/Rakefile @@ -0,0 +1,14 @@ +require 'rake' + +task :default => [:spec] + +desc "Run all module spec tests (Requires rspec-puppet gem)" +task :spec do + system("rspec spec/**/*_spec.rb") +end + +desc "Build package" +task :build do + system("puppet-module build") +end + From 97c67106890d2e68b1ada5862343395e6b334a89 Mon Sep 17 00:00:00 2001 From: Dan Bode Date: Fri, 30 Mar 2012 01:09:50 -0700 Subject: [PATCH 2/4] Install nova packages per service This commit ensures that the individual Ubuntu nova packages for any given service are only installed when that service is configured. This behavior was broken when RedHat support was added. Since Redhat only has a single package, it was assumed that all packages should always be installed on all nodes. This was causing all services to be in a running state on Ubuntu (b/c the packages were starting the related service) --- manifests/api.pp | 13 ++++++- manifests/compute.pp | 22 +++++------ manifests/init.pp | 7 ++-- manifests/network.pp | 10 ++++- manifests/objectstore.pp | 10 ++++- manifests/params.pp | 20 ++++++---- manifests/scheduler.pp | 12 +++++- spec/classes/nova_api_spec.rb | 54 +++++++++++++++++++++++++++ spec/classes/nova_compute_spec.rb | 45 ++++++++++++++++++++++ spec/classes/nova_init_spec.rb | 11 +++++- spec/classes/nova_network_spec.rb | 45 ++++++++++++++++++++++ spec/classes/nova_objectstore_spec.rb | 45 ++++++++++++++++++++++ spec/classes/nova_scheduler_spec.rb | 45 ++++++++++++++++++++++ 13 files changed, 309 insertions(+), 30 deletions(-) create mode 100644 spec/classes/nova_api_spec.rb create mode 100644 spec/classes/nova_compute_spec.rb create mode 100644 spec/classes/nova_network_spec.rb create mode 100644 spec/classes/nova_objectstore_spec.rb create mode 100644 spec/classes/nova_scheduler_spec.rb diff --git a/manifests/api.pp b/manifests/api.pp index 8bbffb483..1d1ffea5e 100644 --- a/manifests/api.pp +++ b/manifests/api.pp @@ -12,14 +12,23 @@ class nova::api($enabled=false) { exec { "initial-db-sync": command => "/usr/bin/nova-manage db sync", refreshonly => true, - require => [Package[$::nova::params::package_names], Nova_config['sql_connection']], + require => [Package[$::nova::params::common_package_name], Nova_config['sql_connection']], + } + + if($::nova::params::api_package_name != undef) { + package { 'nova-api': + name => $::nova::params::api_package_name, + ensure => present, + notify => Service['nova-api'], + before => Exec['initial-db-sync'] + } } service { "nova-api": name => $::nova::params::api_service_name, ensure => $service_ensure, enable => $enabled, - require => Package[$::nova::params::package_names], + require => Package[$::nova::params::common_package_name], #subscribe => File["/etc/nova/nova.conf"] } } diff --git a/manifests/compute.pp b/manifests/compute.pp index 3ca5da296..f40fc74a5 100644 --- a/manifests/compute.pp +++ b/manifests/compute.pp @@ -1,10 +1,7 @@ -# this class should probably never be declared except +#schedulee this class should probably never be declared except # from the virtualization implementation of the compute node class nova::compute( - $api_server, $enabled = false, - $api_port = 8773, - $aws_address = '169.254.169.254' ) { Exec['post-nova_config'] ~> Service['nova-compute'] @@ -16,18 +13,19 @@ class nova::compute( $service_ensure = 'stopped' } + if($::nova::params::compute_package_name != undef) { + package { 'nova-compute': + name => $::nova::params::compute_package_name, + ensure => present, + notify => Service['nova-compute'], + } + } + service { "nova-compute": name => $::nova::params::compute_service_name, ensure => $service_ensure, enable => $enabled, - require => Package[$::nova::params::package_names], + require => Package[$::nova::params::common_package_name], before => Exec['networking-refresh'], } - - # forward guest metadata requests to correct API server -# exec { "forward_api_requests": -# command => "/sbin/iptables -t nat -A PREROUTING -d ${aws_address}/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination ${api_server}:${api_port}", -# unless => "/sbin/iptables -L PREROUTING -t nat -n | egrep 'DNAT[ ]+tcp+[ ]+--[ ]+0.0.0.0\\/0+[ ]+${aws_address}+[ ]+tcp+[ ]+dpt:80+[ ]+to:${api_server}:${api_port}'", -# logoutput => on_failure -# } } diff --git a/manifests/init.pp b/manifests/init.pp index ad7c3c3d0..8996afb1d 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -28,13 +28,13 @@ class nova( ) inherits nova::params { Nova_config<| |> { - require +> Package[$::nova::params::package_names], + require +> Package[$::nova::params::common_package_name], before +> File['/etc/nova/nova.conf'], notify +> Exec['post-nova_config'] } File { - require => Package[$::nova::params::package_names], + require => Package[$::nova::params::common_package_name], owner => 'nova', group => 'nova', } @@ -59,7 +59,8 @@ class nova( require => Package["python-greenlet"] } - package { $::nova::params::package_names: + package { 'nova-common': + name =>$::nova::params::common_package_name, ensure => present, require => [Package["python-greenlet"], Anchor['nova-start']] } diff --git a/manifests/network.pp b/manifests/network.pp index d27d13402..64d1c9057 100644 --- a/manifests/network.pp +++ b/manifests/network.pp @@ -9,11 +9,19 @@ class nova::network( $enabled=false ) { $service_ensure = 'stopped' } + if($::nova::params::network_package_name != undef) { + package { 'nova-network': + name => $::nova::params::network_package_name, + ensure => present, + notify => Service['nova-network'], + } + } + service { "nova-network": name => $::nova::params::network_service_name, ensure => $service_ensure, enable => $enabled, - require => Package[$::nova::params::package_names], + require => Package[$::nova::params::common_package_name], before => Exec['networking-refresh'], #subscribe => File["/etc/nova/nova.conf"] } diff --git a/manifests/objectstore.pp b/manifests/objectstore.pp index 90980d408..e4909cab2 100644 --- a/manifests/objectstore.pp +++ b/manifests/objectstore.pp @@ -11,11 +11,19 @@ class nova::objectstore( $enabled=false ) { $service_ensure = 'stopped' } + if($::nova::params::objectstore_package_name != undef) { + package { 'nova-objectstore': + name => $::nova::params::objectstore_package_name, + ensure => present, + notify => Service['nova-objectstore'], + } + } + service { "nova-objectstore": name => $::nova::params::objectstore_service_name, ensure => $service_ensure, enable => $enabled, - require => Package[$::nova::params::package_names], + require => Package[$::nova::params::common_package_name], #subscribe => File["/etc/nova/nova.conf"] } } diff --git a/manifests/params.pp b/manifests/params.pp index a40958191..847080cfc 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -4,7 +4,12 @@ class nova::params { case $::osfamily { 'RedHat': { - $package_names = 'openstack-nova' + $common_package_name = 'openstack-nova' + $api_package_name = undef + $compute_package_name = undef + $network_package_name = undef + $objectstore_package_name = undef + $scheduler_package_name = undef $doc_package_name = 'openstack-nova-doc' $api_service_name = 'openstack-nova-api' $compute_service_name = 'openstack-nova-compute' @@ -18,13 +23,12 @@ class nova::params { $root_helper = 'sudo nova-rootwrap' } 'Debian': { - $package_names = ['nova-common', - 'nova-api', - 'nova-compute', - 'nova-network', - 'nova-objectstore', - 'nova-scheduler' - ] + $common_package_name = 'nova-common' + $api_package_name = 'nova-api' + $compute_package_name = 'nova-compute' + $network_package_name = 'nova-network' + $objectstore_package_name = 'nova-objectstore' + $scheduler_package_name = 'nova-scheduler' $doc_package_name = 'nova-doc' $api_service_name = 'nova-api' $compute_service_name = 'nova-compute' diff --git a/manifests/scheduler.pp b/manifests/scheduler.pp index 2ef1daff0..39aaa1564 100644 --- a/manifests/scheduler.pp +++ b/manifests/scheduler.pp @@ -1,4 +1,4 @@ -class nova::scheduler( $enabled ) { +class nova::scheduler( $enabled = false) { include nova::params @@ -11,11 +11,19 @@ class nova::scheduler( $enabled ) { $service_ensure = 'stopped' } + if($::nova::params::scheduler_package_name != undef) { + package { 'nova-scheduler': + name => $::nova::params::scheduler_package_name, + ensure => present, + notify => Service['nova-scheduler'], + } + } + service { "nova-scheduler": name => $::nova::params::scheduler_service_name, ensure => $service_ensure, enable => $enabled, - require => Package[$::nova::params::package_names], + require => Package[$::nova::params::common_package_name], #subscribe => File["/etc/nova/nova.conf"] } } diff --git a/spec/classes/nova_api_spec.rb b/spec/classes/nova_api_spec.rb new file mode 100644 index 000000000..9d0892a63 --- /dev/null +++ b/spec/classes/nova_api_spec.rb @@ -0,0 +1,54 @@ +require 'spec_helper' + +describe 'nova::api' do + + let :pre_condition do + 'include nova' + end + + describe 'on debian platforms' do + let :facts do + { :osfamily => 'Debian' } + end + it{ should contain_exec('initial-db-sync').with( + 'command' => '/usr/bin/nova-manage db sync', + 'refreshonly' => true + )} + it { should contain_service('nova-api').with( + 'name' => 'nova-api', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should contain_package('nova-api').with( + 'name' => 'nova-api', + 'ensure' => 'present', + 'notify' => 'Service[nova-api]', + 'before' => 'Exec[initial-db-sync]' + ) } + describe 'with enabled as true' do + let :params do + {:enabled => true} + end + it { should contain_service('nova-api').with( + 'name' => 'nova-api', + 'ensure' => 'running', + 'enable' => true + )} + end + end + describe 'on rhel' do + let :facts do + { :osfamily => 'RedHat' } + end + it{ should contain_exec('initial-db-sync').with( + 'command' => '/usr/bin/nova-manage db sync', + 'refreshonly' => true + )} + it { should contain_service('nova-api').with( + 'name' => 'openstack-nova-api', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should_not contain_package('nova-api') } + end +end diff --git a/spec/classes/nova_compute_spec.rb b/spec/classes/nova_compute_spec.rb new file mode 100644 index 000000000..792d60a92 --- /dev/null +++ b/spec/classes/nova_compute_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe 'nova::compute' do + + let :pre_condition do + 'include nova' + end + + describe 'on debian platforms' do + let :facts do + { :osfamily => 'Debian' } + end + it { should contain_service('nova-compute').with( + 'name' => 'nova-compute', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should contain_package('nova-compute').with( + 'name' => 'nova-compute', + 'ensure' => 'present', + 'notify' => 'Service[nova-compute]' + ) } + describe 'with enabled as true' do + let :params do + {:enabled => true} + end + it { should contain_service('nova-compute').with( + 'name' => 'nova-compute', + 'ensure' => 'running', + 'enable' => true + )} + end + end + describe 'on rhel' do + let :facts do + { :osfamily => 'RedHat' } + end + it { should contain_service('nova-compute').with( + 'name' => 'openstack-nova-compute', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should_not contain_package('nova-compute') } + end +end diff --git a/spec/classes/nova_init_spec.rb b/spec/classes/nova_init_spec.rb index fe69f97e8..8f4b7a9dd 100644 --- a/spec/classes/nova_init_spec.rb +++ b/spec/classes/nova_init_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe 'nova' do let :facts do { :osfamily => 'Debian' } - end + end it do should contain_group('nova').with( @@ -21,4 +21,13 @@ describe 'nova' do 'require' => 'Package[nova-common]' ) end + describe "When platform is RedHat" do + let :facts do + {:osfamily => 'RedHat'} + end + it { should contain_package('nova-common').with( + 'name' => 'openstack-nova', + 'ensure' => 'present' + )} + end end diff --git a/spec/classes/nova_network_spec.rb b/spec/classes/nova_network_spec.rb new file mode 100644 index 000000000..ddbaa1527 --- /dev/null +++ b/spec/classes/nova_network_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe 'nova::network' do + + let :pre_condition do + 'include nova' + end + + describe 'on debian platforms' do + let :facts do + { :osfamily => 'Debian' } + end + it { should contain_service('nova-network').with( + 'name' => 'nova-network', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should contain_package('nova-network').with( + 'name' => 'nova-network', + 'ensure' => 'present', + 'notify' => 'Service[nova-network]' + ) } + describe 'with enabled as true' do + let :params do + {:enabled => true} + end + it { should contain_service('nova-network').with( + 'name' => 'nova-network', + 'ensure' => 'running', + 'enable' => true + )} + end + end + describe 'on rhel' do + let :facts do + { :osfamily => 'RedHat' } + end + it { should contain_service('nova-network').with( + 'name' => 'openstack-nova-network', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should_not contain_package('nova-network') } + end +end diff --git a/spec/classes/nova_objectstore_spec.rb b/spec/classes/nova_objectstore_spec.rb new file mode 100644 index 000000000..fc6391e94 --- /dev/null +++ b/spec/classes/nova_objectstore_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe 'nova::objectstore' do + + let :pre_condition do + 'include nova' + end + + describe 'on debian platforms' do + let :facts do + { :osfamily => 'Debian' } + end + it { should contain_service('nova-objectstore').with( + 'name' => 'nova-objectstore', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should contain_package('nova-objectstore').with( + 'name' => 'nova-objectstore', + 'ensure' => 'present', + 'notify' => 'Service[nova-objectstore]' + ) } + describe 'with enabled as true' do + let :params do + {:enabled => true} + end + it { should contain_service('nova-objectstore').with( + 'name' => 'nova-objectstore', + 'ensure' => 'running', + 'enable' => true + )} + end + end + describe 'on rhel' do + let :facts do + { :osfamily => 'RedHat' } + end + it { should contain_service('nova-objectstore').with( + 'name' => 'openstack-nova-objectstore', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should_not contain_package('nova-objectstore') } + end +end diff --git a/spec/classes/nova_scheduler_spec.rb b/spec/classes/nova_scheduler_spec.rb new file mode 100644 index 000000000..02fb3f383 --- /dev/null +++ b/spec/classes/nova_scheduler_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe 'nova::scheduler' do + + let :pre_condition do + 'include nova' + end + + describe 'on debian platforms' do + let :facts do + { :osfamily => 'Debian' } + end + it { should contain_service('nova-scheduler').with( + 'name' => 'nova-scheduler', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should contain_package('nova-scheduler').with( + 'name' => 'nova-scheduler', + 'ensure' => 'present', + 'notify' => 'Service[nova-scheduler]' + ) } + describe 'with enabled as true' do + let :params do + {:enabled => true} + end + it { should contain_service('nova-scheduler').with( + 'name' => 'nova-scheduler', + 'ensure' => 'running', + 'enable' => true + )} + end + end + describe 'on rhel' do + let :facts do + { :osfamily => 'RedHat' } + end + it { should contain_service('nova-scheduler').with( + 'name' => 'openstack-nova-scheduler', + 'ensure' => 'stopped', + 'enable' => false + )} + it { should_not contain_package('nova-scheduler') } + end +end From 806a52b12cbb88b79d2e117283f772a9349b63c2 Mon Sep 17 00:00:00 2001 From: Dan Bode Date: Fri, 30 Mar 2012 09:48:43 -0700 Subject: [PATCH 3/4] Remove deprecated param api_servers from nova::compute The usage of api_servers for the nova::compute module has been deprecated. This commit removes the invalid class parameter from the nova::compute declaration in the nova::all class. --- manifests/all.pp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/manifests/all.pp b/manifests/all.pp index cd6e06894..46356b007 100644 --- a/manifests/all.pp +++ b/manifests/all.pp @@ -54,10 +54,11 @@ class nova::all( rabbit_virtual_host => $rabbit_virtual_host, } - class { "nova::api": enabled => true } + class { "nova::api": + enabled => true + } class { "nova::compute": - api_server => $ipaddress, enabled => true, } class { 'nova::compute::libvirt': From 60eee6d535da3f23930f0142b13857de723a87c8 Mon Sep 17 00:00:00 2001 From: Dan Bode Date: Fri, 30 Mar 2012 20:24:24 -0700 Subject: [PATCH 4/4] Update module packages used --- examples/site.pp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/examples/site.pp b/examples/site.pp index 3fb918a12..9eb74204c 100644 --- a/examples/site.pp +++ b/examples/site.pp @@ -19,6 +19,21 @@ resources { 'nova_config': purge => true, } +# temporarily update this to use the +# latest tested packages from precise +# eventually, these packages need to be moved +# to the openstack module +stage { 'nova_ppa': + before => Stage['main'] +} + +class { 'apt': + stage => 'nova_ppa', +} +class { 'keystone::repo::trunk': + stage => 'nova_ppa', +} + # this is a hack that I have to do b/c openstack nova # sets up a route to reroute calls to the metadata server # to its own server which fails