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

Reply via email to