From 7fbd758d72d347c66f3431fc6ed475266b263081 Mon Sep 17 00:00:00 2001
From: Takashi Kajinami <tkajinam@redhat.com>
Date: Tue, 9 Nov 2021 00:28:19 +0900
Subject: [PATCH] Add support for polling Radosgw metrics

Ceilometer supports polling metrics from the Radosgw service using
radosgw.* pollsters. This change introduces support for the parameters
required to use that feature.

Change-Id: I58be60247bba1483f49f830802d422109ff13930
---
 manifests/agent/polling/rgw.pp                | 32 +++++++++++++++
 manifests/agent/polling/service_types.pp      |  6 +++
 .../notes/rgw-support-35ca7afb8e5ec322.yaml   |  5 +++
 .../ceilometer_agent_polling_rgw_spec.rb      | 41 +++++++++++++++++++
 ...ometer_agent_polling_service_types_spec.rb |  3 ++
 5 files changed, 87 insertions(+)
 create mode 100644 manifests/agent/polling/rgw.pp
 create mode 100644 releasenotes/notes/rgw-support-35ca7afb8e5ec322.yaml
 create mode 100644 spec/classes/ceilometer_agent_polling_rgw_spec.rb

diff --git a/manifests/agent/polling/rgw.pp b/manifests/agent/polling/rgw.pp
new file mode 100644
index 00000000..a1845edd
--- /dev/null
+++ b/manifests/agent/polling/rgw.pp
@@ -0,0 +1,32 @@
+# == Class: ceilometer::agent::polling::rgw
+#
+# Configure rgw parameters
+#
+# === Parameters
+#
+# [*access_key*]
+#  (Optional) Access key for Radosgw Admin.
+#  Defaults to $::os_service_default
+#
+# [*secret_key*]
+#  (Optional) Secret key for Radosgw Admin.
+#  Defaults to $::os_service_default
+#
+# [*implicit_tenants*]
+#  (Optional) Whether RGW uses implicit tenants or not.
+#  Defaults to $::os_service_default
+#
+class ceilometer::agent::polling::rgw (
+  $access_key       = $::os_service_default,
+  $secret_key       = $::os_service_default,
+  $implicit_tenants = $::os_service_default,
+) {
+
+  include ceilometer::deps
+
+  ceilometer_config {
+    'rgw_admin_credentials/access_key': value => $access_key, secret => true;
+    'rgw_admin_credentials/secret_key': value => $secret_key, secret => true;
+    'rgw_client/implicit_tenants':      value => $implicit_tenants;
+  }
+}
diff --git a/manifests/agent/polling/service_types.pp b/manifests/agent/polling/service_types.pp
index 19e017ea..d07bb9f1 100644
--- a/manifests/agent/polling/service_types.pp
+++ b/manifests/agent/polling/service_types.pp
@@ -24,12 +24,17 @@
 #   (Optional) cinder service type.
 #   Defaults to $::os_service_default
 #
+# [*radosgw*]
+#   (Optional) Radosgw service type.
+#   Defaults to $::os_service_default
+#
 class ceilometer::agent::polling::service_types (
   $glance  = $::os_service_default,
   $neutron = $::os_service_default,
   $nova    = $::os_service_default,
   $swift   = $::os_service_default,
   $cinder  = $::os_service_default,
+  $radosgw = $::os_service_default,
 ) {
 
   include ceilometer::deps
@@ -40,5 +45,6 @@ class ceilometer::agent::polling::service_types (
     'service_types/nova':    value => $nova;
     'service_types/swift':   value => $swift;
     'service_types/cinder':  value => $cinder;
+    'service_types/radosgw': value => $radosgw;
   }
 }
diff --git a/releasenotes/notes/rgw-support-35ca7afb8e5ec322.yaml b/releasenotes/notes/rgw-support-35ca7afb8e5ec322.yaml
new file mode 100644
index 00000000..ef683fba
--- /dev/null
+++ b/releasenotes/notes/rgw-support-35ca7afb8e5ec322.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - |
+    Support for the parameters used to poll metrics from the Radosgw service
+    has been added.
diff --git a/spec/classes/ceilometer_agent_polling_rgw_spec.rb b/spec/classes/ceilometer_agent_polling_rgw_spec.rb
new file mode 100644
index 00000000..326d174e
--- /dev/null
+++ b/spec/classes/ceilometer_agent_polling_rgw_spec.rb
@@ -0,0 +1,41 @@
+require 'spec_helper'
+
+describe 'ceilometer::agent::polling::rgw' do
+  shared_examples 'ceilometer::agent::polling::rgw' do
+    context 'with default parameters' do
+      it 'configures the default values' do
+        is_expected.to contain_ceilometer_config('rgw_admin_credentials/access_key').with_value('<SERVICE DEFAULT>').with_secret(true)
+        is_expected.to contain_ceilometer_config('rgw_admin_credentials/secret_key').with_value('<SERVICE DEFAULT>').with_secret(true)
+        is_expected.to contain_ceilometer_config('rgw_client/implicit_tenants').with_value('<SERVICE DEFAULT>')
+      end
+    end
+
+    context 'with overridden parameters' do
+      let :params do
+        {
+          :access_key       => 'access',
+          :secret_key       => 'secret',
+          :implicit_tenants => true,
+        }
+      end
+
+      it 'configures the overridden values' do
+        is_expected.to contain_ceilometer_config('rgw_admin_credentials/access_key').with_value('access')
+        is_expected.to contain_ceilometer_config('rgw_admin_credentials/secret_key').with_value('secret')
+        is_expected.to contain_ceilometer_config('rgw_client/implicit_tenants').with_value(true)
+      end
+    end
+  end
+
+  on_supported_os({
+    :supported_os => OSDefaults.get_supported_os
+  }).each do |os,facts|
+    context "on #{os}" do
+      let (:facts) do
+        facts.merge(OSDefaults.get_facts())
+      end
+
+      it_behaves_like 'ceilometer::agent::polling::rgw'
+    end
+  end
+end
diff --git a/spec/classes/ceilometer_agent_polling_service_types_spec.rb b/spec/classes/ceilometer_agent_polling_service_types_spec.rb
index aa7c21a2..adddfdf6 100644
--- a/spec/classes/ceilometer_agent_polling_service_types_spec.rb
+++ b/spec/classes/ceilometer_agent_polling_service_types_spec.rb
@@ -9,6 +9,7 @@ describe 'ceilometer::agent::polling::service_types' do
         is_expected.to contain_ceilometer_config('service_types/nova').with_value('<SERVICE DEFAULT>')
         is_expected.to contain_ceilometer_config('service_types/swift').with_value('<SERVICE DEFAULT>')
         is_expected.to contain_ceilometer_config('service_types/cinder').with_value('<SERVICE DEFAULT>')
+        is_expected.to contain_ceilometer_config('service_types/radosgw').with_value('<SERVICE DEFAULT>')
       end
     end
 
@@ -20,6 +21,7 @@ describe 'ceilometer::agent::polling::service_types' do
           :nova    => 'compute',
           :swift   => 'object-store',
           :cinder  => 'volumev3',
+          :radosgw => 'alt-object-store',
         }
       end
 
@@ -29,6 +31,7 @@ describe 'ceilometer::agent::polling::service_types' do
         is_expected.to contain_ceilometer_config('service_types/nova').with_value('compute')
         is_expected.to contain_ceilometer_config('service_types/swift').with_value('object-store')
         is_expected.to contain_ceilometer_config('service_types/cinder').with_value('volumev3')
+        is_expected.to contain_ceilometer_config('service_types/radosgw').with_value('alt-object-store')
       end
     end
   end