Add quorum queues support for service

This change implements and enables by default quorum support
for rabbitmq as well as providing default variables to globally tune
it's behaviour.

In order to ensure upgrade path and ability to switch back to HA queues
we change vhost names with removing leading `/`, as enabling quorum
requires to remove exchange which is tricky thing to do with running
services.

Change-Id: I722aefb5290a68311faf1d44c279151e8492466a
This commit is contained in:
Dmitriy Rabotyagov 2023-10-19 14:14:57 +02:00
parent c7b2ad25c9
commit 7a011bb545
3 changed files with 30 additions and 3 deletions

View File

@ -45,9 +45,20 @@ cloudkitty_oslomsg_rpc_servers: "{{ oslomsg_rpc_servers | default('127.0.0.1') }
cloudkitty_oslomsg_rpc_port: "{{ oslomsg_rpc_port | default('5672') }}"
cloudkitty_oslomsg_rpc_use_ssl: "{{ oslomsg_rpc_use_ssl | default(False) }}"
cloudkitty_oslomsg_rpc_userid: cloudkitty
cloudkitty_oslomsg_rpc_vhost: /cloudkitty
# vhost name depends on value of oslomsg_rabbit_quorum_queues. In case quorum queues
# are not used - vhost name will be prefixed with leading `/`.
cloudkitty_oslomsg_rpc_vhost:
- name: /cloudkitty
state: "{{ cloudkitty_oslomsg_rabbit_quorum_queues | ternary('absent', 'present') }}"
- name: cloudkitty
state: "{{ cloudkitty_oslomsg_rabbit_quorum_queues | ternary('present', 'absent') }}"
cloudkitty_oslomsg_rpc_ssl_version: "{{ oslomsg_rpc_ssl_version | default('TLSv1_2') }}"
cloudkitty_oslomsg_rpc_ssl_ca_file: "{{ oslomsg_rpc_ssl_ca_file | default('') }}"
## RabbitMQ integration
cloudkitty_oslomsg_rabbit_quorum_queues: "{{ oslomsg_rabbit_quorum_queues | default(True) }}"
cloudkitty_oslomsg_rabbit_quorum_delivery_limit: "{{ oslomsg_rabbit_quorum_delivery_limit | default(0) }}"
cloudkitty_oslomsg_rabbit_quorum_max_memory_bytes: "{{ oslomsg_rabbit_quorum_max_memory_bytes | default(0) }}"
# Notify
cloudkitty_oslomsg_notify_host_group: "{{ oslomsg_notify_host_group | default('rabbitmq_all') }}"

View File

@ -8,7 +8,7 @@ notification_topics = {{ cloudkitty_notification_topics }}
use_journal = True
## Oslo Messaging RPC
transport_url = {{ cloudkitty_oslomsg_rpc_transport }}://{% for host in cloudkitty_oslomsg_rpc_servers.split(',') %}{{ cloudkitty_oslomsg_rpc_userid }}:{{ cloudkitty_oslomsg_rpc_password }}@{{ host }}:{{ cloudkitty_oslomsg_rpc_port }}{% if not loop.last %},{% else %}/{{ cloudkitty_oslomsg_rpc_vhost }}{% if cloudkitty_oslomsg_rpc_use_ssl | bool %}?ssl=1&ssl_version={{ cloudkitty_oslomsg_rpc_ssl_version }}&ssl_ca_file={{ cloudkitty_oslomsg_rpc_ssl_ca_file }}{% else %}?ssl=0{% endif %}{% endif %}{% endfor %}
transport_url = {{ cloudkitty_oslomsg_rpc_transport }}://{% for host in cloudkitty_oslomsg_rpc_servers.split(',') %}{{ cloudkitty_oslomsg_rpc_userid }}:{{ cloudkitty_oslomsg_rpc_password }}@{{ host }}:{{ cloudkitty_oslomsg_rpc_port }}{% if not loop.last %},{% else %}/{{ _cloudkitty_oslomsg_rpc_vhost_conf }}{% if cloudkitty_oslomsg_rpc_use_ssl | bool %}?ssl=1&ssl_version={{ cloudkitty_oslomsg_rpc_ssl_version }}&ssl_ca_file={{ cloudkitty_oslomsg_rpc_ssl_ca_file }}{% else %}?ssl=0{% endif %}{% endif %}{% endfor %}
[api]
port = {{ cloudkitty_service_port }}
@ -55,11 +55,16 @@ service_type = {{ cloudkitty_service_type }}
[oslo_messaging_qpid]
{% if cloudkitty_oslomsg_rpc_transport == 'rabbit' %}
[oslo_messaging_rabbit]
ssl = {{ cloudkitty_oslomsg_notify_use_ssl | bool }}
rabbit_quorum_queue = {{ cloudkitty_oslomsg_rabbit_quorum_queues }}
rabbit_quorum_delivery_limit = {{ cloudkitty_oslomsg_rabbit_quorum_delivery_limit }}
rabbit_quorum_max_memory_bytes = {{ cloudkitty_oslomsg_rabbit_quorum_max_memory_bytes }}
{% endif %}
[oslo_messaging_notifications]
transport_url = {{ cloudkitty_oslomsg_notify_transport }}://{% for host in cloudkitty_oslomsg_notify_servers.split(',') %}{{ cloudkitty_oslomsg_notify_userid }}:{{ cloudkitty_oslomsg_notify_password }}@{{ host }}:{{ cloudkitty_oslomsg_notify_port }}{% if not loop.last %},{% else %}/{{ cloudkitty_oslomsg_notify_vhost }}{% if cloudkitty_oslomsg_notify_use_ssl | bool %}?ssl=1&ssl_version={{ cloudkitty_oslomsg_notify_ssl_version }}&ssl_ca_file={{ cloudkitty_oslomsg_notify_ssl_ca_file }}{% else %}?ssl=0{% endif %}{% endif %}{% endfor %}
transport_url = {{ cloudkitty_oslomsg_notify_transport }}://{% for host in cloudkitty_oslomsg_notify_servers.split(',') %}{{ cloudkitty_oslomsg_notify_userid }}:{{ cloudkitty_oslomsg_notify_password }}@{{ host }}:{{ cloudkitty_oslomsg_notify_port }}{% if not loop.last %},{% else %}/{{ _cloudkitty_oslomsg_notify_vhost_conf }}{% if cloudkitty_oslomsg_notify_use_ssl | bool %}?ssl=1&ssl_version={{ cloudkitty_oslomsg_notify_ssl_version }}&ssl_ca_file={{ cloudkitty_oslomsg_notify_ssl_ca_file }}{% else %}?ssl=0{% endif %}{% endif %}{% endfor %}
[output]
pipeline = {{ cloudkitty_output_pipeline }}

View File

@ -19,6 +19,17 @@ _cloudkitty_is_first_play_host: >-
(groups[cloudkitty_services['cloudkitty-api']['group']] | intersect(ansible_play_hosts)) | list)[0]) | bool
}}
_cloudkitty_oslomsg_rpc_vhost_conf: >-
{{
(cloudkitty_oslomsg_rpc_vhost is string) | ternary(
cloudkitty_oslomsg_rpc_vhost, cloudkitty_oslomsg_rpc_vhost | selectattr('state', 'eq', 'present') | map(attribute='name') | first)
}}
_cloudkitty_oslomsg_notify_vhost_conf: >-
{{
(cloudkitty_oslomsg_notify_vhost is string) | ternary(
cloudkitty_oslomsg_notify_vhost, cloudkitty_oslomsg_notify_vhost | selectattr('state', 'eq', 'present') | map(attribute='name') | first)
}}
#
# Compile a list of the services on a host based on whether
# the host is in the host group and the service is enabled.