From dae2cbca30663b03c4c1994f26f3a0a3c0f2dcf8 Mon Sep 17 00:00:00 2001
From: Matt Crees <mattc@stackhpc.com>
Date: Wed, 1 Feb 2023 17:01:03 +0000
Subject: [PATCH] Add flags for RabbitMQ message TTL & queue expiry

Adds two new flags to alter behaviour in RabbitMQ:
    * `rabbitmq_message_ttl_ms`, which lets you set a TTL on messages.
    * `rabbitmq_queue_expiry_ms`, which lets you set an expiry time on queues.
See https://www.rabbitmq.com/ttl.html for more information on both.

Change-Id: I51ca37ffbb1bb5c07f2d39873f0f33ca20263f2a
---
 ansible/roles/rabbitmq/defaults/main.yml                   | 4 ++++
 ansible/roles/rabbitmq/templates/definitions.json.j2       | 4 ++--
 ...-for-message-ttl-and-queue-expiry-c163a370708f5b20.yaml | 7 +++++++
 tools/validate-all-file.py                                 | 3 +++
 4 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 releasenotes/notes/rabbitmq-add-flags-for-message-ttl-and-queue-expiry-c163a370708f5b20.yaml

diff --git a/ansible/roles/rabbitmq/defaults/main.yml b/ansible/roles/rabbitmq/defaults/main.yml
index 4c059eadb..46d907bf5 100644
--- a/ansible/roles/rabbitmq/defaults/main.yml
+++ b/ansible/roles/rabbitmq/defaults/main.yml
@@ -99,6 +99,10 @@ rabbitmq_ha_promote_on_shutdown:
 # "ha-mode":"exactly","ha-params":{{ rabbitmq_ha_replica_count | int }}
 rabbitmq_server_count: "{{ groups[role_rabbitmq_groups] | length }}"
 rabbitmq_ha_replica_count: "{{ (rabbitmq_server_count | int // 2 + 1) }}"
+# If no TTL is specified, messages will not expire
+rabbitmq_message_ttl_ms:
+# If no queue expiry is specified, queues will not expire
+rabbitmq_queue_expiry_ms:
 rabbitmq_extra_config: {}
 
 ####################
diff --git a/ansible/roles/rabbitmq/templates/definitions.json.j2 b/ansible/roles/rabbitmq/templates/definitions.json.j2
index 4bf42d948..1a7205de7 100644
--- a/ansible/roles/rabbitmq/templates/definitions.json.j2
+++ b/ansible/roles/rabbitmq/templates/definitions.json.j2
@@ -18,8 +18,8 @@
   ],
 {% if om_enable_rabbitmq_high_availability | bool %}
   "policies":[
-    {"vhost": "/", "name": "ha-all", "pattern": "^(?!(amq\\.)|(.*_fanout_)|(reply_)).*", "apply-to": "all", "definition": {"ha-mode":{% if rabbitmq_ha_replica_count is not none %}"exactly","ha-params":{{ rabbitmq_ha_replica_count | int }}{% else %}"all"{% endif %}{% if rabbitmq_ha_promote_on_shutdown is not none %},"ha-promote-on-shutdown":"{{ rabbitmq_ha_promote_on_shutdown }}"{% endif %}}, "priority":0}{% if project_name == 'outward_rabbitmq' %},
-    {"vhost": "{{ murano_agent_rabbitmq_vhost }}", "name": "ha-all", "pattern": "^(?!(amq\\.)|(.*_fanout_)|(reply_)).*", "apply-to": "all", "definition": {"ha-mode":{% if rabbitmq_ha_replica_count is not none %}"exactly","ha-params":{{ rabbitmq_ha_replica_count | int }}{% else %}"all"{% endif %}{% if rabbitmq_ha_promote_on_shutdown is not none %},"ha-promote-on-shutdown":"{{ rabbitmq_ha_promote_on_shutdown }}"{% endif %}}, "priority":0}
+    {"vhost": "/", "name": "ha-all", "pattern": "^(?!(amq\\.)|(.*_fanout_)|(reply_)).*", "apply-to": "all", "definition": {"ha-mode":{% if rabbitmq_ha_replica_count is not none %}"exactly","ha-params":{{ rabbitmq_ha_replica_count | int }}{% else %}"all"{% endif %}{% if rabbitmq_ha_promote_on_shutdown is not none %},"ha-promote-on-shutdown":"{{ rabbitmq_ha_promote_on_shutdown }}"{% endif %}{% if rabbitmq_message_ttl_ms is not none %},"message-ttl":{{ rabbitmq_message_ttl_ms | int }}{% endif %}{% if rabbitmq_queue_expiry_ms is not none %},"expires":{{ rabbitmq_queue_expiry_ms }}{% endif %}}, "priority":0}{% if project_name == 'outward_rabbitmq' %},
+    {"vhost": "{{ murano_agent_rabbitmq_vhost }}", "name": "ha-all", "pattern": "^(?!(amq\\.)|(.*_fanout_)|(reply_)).*", "apply-to": "all", "definition": {"ha-mode":{% if rabbitmq_ha_replica_count is not none %}"exactly","ha-params":{{ rabbitmq_ha_replica_count | int }}{% else %}"all"{% endif %}{% if rabbitmq_ha_promote_on_shutdown is not none %},"ha-promote-on-shutdown":"{{ rabbitmq_ha_promote_on_shutdown }}"{% endif %}{% if rabbitmq_message_ttl_ms is not none %},"message-ttl":{{ rabbitmq_message_ttl_ms | int }}{% endif %}{% if rabbitmq_queue_expiry_ms is not none %},"expires":{{ rabbitmq_queue_expiry_ms }}{% endif %}}, "priority":0}
     {% endif %}
   ]
 {% else %}
diff --git a/releasenotes/notes/rabbitmq-add-flags-for-message-ttl-and-queue-expiry-c163a370708f5b20.yaml b/releasenotes/notes/rabbitmq-add-flags-for-message-ttl-and-queue-expiry-c163a370708f5b20.yaml
new file mode 100644
index 000000000..81947616b
--- /dev/null
+++ b/releasenotes/notes/rabbitmq-add-flags-for-message-ttl-and-queue-expiry-c163a370708f5b20.yaml
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Added two new flags to alter behaviour in RabbitMQ:
+    * `rabbitmq_message_ttl_ms`, which lets you set a TTL on messages.
+    * `rabbitmq_queue_expiry_ms`, which lets you set an expiry time on queues.
+    See https://www.rabbitmq.com/ttl.html for more information on both.
diff --git a/tools/validate-all-file.py b/tools/validate-all-file.py
index 763020e52..777c47b09 100755
--- a/tools/validate-all-file.py
+++ b/tools/validate-all-file.py
@@ -128,6 +128,9 @@ def check_json_j2():
             'kolla_internal_fqdn': '',
             'octavia_provider_drivers': '',
             'rabbitmq_ha_replica_count': 2,
+            'rabbitmq_message_ttl_ms': 600000,
+            'rabbitmq_queue_expiry_ms': 3600000,
+
         }
         data = template.render(**context)
         json.loads(data)
-- 
GitLab