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