From 2baf36f4eeca6fad7202f1e914d893619f5569a6 Mon Sep 17 00:00:00 2001
From: Xav Paice <xav.paice@canonical.com>
Date: Wed, 8 Aug 2018 15:25:27 +1200
Subject: [PATCH] Add polling.yaml to managed configs

This change adds polling.yaml to the list of managed config files, for
Queens and above.  Two new config items are added alongside the
template, to take into account a choice between the two polling.yaml
files supplied with the Ceilometer source, one which has a small list of
pollsters and the other which has all pollsters.  Additionally the
change adds the option to set the polling interval.

Change-Id: Ifff72870cf79bea23dbd21586857dd832c9e1405
Closes-Bug: 1785933
Closes-Bug: 1652848
---
 config.yaml                            | 13 +++++++++++
 lib/ceilometer_contexts.py             |  2 ++
 lib/ceilometer_utils.py                |  6 +++++
 templates/polling.yaml                 | 31 +++++++++++++++++++++++++
 unit_tests/test_ceilometer_contexts.py | 32 ++++++++++++++++++++++++++
 unit_tests/test_ceilometer_utils.py    |  3 +++
 6 files changed, 87 insertions(+)
 create mode 100644 templates/polling.yaml

diff --git a/config.yaml b/config.yaml
index a486c4e..5cf2da3 100644
--- a/config.yaml
+++ b/config.yaml
@@ -255,3 +255,16 @@ options:
     description: |
       When set the content is written to /etc/ceilometer/pipeline.yaml, by
       default the package's file is used.
+  polling-interval:
+    type: int
+    default: 300
+    description: |
+      Number of seconds between Ceilometer central agent pollster collections.
+      This setting only takes effect from Queens onwards.
+  enable-all-pollsters:
+    type: boolean
+    default: False
+    description: |
+      From Pike onwards, the default ceilometer pollster collection runs a
+      limited set of pollsters.  Enable this to run all the available pollsters.
+      This setting only takes effect from Queens onwards.
diff --git a/lib/ceilometer_contexts.py b/lib/ceilometer_contexts.py
index 9023c92..01f73bd 100644
--- a/lib/ceilometer_contexts.py
+++ b/lib/ceilometer_contexts.py
@@ -106,6 +106,8 @@ class CeilometerContext(OSContextGenerator):
             'metering_secret': get_shared_secret(),
             'metering_time_to_live': int(config('metering-time-to-live')),
             'event_time_to_live': int(config('event-time-to-live')),
+            'polling_interval': int(config('polling-interval')),
+            'enable_all_pollsters': config('enable-all-pollsters'),
         }
         return ctxt
 
diff --git a/lib/ceilometer_utils.py b/lib/ceilometer_utils.py
index e9a12f9..838ffe8 100644
--- a/lib/ceilometer_utils.py
+++ b/lib/ceilometer_utils.py
@@ -71,6 +71,7 @@ HAPROXY_CONF = '/etc/haproxy/haproxy.cfg'
 CEILOMETER_CONF_DIR = "/etc/ceilometer"
 CEILOMETER_CONF = "%s/ceilometer.conf" % CEILOMETER_CONF_DIR
 CEILOMETER_PIPELINE_YAML = "%s/pipeline.yaml" % CEILOMETER_CONF_DIR
+POLLING_CONF = "%s/polling.yaml" % CEILOMETER_CONF_DIR
 CEILOMETER_API_SYSTEMD_CONF = (
     '/etc/systemd/system/ceilometer-api.service.d/override.conf'
 )
@@ -160,6 +161,11 @@ QUEENS_CONFIG_FILES = OrderedDict([
             AMQPListenersContext(ssl_dir=CEILOMETER_CONF_DIR)],
         'services': QUEENS_SERVICES
     }),
+    (POLLING_CONF, {
+        'hook_contexts': [
+            CeilometerContext()],
+        'services': QUEENS_SERVICES
+    }),
 ])
 
 CONFIG_FILES = OrderedDict([
diff --git a/templates/polling.yaml b/templates/polling.yaml
new file mode 100644
index 0000000..5fb8d73
--- /dev/null
+++ b/templates/polling.yaml
@@ -0,0 +1,31 @@
+---
+sources:
+  - name: juju_pollsters
+    interval: {{ polling_interval }}
+    meters:
+{%- if enable_all_pollsters %}
+      - "*"
+{%- else %}
+      - cpu
+      - cpu_l3_cache
+      - memory.usage
+      - network.incoming.bytes
+      - network.incoming.packets
+      - network.outgoing.bytes
+      - network.outgoing.packets
+      - disk.device.read.bytes
+      - disk.device.read.requests
+      - disk.device.write.bytes
+      - disk.device.write.requests
+      - 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
+{%- endif %}
diff --git a/unit_tests/test_ceilometer_contexts.py b/unit_tests/test_ceilometer_contexts.py
index d9c41ae..e70a65e 100644
--- a/unit_tests/test_ceilometer_contexts.py
+++ b/unit_tests/test_ceilometer_contexts.py
@@ -131,6 +131,8 @@ class CeilometerContextsTest(CharmTestCase):
             'metering_secret': 'mysecret',
             'metering_time_to_live': -1,
             'event_time_to_live': -1,
+            'polling_interval': 300,
+            'enable_all_pollsters': False,
         })
 
     @patch.object(utils, 'get_shared_secret')
@@ -144,10 +146,40 @@ class CeilometerContextsTest(CharmTestCase):
             'metering_secret': 'mysecret',
             'metering_time_to_live': 7776000,
             'event_time_to_live': 7776000,
+            'polling_interval': 300,
+            'enable_all_pollsters': False,
         })
         self.assertTrue(type(context['metering_time_to_live']) is int)
         self.assertTrue(type(context['event_time_to_live']) is int)
 
+    @patch.object(utils, 'get_shared_secret')
+    def test_ceilometer_context_enable_all_pollsters(self, secret):
+        secret.return_value = 'mysecret'
+        self.test_config.set('enable-all-pollsters', True)
+        context = contexts.CeilometerContext()()
+        self.assertEqual(context, {
+            'port': 8777,
+            'metering_secret': 'mysecret',
+            'metering_time_to_live': -1,
+            'event_time_to_live': -1,
+            'polling_interval': 300,
+            'enable_all_pollsters': True,
+        })
+
+    @patch.object(utils, 'get_shared_secret')
+    def test_ceilometer_context_polling_interval(self, secret):
+        secret.return_value = 'mysecret'
+        self.test_config.set('polling-interval', 900)
+        context = contexts.CeilometerContext()()
+        self.assertEqual(context, {
+            'port': 8777,
+            'metering_secret': 'mysecret',
+            'metering_time_to_live': -1,
+            'event_time_to_live': -1,
+            'polling_interval': 900,
+            'enable_all_pollsters': False,
+        })
+
     def test_ceilometer_service_context(self):
         self.relation_ids.return_value = ['ceilometer-service:0']
         self.related_units.return_value = ['ceilometer/0']
diff --git a/unit_tests/test_ceilometer_utils.py b/unit_tests/test_ceilometer_utils.py
index 70b0922..26b6d49 100644
--- a/unit_tests/test_ceilometer_utils.py
+++ b/unit_tests/test_ceilometer_utils.py
@@ -176,6 +176,9 @@ class CeilometerUtilsTest(CharmTestCase):
             {'/etc/ceilometer/ceilometer.conf': [
                 'ceilometer-agent-central',
                 'ceilometer-agent-notification'],
+             '/etc/ceilometer/polling.yaml': [
+                'ceilometer-agent-central',
+                'ceilometer-agent-notification'],
              }
         )
 
-- 
GitLab