From 93f4831605b5bff08af2af400aac76eb0bb8238f Mon Sep 17 00:00:00 2001 From: James Page Date: Tue, 26 Feb 2019 10:27:52 +0100 Subject: [PATCH] Add transport_url property to AMQP adapter To support oslo.messaging switch to use of transport_url, provide a formatted transport_url attribute on the AMQP relation adapter. Change-Id: I02513dbef01f7fde7db65702d2ad64d2aa72ed0f Closes-Bug: 1817672 --- charms_openstack/adapters.py | 17 +++++++++++++++++ unit_tests/test_charms_openstack_adapters.py | 11 ++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/charms_openstack/adapters.py b/charms_openstack/adapters.py index b0061e4..7089ac6 100644 --- a/charms_openstack/adapters.py +++ b/charms_openstack/adapters.py @@ -206,6 +206,23 @@ class RabbitMQRelationAdapter(OpenStackRelationAdapter): return '/var/lib/charm/{}/rabbit-client-ca.pem'.format( hookenv.service_name()) + @property + def transport_url(self): + """ + oslo.messaging formatted transport URL + + :returns: oslo.messaging formatted transport URL + :rtype: string + """ + hosts = self.relation.rabbitmq_hosts() + transport_url_hosts = ','.join([ + "{}:{}@{}:5672".format(self.username, + self.password, + ch_ip.format_ipv6_addr(host_) or host_) + for host_ in hosts + ]) + return "rabbit://{}/{}".format(transport_url_hosts, self.vhost) + class PeerHARelationAdapter(OpenStackRelationAdapter): """ diff --git a/unit_tests/test_charms_openstack_adapters.py b/unit_tests/test_charms_openstack_adapters.py index 96f1d9f..b906ba3 100644 --- a/unit_tests/test_charms_openstack_adapters.py +++ b/unit_tests/test_charms_openstack_adapters.py @@ -124,7 +124,7 @@ class TestMemcacheRelationAdapter(unittest.TestCase): class FakeRabbitMQRelation(): - auto_accessors = ['vip', 'private_address'] + auto_accessors = ['vip', 'private_address', 'password'] relation_name = 'amqp' def __init__(self, vip=None): @@ -145,11 +145,15 @@ class FakeRabbitMQRelation(): def username(self): return 'fakename' + def password(self): + return 'password' + class TestRabbitMQRelationAdapter(unittest.TestCase): def test_class(self): fake = FakeRabbitMQRelation(None) + adapters.ch_ip.format_ipv6_addr.side_effect = lambda x: x mq = adapters.RabbitMQRelationAdapter(fake) self.assertEqual(mq.vhost, 'vhost') self.assertEqual(mq.username, 'fakename') @@ -158,6 +162,11 @@ class TestRabbitMQRelationAdapter(unittest.TestCase): # fake._vip = 'vip1' # self.assertEqual(mq.host, 'vip1') self.assertEqual(mq.hosts, 'host1,host2') + self.assertEqual( + mq.transport_url, + 'rabbit://fakename:password@host1:5672,' + 'fakename:password@host2:5672/vhost' + ) class FakeAPIConfigAdapter():