Files
openGauss-OM/script/gspylib/inspection/items/cluster/CheckDebugSwitch.py
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

追加合入
2022-03-05 18:51:52 +08:00

147 lines
5.7 KiB
Python

# -*- coding:utf-8 -*-
# Copyright (c) 2020 Huawei Technologies Co.,Ltd.
#
# openGauss is licensed under Mulan PSL v2.
# You can use this software according to the terms
# and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
# http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
# ----------------------------------------------------------------------------
import os
import subprocess
from gspylib.inspection.common import SharedFuncs
from gspylib.inspection.common.CheckItem import BaseItem
from gspylib.inspection.common.CheckResult import ResultStatus
from base_utils.os.file_util import FileUtil
# Conf file name constant
POSTGRESQL_CONF = "postgresql.conf"
INSTANCE_ROLE_DATANODE = 4
g_result = []
class CheckDebugSwitch(BaseItem):
def __init__(self):
super(CheckDebugSwitch, self).__init__(self.__class__.__name__)
def obtainDataDirLength(self, nodeInfo):
"""
function: Obtain data dir length
input: NA
output: int, list
"""
# Get the longest path
DirLength = 0
# Get the DB instance and the longest DB path
for inst in nodeInfo.datanodes:
if (len(inst.datadir) > DirLength):
DirLength = len(inst.datadir)
return DirLength
def checkSingleParaFile(self, inst, desc, INDENTATION_VALUE_INT):
"""
function: Check the log_min_messages parameter for each instance
input: String, String, int
output: int
"""
# The instance directory must exist
if (not os.path.exists(inst.datadir) or len(
os.listdir(inst.datadir)) == 0):
g_result.append(
"%s: Abnormal reason: The directory doesn't exist"
" or is empty." % (
"%s(%s) log_min_messages parameter" % (
desc, inst.datadir)).ljust(INDENTATION_VALUE_INT))
return -1
paraPath = ""
# Gets the database node configuration file
if inst.instanceRole == INSTANCE_ROLE_DATANODE:
paraPath = os.path.join(inst.datadir, POSTGRESQL_CONF)
else:
g_result.append(
"%s: Abnormal reason: Invalid instance type: %s." % (
("%s(%s) log_min_messages parameter " % (
desc, inst.datadir)).ljust(INDENTATION_VALUE_INT),
inst.instanceRole))
return - 1
# The instance configuration file must exist
if (not os.path.exists(paraPath)):
g_result.append("%s: Abnormal reason: %s does not exist." % (
("%s(%s) log_min_messages parameter " % (
desc, inst.datadir)).ljust(INDENTATION_VALUE_INT),
paraPath))
return -1
# Gets the log_min_messages parameter in the configuration file
output = FileUtil.readFile(paraPath, "log_min_messages")
value = None
for line in output:
line = line.split('#')[0].strip()
if (line.find('log_min_messages') >= 0 and line.find('=') > 0):
value = line.split('=')[1].strip()
break
if not value:
value = "warning"
# Determines whether the log_min_messages parameter is valid
if (value.lower() != "warning"):
g_result.append(
"%s: Warning reason: The parameter 'log_min_messages(%s)'"
" value is incorrect. It should be 'warning'."
% (("%s(%s) log_min_messages parameter(%s)"
% (desc, paraPath, value)).ljust(INDENTATION_VALUE_INT),
value))
return -1
g_result.append("%s: Normal" % (
"%s(%s) log_min_messages parameter(%s)" % (
desc, paraPath, value)).ljust(
INDENTATION_VALUE_INT))
return 0
def doCheck(self):
global g_result
g_result = []
nodeInfo = self.cluster.getDbNodeByName(self.host)
intervalLen = self.obtainDataDirLength(nodeInfo)
resultList = []
self.result.val = ""
INDENTATION_VALUE_INT = intervalLen + 64
# Check all DB instance debug switch
for inst in nodeInfo.datanodes:
resultList.append(
self.checkSingleParaFile(inst, "DN", INDENTATION_VALUE_INT))
if (-1 in resultList):
self.result.rst = ResultStatus.WARNING
else:
self.result.rst = ResultStatus.OK
for detail in g_result:
self.result.val = self.result.val + '%s\n' % detail
def doSet(self):
nodeInfo = self.cluster.getDbNodeByName(self.host)
intervalLen = self.obtainDataDirLength(nodeInfo)
flag = 0
resultStr = ""
INDENTATION_VALUE_INT = intervalLen + 64
for inst in nodeInfo.datanodes:
flag = self.checkSingleParaFile(inst, "DN", INDENTATION_VALUE_INT)
if (flag == -1):
cmd = "gs_guc set -N all -I all -c" \
" 'log_min_messages = warning'"
(status, output) = subprocess.getstatusoutput(cmd)
if (status != 0):
resultStr += "Falied to set database node " \
"log_min_massages.\n Error : %s" % output + \
" Command: %s.\n" % cmd
if (len(resultStr) > 0):
self.result.val = resultStr
else:
self.result.val = "Set log_min_messages successfully."