diff --git a/cmapi/cmapi_server/constants.py b/cmapi/cmapi_server/constants.py index 37790b765..99375a628 100644 --- a/cmapi/cmapi_server/constants.py +++ b/cmapi/cmapi_server/constants.py @@ -77,17 +77,17 @@ class ProgInfo(NamedTuple): # on top level of process handling # mcs-storagemanager starts conditionally inside mcs-loadbrm, but should be # stopped using cmapi -ALL_MCS_PROGS: dict[str, ProgInfo] = { +ALL_MCS_PROGS: dict[MCSProgs, ProgInfo] = { # workernode starts on primary and non primary node with 1 or 2 added # to subcommand (DBRM_Worker1 - on primary, DBRM_Worker2 - non primary) - MCSProgs.STORAGE_MANAGER.value: ProgInfo(15, 'mcs-storagemanager', '', False, 1), - MCSProgs.WORKER_NODE.value: ProgInfo(13, 'mcs-workernode', 'DBRM_Worker{}', False, 1), - MCSProgs.CONTROLLER_NODE.value: ProgInfo(11, 'mcs-controllernode', 'fg', True), - MCSProgs.PRIM_PROC.value: ProgInfo(5, 'mcs-primproc', '', False, 1), - MCSProgs.EXE_MGR.value: ProgInfo(9, 'mcs-exemgr', '', False, 1), - MCSProgs.WRITE_ENGINE_SERVER.value: ProgInfo(7, 'mcs-writeengineserver', '', False, 3), - MCSProgs.DML_PROC.value: ProgInfo(3, 'mcs-dmlproc', '', False), - MCSProgs.DDL_PROC.value: ProgInfo(1, 'mcs-ddlproc', '', False), + MCSProgs.STORAGE_MANAGER: ProgInfo(15, 'mcs-storagemanager', '', False, 1), + MCSProgs.WORKER_NODE: ProgInfo(13, 'mcs-workernode', 'DBRM_Worker{}', False, 1), + MCSProgs.CONTROLLER_NODE: ProgInfo(11, 'mcs-controllernode', 'fg', True), + MCSProgs.PRIM_PROC: ProgInfo(5, 'mcs-primproc', '', False, 1), + MCSProgs.EXE_MGR: ProgInfo(9, 'mcs-exemgr', '', False, 1), + MCSProgs.WRITE_ENGINE_SERVER: ProgInfo(7, 'mcs-writeengineserver', '', False, 3), + MCSProgs.DML_PROC: ProgInfo(3, 'mcs-dmlproc', '', False), + MCSProgs.DDL_PROC: ProgInfo(1, 'mcs-ddlproc', '', False), } # constants for docker container dispatcher diff --git a/cmapi/cmapi_server/controllers/endpoints.py b/cmapi/cmapi_server/controllers/endpoints.py index 360c1fad8..047e452d3 100644 --- a/cmapi/cmapi_server/controllers/endpoints.py +++ b/cmapi/cmapi_server/controllers/endpoints.py @@ -435,7 +435,6 @@ class ConfigController: is_primary=node_config.is_primary_node(), use_sudo=use_sudo, timeout=request_timeout, - is_read_only=node_config.is_read_only(), ) except CMAPIBasicError as err: raise_422_error( @@ -705,7 +704,6 @@ class ShutdownController: is_primary=node_config.is_primary_node(), use_sudo=use_sudo, timeout=timeout, - is_read_only=node_config.is_read_only(), ) except CMAPIBasicError as err: raise_422_error( diff --git a/cmapi/cmapi_server/failover_agent.py b/cmapi/cmapi_server/failover_agent.py index 1e4f5fdac..ff92c06b6 100644 --- a/cmapi/cmapi_server/failover_agent.py +++ b/cmapi/cmapi_server/failover_agent.py @@ -97,7 +97,6 @@ class FailoverAgent(AgentBase): if not test_mode: MCSProcessManager.stop_node( is_primary=nc.is_primary_node(), - is_read_only=nc.is_read_only(), ) logger.info( 'FA.enterStandbyMode(): successfully stopped node.' diff --git a/cmapi/cmapi_server/helpers.py b/cmapi/cmapi_server/helpers.py index e022d3503..eef8ad803 100644 --- a/cmapi/cmapi_server/helpers.py +++ b/cmapi/cmapi_server/helpers.py @@ -540,11 +540,6 @@ def get_desired_nodes(config=DEFAULT_MCS_CONF_PATH): return [ node.text for node in nodes ] -def get_read_only_nodes(root) -> list[str]: - """Get names of read only nodes from config""" - return [node.text for node in root.findall('./ReadOnlyNodes/Node')] - - def in_maintenance_state(config=DEFAULT_MCS_CONF_PATH): nc = NodeConfig() root = nc.get_current_config_root(config, upgrade=False) diff --git a/cmapi/cmapi_server/managers/process.py b/cmapi/cmapi_server/managers/process.py index 98802931a..b0807a031 100644 --- a/cmapi/cmapi_server/managers/process.py +++ b/cmapi/cmapi_server/managers/process.py @@ -7,7 +7,7 @@ from time import sleep import psutil from cmapi_server.exceptions import CMAPIBasicError -from cmapi_server.constants import MCS_INSTALL_BIN, ALL_MCS_PROGS, MCSProgs +from cmapi_server.constants import MCS_INSTALL_BIN, ALL_MCS_PROGS, MCSProgs, ProgInfo from cmapi_server.process_dispatchers.base import BaseDispatcher from cmapi_server.process_dispatchers.systemd import SystemdDispatcher from cmapi_server.process_dispatchers.container import ( @@ -33,7 +33,7 @@ class MCSProcessManager: e.g. re/-start or stop systemd services, run executable. """ CONTROLLER_MAX_RETRY = 30 - mcs_progs = {} + mcs_progs: dict[str, ProgInfo] = {} mcs_version_info = None dispatcher_name = None process_dispatcher: BaseDispatcher = None @@ -48,7 +48,7 @@ class MCSProcessManager: :rtype: str """ if cls.dispatcher_name == 'systemd': - prog = MCSProgs[name] + prog = MCSProgs(name) return ALL_MCS_PROGS[prog].service_name return name @@ -98,7 +98,8 @@ class MCSProcessManager: if cls.mcs_progs: logging.warning('Mcs ProcessHandler already detected processes.') - for prog_name, prog_info in ALL_MCS_PROGS.items(): + for prog, prog_info in ALL_MCS_PROGS.items(): + prog_name = prog.value if os.path.exists(os.path.join(MCS_INSTALL_BIN, prog_name)): cls.mcs_progs[prog_name] = prog_info @@ -454,7 +455,6 @@ class MCSProcessManager: is_primary: bool, use_sudo: bool = True, timeout: int = 10, - is_read_only: bool = False, ): """Stop mcs node processes. @@ -464,8 +464,6 @@ class MCSProcessManager: :type use_sudo: bool, optional :param timeout: timeout for DMLProc gracefully stop using DBRM, seconds :type timeout: int - :param is_read_only: if true, doesn't stop WriteEngine - :type is_read_only: bool, optional :raises CMAPIBasicError: immediately if one mcs process not stopped """ # Every time try to stop all processes no matter primary it or slave, @@ -481,5 +479,5 @@ class MCSProcessManager: def restart_node(cls, is_primary: bool, use_sudo: bool, is_read_only: bool = False): """TODO: For next releases.""" if cls.get_running_mcs_procs(): - cls.stop_node(is_primary, use_sudo, is_read_only) + cls.stop_node(is_primary, use_sudo) cls.start_node(is_primary, use_sudo, is_read_only) diff --git a/cmapi/cmapi_server/process_dispatchers/container.py b/cmapi/cmapi_server/process_dispatchers/container.py index 7db927b32..644c4a7af 100644 --- a/cmapi/cmapi_server/process_dispatchers/container.py +++ b/cmapi/cmapi_server/process_dispatchers/container.py @@ -11,7 +11,7 @@ from time import sleep import psutil from cmapi_server.constants import ( - IFLAG, LIBJEMALLOC_DEFAULT_PATH, MCS_INSTALL_BIN, ALL_MCS_PROGS + IFLAG, LIBJEMALLOC_DEFAULT_PATH, MCS_INSTALL_BIN, ALL_MCS_PROGS, MCSProgs ) from cmapi_server.exceptions import CMAPIBasicError from cmapi_server.process_dispatchers.base import BaseDispatcher @@ -126,7 +126,8 @@ class ContainerDispatcher(BaseDispatcher): :return: command with arguments if needed :rtype: str """ - service_info = ALL_MCS_PROGS[service] + prog = MCSProgs(service) + service_info = ALL_MCS_PROGS[prog] command = os.path.join(MCS_INSTALL_BIN, service) if service_info.subcommand: @@ -188,7 +189,8 @@ class ContainerDispatcher(BaseDispatcher): env=env_vars ) # TODO: any other way to detect service finished its initialisation? - sleep(ALL_MCS_PROGS[service].delay) + prog = MCSProgs(service) + sleep(ALL_MCS_PROGS[prog].delay) logger.debug(f'Started "{service}".') if is_primary and service == 'DDLProc': diff --git a/cmapi/cmapi_server/test/test_node_manip.py b/cmapi/cmapi_server/test/test_node_manip.py index 8dd0bac2b..88c8993db 100644 --- a/cmapi/cmapi_server/test/test_node_manip.py +++ b/cmapi/cmapi_server/test/test_node_manip.py @@ -7,7 +7,6 @@ from lxml import etree from cmapi_server import node_manipulation from cmapi_server.constants import MCS_DATA_PATH -from cmapi_server.helpers import get_read_only_nodes from cmapi_server.node_manipulation import add_dbroots_of_other_nodes, remove_dbroots_of_node from cmapi_server.test.unittest_global import BaseNodeManipTestCase, tmp_mcs_config_filename from mcs_node_control.models.node_config import NodeConfig diff --git a/cmapi/mcs_node_control/models/node_config.py b/cmapi/mcs_node_control/models/node_config.py index c71e39703..9d52ad49e 100644 --- a/cmapi/mcs_node_control/models/node_config.py +++ b/cmapi/mcs_node_control/models/node_config.py @@ -4,23 +4,22 @@ import logging import pwd import re import socket -from os import mkdir, replace, chown +from os import chown, mkdir, replace from pathlib import Path from shutil import copyfile -from xml.dom import minidom # to pick up pretty printing functionality +from xml.dom import minidom # to pick up pretty printing functionality from lxml import etree from cmapi_server.constants import ( - DEFAULT_MCS_CONF_PATH, DEFAULT_SM_CONF_PATH, + DEFAULT_MCS_CONF_PATH, + DEFAULT_SM_CONF_PATH, MCS_MODULE_FILE_PATH, ) -# from cmapi_server.managers.process import MCSProcessManager -from mcs_node_control.models.misc import ( - read_module_id, get_dbroots_list -) -from mcs_node_control.models.network_ifaces import get_network_interfaces +# from cmapi_server.managers.process import MCSProcessManager +from mcs_node_control.models.misc import get_dbroots_list, read_module_id +from mcs_node_control.models.network_ifaces import get_network_interfaces module_logger = logging.getLogger() @@ -569,11 +568,15 @@ has dbroot {subel.text}') return dbroots + def get_read_only_nodes(self, root=None) -> list[str]: + """Get names of read only nodes from config""" + root = root or self.get_current_config_root() + return [node.text for node in root.findall('./ReadOnlyNodes/Node')] + def is_read_only(self, root=None) -> bool: """Checks if this node is in read-only mode""" - from cmapi_server.helpers import get_read_only_nodes # Avoid circular import root = root or self.get_current_config_root() - read_only_nodes = set(get_read_only_nodes(root)) + read_only_nodes = set(self.get_read_only_nodes(root)) my_names = set(self.get_network_addresses_and_names()) return bool(read_only_nodes.intersection(my_names)) \ No newline at end of file