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
This commit is contained in:
Doug Schaapveld 2014-01-13 22:58:10 -06:00
parent 75b9fbea27
commit c45f573882
18 changed files with 201 additions and 8 deletions

View File

@ -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,
}

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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]],
}
}
}

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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' }

View File

@ -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'}

View File

@ -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