From 27699267edfbf2ce9e5246d6ec89435ab3c4cacb Mon Sep 17 00:00:00 2001 From: Liam Young Date: Fri, 12 Apr 2019 11:14:36 +0000 Subject: [PATCH] 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 --- hooks/utils.py | 11 ++++++++--- unit_tests/test_hacluster_utils.py | 22 ++++++++++++++-------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/hooks/utils.py b/hooks/utils.py index 13e1bdf..60bbc0b 100644 --- a/hooks/utils.py +++ b/hooks/utils.py @@ -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} diff --git a/unit_tests/test_hacluster_utils.py b/unit_tests/test_hacluster_utils.py index a3779fd..e513190 100644 --- a/unit_tests/test_hacluster_utils.py +++ b/unit_tests/test_hacluster_utils.py @@ -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)