From 7e48371ebf1d0b93150fb885f9dfad1543f843d4 Mon Sep 17 00:00:00 2001 From: ZhongShengping Date: Wed, 7 Dec 2016 13:51:43 +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: Ie0fa86a383a19b272a2bdaedb61ede73cad6934f --- manifests/api.pp | 9 +------- manifests/config.pp | 2 ++ manifests/db.pp | 2 ++ manifests/db/mysql.pp | 7 +++++- manifests/db/postgresql.pp | 6 +++-- manifests/db/sync.pp | 13 +++++++---- manifests/deps.pp | 40 +++++++++++++++++++++++++++++++++ manifests/init.pp | 2 +- manifests/keystone/auth.pp | 1 + manifests/keystone/authtoken.pp | 2 ++ manifests/logging.pp | 2 ++ manifests/policy.pp | 2 ++ manifests/wsgi/apache.pp | 1 + spec/classes/panko_api_spec.rb | 4 +++- 14 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 manifests/deps.pp diff --git a/manifests/api.pp b/manifests/api.pp index e80a6cc..aca16de 100644 --- a/manifests/api.pp +++ b/manifests/api.pp @@ -68,15 +68,9 @@ class panko::api ( $enable_proxy_headers_parsing = $::os_service_default, ) inherits panko::params { + include ::panko::deps include ::panko::policy - Panko_config<||> ~> Service[$service_name] - Panko_api_paste_ini<||> ~> Service[$service_name] - Class['panko::policy'] ~> Service[$service_name] - - Package['panko-api'] -> Service[$service_name] - Package['panko-api'] -> Service['panko-api'] - Package['panko-api'] -> Class['panko::policy'] package { 'panko-api': ensure => $package_ensure, name => $::panko::params::api_package_name, @@ -102,7 +96,6 @@ class panko::api ( enable => $enabled, hasstatus => true, hasrestart => true, - require => Class['panko::db'], tag => ['panko-service', 'panko-db-sync-service'], } } elsif $service_name == 'httpd' { diff --git a/manifests/config.pp b/manifests/config.pp index dc44a8c..b96335d 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -28,6 +28,8 @@ class panko::config ( $panko_api_paste_ini = {}, ) { + include ::panko::deps + validate_hash($panko_config) validate_hash($panko_api_paste_ini) diff --git a/manifests/db.pp b/manifests/db.pp index 0a7eba7..168add0 100644 --- a/manifests/db.pp +++ b/manifests/db.pp @@ -49,6 +49,8 @@ class panko::db ( $database_max_overflow = $::os_service_default, ) { + include ::panko::deps + validate_re($database_connection, '^(sqlite|mysql(\+pymysql)?|postgresql):\/\/(\S+:\S+@\S+\/\S+)?') diff --git a/manifests/db/mysql.pp b/manifests/db/mysql.pp index 9a400c2..c843148 100644 --- a/manifests/db/mysql.pp +++ b/manifests/db/mysql.pp @@ -53,6 +53,8 @@ class panko::db::mysql( $allowed_hosts = undef ) { + include ::panko::deps + validate_string($password) ::openstacklib::db::mysql { 'panko': @@ -65,5 +67,8 @@ class panko::db::mysql( allowed_hosts => $allowed_hosts, } - ::Openstacklib::Db::Mysql['panko'] ~> Exec<| title == 'panko-db-sync' |> + Anchor['panko::db::begin'] + ~> Class['panko::db::mysql'] + ~> Anchor['panko::db::end'] + } diff --git a/manifests/db/postgresql.pp b/manifests/db/postgresql.pp index fc9ab4a..ce48868 100644 --- a/manifests/db/postgresql.pp +++ b/manifests/db/postgresql.pp @@ -40,7 +40,7 @@ class panko::db::postgresql( $privileges = 'ALL', ) { - Class['panko::db::postgresql'] -> Service<| title == 'panko' |> + include ::panko::deps ::openstacklib::db::postgresql { 'panko': password_hash => postgresql_password($user, $password), @@ -50,6 +50,8 @@ class panko::db::postgresql( privileges => $privileges, } - ::Openstacklib::Db::Postgresql['panko'] ~> Exec<| title == 'panko-db-sync' |> + Anchor['panko::db::begin'] + ~> Class['panko::db::postgresql'] + ~> Anchor['panko::db::end'] } diff --git a/manifests/db/sync.pp b/manifests/db/sync.pp index 04a0eab..601d4c9 100644 --- a/manifests/db/sync.pp +++ b/manifests/db/sync.pp @@ -11,6 +11,9 @@ class panko::db::sync( $extra_params = undef, ) { + + include ::panko::deps + exec { 'panko-db-sync': command => "panko-dbsync --config-file /etc/panko/panko.conf ${extra_params}", path => '/usr/bin', @@ -19,10 +22,12 @@ class panko::db::sync( try_sleep => 5, tries => 10, logoutput => 'on_failure', + subscribe => [ + Anchor['panko::install::end'], + Anchor['panko::config::end'], + Anchor['panko::dbsync::begin'] + ], + notify => Anchor['panko::dbsync::end'], } - Package<| tag == 'panko-package' |> ~> Exec['panko-db-sync'] - Exec['panko-db-sync'] ~> Service<| tag == 'panko-db-sync-service' |> - Panko_config<||> ~> Exec['panko-db-sync'] - Panko_config<| title == 'database/connection' |> ~> Exec['panko-db-sync'] } diff --git a/manifests/deps.pp b/manifests/deps.pp new file mode 100644 index 0000000..c29e722 --- /dev/null +++ b/manifests/deps.pp @@ -0,0 +1,40 @@ +# == Class: panko::deps +# +# Panko anchors and dependency management +# +class panko::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 { 'panko::install::begin': } + -> Package<| tag == 'panko-package'|> + ~> anchor { 'panko::install::end': } + -> anchor { 'panko::config::begin': } + -> Panko_config<||> + ~> anchor { 'panko::config::end': } + -> anchor { 'panko::db::begin': } + -> anchor { 'panko::db::end': } + ~> anchor { 'panko::dbsync::begin': } + -> anchor { 'panko::dbsync::end': } + ~> anchor { 'panko::service::begin': } + ~> Service<| tag == 'panko-service' |> + ~> anchor { 'panko::service::end': } + + # policy config should occur in the config block also. + Anchor['panko::config::begin'] + -> Openstacklib::Policy::Base<||> + ~> Anchor['panko::config::end'] + + # api paste ini config should occur in the config block also. + Anchor['panko::config::begin'] + -> Panko_api_paste_ini<||> + ~> Anchor['panko::config::end'] + + # Installation or config changes will always restart services. + Anchor['panko::install::end'] ~> Anchor['panko::service::begin'] + Anchor['panko::config::end'] ~> Anchor['panko::service::begin'] +} diff --git a/manifests/init.pp b/manifests/init.pp index 811f6e6..dbcc22e 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -18,7 +18,7 @@ class panko ( $purge_config = false, ) inherits panko::params { - + include ::panko::deps include ::panko::logging package { 'panko': diff --git a/manifests/keystone/auth.pp b/manifests/keystone/auth.pp index c003cde..ebd35a4 100644 --- a/manifests/keystone/auth.pp +++ b/manifests/keystone/auth.pp @@ -78,6 +78,7 @@ class panko::keystone::auth ( $internal_url = 'http://127.0.0.1:8779', ) { + include ::panko::deps keystone::resource::service_identity { 'panko': configure_user => $configure_user, diff --git a/manifests/keystone/authtoken.pp b/manifests/keystone/authtoken.pp index d0d4f25..a1290c7 100644 --- a/manifests/keystone/authtoken.pp +++ b/manifests/keystone/authtoken.pp @@ -227,6 +227,8 @@ class panko::keystone::authtoken( $token_cache_time = $::os_service_default, ) { + include ::panko::deps + keystone::resource::authtoken { 'panko_config': username => $username, password => $password, diff --git a/manifests/logging.pp b/manifests/logging.pp index 20bfa16..917cf22 100644 --- a/manifests/logging.pp +++ b/manifests/logging.pp @@ -113,6 +113,8 @@ class panko::logging( $log_date_format = $::os_service_default, ) { + include ::panko::deps + oslo::log { 'panko_config': use_stderr => $use_stderr, use_syslog => $use_syslog, diff --git a/manifests/policy.pp b/manifests/policy.pp index 996c661..07b76a3 100644 --- a/manifests/policy.pp +++ b/manifests/policy.pp @@ -28,6 +28,8 @@ class panko::policy ( $policy_path = '/etc/panko/policy.json', ) { + include ::panko::deps + validate_hash($policies) Openstacklib::Policy::Base { diff --git a/manifests/wsgi/apache.pp b/manifests/wsgi/apache.pp index ab01025..cd2f853 100644 --- a/manifests/wsgi/apache.pp +++ b/manifests/wsgi/apache.pp @@ -91,6 +91,7 @@ class panko::wsgi::apache ( $priority = '10', ) { + include ::panko::deps include ::panko::params include ::apache include ::apache::mod::wsgi diff --git a/spec/classes/panko_api_spec.rb b/spec/classes/panko_api_spec.rb index 1a5dbb4..8d1b653 100644 --- a/spec/classes/panko_api_spec.rb +++ b/spec/classes/panko_api_spec.rb @@ -22,6 +22,7 @@ describe 'panko::api' do shared_examples_for 'panko-api' do + it { is_expected.to contain_class('panko::deps') } it { is_expected.to contain_class('panko::params') } it { is_expected.to contain_class('panko::policy') } @@ -54,10 +55,11 @@ describe 'panko::api' do :enable => params[:enabled], :hasstatus => true, :hasrestart => true, - :require => 'Class[Panko::Db]', :tag => ['panko-service', 'panko-db-sync-service'], ) end + it { is_expected.to contain_service('panko-api').that_subscribes_to('Anchor[panko::service::begin]')} + it { is_expected.to contain_service('panko-api').that_notifies('Anchor[panko::service::end]')} end end