From f236f531df8f342c475973620e3f3913399dc2c0 Mon Sep 17 00:00:00 2001 From: Tobias Urdin Date: Mon, 23 Jul 2018 22:21:21 +0200 Subject: [PATCH] Add support to customize polling meters This adds a new parameter called polling_meters to the ceilometer::agent::polling class. If you pass a array of strings this parameter will then populate the meters in the polling.yaml file by inserting them in the templated polling file. The default values that was hardcoded in the template is still the same but has been moved to the params class as an array of strings. Change-Id: Iae2567b5a0f24b2aa80f9640ff10df96cd656922 --- manifests/agent/polling.pp | 6 + manifests/params.pp | 41 ++- ...anage-polling-meters-e28386cd03c9d80d.yaml | 6 + spec/classes/ceilometer_agent_polling_spec.rb | 238 ++++++++++-------- templates/polling.yaml.erb | 28 +-- 5 files changed, 189 insertions(+), 130 deletions(-) create mode 100644 releasenotes/notes/manage-polling-meters-e28386cd03c9d80d.yaml diff --git a/manifests/agent/polling.pp b/manifests/agent/polling.pp index dd962b2d..1344abfa 100644 --- a/manifests/agent/polling.pp +++ b/manifests/agent/polling.pp @@ -48,6 +48,11 @@ # (Optional) Number of seconds between polling cycle # Defaults to 600 seconds, used only if manage_polling is true. # +# [*polling_meters*] +# (Optional) Array of strings with meters to add to +# the polling.yaml file, used only if manage_polling is true. +# Defaults to $::ceilometer::params::polling_meters +# class ceilometer::agent::polling ( $manage_service = true, $enabled = true, @@ -59,6 +64,7 @@ class ceilometer::agent::polling ( $instance_discovery_method = $::os_service_default, $manage_polling = false, $polling_interval = 600, + $polling_meters = $::ceilometer::params::polling_meters, ) inherits ceilometer { include ::ceilometer::deps diff --git a/manifests/params.pp b/manifests/params.pp index 28071c9e..4964444e 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -6,13 +6,40 @@ class ceilometer::params { include ::openstacklib::defaults - $dbsync_command = 'ceilometer-upgrade' - $expirer_command = 'ceilometer-expirer' - $user = 'ceilometer' - $event_pipeline = '/etc/ceilometer/event_pipeline.yaml' - $pipeline = '/etc/ceilometer/pipeline.yaml' - $polling = '/etc/ceilometer/polling.yaml' - $group = 'ceilometer' + $dbsync_command = 'ceilometer-upgrade' + $expirer_command = 'ceilometer-expirer' + $user = 'ceilometer' + $event_pipeline = '/etc/ceilometer/event_pipeline.yaml' + $pipeline = '/etc/ceilometer/pipeline.yaml' + $polling = '/etc/ceilometer/polling.yaml' + $group = 'ceilometer' + $polling_meters = [ + 'cpu', + 'cpu_l3_cache', + 'memory.usage', + 'network.incoming.bytes', + 'network.incoming.packets', + 'network.outgoing.bytes', + 'network.outgoing.packets', + 'disk.read.bytes', + 'disk.read.requests', + 'disk.write.bytes', + 'disk.write.requests', + 'volume.size', + 'volume.snapshot.size', + 'volume.backup.size', + 'hardware.cpu.util', + 'hardware.memory.used', + 'hardware.memory.total', + 'hardware.memory.buffer', + 'hardware.memory.cached', + 'hardware.memory.swap.avail', + 'hardware.memory.swap.total', + 'hardware.system_stats.io.outgoing.blocks', + 'hardware.system_stats.io.incoming.blocks', + 'hardware.network.ip.incoming.datagrams', + 'hardware.network.ip.outgoing.datagrams', + ] case $::osfamily { 'RedHat': { diff --git a/releasenotes/notes/manage-polling-meters-e28386cd03c9d80d.yaml b/releasenotes/notes/manage-polling-meters-e28386cd03c9d80d.yaml new file mode 100644 index 00000000..223e79a2 --- /dev/null +++ b/releasenotes/notes/manage-polling-meters-e28386cd03c9d80d.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + New parameter ceilometer::agent::polling::polling_meters can now be used to + populate the list of pollers in the ceilometer polling.yaml file. The default + values in this file is still the same. diff --git a/spec/classes/ceilometer_agent_polling_spec.rb b/spec/classes/ceilometer_agent_polling_spec.rb index 306c69ba..4e257554 100644 --- a/spec/classes/ceilometer_agent_polling_spec.rb +++ b/spec/classes/ceilometer_agent_polling_spec.rb @@ -3,142 +3,180 @@ require 'spec_helper' describe 'ceilometer::agent::polling' do let :pre_condition do - "include nova\n" + - "include nova::compute\n" + - "class { 'ceilometer': telemetry_secret => 's3cr3t' }" + "include nova + include nova::compute + class { 'ceilometer': telemetry_secret => 's3cr3t' }" end let :params do - { :enabled => true, - :manage_service => true, - :package_ensure => 'latest', - :central_namespace => true, - :compute_namespace => true, - :ipmi_namespace => true, - :coordination_url => 'redis://localhost:6379', - } + {} end - shared_examples_for 'ceilometer-polling' do + shared_examples 'ceilometer::agent::polling' do + context 'with default params' do + it { should contain_class('ceilometer::deps') } + it { should contain_class('ceilometer::params') } - it { is_expected.to contain_class('ceilometer::deps') } - it { is_expected.to contain_class('ceilometer::params') } - - context 'when compute_namespace => true' do - it 'adds ceilometer user to nova group and, if required, to libvirt group' do + it { if platform_params[:libvirt_group] - is_expected.to contain_user('ceilometer').with_groups(['nova', "#{platform_params[:libvirt_group]}"]) + should contain_user('ceilometer').with_groups(['nova', "#{platform_params[:libvirt_group]}"]) else - is_expected.to contain_user('ceilometer').with_groups(['nova']) + should contain_user('ceilometer').with_groups(['nova']) end - end + } - it 'ensures nova-common is installed before the package ceilometer-common' do - is_expected.to contain_package('nova-common').with( - :before => /Package\[ceilometer-common\]/ - ) - end + it { should contain_package('nova-common').with( + :before => /Package\[ceilometer-common\]/ + )} - it 'configures agent compute' do - is_expected.to contain_ceilometer_config('compute/instance_discovery_method').with_value('') - end - end + it { should contain_ceilometer_config('compute/instance_discovery_method').with_value('') } - it 'installs ceilometer-polling package' do - is_expected.to contain_package('ceilometer-polling').with( - :ensure => 'latest', + it { should contain_package('ceilometer-polling').with( + :ensure => 'present', :name => platform_params[:agent_package_name], :tag => ['openstack', 'ceilometer-package'], - ) + )} + + it { should contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('central,compute,ipmi') } + + it { should contain_service('ceilometer-polling').with( + :ensure => 'running', + :name => platform_params[:agent_service_name], + :enable => true, + :hasstatus => true, + :hasrestart => true, + :tag => 'ceilometer-service', + )} + + it { should_not contain_ceilometer_config('coordination/backend_url') } + it { should_not contain_file('polling') } end - it 'configures polling namespaces' do - is_expected.to contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('central,compute,ipmi') - end - - [{:enabled => true}, {:enabled => false}].each do |param_hash| - context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do - before do - params.merge!(param_hash) - end - - it 'configures ceilometer-polling service' do - is_expected.to contain_service('ceilometer-polling').with( - :ensure => (params[:manage_service] && params[:enabled]) ? 'running' : 'stopped', - :name => platform_params[:agent_service_name], - :enable => params[:enabled], - :hasstatus => true, - :hasrestart => true, - :tag => 'ceilometer-service', - ) - end + context 'when setting package_ensure' do + before do + params.merge!( :package_ensure => 'latest' ) end - end + it { should contain_package('ceilometer-polling').with( + :ensure => 'latest', + )} + end context 'when setting instance_discovery_method' do before do - params.merge!({ :instance_discovery_method => 'naive' }) + params.merge!( :instance_discovery_method => 'naive' ) end - it 'configures agent compute instance discovery' do - is_expected.to contain_ceilometer_config('compute/instance_discovery_method').with_value('naive') - end + it { should contain_ceilometer_config('compute/instance_discovery_method').with_value('naive') } end context 'with central and ipmi polling namespaces disabled' do before do - params.merge!({ - :central_namespace => false, - :ipmi_namespace => false }) + params.merge!( :central_namespace => false, + :ipmi_namespace => false ) end - it 'configures compute polling namespace' do - is_expected.to contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('compute') - end + it { should contain_ceilometer_config('DEFAULT/polling_namespaces').with_value('compute') } end context 'with disabled service managing' do before do - params.merge!({ - :manage_service => false, - :enabled => false }) + params.merge!( :manage_service => false, + :enabled => false ) end - it 'configures ceilometer-polling service' do - is_expected.to contain_service('ceilometer-polling').with( - :ensure => nil, - :name => platform_params[:agent_service_name], - :enable => false, - :hasstatus => true, - :hasrestart => true, - :tag => 'ceilometer-service', - ) + it { should contain_service('ceilometer-polling').with( + :ensure => nil, + :name => platform_params[:agent_service_name], + :enable => false, + :hasstatus => true, + :hasrestart => true, + :tag => 'ceilometer-service', + )} + end + + context 'with polling management enabled and default meters' do + before do + params.merge!( :manage_polling => true ) + end + + it { should contain_file('polling').with( + :ensure => 'present', + :path => '/etc/ceilometer/polling.yaml', + :content => '--- +sources: + - name: some_pollsters + interval: 600 + meters: + - cpu + - cpu_l3_cache + - memory.usage + - network.incoming.bytes + - network.incoming.packets + - network.outgoing.bytes + - network.outgoing.packets + - disk.read.bytes + - disk.read.requests + - disk.write.bytes + - disk.write.requests + - volume.size + - volume.snapshot.size + - volume.backup.size + - hardware.cpu.util + - hardware.memory.used + - hardware.memory.total + - hardware.memory.buffer + - hardware.memory.cached + - hardware.memory.swap.avail + - hardware.memory.swap.total + - hardware.system_stats.io.outgoing.blocks + - hardware.system_stats.io.incoming.blocks + - hardware.network.ip.incoming.datagrams + - hardware.network.ip.outgoing.datagrams +', + :selinux_ignore_defaults => true, + :tag => 'ceilometer-yamls', + )} + end + + context 'with polling and custom config' do + before do + params.merge!( :manage_polling => true, + :polling_interval => 30, + :polling_meters => ['meter1', 'meter2'] ) end + + it { should contain_file('polling').with( + :ensure => 'present', + :path => '/etc/ceilometer/polling.yaml', + :content => '--- +sources: + - name: some_pollsters + interval: 30 + meters: + - meter1 + - meter2 +', + :selinux_ignore_defaults => true, + :tag => 'ceilometer-yamls', + )} end - context "with polling management enabled" do - before { params.merge!( - :manage_polling => true - ) } + context 'with polling management disabled' do + before do + params.merge!( :manage_polling => false ) + end - it { is_expected.to contain_file('polling').with( - 'path' => '/etc/ceilometer/polling.yaml', - ) } + it { should_not contain_file('polling') } end - context "with polling management disabled" do - before { params.merge!( - :manage_polling => false - ) } + context 'when setting coordination_url' do + before do + params.merge!( :coordination_url => 'redis://localhost:6379' ) + end - it { is_expected.not_to contain_file('polling') } + it { should contain_ceilometer_config('coordination/backend_url').with_value('redis://localhost:6379') } end - - it 'configures central agent' do - is_expected.to contain_ceilometer_config('coordination/backend_url').with_value( params[:coordination_url] ) - end - end on_supported_os({ @@ -152,16 +190,20 @@ describe 'ceilometer::agent::polling' do let :platform_params do case facts[:osfamily] when 'Debian' - { :agent_package_name => 'ceilometer-polling', + { + :agent_package_name => 'ceilometer-polling', :agent_service_name => 'ceilometer-polling', - :libvirt_group => 'libvirt' } + :libvirt_group => 'libvirt' + } when 'RedHat' - { :agent_package_name => 'openstack-ceilometer-polling', - :agent_service_name => 'openstack-ceilometer-polling' } + { + :agent_package_name => 'openstack-ceilometer-polling', + :agent_service_name => 'openstack-ceilometer-polling' + } end end - it_behaves_like 'ceilometer-polling' + it_behaves_like 'ceilometer::agent::polling' end end diff --git a/templates/polling.yaml.erb b/templates/polling.yaml.erb index 0a648d59..0b62d8ec 100644 --- a/templates/polling.yaml.erb +++ b/templates/polling.yaml.erb @@ -3,28 +3,6 @@ sources: - name: some_pollsters interval: <%= @polling_interval %> meters: - - cpu - - cpu_l3_cache - - memory.usage - - network.incoming.bytes - - network.incoming.packets - - network.outgoing.bytes - - network.outgoing.packets - - disk.read.bytes - - disk.read.requests - - disk.write.bytes - - disk.write.requests - - volume.size - - volume.snapshot.size - - volume.backup.size - - hardware.cpu.util - - hardware.memory.used - - hardware.memory.total - - hardware.memory.buffer - - hardware.memory.cached - - hardware.memory.swap.avail - - hardware.memory.swap.total - - hardware.system_stats.io.outgoing.blocks - - hardware.system_stats.io.incoming.blocks - - hardware.network.ip.incoming.datagrams - - hardware.network.ip.outgoing.datagrams +<% @polling_meters.each do |meter| -%> + - <%= meter %> +<% end -%>