On Thu, Apr 16, 2015 at 05:31:58PM +0200, 'Helga Velroyen' via ganeti-devel
wrote:
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
LGTM