Like the previous patch, also NodeSshRemoveKey did not consider offline nodes so far. This patch fixes it.
This fixes issue 1047. Signed-off-by: Helga Velroyen <[email protected]> --- lib/backend.py | 4 ++++ test/py/ganeti.backend_unittest.py | 42 ++++++++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lib/backend.py b/lib/backend.py index b5f4001..bc1a570 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -1673,9 +1673,13 @@ def RemoveNodeSshKey(node_uuid, node_name, ssh.RemovePublicKey(node_uuid, key_file=pub_key_file) all_nodes = ssconf_store.GetNodeList() + online_nodes = ssconf_store.GetOnlineNodeList() for node in all_nodes: if node == master_node: continue + if node not in online_nodes: + logging.debug("Skipping offline node '%s'.", node) + continue ssh_port = ssh_port_map.get(node) if not ssh_port: raise errors.OpExecError("No SSH port information available for" diff --git a/test/py/ganeti.backend_unittest.py b/test/py/ganeti.backend_unittest.py index 56200ea..b6c0ebf 100755 --- a/test/py/ganeti.backend_unittest.py +++ b/test/py/ganeti.backend_unittest.py @@ -1358,6 +1358,11 @@ class TestAddRemoveGenerateNodeSshKey(testutils.GanetiTestCase): self._TearDownTestData() + def _GetReducedOnlineNodeList(self): + """'Randomly' mark some nodes as offline.""" + return [name for name in self._all_nodes + if '3' not in name and '5' not in name] + def testAddKeyWithOfflineNodes(self): new_node_name = "new_node_name" new_node_uuid = "new_node_uuid" @@ -1371,11 +1376,9 @@ class TestAddRemoveGenerateNodeSshKey(testutils.GanetiTestCase): new_node_name, new_node_uuid, new_node_key, is_potential_master_candidate, is_master_candidate, is_master) - - # 'randomly' mark some nodes as offline - self._online_nodes = [name for name in self._all_nodes - if '3' not in name and '5' not in name] + self._online_nodes = self._GetReducedOnlineNodeList() self._ssconf_mock.GetOnlineNodeList.return_value = self._online_nodes + backend.AddNodeSshKey(new_node_uuid, new_node_name, self._potential_master_candidates, self._ssh_port_map, @@ -1397,6 +1400,37 @@ class TestAddRemoveGenerateNodeSshKey(testutils.GanetiTestCase): self._TearDownTestData() + def testRemoveKeyWithOfflineNodes(self): + self._SetupTestData() + (node_name, node_uuid, node_key, is_potential_master_candidate, + is_master_candidate, is_master) = \ + self._ssh_file_manager.GetAllMasterCandidates()[0] + self._online_nodes = self._GetReducedOnlineNodeList() + self._ssconf_mock.GetOnlineNodeList.return_value = self._online_nodes + + backend.RemoveNodeSshKey(node_uuid, node_name, + self._master_candidate_uuids, + self._potential_master_candidates, + self._ssh_port_map, + from_authorized_keys=True, + from_public_keys=True, + clear_authorized_keys=True, + clear_public_keys=True, + pub_key_file=self._pub_key_file, + ssconf_store=self._ssconf_mock, + noded_cert_file=self.noded_cert_file, + run_cmd_fn=self._run_cmd_mock) + + for node in self._all_nodes: + if node in self._online_nodes: + self.assertFalse(self._ssh_file_manager.NodeHasAuthorizedKey( + node, node_key)) + else: + self.assertTrue(self._ssh_file_manager.NodeHasAuthorizedKey( + node, node_key)) + + self._TearDownTestData() + class TestVerifySshSetup(testutils.GanetiTestCase): _NODE1_UUID = "uuid1" -- 2.2.0.rc0.207.ga3a616c
