From c45f573882939ba66136e7b7c2196908294ee2b4 Mon Sep 17 00:00:00 2001 From: Doug Schaapveld Date: Mon, 13 Jan 2014 22:58:10 -0600 Subject: [PATCH] Adding manage_service parameter to all services When set to false, enables puppet to configure a service without starting/stopping it on each run. This may be necessary when using an external clustering system (Corosync/Pacemaker, for example). Defaults to true. Change-Id: Iff21ee384fa857e1ddec0e15ca85df8aedad3e80 --- examples/nova_with_pacemaker.pp | 55 ++++++++++++++++++++++ manifests/api.pp | 7 +++ manifests/cells.pp | 6 +++ manifests/cert.pp | 6 +++ manifests/compute.pp | 6 +++ manifests/conductor.pp | 6 +++ manifests/consoleauth.pp | 17 +++++++ manifests/generic_service.pp | 18 +++---- manifests/objectstore.pp | 6 +++ manifests/scheduler.pp | 6 +++ manifests/spicehtml5proxy.pp | 6 +++ manifests/vncproxy.pp | 6 +++ spec/classes/nova_api_spec.rb | 11 +++++ spec/classes/nova_cells_spec.rb | 14 ++++++ spec/classes/nova_compute_spec.rb | 10 ++++ spec/classes/nova_spicehtml5_proxy_spec.rb | 9 ++++ spec/classes/nova_vnc_proxy_spec.rb | 9 ++++ spec/shared_examples.rb | 11 +++++ 18 files changed, 201 insertions(+), 8 deletions(-) create mode 100644 examples/nova_with_pacemaker.pp diff --git a/examples/nova_with_pacemaker.pp b/examples/nova_with_pacemaker.pp new file mode 100644 index 000000000..0e2833cc3 --- /dev/null +++ b/examples/nova_with_pacemaker.pp @@ -0,0 +1,55 @@ +# Example: managing nova compute controller services with pacemaker +# +# By setting enabled to false, these services will not be started at boot. By setting +# manage_service to false, puppet will not kill these services on every run. This +# allows the Pacemaker resource manager to dynamically determine on which node each +# service should run. +# +# The puppet commands below would ideally be applied to at least three nodes. +# +# Note that nova-api and nova-novncproxy are associated with the virtual IP address as +# they are called from external services. The remaining services connect to the +# database and/or message broker independently. +# +# Example pacemaker resource configuration commands (configured once per cluster): +# +# sudo pcs resource create nova_vip ocf:heartbeat:IPaddr2 params ip=192.0.2.3 \ +# cidr_netmask=24 op monitor interval=10s +# +# sudo pcs resource create nova_api_service lsb:openstack-nova-api +# sudo pcs resource create nova_conductor_service lsb:openstack-nova-conductor +# sudo pcs resource create nova_consoleauth_service lsb:openstack-nova-consoleauth +# sudo pcs resource create nova_novncproxy_service lsb:openstack-nova-novncproxy +# sudo pcs resource create nova_scheduler_service lsb:openstack-nova-scheduler +# +# sudo pcs constraint colocation add nova_api_service with nova_vip +# sudo pcs constraint colocation add nova_novncproxy_service with nova_vip + +class { 'nova': } + +class { 'nova::api': + enabled => false, + manage_service => false, + admin_password => 'PASSWORD', +} + +class { 'nova::conductor': + enabled => false, + manage_service => false, +} + +class { 'nova::consoleauth': + enabled => false, + manage_service => false, +} + +class { 'nova::scheduler': + enabled => false, + manage_service => false, +} + +class { 'nova::vncproxy': + enabled => false, + manage_service => false, +} + diff --git a/manifests/api.pp b/manifests/api.pp index 74f13cdbb..a4f35825a 100644 --- a/manifests/api.pp +++ b/manifests/api.pp @@ -11,6 +11,10 @@ # (optional) Whether the nova api service will be run # Defaults to false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*ensure_package*] # (optional) Whether the nova api package will be installed # Defaults to 'present' @@ -93,6 +97,7 @@ class nova::api( $admin_password, $enabled = false, + $manage_service = true, $ensure_package = 'present', $auth_strategy = undef, $auth_host = '127.0.0.1', @@ -124,6 +129,7 @@ class nova::api( Package<| title == 'nova-common' |> -> Class['nova::api'] Nova_paste_api_ini<| |> ~> Exec['post-nova_config'] + Nova_paste_api_ini<| |> ~> Service['nova-api'] if $auth_strategy { @@ -132,6 +138,7 @@ class nova::api( nova::generic_service { 'api': enabled => $enabled, + manage_service => $manage_service, ensure_package => $ensure_package, package_name => $::nova::params::api_package_name, service_name => $::nova::params::api_service_name, diff --git a/manifests/cells.pp b/manifests/cells.pp index d0909bd13..4ea4755ef 100644 --- a/manifests/cells.pp +++ b/manifests/cells.pp @@ -23,6 +23,10 @@ # Use Nova Cells or not # Defaults to 'False' # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*create_cells*] # Create cells with nova-manage # Defaults to 'True' @@ -144,6 +148,7 @@ class nova::cells ( $ensure_package = 'present', $instance_updated_at_threshold = '3600', $instance_update_num_instances = '1', + $manage_service = true, $manager = 'nova.cells.manager.CellsManager', $max_hop_count = '10', $mute_child_interval = '300', @@ -202,6 +207,7 @@ class nova::cells ( nova::generic_service { 'cells': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::cells_package_name, service_name => $::nova::params::cells_service_name, ensure_package => $ensure_package, diff --git a/manifests/cert.pp b/manifests/cert.pp index b5399fe6d..4e276a167 100644 --- a/manifests/cert.pp +++ b/manifests/cert.pp @@ -8,12 +8,17 @@ # (optional) Whether or not to enable the nova cert service # Defaults to false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*ensure_package*] # (optional) The state to set for the nova-cert package # Defaults to 'present' # class nova::cert( $enabled = false, + $manage_service = true, $ensure_package = 'present' ) { @@ -21,6 +26,7 @@ class nova::cert( nova::generic_service { 'cert': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::cert_package_name, service_name => $::nova::params::cert_service_name, ensure_package => $ensure_package, diff --git a/manifests/compute.pp b/manifests/compute.pp index d5bc60e9d..b4d017809 100644 --- a/manifests/compute.pp +++ b/manifests/compute.pp @@ -8,6 +8,10 @@ # (optional) Whether to enable the nova-compute service # Defaults to false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*ensure_package*] # (optional) The state for the nova-compute package # Defaults to 'present' @@ -54,6 +58,7 @@ # class nova::compute ( $enabled = false, + $manage_service = true, $ensure_package = 'present', $vnc_enabled = true, $vncserver_proxyclient_address = '127.0.0.1', @@ -94,6 +99,7 @@ class nova::compute ( nova::generic_service { 'compute': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::compute_package_name, service_name => $::nova::params::compute_service_name, ensure_package => $ensure_package, diff --git a/manifests/conductor.pp b/manifests/conductor.pp index 449741a35..907ba3c12 100644 --- a/manifests/conductor.pp +++ b/manifests/conductor.pp @@ -8,12 +8,17 @@ # (optional) Whether to enable the nova-conductor service # Defaults to false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*ensure_package*] # (optional) The state of the nova conductor package # Defaults to 'present' # class nova::conductor( $enabled = false, + $manage_service = true, $ensure_package = 'present' ) { @@ -21,6 +26,7 @@ class nova::conductor( nova::generic_service { 'conductor': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::conductor_package_name, service_name => $::nova::params::conductor_service_name, ensure_package => $ensure_package, diff --git a/manifests/consoleauth.pp b/manifests/consoleauth.pp index 2236f0b34..9907975df 100644 --- a/manifests/consoleauth.pp +++ b/manifests/consoleauth.pp @@ -1,11 +1,27 @@ +# == Class: nova::consoleauth # # Installs and configures consoleauth service # # The consoleauth service is required for vncproxy auth # for Horizon # +# === Parameters +# +# [*enabled*] +# (optional) Whether the nova consoleauth service will be run +# Defaults to false +# +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# +# [*ensure_package*] +# (optional) Whether the nova consoleauth package will be installed +# Defaults to 'present' +# class nova::consoleauth( $enabled = false, + $manage_service = true, $ensure_package = 'present' ) { @@ -13,6 +29,7 @@ class nova::consoleauth( nova::generic_service { 'consoleauth': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::consoleauth_package_name, service_name => $::nova::params::consoleauth_service_name, ensure_package => $ensure_package, diff --git a/manifests/generic_service.pp b/manifests/generic_service.pp index d2243a3c2..ea6486573 100644 --- a/manifests/generic_service.pp +++ b/manifests/generic_service.pp @@ -14,17 +14,12 @@ define nova::generic_service( $package_name, $service_name, $enabled = false, + $manage_service = true, $ensure_package = 'present' ) { include nova::params - if $enabled { - $service_ensure = 'running' - } else { - $service_ensure = 'stopped' - } - $nova_title = "nova-${name}" # ensure that the service is only started after # all nova config entries have been set @@ -44,7 +39,15 @@ define nova::generic_service( } } - if ($service_name) { + if $service_name { + if $manage_service { + if $enabled { + $service_ensure = 'running' + } else { + $service_ensure = 'stopped' + } + } + service { $nova_title: ensure => $service_ensure, name => $service_name, @@ -53,5 +56,4 @@ define nova::generic_service( require => [Package['nova-common'], Package[$nova_title]], } } - } diff --git a/manifests/objectstore.pp b/manifests/objectstore.pp index 6cc3f8a35..c26afac17 100644 --- a/manifests/objectstore.pp +++ b/manifests/objectstore.pp @@ -8,12 +8,17 @@ # (optional) Whether to enable the service # Defaults to false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*ensure_package*] # (optional) The package state to set # Defaults to 'present' # class nova::objectstore( $enabled = false, + $manage_service = true, $ensure_package = 'present' ) { @@ -21,6 +26,7 @@ class nova::objectstore( nova::generic_service { 'objectstore': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::objectstore_package_name, service_name => $::nova::params::objectstore_service_name, ensure_package => $ensure_package, diff --git a/manifests/scheduler.pp b/manifests/scheduler.pp index ce80e1852..2b4e6abc0 100644 --- a/manifests/scheduler.pp +++ b/manifests/scheduler.pp @@ -8,12 +8,17 @@ # (optional) Whether to run the scheduler service # Defaults to false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*ensure_package*] # (optional) The state of the scheduler package # Defaults to 'present' # class nova::scheduler( $enabled = false, + $manage_service = true, $ensure_package = 'present' ) { @@ -21,6 +26,7 @@ class nova::scheduler( nova::generic_service { 'scheduler': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::scheduler_package_name, service_name => $::nova::params::scheduler_service_name, ensure_package => $ensure_package, diff --git a/manifests/spicehtml5proxy.pp b/manifests/spicehtml5proxy.pp index e2863378a..b06c016ff 100644 --- a/manifests/spicehtml5proxy.pp +++ b/manifests/spicehtml5proxy.pp @@ -12,6 +12,10 @@ # (optional) enable spicehtml5proxy service # true/false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*host*] # (optional) Listen address for the html5 console proxy # Defaults to 0.0.0.0 @@ -26,6 +30,7 @@ # class nova::spicehtml5proxy( $enabled = false, + $manage_service = true, $host = '0.0.0.0', $port = '6082', $ensure_package = 'present' @@ -40,6 +45,7 @@ class nova::spicehtml5proxy( nova::generic_service { 'spicehtml5proxy': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::spicehtml5proxy_package_name, service_name => $::nova::params::spicehtml5proxy_service_name, ensure_package => $ensure_package, diff --git a/manifests/vncproxy.pp b/manifests/vncproxy.pp index 0db3878f4..b131aac9d 100644 --- a/manifests/vncproxy.pp +++ b/manifests/vncproxy.pp @@ -8,6 +8,10 @@ # (optional) Whether to run the vncproxy service # Defaults to false # +# [*manage_service*] +# (optional) Whether to start/stop the service +# Defaults to true +# # [*host*] # (optional) Host on which to listen for incoming requests # Defaults to '0.0.0.0' @@ -22,6 +26,7 @@ # class nova::vncproxy( $enabled = false, + $manage_service = true, $host = '0.0.0.0', $port = '6080', $ensure_package = 'present' @@ -46,6 +51,7 @@ class nova::vncproxy( } nova::generic_service { 'vncproxy': enabled => $enabled, + manage_service => $manage_service, package_name => $::nova::params::vncproxy_package_name, service_name => $::nova::params::vncproxy_service_name, ensure_package => $ensure_package, diff --git a/spec/classes/nova_api_spec.rb b/spec/classes/nova_api_spec.rb index 1f5daf8e5..15c2900a4 100644 --- a/spec/classes/nova_api_spec.rb +++ b/spec/classes/nova_api_spec.rb @@ -148,6 +148,17 @@ describe 'nova::api' do raise_error(Puppet::Error, /validate_re\(\): "#{auth_admin_prefix}" does not match/) } end end + + context 'while not managing service state' do + before do + params.merge!({ + :enabled => false, + :manage_service => false, + }) + end + + it { should contain_service('nova-api').without_ensure } + end end context 'on Debian platforms' do diff --git a/spec/classes/nova_cells_spec.rb b/spec/classes/nova_cells_spec.rb index 3aead1e79..626264af5 100644 --- a/spec/classes/nova_cells_spec.rb +++ b/spec/classes/nova_cells_spec.rb @@ -109,6 +109,19 @@ describe 'nova::cells' do it_configures 'nova-cells' end + shared_examples_for 'a parent cell with manage_service as false' do + let :params do + { :enabled => true, + :manage_service => false, + :cell_type => 'parent', + :cell_name => 'mommy' } + end + let :expected_params do + default_params.merge(params) + end + it { should contain_service(platform_params[:cells_service_name]).without_ensure } + end + shared_examples_for 'a child cell' do let :params do { :enabled => true, @@ -137,6 +150,7 @@ describe 'nova::cells' do end it_configures 'a parent cell' + it_configures 'a parent cell with manage_service as false' it_configures 'a child cell' end diff --git a/spec/classes/nova_compute_spec.rb b/spec/classes/nova_compute_spec.rb index e87ae0b7c..b2caa1737 100644 --- a/spec/classes/nova_compute_spec.rb +++ b/spec/classes/nova_compute_spec.rb @@ -101,6 +101,16 @@ describe 'nova::compute' do it { should contain_nova_config('DEFAULT/force_config_drive').with_value(true) } end + + context 'while not managing service state' do + let :params do + { :enabled => false, + :manage_service => false, + } + end + + it { should contain_service('nova-compute').without_ensure } + end end diff --git a/spec/classes/nova_spicehtml5_proxy_spec.rb b/spec/classes/nova_spicehtml5_proxy_spec.rb index 53e539339..88f38ceb4 100644 --- a/spec/classes/nova_spicehtml5_proxy_spec.rb +++ b/spec/classes/nova_spicehtml5_proxy_spec.rb @@ -28,6 +28,15 @@ describe 'nova::spicehtml5proxy' do :ensure => 'running' )} + context 'with manage_service as false' do + let :params do + { :enabled => true, + :manage_service => false + } + end + it { should contain_service('nova-spicehtml5proxy').without_ensure } + end + context 'with package version' do let :params do { :ensure_package => '2012.1-2' } diff --git a/spec/classes/nova_vnc_proxy_spec.rb b/spec/classes/nova_vnc_proxy_spec.rb index 37b22bd65..b96415bdc 100644 --- a/spec/classes/nova_vnc_proxy_spec.rb +++ b/spec/classes/nova_vnc_proxy_spec.rb @@ -33,6 +33,15 @@ describe 'nova::vncproxy' do :ensure => 'running' )} + describe 'with manage_service as false' do + let :params do + { :enabled => true, + :manage_service => false + } + end + it { should contain_service('nova-vncproxy').without_ensure } + end + describe 'with package version' do let :params do {:ensure_package => '2012.1-2'} diff --git a/spec/shared_examples.rb b/spec/shared_examples.rb index 7429b5f34..52f56c3a8 100644 --- a/spec/shared_examples.rb +++ b/spec/shared_examples.rb @@ -42,4 +42,15 @@ shared_examples 'generic nova service' do |service| }) end end + + context 'while not managing service state' do + let :params do + { :enabled => false, + :manage_service => false } + end + + it 'does not control service state' do + should contain_service(service[:name]).without_ensure + end + end end