Determine amqp port from relation data

The non-SSL port 5672 was hard coded.

Set the amqp port based on relation data.

Change-Id: Ic48aabb3650a7198ef8298aa0eef152b4851e9a3
Closes-Bug: #1838783
This commit is contained in:
David Ames 2019-08-02 09:00:54 -07:00
parent 032ae3dbe2
commit 405b4b75bc
2 changed files with 39 additions and 5 deletions

View File

@ -196,6 +196,7 @@ class RabbitMQRelationAdapter(OpenStackRelationAdapter):
"""
interface_type = "messaging"
DEFAULT_PORT = "5672"
def __init__(self, relation):
add_accessors = ['vhost', 'username']
@ -232,6 +233,15 @@ class RabbitMQRelationAdapter(OpenStackRelationAdapter):
return '/var/lib/charm/{}/rabbit-client-ca.pem'.format(
hookenv.service_name())
@property
def port(self):
"""Return the AMQP port
:returns: AMQP port number
:rtype: string
"""
return self.ssl_port or self.DEFAULT_PORT
@property
def transport_url(self):
"""
@ -242,9 +252,10 @@ class RabbitMQRelationAdapter(OpenStackRelationAdapter):
"""
hosts = self.relation.rabbitmq_hosts()
transport_url_hosts = ','.join([
"{}:{}@{}:5672".format(self.username,
self.password,
ch_ip.format_ipv6_addr(host_) or host_)
"{}:{}@{}:{}".format(self.username,
self.password,
ch_ip.format_ipv6_addr(host_) or host_,
self.port)
for host_ in hosts
])
return "rabbit://{}/{}".format(transport_url_hosts, self.vhost)

View File

@ -151,11 +151,12 @@ class TestMemcacheRelationAdapter(unittest.TestCase):
class FakeRabbitMQRelation():
auto_accessors = ['vip', 'private_address', 'password']
auto_accessors = ['vip', 'private_address', 'password', 'ssl_port']
relation_name = 'amqp'
def __init__(self, vip=None):
def __init__(self, vip=None, ssl=False):
self._vip = vip
self._ssl = ssl
def vip(self):
return self._vip
@ -175,6 +176,11 @@ class FakeRabbitMQRelation():
def password(self):
return 'password'
def ssl_port(self):
if self._ssl:
return '5671'
return None
class TestRabbitMQRelationAdapter(unittest.TestCase):
@ -195,6 +201,23 @@ class TestRabbitMQRelationAdapter(unittest.TestCase):
'fakename:password@host2:5672/vhost'
)
def test_class_ssl(self):
fake = FakeRabbitMQRelation(ssl=True)
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')
self.assertEqual(mq.host, 'private-address')
# TODO: can't do the following 2 lines as not dynamic accessors
# fake._vip = 'vip1'
# self.assertEqual(mq.host, 'vip1')
self.assertEqual(mq.hosts, 'host1,host2')
self.assertEqual(
mq.transport_url,
'rabbit://fakename:password@host1:5671,'
'fakename:password@host2:5671/vhost'
)
class FakeAPIConfigAdapter():