From 9fe25f3a23bbb5cbcc839868471d688fc446e873 Mon Sep 17 00:00:00 2001 From: Adam Vinsh Date: Tue, 13 Sep 2016 16:17:10 +0000 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: I31c023824e428ad0fc3dad30b4d3103aaa747597 --- manifests/api.pp | 6 +- manifests/api/authtoken.pp | 2 + manifests/bifrost.pp | 2 + manifests/client.pp | 3 +- manifests/conductor.pp | 4 +- manifests/config.pp | 1 + manifests/cors.pp | 2 + manifests/db.pp | 1 + manifests/db/inspector_sync.pp | 13 ++-- manifests/db/mysql.pp | 7 +- manifests/db/postgresql.pp | 7 +- manifests/db/sync.pp | 13 ++-- manifests/deps.pp | 72 +++++++++++++++++++ manifests/drivers/agent.pp | 2 + manifests/drivers/ipmi.pp | 2 + manifests/drivers/pxe.pp | 1 + manifests/drivers/ssh.pp | 2 + manifests/init.pp | 3 +- manifests/inspector.pp | 16 ++--- manifests/inspector/authtoken.pp | 2 + manifests/inspector/logging.pp | 2 + manifests/keystone/auth.pp | 2 + manifests/keystone/auth_inspector.pp | 2 + manifests/logging.pp | 2 + manifests/policy.pp | 2 + manifests/pxe.pp | 13 ++-- manifests/pxe/common.pp | 1 + manifests/pxe/tftpboot_file.pp | 2 + manifests/wsgi/apache.pp | 1 + .../external-hooks-ebebbb5d72f14f9f.yaml | 8 +++ spec/classes/ironic_api_spec.rb | 3 +- spec/classes/ironic_conductor_spec.rb | 3 +- spec/classes/ironic_inspector_spec.rb | 17 +++-- spec/classes/ironic_pxe_spec.rb | 10 +-- 34 files changed, 174 insertions(+), 55 deletions(-) create mode 100644 manifests/deps.pp create mode 100644 releasenotes/notes/external-hooks-ebebbb5d72f14f9f.yaml diff --git a/manifests/api.pp b/manifests/api.pp index c4a9bf97..afc2ad0d 100644 --- a/manifests/api.pp +++ b/manifests/api.pp @@ -113,6 +113,7 @@ class ironic::api ( $memcached_servers = undef, ) inherits ironic::params { + include ::ironic::deps include ::ironic::params include ::ironic::policy @@ -142,9 +143,6 @@ class ironic::api ( include ::ironic::api::authtoken - Ironic_config<||> ~> Service[$service_name] - Class['ironic::policy'] ~> Service[$service_name] - # Configure ironic.conf ironic_config { 'api/host_ip': value => $host_ip; @@ -157,8 +155,6 @@ class ironic::api ( # Install package if $::ironic::params::api_package { - Package['ironic-api'] -> Class['ironic::policy'] - Package['ironic-api'] -> Service[$service_name] package { 'ironic-api': ensure => $package_ensure, name => $::ironic::params::api_package, diff --git a/manifests/api/authtoken.pp b/manifests/api/authtoken.pp index 34f6f89a..715ce746 100644 --- a/manifests/api/authtoken.pp +++ b/manifests/api/authtoken.pp @@ -228,6 +228,8 @@ class ironic::api::authtoken( $token_cache_time = $::os_service_default, ) { + include ::ironic::deps + if is_service_default($password) and ! $::ironic::api::admin_password { fail('Please set password for Ironic API service user') } diff --git a/manifests/bifrost.pp b/manifests/bifrost.pp index bda15ebe..a541b94d 100644 --- a/manifests/bifrost.pp +++ b/manifests/bifrost.pp @@ -190,6 +190,8 @@ class ironic::bifrost ( $ipmi_bridging = 'no', ) { + include ::ironic::deps + vcsrepo { $git_dest_repo_folder: ensure => $ensure, provider => git, diff --git a/manifests/client.pp b/manifests/client.pp index 71570e98..7bc34d37 100644 --- a/manifests/client.pp +++ b/manifests/client.pp @@ -30,12 +30,13 @@ class ironic::client ( $package_ensure = present ) { + include ::ironic::deps include ::ironic::params package { 'python-ironicclient': ensure => $package_ensure, name => $::ironic::params::client_package, - tag => 'openstack', + tag => ['openstack', 'ironic-support-package'], } } diff --git a/manifests/conductor.pp b/manifests/conductor.pp index 725c5282..15cfca2b 100644 --- a/manifests/conductor.pp +++ b/manifests/conductor.pp @@ -127,11 +127,10 @@ class ironic::conductor ( $configdrive_swift_container = $::os_service_default, ) { + include ::ironic::deps include ::ironic::params include ::ironic::drivers::deploy - Ironic_config<||> ~> Service['ironic-conductor'] - $enabled_drivers_real = pick($::ironic::enabled_drivers, $enabled_drivers) validate_array($enabled_drivers_real) @@ -200,7 +199,6 @@ class ironic::conductor ( # Install package if $::ironic::params::conductor_package { - Package<| tag == 'ironic-package' |> -> Service['ironic-conductor'] package { 'ironic-conductor': ensure => $package_ensure, name => $::ironic::params::conductor_package, diff --git a/manifests/config.pp b/manifests/config.pp index 7a1569ec..d20bff7b 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -28,6 +28,7 @@ class ironic::config ( $ironic_api_paste_ini = {}, ) { + include ::ironic::deps validate_hash($ironic_config) validate_hash($ironic_api_paste_ini) diff --git a/manifests/cors.pp b/manifests/cors.pp index 8100716a..8fa855ca 100644 --- a/manifests/cors.pp +++ b/manifests/cors.pp @@ -45,6 +45,8 @@ class ironic::cors ( $allow_headers = $::os_service_default, ) { + include ::ironic::deps + oslo::cors { 'ironic_config': allowed_origin => $allowed_origin, allow_credentials => $allow_credentials, diff --git a/manifests/db.pp b/manifests/db.pp index fd16bd4b..bdccdbbf 100644 --- a/manifests/db.pp +++ b/manifests/db.pp @@ -48,6 +48,7 @@ class ironic::db ( $database_max_overflow = $::os_service_default, $database_db_max_retries = $::os_service_default, ) { + include ::ironic::deps # NOTE(spredzy): In order to keep backward compatibility we rely on the pick function # to use ironic:: if ironic::db:: isn't specified. diff --git a/manifests/db/inspector_sync.pp b/manifests/db/inspector_sync.pp index d09decf4..4b15e6f8 100644 --- a/manifests/db/inspector_sync.pp +++ b/manifests/db/inspector_sync.pp @@ -3,19 +3,20 @@ # class ironic::db::inspector_sync { + include ::ironic::deps include ::ironic::params - Package<| tag == 'ironic-inspector-package' |> ~> Exec['ironic-inspector-dbsync'] - Exec['ironic-inspector-dbsync'] ~> Service <| tag == 'ironic-inspector-service' |> - - Ironic_inspector_config<||> -> Exec['ironic-inspector-dbsync'] - Ironic_inspector_config<| title == 'database/connection' |> ~> Exec['ironic-inspector-dbsync'] - exec { 'ironic-inspector-dbsync': command => $::ironic::params::inspector_dbsync_command, path => '/usr/bin', user => 'ironic-inspector', refreshonly => true, logoutput => on_failure, + subscribe => [ + Anchor['ironic-inspector::install::end'], + Anchor['ironic-inspector::config::end'], + Anchor['ironic-inspector::dbsync::begin'] + ], + notify => Anchor['ironic-inspector::dbsync::end'], } } diff --git a/manifests/db/mysql.pp b/manifests/db/mysql.pp index e9b685b4..1f7404d3 100644 --- a/manifests/db/mysql.pp +++ b/manifests/db/mysql.pp @@ -54,6 +54,8 @@ class ironic::db::mysql ( $collate = 'utf8_general_ci', ) { + include ::ironic::deps + ::openstacklib::db::mysql { 'ironic': user => $user, password_hash => mysql_password($password), @@ -64,6 +66,7 @@ class ironic::db::mysql ( allowed_hosts => $allowed_hosts, } - ::Openstacklib::Db::Mysql['ironic'] ~> Exec<| title == 'ironic-dbsync' |> - + Anchor['ironic::db::begin'] + ~> Class['ironic::db::mysql'] + ~> Anchor['ironic::db::end'] } diff --git a/manifests/db/postgresql.pp b/manifests/db/postgresql.pp index 7fe7bb25..ce929d83 100644 --- a/manifests/db/postgresql.pp +++ b/manifests/db/postgresql.pp @@ -32,7 +32,7 @@ class ironic::db::postgresql( $privileges = 'ALL', ) { - Class['ironic::db::postgresql'] -> Service<| title == 'ironic' |> + include ::ironic::deps ::openstacklib::db::postgresql { 'ironic': password_hash => postgresql_password($user, $password), @@ -42,6 +42,7 @@ class ironic::db::postgresql( privileges => $privileges, } - ::Openstacklib::Db::Postgresql['ironic'] ~> Exec<| title == 'ironic-dbsync' |> - + Anchor['ironic::db::begin'] + ~> Class['ironic::db::postgresql'] + ~> Anchor['ironic::db::end'] } diff --git a/manifests/db/sync.pp b/manifests/db/sync.pp index 8fec73b9..ac5375e2 100644 --- a/manifests/db/sync.pp +++ b/manifests/db/sync.pp @@ -12,14 +12,9 @@ class ironic::db::sync( $extra_params = undef, ) { + include ::ironic::deps include ::ironic::params - Package<| tag == 'ironic-package' |> ~> Exec['ironic-dbsync'] - Exec['ironic-dbsync'] ~> Service <| tag == 'ironic-service' |> - - Ironic_config<||> -> Exec['ironic-dbsync'] - Ironic_config<| title == 'database/connection' |> ~> Exec['ironic-dbsync'] - exec { 'ironic-dbsync': command => "${::ironic::params::dbsync_command} ${extra_params}", path => '/usr/bin', @@ -31,5 +26,11 @@ class ironic::db::sync( user => 'root', refreshonly => true, logoutput => on_failure, + subscribe => [ + Anchor['ironic::install::end'], + Anchor['ironic::config::end'], + Anchor['ironic::dbsync::begin'] + ], + notify => Anchor['ironic::dbsync::end'], } } diff --git a/manifests/deps.pp b/manifests/deps.pp new file mode 100644 index 00000000..68dffdf9 --- /dev/null +++ b/manifests/deps.pp @@ -0,0 +1,72 @@ +# == Class: ironic::deps +# +# ironic anchors and dependency management +# +class ironic::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 { 'ironic::install::begin': } + -> Package<| tag == 'ironic-package'|> + ~> anchor { 'ironic::install::end': } + -> anchor { 'ironic::config::begin': } + -> Ironic_config<||> + ~> anchor { 'ironic::config::end': } + -> anchor { 'ironic::db::begin': } + -> anchor { 'ironic::db::end': } + ~> anchor { 'ironic::dbsync::begin': } + -> anchor { 'ironic::dbsync::end': } + ~> anchor { 'ironic::service::begin': } + ~> Service<| tag == 'ironic-service' |> + ~> anchor { 'ironic::service::end': } + + # paste-api.ini config should occur in the config block also. + Anchor['ironic::config::begin'] + -> Ironic_api_paste_ini<||> + ~> Anchor['ironic::config::end'] + + # ironic-inspector is supported by this module. This service uses a + # specific conf file and uses it's own config provider. Split out install + # and configure of this service so that other services are not affected. + anchor { 'ironic-inspector::install::begin': } + -> Package<| tag == 'ironic-inspector-package'|> + ~> anchor { 'ironic-inspector::install::end': } + -> anchor { 'ironic-inspector::config::begin': } + -> Ironic_inspector_config<||> + ~> anchor { 'ironic-inspector::config::end': } + -> anchor { 'ironic-inspector::dbsync::begin': } + -> anchor { 'ironic-inspector::dbsync::end': } + ~> anchor { 'ironic-inspector::service::begin': } + ~> Service<| tag == 'ironic-inspector-service' |> + ~> Service<| tag == 'ironic-inspector-dnsmasq-service' |> + ~> anchor { 'ironic-inspector::service::end': } + + Anchor['ironic::db::end'] + -> Anchor['ironic-inspector::dbsync::begin'] + + # Support packages need to be installed in the install phase, but we don't + # put them in the chain above because we don't want any false dependencies + # between packages with the ironic-package tag and the ironic-support-package + # tag. Note: the package resources here will have a 'before' relationshop on + # the ironic::install::end anchor. The line between ironic-support-package and + # ironic-package should be whether or not ironic services would need to be + # restarted if the package state was changed. + Anchor['ironic::install::begin'] + -> Package<| tag == 'ironic-support-package'|> + -> Anchor['ironic::install::end'] + + # ironic-inspector depends on support packages in pxe.pp + Anchor['ironic-inspector::install::begin'] + -> Package<| tag == 'ironic-support-package'|> + -> Anchor['ironic-inspector::install::end'] + +# Installation or config changes will always restart services. + Anchor['ironic::install::end'] ~> Anchor['ironic::service::begin'] + Anchor['ironic::config::end'] ~> Anchor['ironic::service::begin'] + Anchor['ironic-inspector::install::end'] ~> Anchor['ironic-inspector::service::begin'] + Anchor['ironic-inspector::config::end'] ~> Anchor['ironic-inspector::service::begin'] +} diff --git a/manifests/drivers/agent.pp b/manifests/drivers/agent.pp index 21f70fa8..25c85678 100644 --- a/manifests/drivers/agent.pp +++ b/manifests/drivers/agent.pp @@ -65,6 +65,8 @@ class ironic::drivers::agent ( $deploy_logs_swift_days_to_expire = $::os_service_default, ) { + include ::ironic::deps + # Configure ironic.conf ironic_config { 'agent/stream_raw_images': value => $stream_raw_images; diff --git a/manifests/drivers/ipmi.pp b/manifests/drivers/ipmi.pp index 2baf03ee..7a9b4559 100644 --- a/manifests/drivers/ipmi.pp +++ b/manifests/drivers/ipmi.pp @@ -29,6 +29,8 @@ class ironic::drivers::ipmi ( $retry_timeout = '10' ) { + include ::ironic::deps + # Configure ironic.conf ironic_config { 'ipmi/retry_timeout': value => $retry_timeout; diff --git a/manifests/drivers/pxe.pp b/manifests/drivers/pxe.pp index 65f4a3f3..dba94d08 100644 --- a/manifests/drivers/pxe.pp +++ b/manifests/drivers/pxe.pp @@ -113,6 +113,7 @@ class ironic::drivers::pxe ( $pxe_deploy_timeout = undef, ) { + include ::ironic::deps include ::ironic::pxe::common $tftp_root_real = pick($::ironic::pxe::common::tftp_root, $tftp_root) $ipxe_timeout_real = pick($::ironic::pxe::common::ipxe_timeout, $ipxe_timeout) diff --git a/manifests/drivers/ssh.pp b/manifests/drivers/ssh.pp index 88fdc491..6a0a408e 100644 --- a/manifests/drivers/ssh.pp +++ b/manifests/drivers/ssh.pp @@ -26,6 +26,8 @@ class ironic::drivers::ssh ( $libvirt_uri = $::os_service_default, ) { + include ::ironic::deps + # Configure ironic.conf ironic_config { 'ssh/libvirt_uri': value => $libvirt_uri; diff --git a/manifests/init.pp b/manifests/init.pp index c180fef3..cf87f855 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -360,6 +360,7 @@ class ironic ( $enabled_drivers = undef, ) { + include ::ironic::deps include ::ironic::logging include ::ironic::db include ::ironic::params @@ -380,14 +381,12 @@ class ironic ( name => $::ironic::params::common_package_name, tag => ['openstack', 'ironic-package'], } - Package['ironic-common'] ~> Service<| tag == 'ironic-service' |> package { 'ironic-lib': ensure => $package_ensure, name => $::ironic::params::lib_package_name, tag => ['openstack', 'ironic-package'], } - Package['ironic-lib'] ~> Service<| tag == 'ironic-service' |> resources { 'ironic_config': purge => $purge_config, diff --git a/manifests/inspector.pp b/manifests/inspector.pp index cebb1c8a..f947b03b 100644 --- a/manifests/inspector.pp +++ b/manifests/inspector.pp @@ -225,6 +225,7 @@ class ironic::inspector ( $auth_uri = undef, ) { + include ::ironic::deps include ::ironic::params include ::ironic::pxe::common include ::ironic::inspector::logging @@ -261,18 +262,16 @@ class ironic::inspector ( $http_port_real = pick($::ironic::pxe::common::http_port, $http_port) $ipxe_timeout_real = pick($::ironic::pxe::common::ipxe_timeout, $ipxe_timeout) - Ironic_inspector_config<||> ~> Service['ironic-inspector'] - file { '/etc/ironic-inspector/inspector.conf': ensure => 'present', - require => Package['ironic-inspector'], + require => Anchor['ironic-inspector::config::begin'], } if $pxe_transfer_protocol == 'tftp' { file { '/etc/ironic-inspector/dnsmasq.conf': ensure => 'present', content => template('ironic/inspector_dnsmasq_tftp.erb'), - require => Package['ironic-inspector'], + require => Anchor['ironic-inspector::config::begin'], } file { "${tftp_root_real}/pxelinux.cfg/default": ensure => 'present', @@ -280,7 +279,7 @@ class ironic::inspector ( owner => 'ironic-inspector', group => 'ironic-inspector', content => template('ironic/inspector_pxelinux_cfg.erb'), - require => Package['ironic-inspector'], + require => Anchor['ironic-inspector::config::begin'], } } @@ -288,7 +287,7 @@ class ironic::inspector ( file { '/etc/ironic-inspector/dnsmasq.conf': ensure => 'present', content => template('ironic/inspector_dnsmasq_http.erb'), - require => Package['ironic-inspector'], + require => Anchor['ironic-inspector::config::begin'], } file { "${http_root_real}/inspector.ipxe": ensure => 'present', @@ -296,7 +295,7 @@ class ironic::inspector ( owner => 'ironic-inspector', group => 'ironic-inspector', content => template('ironic/inspector_ipxe.erb'), - require => Package['ironic-inspector'], + require => Anchor['ironic-inspector::config::begin'], } } @@ -330,8 +329,6 @@ class ironic::inspector ( # Install package if $::ironic::params::inspector_package { - Package['ironic-inspector'] -> Service['ironic-inspector'] - Package['ironic-inspector'] -> Service['ironic-inspector-dnsmasq'] package { 'ironic-inspector': ensure => $package_ensure, name => $::ironic::params::inspector_package, @@ -358,7 +355,6 @@ class ironic::inspector ( tag => 'ironic-inspector-service', } - Service['ironic-inspector'] -> Service['ironic-inspector-dnsmasq'] service { 'ironic-inspector-dnsmasq': ensure => $ensure, name => $::ironic::params::inspector_dnsmasq_service, diff --git a/manifests/inspector/authtoken.pp b/manifests/inspector/authtoken.pp index 91895df6..e6e0340e 100644 --- a/manifests/inspector/authtoken.pp +++ b/manifests/inspector/authtoken.pp @@ -228,6 +228,8 @@ class ironic::inspector::authtoken( $token_cache_time = $::os_service_default, ) { + include ::ironic::deps + if is_service_default($password) and ! $::ironic::inspector::admin_password { fail('Please set password for Ironic Inspector service user') } diff --git a/manifests/inspector/logging.pp b/manifests/inspector/logging.pp index 50fb7834..1254fe05 100644 --- a/manifests/inspector/logging.pp +++ b/manifests/inspector/logging.pp @@ -112,6 +112,8 @@ class ironic::inspector::logging( $verbose = undef, ) { + include ::ironic::deps + $debug_real = pick($::ironic::inspector::debug,$debug) if is_service_default($default_log_levels) { $default_log_levels_real = $default_log_levels diff --git a/manifests/keystone/auth.pp b/manifests/keystone/auth.pp index b6fbc4f7..042b25a2 100644 --- a/manifests/keystone/auth.pp +++ b/manifests/keystone/auth.pp @@ -95,6 +95,8 @@ class ironic::keystone::auth ( $internal_url = 'http://127.0.0.1:6385', ) { + include ::ironic::deps + if $configure_user_role { Keystone_user_role["${auth_name}@${tenant}"] ~> Service <| name == 'ironic-server' |> } diff --git a/manifests/keystone/auth_inspector.pp b/manifests/keystone/auth_inspector.pp index 2f98daac..80bf3110 100644 --- a/manifests/keystone/auth_inspector.pp +++ b/manifests/keystone/auth_inspector.pp @@ -95,6 +95,8 @@ class ironic::keystone::auth_inspector ( $internal_url = 'http://127.0.0.1:5050', ) { + include ::ironic::deps + $real_service_name = pick($service_name, $auth_name) if $configure_user_role { diff --git a/manifests/logging.pp b/manifests/logging.pp index f6ea7ba0..f6f21ce8 100644 --- a/manifests/logging.pp +++ b/manifests/logging.pp @@ -116,6 +116,8 @@ class ironic::logging( $verbose = undef, ) { + include ::ironic::deps + # NOTE(spredzy): In order to keep backward compatibility we rely on the pick function # to use ironic:: first then ironic::logging::. $use_syslog_real = pick($::ironic::use_syslog,$use_syslog) diff --git a/manifests/policy.pp b/manifests/policy.pp index 0a477569..9b982ddf 100644 --- a/manifests/policy.pp +++ b/manifests/policy.pp @@ -18,6 +18,8 @@ class ironic::policy ( $policy_path = '/etc/ironic/policy.json', ) { + include ::ironic::deps + validate_hash($policies) Openstacklib::Policy::Base { diff --git a/manifests/pxe.pp b/manifests/pxe.pp index 00eb59df..9bf21f0e 100644 --- a/manifests/pxe.pp +++ b/manifests/pxe.pp @@ -51,6 +51,7 @@ class ironic::pxe ( $syslinux_files = $::ironic::params::syslinux_files, ) inherits ::ironic::params { + include ::ironic::deps include ::ironic::pxe::common $tftp_root_real = pick($::ironic::pxe::common::tftp_root, $tftp_root) @@ -62,7 +63,8 @@ class ironic::pxe ( seltype => 'tftpdir_t', owner => 'ironic', group => 'ironic', - require => Package['ironic-common'], + require => Anchor['ironic::config::begin'], + before => Anchor['ironic::config::end'], } file { "${tftp_root_real}/pxelinux.cfg": @@ -78,13 +80,14 @@ class ironic::pxe ( seltype => 'httpd_sys_content_t', owner => 'ironic', group => 'ironic', - require => Package['ironic-common'], + require => Anchor['ironic::config::begin'], + before => Anchor['ironic::config::end'], } ensure_resource( 'package', 'tftp-server', { 'ensure' => $package_ensure, 'name' => $::ironic::params::tftpd_package, - 'tag' => ['openstack', 'ironic-ipxe'], + 'tag' => ['openstack', 'ironic-ipxe', 'ironic-support-package'], }) $options = "--map-file ${tftp_root_real}/map-file" @@ -100,7 +103,7 @@ class ironic::pxe ( flags => 'IPv4', per_source => '11', wait => 'yes', - require => Package['tftp-server'], + subscribe => Anchor['ironic::install::end'], } file { "${tftp_root_real}/map-file": @@ -123,7 +126,7 @@ class ironic::pxe ( ensure_resource( 'package', 'ipxe', { ensure => $package_ensure, name => $::ironic::params::ipxe_package, - tag => ['openstack', 'ironic-ipxe'], + tag => ['openstack', 'ironic-ipxe', 'ironic-support-package'], }) file { "${tftp_root_real}/undionly.kpxe": diff --git a/manifests/pxe/common.pp b/manifests/pxe/common.pp index 6cb64968..d5007792 100644 --- a/manifests/pxe/common.pp +++ b/manifests/pxe/common.pp @@ -43,4 +43,5 @@ class ironic::pxe::common ( $http_port = undef, $ipxe_timeout = undef, ) { + include ::ironic::deps } diff --git a/manifests/pxe/tftpboot_file.pp b/manifests/pxe/tftpboot_file.pp index 5d10d386..4e5607f3 100644 --- a/manifests/pxe/tftpboot_file.pp +++ b/manifests/pxe/tftpboot_file.pp @@ -32,6 +32,8 @@ define ironic::pxe::tftpboot_file ( $destination_directory, $file = $title, ) { + include ::ironic::deps + file {"${destination_directory}/${file}": ensure => 'present', seltype => 'tftpdir_t', diff --git a/manifests/wsgi/apache.pp b/manifests/wsgi/apache.pp index d2308eba..bb9a5834 100644 --- a/manifests/wsgi/apache.pp +++ b/manifests/wsgi/apache.pp @@ -91,6 +91,7 @@ class ironic::wsgi::apache ( $priority = '10', ) { + include ::ironic::deps include ::ironic::params include ::apache include ::apache::mod::wsgi diff --git a/releasenotes/notes/external-hooks-ebebbb5d72f14f9f.yaml b/releasenotes/notes/external-hooks-ebebbb5d72f14f9f.yaml new file mode 100644 index 00000000..0ac7ba9d --- /dev/null +++ b/releasenotes/notes/external-hooks-ebebbb5d72f14f9f.yaml @@ -0,0 +1,8 @@ +--- +features: + - 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. diff --git a/spec/classes/ironic_api_spec.rb b/spec/classes/ironic_api_spec.rb index 48f4613a..62a7a378 100644 --- a/spec/classes/ironic_api_spec.rb +++ b/spec/classes/ironic_api_spec.rb @@ -51,7 +51,8 @@ describe 'ironic::api' do :ensure => p[:package_ensure], :tag => ['openstack', 'ironic-package'], ) - is_expected.to contain_package('ironic-api').with_before(/Service\[ironic-api\]/) + is_expected.to contain_package('ironic-api').that_requires('Anchor[ironic::install::begin]') + is_expected.to contain_package('ironic-api').that_notifies('Anchor[ironic::install::end]') end end diff --git a/spec/classes/ironic_conductor_spec.rb b/spec/classes/ironic_conductor_spec.rb index 2b71fc85..6abc108d 100644 --- a/spec/classes/ironic_conductor_spec.rb +++ b/spec/classes/ironic_conductor_spec.rb @@ -49,7 +49,8 @@ describe 'ironic::conductor' do :ensure => p[:package_ensure], :tag => ['openstack', 'ironic-package'], ) - is_expected.to contain_package('ironic-conductor').with_before(/Service\[ironic-conductor\]/) + is_expected.to contain_package('ironic-conductor').that_requires('Anchor[ironic::install::begin]') + is_expected.to contain_package('ironic-conductor').that_notifies('Anchor[ironic::install::end]') end end diff --git a/spec/classes/ironic_inspector_spec.rb b/spec/classes/ironic_inspector_spec.rb index 2b68a7d2..136b9fbb 100644 --- a/spec/classes/ironic_inspector_spec.rb +++ b/spec/classes/ironic_inspector_spec.rb @@ -72,7 +72,8 @@ describe 'ironic::inspector' do :ensure => p[:package_ensure], :tag => ['openstack', 'ironic-inspector-package'], ) - is_expected.to contain_package('ironic-inspector').with_before(/Service\[ironic-inspector\]/) + is_expected.to contain_package('ironic-inspector').that_requires('Anchor[ironic-inspector::install::begin]') + is_expected.to contain_package('ironic-inspector').that_notifies('Anchor[ironic-inspector::install::end]') end end @@ -118,10 +119,16 @@ describe 'ironic::inspector' do is_expected.to contain_ironic_inspector_config('processing/processing_hooks').with_value('$default_processing_hooks') end + it 'should contain file /etc/ironic-inspector/inspector.conf' do + is_expected.to contain_file('/etc/ironic-inspector/inspector.conf').with( + 'ensure' => 'present', + 'require' => 'Anchor[ironic-inspector::config::begin]', + ) + end it 'should contain file /etc/ironic-inspector/dnsmasq.conf' do is_expected.to contain_file('/etc/ironic-inspector/dnsmasq.conf').with( 'ensure' => 'present', - 'require' => 'Package[ironic-inspector]', + 'require' => 'Anchor[ironic-inspector::config::begin]', 'content' => /pxelinux/, ) end @@ -131,7 +138,7 @@ describe 'ironic::inspector' do 'group' => 'ironic-inspector', 'seltype' => 'tftpdir_t', 'ensure' => 'present', - 'require' => 'Package[ironic-inspector]', + 'require' => 'Anchor[ironic-inspector::config::begin]', 'content' => /default/, ) is_expected.to contain_file('/tftpboot/pxelinux.cfg/default').with_content( @@ -176,7 +183,7 @@ describe 'ironic::inspector' do it 'should contain file /etc/ironic-inspector/dnsmasq.conf' do is_expected.to contain_file('/etc/ironic-inspector/dnsmasq.conf').with( 'ensure' => 'present', - 'require' => 'Package[ironic-inspector]', + 'require' => 'Anchor[ironic-inspector::config::begin]', 'content' => /ipxe/, ) is_expected.to contain_file('/etc/ironic-inspector/dnsmasq.conf').with_content( @@ -187,9 +194,9 @@ describe 'ironic::inspector' do is_expected.to contain_file('/var/www/httpboot/inspector.ipxe').with( 'owner' => 'ironic-inspector', 'group' => 'ironic-inspector', - 'require' => 'Package[ironic-inspector]', 'seltype' => 'httpd_sys_content_t', 'ensure' => 'present', + 'require' => 'Anchor[ironic-inspector::config::begin]', 'content' => /ipxe/, ) is_expected.to contain_file('/var/www/httpboot/inspector.ipxe').with_content( diff --git a/spec/classes/ironic_pxe_spec.rb b/spec/classes/ironic_pxe_spec.rb index 55e63108..41325487 100644 --- a/spec/classes/ironic_pxe_spec.rb +++ b/spec/classes/ironic_pxe_spec.rb @@ -23,7 +23,7 @@ describe 'ironic::pxe' do is_expected.to contain_file('/tftpboot').with( 'owner' => 'ironic', 'group' => 'ironic', - 'require' => 'Package[ironic-common]', + 'require' => 'Anchor[ironic::config::begin]', 'ensure' => 'directory', 'seltype' => 'tftpdir_t', ) @@ -43,7 +43,7 @@ describe 'ironic::pxe' do is_expected.to contain_file('/httpboot').with( 'owner' => 'ironic', 'group' => 'ironic', - 'require' => 'Package[ironic-common]', + 'require' => 'Anchor[ironic::config::begin]', 'ensure' => 'directory', 'seltype' => 'httpd_sys_content_t', ) @@ -67,7 +67,7 @@ describe 'ironic::pxe' do 'flags' => 'IPv4', 'per_source' => '11', 'wait' => 'yes', - 'require' => 'Package[tftp-server]', + 'subscribe' => 'Anchor[ironic::install::end]', ) end @@ -84,7 +84,7 @@ describe 'ironic::pxe' do is_expected.to contain_file('/var/www/httpboot').with( 'owner' => 'ironic', 'group' => 'ironic', - 'require' => 'Package[ironic-common]', + 'require' => 'Anchor[ironic::config::begin]', 'ensure' => 'directory', 'seltype' => 'httpd_sys_content_t', ) @@ -94,7 +94,7 @@ describe 'ironic::pxe' do is_expected.to contain_file('/var/lib/tftpboot').with( 'owner' => 'ironic', 'group' => 'ironic', - 'require' => 'Package[ironic-common]', + 'require' => 'Anchor[ironic::config::begin]', 'ensure' => 'directory', 'seltype' => 'tftpdir_t', )