$auth_type = 'password',
) {
+ include ::ceilometer::deps
+
if ! $auth_cacert {
ceilometer_config { 'service_credentials/ca_file': ensure => absent }
} else {
$coordination_url = undef,
) {
+ include ::ceilometer::deps
include ::ceilometer::params
- Ceilometer_config<||> ~> Service['ceilometer-agent-central']
-
- Package['ceilometer-agent-central'] -> Service['ceilometer-agent-central']
package { 'ceilometer-agent-central':
ensure => $package_ensure,
name => $::ceilometer::params::agent_central_package_name,
}
}
- Package['ceilometer-common'] -> Service['ceilometer-agent-central']
service { 'ceilometer-agent-central':
ensure => $service_ensure,
name => $::ceilometer::params::agent_central_service_name,
$event_pipeline_publishers = ['notifier://'],
) {
+ include ::ceilometer::deps
include ::ceilometer::params
- Ceilometer_config<||> ~> Service['ceilometer-agent-notification']
-
- Package[$::ceilometer::params::agent_notification_package_name] ->
- Service['ceilometer-agent-notification']
-
ensure_resource('package', [$::ceilometer::params::agent_notification_package_name],
{
ensure => $package_ensure,
- tag => 'openstack'
+ tag => ['openstack', 'ceilometer-package']
}
)
}
}
- Package['ceilometer-common'] -> Service['ceilometer-agent-notification']
service { 'ceilometer-agent-notification':
ensure => $service_ensure,
name => $::ceilometer::params::agent_notification_service_name,
ensure => present,
path => $::ceilometer::params::event_pipeline,
content => template('ceilometer/event_pipeline.yaml.erb'),
- selinux_ignore_defaults => true
+ selinux_ignore_defaults => true,
+ tag => 'event-pipeline',
}
-
- Package<| tag == 'ceilometer-package' |> -> File['event_pipeline']
- File['event_pipeline'] ~> Service['ceilometer-agent-notification']
}
ceilometer_config {
$coordination_url = undef,
) inherits ceilometer {
+ include ::ceilometer::deps
include ::ceilometer::params
if $central_namespace {
}
}
- Ceilometer_config<||> ~> Service['ceilometer-polling']
- Package['ceilometer-polling'] -> Service['ceilometer-polling']
- Package['ceilometer-common'] -> Service['ceilometer-polling']
-
service { 'ceilometer-polling':
ensure => $service_ensure,
name => $::ceilometer::params::agent_polling_service_name,
$enable_proxy_headers_parsing = $::os_service_default,
) inherits ceilometer::params {
+ include ::ceilometer::deps
include ::ceilometer::params
include ::ceilometer::policy
include ::ceilometer::keystone::authtoken
}
- Ceilometer_config<||> ~> Service[$service_name]
- Class['ceilometer::policy'] ~> Service[$service_name]
-
- Package['ceilometer-api'] -> Service[$service_name]
- Package['ceilometer-api'] -> Class['ceilometer::policy']
package { 'ceilometer-api':
ensure => $package_ensure,
name => $::ceilometer::params::api_package_name,
}
}
- Package['ceilometer-common'] -> Service[$service_name]
-
if $service_name == $::ceilometer::params::api_service_name {
service { 'ceilometer-api':
ensure => $service_ensure,
enable => $enabled,
hasstatus => true,
hasrestart => true,
- require => Class['ceilometer::db'],
tag => 'ceilometer-service',
}
} elsif $service_name == 'httpd' {
enable => false,
tag => 'ceilometer-service',
}
- Class['ceilometer::db'] -> Service[$service_name]
# we need to make sure ceilometer-api/eventlet is stopped before trying to start apache
Service['ceilometer-api'] -> Service[$service_name]
$ensure = 'present'
) {
+ include ::ceilometer::deps
include ::ceilometer::params
package { 'python-ceilometerclient':
$event_dispatcher = 'database',
) {
+ include ::ceilometer::deps
include ::ceilometer::params
- Ceilometer_config<||> ~> Service['ceilometer-collector']
-
# We accept udp_address to be set to empty instead of the usual undef to stay
# close to the "strange" upstream interface.
if (is_ip_address($udp_address) != true and $udp_address != '' ){
'collector/udp_address': value => $udp_address;
'collector/udp_port': value => $udp_port;
'collector/workers': value => $collector_workers;
- 'DEFAULT/meter_dispatchers': value => join(any2array($meter_dispatcher), ',');
- 'DEFAULT/event_dispatchers': value => join(any2array($event_dispatcher), ',');
+ 'DEFAULT/meter_dispatchers': value => join(any2array($meter_dispatcher), ',');
+ 'DEFAULT/event_dispatchers': value => join(any2array($event_dispatcher), ',');
}
- Package[$::ceilometer::params::collector_package_name] -> Service['ceilometer-collector']
ensure_resource( 'package', [$::ceilometer::params::collector_package_name],
- { ensure => $package_ensure }
+ {
+ ensure => $package_ensure,
+ tag => ['openstack', 'ceilometer-package']
+ }
)
if $manage_service {
}
}
- Package['ceilometer-common'] -> Service['ceilometer-collector']
service { 'ceilometer-collector':
ensure => $service_ensure,
name => $::ceilometer::params::collector_service_name,
$ceilometer_api_paste_ini = {},
) {
+ include ::ceilometer::deps
+
validate_hash($ceilometer_config)
validate_hash($ceilometer_api_paste_ini)
$sync_db = true,
) {
- Package<| title == 'ceilometer-common' |> -> Class['ceilometer::db']
+ include ::ceilometer::deps
oslo::db { 'ceilometer_config':
db_max_retries => $database_db_max_retries,
$collate = 'utf8_general_ci',
) {
+ include ::ceilometer::deps
+
validate_string($password)
::openstacklib::db::mysql { 'ceilometer':
allowed_hosts => $allowed_hosts,
}
- ::Openstacklib::Db::Mysql['ceilometer'] ~> Exec<| title == 'ceilometer-dbsync' |>
+ Anchor['ceilometer::db::begin']
+ ~> Class['ceilometer::db::mysql']
+ ~> Anchor['ceilometer::db::end']
}
$privileges = 'ALL',
) {
+ include ::ceilometer::deps
+
::openstacklib::db::postgresql { 'ceilometer':
password_hash => postgresql_password($user, $password),
dbname => $dbname,
privileges => $privileges,
}
- ::Openstacklib::Db::Postgresql['ceilometer'] ~> Exec<| title == 'ceilometer-dbsync' |>
-
+ Anchor['ceilometer::db::begin']
+ ~> Class['ceilometer::db::postgresql']
+ ~> Anchor['ceilometer::db::end']
}
$extra_params = undef,
) {
+ include ::ceilometer::deps
include ::ceilometer::params
- Package<| tag == 'ceilometer-package' |> ~> Exec['ceilometer-dbsync']
- Exec['ceilometer-dbsync'] ~> Service <| tag == 'ceilometer-service' |>
-
- Ceilometer_config<||> -> Exec['ceilometer-dbsync']
- Ceilometer_config<| title == 'database/connection' |> ~> Exec['ceilometer-dbsync']
-
exec { 'ceilometer-dbsync':
command => "${::ceilometer::params::dbsync_command} ${extra_params}",
path => '/usr/bin',
try_sleep => 5,
tries => 10,
logoutput => on_failure,
+ subscribe => [
+ Anchor['ceilometer::install::end'],
+ Anchor['ceilometer::config::end'],
+ Anchor['ceilometer::dbsync::begin']
+ ],
+ notify => Anchor['ceilometer::dbsync::end'],
}
}
--- /dev/null
+# == Class: ceilometer::deps
+#
+# Ceilometer anchors and dependency management
+#
+class ceilometer::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 { 'ceilometer::install::begin': }
+ -> Package<| tag == 'ceilometer-package'|>
+ ~> anchor { 'ceilometer::install::end': }
+ -> anchor { 'ceilometer::config::begin': }
+ -> Ceilometer_config<||>
+ ~> anchor { 'ceilometer::config::end': }
+ -> anchor { 'ceilometer::db::begin': }
+ -> anchor { 'ceilometer::db::end': }
+ ~> anchor { 'ceilometer::dbsync::begin': }
+ -> anchor { 'ceilometer::dbsync::end': }
+ ~> anchor { 'ceilometer::service::begin': }
+ ~> Service<| tag == 'ceilometer-service' |>
+ ~> anchor { 'ceilometer::service::end': }
+
+ # policy config should occur in the config block also.
+ Anchor['ceilometer::config::begin']
+ -> Openstacklib::Policy::Base<||>
+ ~> Anchor['ceilometer::config::end']
+
+ # Ensure files are modified in the config block
+ Anchor['ceilometer::config::begin']
+ -> File<| tag == 'event-pipeline' |>
+ ~> Anchor['ceilometer::config::end']
+
+ # Installation or config changes will always restart services.
+ Anchor['ceilometer::install::end'] ~> Anchor['ceilometer::service::begin']
+ Anchor['ceilometer::config::end'] ~> Anchor['ceilometer::service::begin']
+}
$resources_definition_file = $::os_service_default,
) {
+ include ::ceilometer::deps
+
ceilometer_config {
'dispatcher_gnocchi/filter_service_activity': value => $filter_service_activity;
'dispatcher_gnocchi/filter_project': value => $filter_project;
# [*weekday*]
# (optional) Defaults to '*'.
#
-
class ceilometer::expirer (
$enable_cron = true,
$minute = 1,
include ::ceilometer::params
- Package<| title == 'ceilometer-common' |> -> Class['ceilometer::expirer']
+ Anchor['ceilometer::install::end'] ~> Class['ceilometer::expirer']
if $enable_cron {
cron { 'ceilometer-expirer':
$rabbit_virtual_host = $::os_service_default,
) {
+ include ::ceilometer::deps
include ::ceilometer::logging
include ::ceilometer::params
group { 'ceilometer':
name => 'ceilometer',
- require => Package['ceilometer-common'],
+ require => Anchor['ceilometer::install::end'],
}
user { 'ceilometer':
name => 'ceilometer',
gid => 'ceilometer',
system => true,
- require => Package['ceilometer-common'],
+ require => Anchor['ceilometer::install::end'],
}
package { 'ceilometer-common':
$internal_url = 'http://127.0.0.1:8777',
) {
+ include ::ceilometer::deps
+
validate_string($password)
::keystone::resource::service_identity { 'ceilometer':
$token_cache_time = $::os_service_default,
) {
+ include ::ceilometer::deps
+
if is_service_default($password) {
fail('Please set password for ceilometer service user')
}
$log_date_format = $::os_service_default,
) {
+ include ::ceilometer::deps
+
# NOTE(spredzy): In order to keep backward compatibility we rely on the pick function
# to use ceilometer::<myparam> first then ceilometer::logging::<myparam>.
$use_syslog_real = pick($::ceilometer::use_syslog,$use_syslog)
$policy_path = '/etc/ceilometer/policy.json',
) {
+ include ::ceilometer::deps
+
validate_hash($policies)
Openstacklib::Policy::Base {
$priority = '10',
) {
+ include ::ceilometer::deps
include ::ceilometer::params
include ::apache
include ::apache::mod::wsgi
--- /dev/null
+---
+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.
shared_examples_for 'ceilometer-agent-central' do
+ it { is_expected.to contain_class('ceilometer::deps') }
it { is_expected.to contain_class('ceilometer::params') }
it 'installs ceilometer-agent-central package' do
is_expected.to contain_package('ceilometer-agent-central').with(
:ensure => 'latest',
:name => platform_params[:agent_package_name],
- :before => ['Service[ceilometer-agent-central]'],
:tag => ['openstack', 'ceilometer-package'],
)
end
- it 'ensures ceilometer-common is installed before the service' do
- is_expected.to contain_package('ceilometer-common').with(
- :before => /Service\[ceilometer-agent-central\]/
- )
- end
-
[{:enabled => true}, {:enabled => false}].each do |param_hash|
context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
before do
shared_examples_for 'ceilometer-agent-compute' do
+ it { is_expected.to contain_class('ceilometer::deps') }
it { is_expected.to contain_class('ceilometer::params') }
it 'installs ceilometer-agent-compute package' do
shared_examples_for 'ceilometer-agent-notification' do
+ it { is_expected.to contain_class('ceilometer::deps') }
it { is_expected.to contain_class('ceilometer::params') }
it 'installs ceilometer agent notification package' do
is_expected.to contain_package(platform_params[:agent_notification_package_name]).with(
:ensure => 'present',
- :tag => 'openstack'
+ :tag => ['openstack', 'ceilometer-package'],
)
end
shared_examples_for 'ceilometer-polling' do
+ it { is_expected.to contain_class('ceilometer::deps') }
it { is_expected.to contain_class('ceilometer::params') }
context 'when compute_namespace => true' do
is_expected.to contain_package('ceilometer-polling').with(
:ensure => 'latest',
:name => platform_params[:agent_package_name],
- :before => ['Service[ceilometer-polling]'],
:tag => ['openstack', 'ceilometer-package'],
)
end
is_expected.to contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('central,compute,ipmi')
end
- it 'ensures ceilometer-common is installed before the service' do
- is_expected.to contain_package('ceilometer-common').with(
- :before => /Service\[ceilometer-polling\]/
- )
- end
-
[{:enabled => true}, {:enabled => false}].each do |param_hash|
context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
before do
shared_examples_for 'ceilometer-api' do
+ it { is_expected.to contain_class('ceilometer::deps') }
it { is_expected.to contain_class('ceilometer::params') }
it { is_expected.to contain_class('ceilometer::policy') }
it { is_expected.to contain_class('ceilometer::keystone::authtoken') }
:enable => params[:enabled],
:hasstatus => true,
:hasrestart => true,
- :require => 'Class[Ceilometer::Db]',
:tag => 'ceilometer-service',
)
end
+ it { is_expected.to contain_service('ceilometer-api').that_subscribes_to('Anchor[ceilometer::service::begin]')}
+ it { is_expected.to contain_service('ceilometer-api').that_notifies('Anchor[ceilometer::service::end]')}
end
end
shared_examples_for 'ceilometer client' do
+ it { is_expected.to contain_class('ceilometer::deps') }
it { is_expected.to contain_class('ceilometer::params') }
it 'installs ceilometer client package' do
:path => '/usr/bin',
:refreshonly => 'true',
:user => 'ceilometer',
- :logoutput => 'on_failure'
+ :logoutput => 'on_failure',
+ :subscribe => ['Anchor[ceilometer::install::end]',
+ 'Anchor[ceilometer::config::end]',
+ 'Anchor[ceilometer::dbsync::begin]'],
+ :notify => 'Anchor[ceilometer::dbsync::end]',
)
end
shared_examples_for 'ceilometer-expirer' do
+ it { is_expected.to contain_class('ceilometer::deps') }
it { is_expected.to contain_class('ceilometer::params') }
it 'installs ceilometer common package' do
it 'configures ceilometer group' do
is_expected.to contain_group('ceilometer').with(
:name => 'ceilometer',
- :require => 'Package[ceilometer-common]'
+ :require => 'Anchor[ceilometer::install::end]'
)
end
:name => 'ceilometer',
:gid => 'ceilometer',
:system => true,
- :require => 'Package[ceilometer-common]'
+ :require => 'Anchor[ceilometer::install::end]'
)
end