From 1e95f32a6fd417f8d62123067acefcb2e5447492 Mon Sep 17 00:00:00 2001 From: ZhongShengping Date: Wed, 30 Nov 2016 17:35:53 +0800 Subject: [PATCH] Add hooks for external install & svc management This adds defined anchor points for external modules to hook into the software install, config and service dependency chain. This allows external modules to manage software installation (virtualenv, containers, etc) and service management (pacemaker) without needing rely on resources that may change or be renamed. Change-Id: If9fa188b7dca47e6724a737d66e34c0c85668c36 --- manifests/agent.pp | 4 ++- manifests/api.pp | 2 ++ manifests/backend/bind9.pp | 2 ++ manifests/backend/powerdns.pp | 2 ++ manifests/central.pp | 2 ++ manifests/client.pp | 1 + manifests/config.pp | 9 +++-- manifests/db.pp | 1 + manifests/db/mysql.pp | 7 +++- manifests/db/powerdns/mysql.pp | 8 ++++- manifests/db/powerdns/sync.pp | 9 +++-- manifests/db/sync.pp | 9 +++-- manifests/deps.pp | 35 +++++++++++++++++++ manifests/generic_service.pp | 4 +-- manifests/init.pp | 25 ++----------- manifests/keystone/auth.pp | 7 ++-- manifests/keystone/authtoken.pp | 2 ++ manifests/logging.pp | 2 ++ manifests/mdns.pp | 2 ++ manifests/policy.pp | 2 ++ manifests/pool.pp | 3 ++ manifests/pool_manager.pp | 2 ++ manifests/pool_manager_cache/memcache.pp | 3 ++ manifests/pool_manager_cache/sqlalchemy.pp | 3 ++ manifests/pool_nameserver.pp | 3 ++ manifests/pool_target.pp | 3 ++ manifests/sink.pp | 2 ++ ...al_install_mgmt_hook-87123a23e235e9d6.yaml | 10 ++++++ spec/classes/designate_client_spec.rb | 1 + .../designate_db_powerdns_sync_spec.rb | 12 ++++--- spec/classes/designate_db_sync_spec.rb | 12 ++++--- spec/classes/designate_init_spec.rb | 14 +------- 32 files changed, 145 insertions(+), 58 deletions(-) create mode 100644 manifests/deps.pp create mode 100644 releasenotes/notes/external_install_mgmt_hook-87123a23e235e9d6.yaml diff --git a/manifests/agent.pp b/manifests/agent.pp index 3b7bef6b..e5ed01ab 100644 --- a/manifests/agent.pp +++ b/manifests/agent.pp @@ -32,8 +32,10 @@ class designate::agent ( $backend_driver = 'bind9', ) inherits designate { + include ::designate::deps + designate_config { - 'service:agent/backend_driver' : value => $backend_driver; + 'service:agent/backend_driver' : value => $backend_driver; } designate::generic_service { 'agent': diff --git a/manifests/api.pp b/manifests/api.pp index 4900301f..8c2b9188 100644 --- a/manifests/api.pp +++ b/manifests/api.pp @@ -70,6 +70,8 @@ class designate::api ( $api_port = undef, ) inherits designate { + include ::designate::deps + if $api_host and $api_port { warning('api_host and api_port parameters have been deprecated, please use listen instead.') $listen_real = "${api_host}:${api_port}" diff --git a/manifests/backend/bind9.pp b/manifests/backend/bind9.pp index 312390d0..9042e656 100644 --- a/manifests/backend/bind9.pp +++ b/manifests/backend/bind9.pp @@ -26,6 +26,8 @@ class designate::backend::bind9 ( $rndc_config_file = '/etc/rndc.conf', $rndc_key_file = '/etc/rndc.key' ) { + + include ::designate::deps include ::designate include ::dns diff --git a/manifests/backend/powerdns.pp b/manifests/backend/powerdns.pp index a479b6c2..45df4114 100644 --- a/manifests/backend/powerdns.pp +++ b/manifests/backend/powerdns.pp @@ -23,6 +23,8 @@ class designate::backend::powerdns ( $use_db_reconnect = true, $sync_db = true, ) { + + include ::designate::deps include ::designate include ::powerdns include ::powerdns::mysql diff --git a/manifests/central.pp b/manifests/central.pp index f9a48dc3..0d495d2e 100644 --- a/manifests/central.pp +++ b/manifests/central.pp @@ -58,6 +58,8 @@ class designate::central ( $min_ttl = $::os_service_default, ) inherits designate { + include ::designate::deps + designate_config { 'service:central/backend_driver' : value => $backend_driver; 'service:central/managed_resource_email' : value => $managed_resource_email; diff --git a/manifests/client.pp b/manifests/client.pp index 5b2b1101..0487f774 100644 --- a/manifests/client.pp +++ b/manifests/client.pp @@ -17,6 +17,7 @@ class designate::client ( $client_package_name = $::designate::params::client_package_name, ) { + include ::designate::deps include ::designate::params package { 'python-designateclient': diff --git a/manifests/config.pp b/manifests/config.pp index 385d45ec..1480d632 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -31,10 +31,13 @@ # (optional) Allow configuration of /etc/designate/rootwrap.conf. # class designate::config ( - $designate_config = {}, - $api_paste_ini_config = {}, - $rootwrap_config = {}, + $designate_config = {}, + $api_paste_ini_config = {}, + $rootwrap_config = {}, ) { + + include ::designate::deps + validate_hash($designate_config) validate_hash($api_paste_ini_config) validate_hash($rootwrap_config) diff --git a/manifests/db.pp b/manifests/db.pp index cff3be49..21b8c60e 100644 --- a/manifests/db.pp +++ b/manifests/db.pp @@ -54,6 +54,7 @@ class designate::db ( $sync_db = true, ) { + include ::designate::deps include ::designate::params validate_re($database_connection, diff --git a/manifests/db/mysql.pp b/manifests/db/mysql.pp index 82f828fe..ff63c72c 100644 --- a/manifests/db/mysql.pp +++ b/manifests/db/mysql.pp @@ -41,6 +41,8 @@ class designate::db::mysql( $allowed_hosts = undef, ) { + include ::designate::deps + ::openstacklib::db::mysql { 'designate': user => $user, password_hash => mysql_password($password), @@ -51,5 +53,8 @@ class designate::db::mysql( allowed_hosts => $allowed_hosts, } - ::Openstacklib::Db::Mysql['designate'] ~> Exec<| title == 'designate-dbsync' |> + Anchor['designate::db::begin'] + ~> Class['designate::db::mysql'] + ~> Anchor['designate::db::end'] + } diff --git a/manifests/db/powerdns/mysql.pp b/manifests/db/powerdns/mysql.pp index 5002d93d..a9dfdfa6 100644 --- a/manifests/db/powerdns/mysql.pp +++ b/manifests/db/powerdns/mysql.pp @@ -40,6 +40,9 @@ class designate::db::powerdns::mysql ( $collate = 'utf8_general_ci', $allowed_hosts = undef, ) { + + include ::designate::deps + ::openstacklib::db::mysql { 'powerdns': user => $user, password_hash => mysql_password($password), @@ -50,5 +53,8 @@ class designate::db::powerdns::mysql ( allowed_hosts => $allowed_hosts, } - ::Openstacklib::Db::Mysql['powerdns'] ~> Exec<| title == 'designate-dbsync' |> + Anchor['designate::db::begin'] + ~> Class['designate::db::powerdns::mysql'] + ~> Anchor['designate::db::end'] + } diff --git a/manifests/db/powerdns/sync.pp b/manifests/db/powerdns/sync.pp index efc6ec9e..4e824218 100644 --- a/manifests/db/powerdns/sync.pp +++ b/manifests/db/powerdns/sync.pp @@ -13,6 +13,7 @@ class designate::db::powerdns::sync( $extra_params = undef, ) { + include ::designate::deps include ::designate::params exec { 'designate-powerdns-dbsync': @@ -21,8 +22,12 @@ class designate::db::powerdns::sync( user => 'root', refreshonly => true, logoutput => on_failure, - subscribe => Anchor['designate::config::end'], - notify => Anchor['designate::service::begin'], + subscribe => [ + Anchor['designate::install::end'], + Anchor['designate::config::end'], + Anchor['designate::dbsync::begin'] + ], + notify => Anchor['designate::dbsync::end'], } diff --git a/manifests/db/sync.pp b/manifests/db/sync.pp index 1c05dc85..e0080e5c 100644 --- a/manifests/db/sync.pp +++ b/manifests/db/sync.pp @@ -14,6 +14,7 @@ class designate::db::sync( $extra_params = undef, ) { + include ::designate::deps include ::designate::params exec { 'designate-dbsync': @@ -24,8 +25,12 @@ class designate::db::sync( try_sleep => 5, tries => 10, logoutput => on_failure, - subscribe => Anchor['designate::config::end'], - notify => Anchor['designate::service::begin'], + subscribe => [ + Anchor['designate::install::end'], + Anchor['designate::config::end'], + Anchor['designate::dbsync::begin'] + ], + notify => Anchor['designate::dbsync::end'], } } diff --git a/manifests/deps.pp b/manifests/deps.pp new file mode 100644 index 00000000..11efd2a0 --- /dev/null +++ b/manifests/deps.pp @@ -0,0 +1,35 @@ +# == Class: designate::deps +# +# Designate anchors and dependency management +# +class designate::deps { + # Setup anchors for install, config and service phases of the module. These + # anchors allow external modules to hook the begin and end of any of these + # phases. Package or service management can also be replaced by ensuring the + # package is absent or turning off service management and having the + # replacement depend on the appropriate anchors. When applicable, end tags + # should be notified so that subscribers can determine if installation, + # config or service state changed and act on that if needed. + anchor { 'designate::install::begin': } + -> Package<| tag == 'designate-package'|> + ~> anchor { 'designate::install::end': } + -> anchor { 'designate::config::begin': } + -> Designate_config<||> + ~> anchor { 'designate::config::end': } + -> anchor { 'designate::db::begin': } + -> anchor { 'designate::db::end': } + ~> anchor { 'designate::dbsync::begin': } + -> anchor { 'designate::dbsync::end': } + ~> anchor { 'designate::service::begin': } + ~> Service<| tag == 'designate-service' |> + ~> anchor { 'designate::service::end': } + + # policy config should occur in the config block also. + Anchor['designate::config::begin'] + -> Openstacklib::Policy::Base<||> + ~> Anchor['designate::config::end'] + + # Installation or config changes will always restart services. + Anchor['designate::install::end'] ~> Anchor['designate::service::begin'] + Anchor['designate::config::end'] ~> Anchor['designate::service::begin'] +} diff --git a/manifests/generic_service.pp b/manifests/generic_service.pp index f79f84b3..12912782 100644 --- a/manifests/generic_service.pp +++ b/manifests/generic_service.pp @@ -39,12 +39,12 @@ define designate::generic_service( $ensure_package = 'present' ) { + include ::designate::deps include ::designate::params include ::designate::db $designate_title = "designate-${name}" - Exec['post-designate_config'] ~> Service<| title == $designate_title |> - Exec<| title == 'designate-db-sync' |> ~> Service<| title == $designate_title |> + Exec['post-designate_config'] ~> Anchor['designate::service::end'] if ($package_name) { if !defined(Package[$package_name]) { diff --git a/manifests/init.pp b/manifests/init.pp index 3cd9a697..ef0a8bc5 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -206,6 +206,7 @@ to your desired configuration.") $rabbit_ha_queues_real = $rabbit_ha_queues } + include ::designate::deps include ::designate::logging exec { 'post-designate_config': @@ -213,7 +214,7 @@ to your desired configuration.") refreshonly => true, } - Designate_config<| |> ~> Exec['post-designate_config'] + Anchor['designate::config::end'] ~> Exec['post-designate_config'] package { 'designate-common': ensure => $package_ensure, @@ -254,26 +255,4 @@ to your desired configuration.") 'DEFAULT/notification_topics' : value => $notification_topics; } - # Setup anchors for install, config and service phases of the module. These - # anchors allow external modules to hook the begin and end of any of these - # phases. Package or service management can also be replaced by ensuring the - # package is absent or turning off service management and having the - # replacement depend on the appropriate anchors. When applicable, end tags - # should be notified so that subscribers can determine if installation, - # config or service state changed and act on that if needed. - anchor { 'designate::install::begin': } -> - Package<| tag == 'designate-package'|> ~> - anchor { 'designate::install::end': } - -> - anchor { 'designate::config::begin': } -> - Designate_config<||> ~> - anchor { 'designate::config::end': } - -> - anchor { 'designate::service::begin': } ~> - Service<| tag == 'designate-service' |> ~> - anchor { 'designate::service::end': } - - # Package installation or config changes will always restart services. - Anchor['designate::install::end'] ~> Anchor['designate::service::begin'] - Anchor['designate::config::end'] ~> Anchor['designate::service::begin'] } diff --git a/manifests/keystone/auth.pp b/manifests/keystone/auth.pp index 1d55aa4e..15be287b 100644 --- a/manifests/keystone/auth.pp +++ b/manifests/keystone/auth.pp @@ -77,8 +77,11 @@ class designate::keystone::auth ( $internal_url = 'http://127.0.0.1:9001/v1', ) { - Keystone_user_role["${auth_name}@${tenant}"] ~> - Service <| name == 'designate-api' |> + include ::designate::deps + + if $configure_user_role { + Keystone_user_role["${auth_name}@${tenant}"] ~> Anchor['designate::service::end'] + } keystone::resource::service_identity { 'designate': configure_user => $configure_user, diff --git a/manifests/keystone/authtoken.pp b/manifests/keystone/authtoken.pp index 299ee384..565f275a 100644 --- a/manifests/keystone/authtoken.pp +++ b/manifests/keystone/authtoken.pp @@ -228,6 +228,8 @@ class designate::keystone::authtoken( $token_cache_time = $::os_service_default, ) { + include ::designate::deps + if is_service_default($password) { fail('Please set password for designate service user') } diff --git a/manifests/logging.pp b/manifests/logging.pp index 8b22caf8..0bd5c743 100644 --- a/manifests/logging.pp +++ b/manifests/logging.pp @@ -104,6 +104,8 @@ class designate::logging( $log_date_format = undef, ) inherits ::designate::params { + include ::designate::deps + # NOTE(spredzy): In order to keep backward compatibility we rely on the pick function # to use designate:: first then designate::logging::. $use_syslog_real = pick($::designate::use_syslog,$use_syslog) diff --git a/manifests/mdns.pp b/manifests/mdns.pp index 6d7e85ea..1c598ccf 100644 --- a/manifests/mdns.pp +++ b/manifests/mdns.pp @@ -80,6 +80,8 @@ class designate::mdns ( $port = undef, ) inherits designate { + include ::designate::deps + if $host and $port { warning('host and port parameters have been deprecated, please use listen instead.') $listen_real = "${host}:${port}" diff --git a/manifests/policy.pp b/manifests/policy.pp index dd090142..56222536 100644 --- a/manifests/policy.pp +++ b/manifests/policy.pp @@ -29,6 +29,8 @@ class designate::policy ( $policy_path = '/etc/designate/policy.json', ) { + include ::designate::deps + validate_hash($policies) Openstacklib::Policy::Base { diff --git a/manifests/pool.pp b/manifests/pool.pp index 53d0974a..5f2e4786 100644 --- a/manifests/pool.pp +++ b/manifests/pool.pp @@ -18,6 +18,9 @@ define designate::pool( $targets, $also_notifies = [], ){ + + include ::designate::deps + validate_re($name, '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}', 'Pool name should be a UUID.') validate_array($nameservers) diff --git a/manifests/pool_manager.pp b/manifests/pool_manager.pp index 0dd26c5d..cd9ff13c 100644 --- a/manifests/pool_manager.pp +++ b/manifests/pool_manager.pp @@ -106,6 +106,8 @@ class designate::pool_manager( $periodic_sync_max_attempts = $::os_service_default, $periodic_sync_retry_interval = $::os_service_default, ) { + + include ::designate::deps include ::designate::params if $pool_id !~ /^[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}$/ { diff --git a/manifests/pool_manager_cache/memcache.pp b/manifests/pool_manager_cache/memcache.pp index 876a573a..5776fda4 100644 --- a/manifests/pool_manager_cache/memcache.pp +++ b/manifests/pool_manager_cache/memcache.pp @@ -16,6 +16,9 @@ class designate::pool_manager_cache::memcache( $memcached_servers = ['127.0.0.1'], $expiration = $::os_service_default, ){ + + include ::designate::deps + validate_array($memcached_servers) designate_config { diff --git a/manifests/pool_manager_cache/sqlalchemy.pp b/manifests/pool_manager_cache/sqlalchemy.pp index 1ba4c520..4d73a88f 100644 --- a/manifests/pool_manager_cache/sqlalchemy.pp +++ b/manifests/pool_manager_cache/sqlalchemy.pp @@ -40,6 +40,9 @@ class designate::pool_manager_cache::sqlalchemy( $max_retries = $::os_service_default, $retry_interval = $::os_service_default, ){ + + include ::designate::deps + designate_config { 'service:pool_manager/cache_driver': value => 'sqlalchemy'; 'pool_manager_cache:sqlalchemy/connection': value => $connection; diff --git a/manifests/pool_nameserver.pp b/manifests/pool_nameserver.pp index 3d8629be..2b9b3a4c 100644 --- a/manifests/pool_nameserver.pp +++ b/manifests/pool_nameserver.pp @@ -12,6 +12,9 @@ define designate::pool_nameserver( $port = 53, $host = '127.0.0.1', ){ + + include ::designate::deps + validate_re($name, '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}', 'Name should be a UUID.') diff --git a/manifests/pool_target.pp b/manifests/pool_target.pp index c00a7d2d..8cd9cdc0 100644 --- a/manifests/pool_target.pp +++ b/manifests/pool_target.pp @@ -27,6 +27,9 @@ define designate::pool_target ( $type, $masters = ['127.0.0.1:5354'], ) { + + include ::designate::deps + if target == 'powerdns' { include ::powerdns include ::powerdns::mysql diff --git a/manifests/sink.pp b/manifests/sink.pp index ba756e52..b01fde8a 100644 --- a/manifests/sink.pp +++ b/manifests/sink.pp @@ -34,6 +34,8 @@ class designate::sink ( $enabled_notification_handlers = undef, ) inherits designate { + include ::designate::deps + designate::generic_service { 'sink': enabled => $enabled, manage_service => $service_ensure, diff --git a/releasenotes/notes/external_install_mgmt_hook-87123a23e235e9d6.yaml b/releasenotes/notes/external_install_mgmt_hook-87123a23e235e9d6.yaml new file mode 100644 index 00000000..eeb3c9b5 --- /dev/null +++ b/releasenotes/notes/external_install_mgmt_hook-87123a23e235e9d6.yaml @@ -0,0 +1,10 @@ +--- +prelude: > + Add hooks for external install & svc management. +features: + - This adds defined anchor points for external modules to + hook into the software install, config and service dependency + chain. This allows external modules to manage software + installation (virtualenv, containers, etc) and service management + (pacemaker) without needing rely on resources that may change or + be renamed. diff --git a/spec/classes/designate_client_spec.rb b/spec/classes/designate_client_spec.rb index 7000e07a..32b187a4 100644 --- a/spec/classes/designate_client_spec.rb +++ b/spec/classes/designate_client_spec.rb @@ -11,6 +11,7 @@ describe 'designate::client' do shared_examples 'designate-client' do context 'with default parameters' do + it { is_expected.to contain_class('designate::deps') } it { is_expected.to contain_class('designate::params') } it 'installs designate client package' do diff --git a/spec/classes/designate_db_powerdns_sync_spec.rb b/spec/classes/designate_db_powerdns_sync_spec.rb index 48e44d42..8231c2cd 100644 --- a/spec/classes/designate_db_powerdns_sync_spec.rb +++ b/spec/classes/designate_db_powerdns_sync_spec.rb @@ -14,8 +14,10 @@ describe 'designate::db::powerdns::sync' do :user => 'root', :refreshonly => 'true', :logoutput => 'on_failure', - :subscribe => 'Anchor[designate::config::end]', - :notify => 'Anchor[designate::service::begin]', + :subscribe => ['Anchor[designate::install::end]', + 'Anchor[designate::config::end]', + 'Anchor[designate::dbsync::begin]'], + :notify => 'Anchor[designate::dbsync::end]', ) end end @@ -33,8 +35,10 @@ describe 'designate::db::powerdns::sync' do :user => 'root', :refreshonly => 'true', :logoutput => 'on_failure', - :subscribe => 'Anchor[designate::config::end]', - :notify => 'Anchor[designate::service::begin]', + :subscribe => ['Anchor[designate::install::end]', + 'Anchor[designate::config::end]', + 'Anchor[designate::dbsync::begin]'], + :notify => 'Anchor[designate::dbsync::end]', ) end end diff --git a/spec/classes/designate_db_sync_spec.rb b/spec/classes/designate_db_sync_spec.rb index 38349dd9..898ac978 100644 --- a/spec/classes/designate_db_sync_spec.rb +++ b/spec/classes/designate_db_sync_spec.rb @@ -14,8 +14,10 @@ describe 'designate::db::sync' do :user => 'root', :refreshonly => 'true', :logoutput => 'on_failure', - :subscribe => 'Anchor[designate::config::end]', - :notify => 'Anchor[designate::service::begin]', + :subscribe => ['Anchor[designate::install::end]', + 'Anchor[designate::config::end]', + 'Anchor[designate::dbsync::begin]'], + :notify => 'Anchor[designate::dbsync::end]', ) end end @@ -33,8 +35,10 @@ describe 'designate::db::sync' do :user => 'root', :refreshonly => 'true', :logoutput => 'on_failure', - :subscribe => 'Anchor[designate::config::end]', - :notify => 'Anchor[designate::service::begin]', + :subscribe => ['Anchor[designate::install::end]', + 'Anchor[designate::config::end]', + 'Anchor[designate::dbsync::begin]'], + :notify => 'Anchor[designate::dbsync::end]', ) end end diff --git a/spec/classes/designate_init_spec.rb b/spec/classes/designate_init_spec.rb index 2aba6689..490b5d1f 100644 --- a/spec/classes/designate_init_spec.rb +++ b/spec/classes/designate_init_spec.rb @@ -112,6 +112,7 @@ describe 'designate' do shared_examples_for 'a designate base installation' do + it { is_expected.to contain_class('designate::deps') } it { is_expected.to contain_class('designate::logging') } it { is_expected.to contain_class('designate::params') } @@ -138,19 +139,6 @@ describe 'designate' do is_expected.to contain_designate_config('DEFAULT/notification_topics').with_value('notifications') end - it 'configures phase anchors' do - is_expected.to contain_anchor('designate::install::begin') - is_expected.to contain_anchor('designate::install::end').with( - :notify => ['Anchor[designate::service::begin]'], - ) - is_expected.to contain_anchor('designate::config::begin') - is_expected.to contain_anchor('designate::config::end').with( - :notify => ['Anchor[designate::service::begin]'], - ) - is_expected.to contain_anchor('designate::service::begin') - is_expected.to contain_anchor('designate::service::end') - end - end shared_examples_for 'rabbit without HA support' do