1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-18 21:44:02 +03:00
mariadb-AlanMologorsky a079a2c944 MCOL-5496: Merge CMAPI code to engine repo.
[add] cmapi code to engine
2023-06-07 10:00:16 +03:00

92 lines
2.5 KiB
Python

import logging
import socket
from cmapi_server.constants import MCS_DATA_PATH, MCS_MODULE_FILE_PATH
from mcs_node_control.models.dbrm import DBRM
from mcs_node_control.models.misc import get_dbroots_list, read_module_id
from mcs_node_control.models.process import get_host_uptime
PROC_NAMES = ['ExeMgr', 'PrimProc', 'WriteEngine', 'controllernode',
'workernode', 'cmagent', 'DMLProc', 'DDLProc']
module_logger = logging.getLogger()
class NodeStatus:
"""Class to tell the status of the node.
Inspects runtime of the cluster and OS and returns its observations.
"""
def get_cluster_mode(self):
"""Reads cluster mode.
Cluster can be in readwrite or readonly modes. It can be also ready or
not ready but it is not important at this point. We pesume if there is
no connection with DBRM master then the cluster is readonly.
TODO:
- Is it ok to have those method here in NodeStatus?
Move to DBRM.
- pass 'root' and config_filename arguments
(likewise dbrm.set_cluster_mode)
:rtype: string
"""
try:
with DBRM() as dbrm:
return dbrm.get_cluster_mode()
except (ConnectionRefusedError, RuntimeError, socket.error):
module_logger.error(
'Cannot establish or use DBRM connection.',
exc_info=True
)
return 'readonly'
def get_dbrm_status(self):
"""reads DBRM status
DBRM Block Resolution Manager operates in two modes:
master and slave. This m() returns the mode of this node
looking for controllernode process running.
:rtype: string
"""
return DBRM.get_dbrm_status()
def get_dbroots(self, path:str = MCS_DATA_PATH):
"""searches for services
The method returns numeric ids of dbroots available.
:rtype: generator of ints
"""
for id in get_dbroots_list(path):
yield id
def get_host_uptime(self):
"""Retrieves uptime in seconds.
:rtype: int : seconds
"""
return get_host_uptime()
def get_module_id(self):
"""Retrieves module ID from MCS_MODULE_FILE_PATH.
:rtype: int : seconds
"""
func_name = 'get_module_id'
try:
module_id = read_module_id()
except FileNotFoundError:
module_id = 0
module_logger.error(
f'{func_name} {MCS_MODULE_FILE_PATH} file is absent.'
)
return module_id