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

support cgroup

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

130 lines
5.5 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.
# ----------------------------------------------------------------------------
from gspylib.common.ErrorCode import ErrorCode
from gspylib.inspection.common import SharedFuncs
from gspylib.inspection.common.CheckItem import BaseItem
from gspylib.inspection.common.CheckResult import ResultStatus
from base_utils.os.disk_util import DiskUtil
from base_utils.os.env_util import EnvUtil
class CheckInodeUsage(BaseItem):
def __init__(self):
super(CheckInodeUsage, self).__init__(self.__class__.__name__)
self.Threshold_NG = None
self.Threshold_Warning = None
def preCheck(self):
# check current node contains cn instances if not raise exception
super(CheckInodeUsage, self).preCheck()
# check the threshold was set correctly
if (not (self.threshold.__contains__(
'Threshold_NG') and self.threshold.__contains__(
'Threshold_Warning'))):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53013"]
% "The threshold Threshold_NG"
" and Threshold_Warning")
if (not self.threshold['Threshold_NG'].isdigit() or not self.threshold[
'Threshold_Warning'].isdigit()):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53014"]
% ("The threshold Threshold_NG[%s]"
" and Threshold_Warning[%s]" %
(self.Threshold_NG, self.Threshold_Warning)))
self.Threshold_NG = int(self.threshold['Threshold_NG'])
self.Threshold_Warning = int(self.threshold['Threshold_Warning'])
if (self.Threshold_NG < self.Threshold_Warning):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53015"]
% (self.Threshold_NG, self.Threshold_Warning))
if (self.Threshold_NG > 99 or self.Threshold_Warning < 1):
raise Exception(ErrorCode.GAUSS_530["GAUSS_53016"]
% (self.Threshold_NG, self.Threshold_Warning))
def obtainDataDir(self, nodeInfo):
dataDirList = []
for inst in nodeInfo.datanodes:
dataDirList.append(inst.datadir)
dataDirList.append(EnvUtil.getEnv("PGHOST"))
dataDirList.append(EnvUtil.getEnv("GPHOME"))
dataDirList.append(EnvUtil.getEnv("GAUSSHOME"))
dataDirList.append(EnvUtil.getEnv("GAUSSLOG"))
dataDirList.append("/tmp")
return dataDirList
def obtainDiskDir(self):
cmd = "df -h -P | awk '{print $6}'"
output = SharedFuncs.runShellCmd(cmd)
allDiskPath = output.split('\n')[1:]
return allDiskPath
def doCheck(self):
flag = "Normal"
resultStr = ""
DiskList = []
DiskInfoDict = {}
if (self.cluster):
pathList = self.obtainDataDir(
self.cluster.getDbNodeByName(self.host))
else:
pathList = self.obtainDiskDir()
for path in pathList:
diskName = DiskUtil.getMountPathByDataDir(path)
diskType = DiskUtil.getDiskMountType(diskName)
if (not diskType in ["xfs", "ext3", "ext4"]):
resultStr += \
"Path(%s) inodes usage(%s) Warning reason: " \
"The file system type [%s] is unrecognized " \
"or not support. Please check it.\n" % (
path, 0, diskType)
if (flag == "Normal"):
flag = "Warning"
continue
usageInfo = DiskUtil.getDiskInodeUsage(path)
if (diskName in DiskList):
continue
else:
DiskList.append(diskName)
DiskInfoDict[usageInfo] = "%s %s%%" % (diskName, usageInfo)
if (usageInfo > self.Threshold_NG):
resultStr += "The usage of the device " \
"disk inodes[%s:%d%%] cannot be greater than" \
" %d%%.\n" % (
diskName, usageInfo, self.Threshold_NG)
flag = "Error"
elif (usageInfo > self.Threshold_Warning):
resultStr += \
"The usage of the device disk inodes[%s:%d%%] " \
"cannot be greater than %d%%.\n" % (
diskName, usageInfo, self.Threshold_Warning)
if (flag == "Normal"):
flag = "Warning"
self.result.val = resultStr
if (flag == "Normal"):
self.result.rst = ResultStatus.OK
self.result.val = "All disk inodes are sufficient."
elif (flag == "Warning"):
self.result.rst = ResultStatus.WARNING
else:
self.result.rst = ResultStatus.NG
keys = DiskInfoDict.keys()
sortedKeys = sorted(keys)
self.result.raw = "diskname inodeUsage"
for diskInfo in map(DiskInfoDict.get, sortedKeys):
self.result.raw += "\n%s" % diskInfo