Use IP supplied via relation for pacmaker remotes

When setting up resources for pacemaker remote nodes use the IP
address supplied by the remote node for communication. This
ensures that communication happens over the desired network
space.

Depends-On: I5aa6993ec702f97403d1a659e09a3fb2f5af4202
Change-Id: I9bb20b5f0b0d780fbf4cc0ac0e5f86fe277c4715
Closes-Bug: #1824514
This commit is contained in:
Liam Young 2019-04-12 11:14:36 +00:00
parent 1f2e910ae9
commit 27699267ed
2 changed files with 22 additions and 11 deletions

View File

@ -726,11 +726,13 @@ def add_location_rules_for_local_nodes(res_name):
log('%s' % cmd, level=DEBUG)
def configure_pacemaker_remote(remote_hostname):
def configure_pacemaker_remote(remote_hostname, remote_ip):
"""Create a resource corresponding to the pacemaker remote node.
:param remote_hostname: Remote hostname used for registering remote node.
:type remote_hostname: str
:param remote_ip: Remote IP used for registering remote node.
:type remote_ip: str
:returns: Name of resource for pacemaker remote node.
:rtype: str
"""
@ -740,7 +742,7 @@ def configure_pacemaker_remote(remote_hostname):
"crm configure primitive {} ocf:pacemaker:remote "
"params server={} reconnect_interval=60 "
"op monitor interval=30s").format(resource_name,
remote_hostname)
remote_ip)
pcmk.commit(cmd, failure_is_fatal=True)
return resource_name
@ -800,8 +802,11 @@ def configure_pacemaker_remote_resources():
for relid in relation_ids('pacemaker-remote'):
for unit in related_units(relid):
remote_hostname = parse_data(relid, unit, 'remote-hostname')
remote_ip = parse_data(relid, unit, 'remote-ip')
if remote_hostname:
resource_name = configure_pacemaker_remote(remote_hostname)
resource_name = configure_pacemaker_remote(
remote_hostname,
remote_ip)
resources.append(resource_name)
cleanup_remote_nodes(resources)
return {name: 'ocf:pacemaker:remote' for name in resources}

View File

@ -704,12 +704,13 @@ class UtilsTestCase(unittest.TestCase):
is_resource_present.return_value = False
self.assertEqual(
utils.configure_pacemaker_remote(
'juju-aa0ba5-zaza-ed2ce6f303f0-10'),
'juju-aa0ba5-zaza-ed2ce6f303f0-10',
'10.0.0.10'),
'juju-aa0ba5-zaza-ed2ce6f303f0-10')
commit.assert_called_once_with(
'crm configure primitive juju-aa0ba5-zaza-ed2ce6f303f0-10 '
'ocf:pacemaker:remote params '
'server=juju-aa0ba5-zaza-ed2ce6f303f0-10 '
'server=10.0.0.10 '
'reconnect_interval=60 op monitor interval=30s',
failure_is_fatal=True)
@ -720,12 +721,13 @@ class UtilsTestCase(unittest.TestCase):
is_resource_present.return_value = False
self.assertEqual(
utils.configure_pacemaker_remote(
'juju-aa0ba5-zaza-ed2ce6f303f0-10.maas'),
'juju-aa0ba5-zaza-ed2ce6f303f0-10.maas',
'10.0.0.10'),
'juju-aa0ba5-zaza-ed2ce6f303f0-10')
commit.assert_called_once_with(
'crm configure primitive juju-aa0ba5-zaza-ed2ce6f303f0-10 '
'ocf:pacemaker:remote params '
'server=juju-aa0ba5-zaza-ed2ce6f303f0-10.maas '
'server=10.0.0.10 '
'reconnect_interval=60 op monitor interval=30s',
failure_is_fatal=True)
@ -736,7 +738,8 @@ class UtilsTestCase(unittest.TestCase):
is_resource_present.return_value = True
self.assertEqual(
utils.configure_pacemaker_remote(
'juju-aa0ba5-zaza-ed2ce6f303f0-10.maas'),
'juju-aa0ba5-zaza-ed2ce6f303f0-10.maas',
'10.0.0.10'),
'juju-aa0ba5-zaza-ed2ce6f303f0-10')
self.assertFalse(commit.called)
@ -773,19 +776,22 @@ class UtilsTestCase(unittest.TestCase):
'pacemaker-remote:49': {
'pacemaker-remote/0': {
'remote-hostname': '"node1"',
'remote-ip': '"10.0.0.10"',
'stonith-hostname': '"st-node1"'},
'pacemaker-remote/1': {
'remote-ip': '"10.0.0.11"',
'remote-hostname': '"node2"'},
'pacemaker-remote/2': {
'stonith-hostname': '"st-node3"'}}}
relation_ids.side_effect = lambda x: rdata.keys()
related_units.side_effect = lambda x: sorted(rdata[x].keys())
relation_get.side_effect = lambda x, y, z: rdata[z][y].get(x, None)
configure_pacemaker_remote.side_effect = lambda x: 'res-{}'.format(x)
configure_pacemaker_remote.side_effect = \
lambda x, y: 'res-{}'.format(x)
utils.configure_pacemaker_remote_resources()
remote_calls = [
mock.call('node1'),
mock.call('node2')]
mock.call('node1', '10.0.0.10'),
mock.call('node2', '10.0.0.11')]
configure_pacemaker_remote.assert_has_calls(
remote_calls,
any_order=True)