diff --git a/cmapi/cmapi_server/node_manipulation.py b/cmapi/cmapi_server/node_manipulation.py index 49023466a..fbfb48a5b 100644 --- a/cmapi/cmapi_server/node_manipulation.py +++ b/cmapi/cmapi_server/node_manipulation.py @@ -178,8 +178,14 @@ def remove_node( _remove_Module_entries(c_root, node) _remove_from_ExeMgrs(c_root, node) + # FIXME MCOL-6105: for some reason deactivate_only is always True, so the nodes are never removed from InactiveNodes if deactivate_only: _deactivate_node(c_root, node) + + # Remove node from ReadOnlyNodes if it is present there + read_only_nodes = c_root.find('./ReadOnlyNodes') + if read_only_nodes is not None: + __remove_helper(read_only_nodes, node) else: # TODO: unspecific name, need to think of a better one _remove_node(c_root, node) diff --git a/cmapi/cmapi_server/test/test_node_manip.py b/cmapi/cmapi_server/test/test_node_manip.py index e20f89d5d..ef0b67bc6 100644 --- a/cmapi/cmapi_server/test/test_node_manip.py +++ b/cmapi/cmapi_server/test/test_node_manip.py @@ -107,16 +107,20 @@ class NodeManipTester(BaseNodeManipTestCase): mock_update_dbroots_of_readonly_nodes.reset_mock() # Test read-only node removal + # Note: deactivate_only is always True in production, so node is only deactivated, not fully removed from config sections. node_manipulation.remove_node( - self.NEW_NODE_NAME, self.tmp_files[1], self.tmp_files[2], - deactivate_only=False, + self.NEW_NODE_NAME, self.tmp_files[1], self.tmp_files[2] ) nc = NodeConfig() root = nc.get_current_config_root(self.tmp_files[2]) read_only_nodes = nc.get_read_only_nodes(root) + # Node should be removed from ReadOnlyNodes (current code does this), but not from InactiveNodes/DesiredNodes self.assertEqual(len(read_only_nodes), 0) + inactive_nodes = root.find('./InactiveNodes') + self.assertTrue(any(n.text == self.NEW_NODE_NAME for n in inactive_nodes.findall('./Node'))) + mock_rebalance_dbroots.assert_not_called() mock_move_primary_node.assert_not_called() mock_update_dbroots_of_readonly_nodes.assert_called_once()