From 3838010aaf5d56a50b4b64be0bcca8ce0f2052b1 Mon Sep 17 00:00:00 2001
From: Ryota MIBU <r-mibu@cq.jp.nec.com>
Date: Tue, 10 Jan 2017 04:30:32 +0000
Subject: [PATCH] Add Aodh event-alarm support

'alarm-listener' in Aodh would be deployed if you use charm-aodh.
It expects that ceilometer publish events with 'alarm.all' topic,
then it can evaluate alarm criteria pre-configured by users.

This patch makes ceilometer publish events for event-driven alarm
evaluation in Aodh.

Change-Id: Id536c9d847ac9c08b9d7d309b4639606e6860a17
---
 files/event_pipeline_alarm.yaml     | 13 +++++++++++++
 hooks/ceilometer_hooks.py           |  9 +++++++++
 templates/mitaka/ceilometer.conf    |  1 +
 unit_tests/test_ceilometer_hooks.py | 13 ++++++++++---
 4 files changed, 33 insertions(+), 3 deletions(-)
 create mode 100644 files/event_pipeline_alarm.yaml

diff --git a/files/event_pipeline_alarm.yaml b/files/event_pipeline_alarm.yaml
new file mode 100644
index 0000000..626006f
--- /dev/null
+++ b/files/event_pipeline_alarm.yaml
@@ -0,0 +1,13 @@
+---
+sources:
+    - name: event_source
+      events:
+          - "*"
+      sinks:
+          - event_sink
+sinks:
+    - name: event_sink
+      transformers:
+      publishers:
+          - notifier://
+          - notifier://?topic=alarm.all
diff --git a/hooks/ceilometer_hooks.py b/hooks/ceilometer_hooks.py
index 7f18c0a..afd6cd0 100755
--- a/hooks/ceilometer_hooks.py
+++ b/hooks/ceilometer_hooks.py
@@ -184,6 +184,7 @@ def config_changed():
         if openstack_upgrade_available('ceilometer-common'):
             status_set('maintenance', 'Upgrading to new OpenStack release')
             do_openstack_upgrade(CONFIGS)
+    install_event_pipeline_setting()
     update_nrpe_config()
     CONFIGS.write_all()
     # NOTE(jamespage): Drop when charm switches to apache2+mod_wsgi
@@ -204,6 +205,14 @@ def config_changed():
         ha_joined(rid)
 
 
+def install_event_pipeline_setting():
+    src_file = 'files/event_pipeline_alarm.yaml'
+    dest_file = '/etc/ceilometer/event_pipeline_alarm.yaml'
+    if not os.path.isdir(os.path.dirname(dest_file)):
+        os.makedirs(os.path.dirname(dest_file))
+    shutil.copy(src_file, dest_file)
+
+
 @hooks.hook('upgrade-charm')
 @harden()
 def upgrade_charm():
diff --git a/templates/mitaka/ceilometer.conf b/templates/mitaka/ceilometer.conf
index dc64536..6c7c920 100644
--- a/templates/mitaka/ceilometer.conf
+++ b/templates/mitaka/ceilometer.conf
@@ -8,6 +8,7 @@
 debug = {{ debug }}
 verbose = {{ verbose }}
 use_syslog = {{ use_syslog }}
+event_pipeline_cfg_file = /etc/ceilometer/event_pipeline_alarm.yaml
 
 [api]
 port = {{ port }}
diff --git a/unit_tests/test_ceilometer_hooks.py b/unit_tests/test_ceilometer_hooks.py
index 878496a..5bd4f82 100644
--- a/unit_tests/test_ceilometer_hooks.py
+++ b/unit_tests/test_ceilometer_hooks.py
@@ -147,44 +147,51 @@ class CeilometerHooksTest(CharmTestCase):
         self.assertTrue(changed.called)
         self.assertTrue(install.called)
 
+    @patch.object(hooks, 'install_event_pipeline_setting')
     @patch('charmhelpers.core.hookenv.config')
     @patch.object(hooks, 'ceilometer_joined')
     @patch.object(hooks, 'install_ceilometer_ocf')
     def test_config_changed_no_upgrade(self, ocf,
-                                       joined, mock_config):
+                                       joined, mock_config, event_pipe):
         self.openstack_upgrade_available.return_value = False
         hooks.hooks.execute(['hooks/config-changed'])
         self.openstack_upgrade_available.\
             assert_called_with('ceilometer-common')
         self.assertFalse(self.do_openstack_upgrade.called)
+        self.assertTrue(event_pipe.called)
         self.assertTrue(self.CONFIGS.write_all.called)
         self.assertTrue(joined.called)
         self.assertTrue(self.reload_systemd.called)
         self.assertTrue(ocf.called)
 
+    @patch.object(hooks, 'install_event_pipeline_setting')
     @patch('charmhelpers.core.hookenv.config')
     @patch.object(hooks, 'ceilometer_joined')
     @patch.object(hooks, 'install_ceilometer_ocf')
     def test_config_changed_upgrade(self, ocf,
-                                    joined, mock_config):
+                                    joined, mock_config, event_pipe):
         self.openstack_upgrade_available.return_value = True
         hooks.hooks.execute(['hooks/config-changed'])
         self.openstack_upgrade_available.\
             assert_called_with('ceilometer-common')
         self.assertTrue(self.do_openstack_upgrade.called)
+        self.assertTrue(event_pipe.called)
         self.assertTrue(self.CONFIGS.write_all.called)
         self.assertTrue(joined.called)
         self.assertTrue(self.reload_systemd.called)
         self.assertTrue(ocf.called)
 
+    @patch.object(hooks, 'install_event_pipeline_setting')
     @patch.object(hooks, 'install_ceilometer_ocf')
-    def test_config_changed_with_openstack_upgrade_action(self, ocf):
+    def test_config_changed_with_openstack_upgrade_action(self, ocf,
+                                                          event_pipe):
         self.openstack_upgrade_available.return_value = True
         self.test_config.set('action-managed-upgrade', True)
 
         hooks.hooks.execute(['hooks/config-changed'])
 
         self.assertFalse(self.do_openstack_upgrade.called)
+        self.assertTrue(event_pipe.called)
         self.assertTrue(ocf.called)
 
     @patch.object(hooks, 'canonical_url')
-- 
GitLab