From 11d1412c6bed612e0d3d7242e9b3581adbdd9630 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafael=20Weing=C3=A4rtner?= <rafael@apache.org>
Date: Thu, 29 Aug 2019 23:02:05 -0300
Subject: [PATCH] Add feature to support managing dynamic pollsters

Depends-On: https://review.opendev.org/#/c/677031/
Change-Id: I273aa795cf5c92f344accae2c219dbb51d318b59
---
 ansible/roles/ceilometer/defaults/main.yml    |  4 +-
 ansible/roles/ceilometer/tasks/config.yml     | 40 +++++++++++++++++++
 .../templates/ceilometer-central.json.j2      |  6 +++
 ...mic_pollster_configs-14bd3b6775e6a07a.yaml |  8 ++++
 4 files changed, 55 insertions(+), 3 deletions(-)
 create mode 100644 releasenotes/notes/manage_dynamic_pollster_configs-14bd3b6775e6a07a.yaml

diff --git a/ansible/roles/ceilometer/defaults/main.yml b/ansible/roles/ceilometer/defaults/main.yml
index 327b736f58..17e9bba18d 100644
--- a/ansible/roles/ceilometer/defaults/main.yml
+++ b/ansible/roles/ceilometer/defaults/main.yml
@@ -96,12 +96,9 @@ ceilometer_ipmi_extra_volumes: "{{ ceilometer_extra_volumes }}"
 # OpenStack
 ####################
 ceilometer_logging_debug: "{{ openstack_logging_debug }}"
-
 ceilometer_keystone_user: "ceilometer"
-
 openstack_ceilometer_auth: "{{ openstack_auth }}"
 
-
 ####################
 # Kolla
 ####################
@@ -111,6 +108,7 @@ ceilometer_dev_mode: "{{ kolla_dev_mode }}"
 ceilometer_source_version: "{{ kolla_source_version }}"
 
 ceilometer_custom_meters_local_folder: "meters.d"
+ceilometer_dynamic_pollsters_local_folder: "pollsters.d"
 
 ####################
 # Keystone
diff --git a/ansible/roles/ceilometer/tasks/config.yml b/ansible/roles/ceilometer/tasks/config.yml
index 1e3ba49a86..5be7b36959 100644
--- a/ansible/roles/ceilometer/tasks/config.yml
+++ b/ansible/roles/ceilometer/tasks/config.yml
@@ -63,6 +63,46 @@
   notify:
     - "Restart {{ item.key }} container"
 
+- name: Check if the folder ["{{ node_custom_config }}/ceilometer/{{ ceilometer_dynamic_pollsters_local_folder }}"] for dynamic pollsters definitions exist
+  stat:
+    path: "{{ node_custom_config }}/ceilometer/{{ ceilometer_dynamic_pollsters_local_folder }}"
+  delegate_to: localhost
+  register: ceilometer_dynamic_pollsters_folder
+  run_once: True
+
+- name: Set the variable that control the copy of dynamic pollsters definitions
+  set_fact:
+    should_copy_dynamic_pollster_definitions: "{{ ceilometer_dynamic_pollsters_folder.stat.exists and ceilometer_dynamic_pollsters_folder.stat.isdir }}"
+
+- name: Clean default folder for dynamic pollsters definitions
+  file:
+    state: absent
+    path: "{{ node_config_directory }}/ceilometer-central/pollsters.d/"
+
+- name: Create default folder for dynamic pollsters definitions
+  file:
+    path: "{{ node_config_directory }}/ceilometer-central/pollsters.d"
+    state: "directory"
+    owner: "{{ config_owner_user }}"
+    group: "{{ config_owner_group }}"
+    mode: "0770"
+  become: true
+  when:
+    - should_copy_dynamic_pollster_definitions
+    - inventory_hostname in groups['ceilometer-central']
+
+- name: Copying dynamic pollsters definitions
+  copy:
+    src: "{{ node_custom_config }}/ceilometer/{{ ceilometer_dynamic_pollsters_local_folder }}/"
+    dest: "{{ node_config_directory }}/ceilometer-central/pollsters.d/"
+    mode: "0660"
+  become: true
+  when:
+    - should_copy_dynamic_pollster_definitions
+    - inventory_hostname in groups['ceilometer-central']
+  notify:
+    - "Restart ceilometer-central container"
+
 - name: Check if custom polling.yaml exists
   stat:
     path: "{{ node_custom_config }}/ceilometer/polling.yaml"
diff --git a/ansible/roles/ceilometer/templates/ceilometer-central.json.j2 b/ansible/roles/ceilometer/templates/ceilometer-central.json.j2
index d97096f99f..5912248190 100644
--- a/ansible/roles/ceilometer/templates/ceilometer-central.json.j2
+++ b/ansible/roles/ceilometer/templates/ceilometer-central.json.j2
@@ -30,6 +30,12 @@
             "dest": "/etc/ceilometer/meters.d",
             "owner": "ceilometer",
             "perm": "0700"
+        }{% endif %}{% if should_copy_dynamic_pollster_definitions %},
+        {
+            "source": "{{ container_config_directory }}/{{ ceilometer_dynamic_pollsters_local_folder }}",
+            "dest": "/etc/ceilometer/pollsters.d",
+            "owner": "ceilometer",
+            "perm": "0700"
         }{% endif %},
         {
             "source": "{{ container_config_directory }}/pipeline.yaml",
diff --git a/releasenotes/notes/manage_dynamic_pollster_configs-14bd3b6775e6a07a.yaml b/releasenotes/notes/manage_dynamic_pollster_configs-14bd3b6775e6a07a.yaml
new file mode 100644
index 0000000000..cec8fe8b8f
--- /dev/null
+++ b/releasenotes/notes/manage_dynamic_pollster_configs-14bd3b6775e6a07a.yaml
@@ -0,0 +1,8 @@
+---
+features:
+  - |
+    Add support for managing Ceilometer dynamic pollster configuration in
+    Kolla-ansible. This feature will look for configurations in
+    ``{{ node_custom_config }}/ceilometer/pollster.d/`` by default.
+    If there are configs there, they are copied to the control nodes,
+    to configure Ceilometer dynamic pollster sub-system.