114 lines
4.8 KiB
Python
114 lines
4.8 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
|
|
from gspylib.inspection.common.CheckItem import BaseItem
|
|
from gspylib.inspection.common.CheckResult import ResultStatus
|
|
from base_utils.os.env_util import EnvUtil
|
|
|
|
|
|
class CheckTableSpace(BaseItem):
|
|
def __init__(self):
|
|
super(CheckTableSpace, self).__init__(self.__class__.__name__)
|
|
|
|
def getClusterDirectorys(self, dbNode):
|
|
"""
|
|
function : Get cluster all directorys
|
|
input : NA
|
|
output : List
|
|
"""
|
|
nodeDirs = []
|
|
# including cm_server, cm_agent, cn, dn, gtm, etcd, ssd
|
|
for dbInst in dbNode.datanodes:
|
|
nodeDirs.append(dbInst.datadir)
|
|
if (hasattr(dbInst, 'ssdDir') and len(dbInst.ssdDir) != 0):
|
|
nodeDirs.append(dbInst.ssdDir)
|
|
return nodeDirs
|
|
|
|
def doCheck(self):
|
|
self.result.val = ""
|
|
nodeInfo = self.cluster.getDbNodeByName(self.host)
|
|
clusterPathList = self.getClusterDirectorys(nodeInfo)
|
|
clusterPathList.append(self.cluster.appPath)
|
|
clusterPathList.append(self.cluster.logPath)
|
|
clusterPathList.append(EnvUtil.getEnv('GPHOME'))
|
|
clusterPathList.append(EnvUtil.getEnv('PGHOST'))
|
|
|
|
nodeInfo = self.cluster.getDbNodeByName(self.host)
|
|
if self.cluster.isSingleInstCluster():
|
|
dirPath = nodeInfo.datanodes[0].datadir
|
|
else:
|
|
dirPath = nodeInfo.coordinators[0].datadir
|
|
tableSpaceDir = os.path.join(dirPath, "pg_tblspc")
|
|
tableSpaceList = os.listdir(tableSpaceDir)
|
|
tablespacePaths = []
|
|
if (len(tableSpaceList)):
|
|
for filename in tableSpaceList:
|
|
if (os.path.islink(os.path.join(tableSpaceDir, filename))):
|
|
linkDir = os.readlink(
|
|
os.path.join(tableSpaceDir, filename))
|
|
if (os.path.isdir(linkDir)):
|
|
tablespacePaths.append(linkDir)
|
|
|
|
flag = "Normal"
|
|
for tableSpace in tablespacePaths:
|
|
if (tableSpace.find(' ') >= 0):
|
|
flag = "Error"
|
|
self.result.val += "Table space path[%s] contains spaces.\n" \
|
|
% tableSpace
|
|
|
|
# Support create tablespace in pg_location dir for V1R7
|
|
if (tableSpace.find(os.path.join(dirPath, "pg_location")) == 0):
|
|
continue
|
|
tableSpaces = tableSpace.split('/')
|
|
for clusterPath in clusterPathList:
|
|
clusterPaths = clusterPath.split('/')
|
|
if (tableSpace.find(clusterPath) == 0 and
|
|
tableSpaces[:len(clusterPaths)] == clusterPaths):
|
|
if (flag == "Normal"):
|
|
flag = "Warning"
|
|
self.result.val += "Table space path[%s] and cluster " \
|
|
"path[%s] are nested.\n" % (
|
|
tableSpace, clusterPath)
|
|
elif (clusterPath.find(tableSpace) == 0 and
|
|
clusterPaths[:len(tableSpaces)] == tableSpaces):
|
|
flag = "Error"
|
|
self.result.val += "Table space path[%s] and cluster " \
|
|
"path[%s] are nested.\n" % (tableSpace,
|
|
clusterPath)
|
|
else:
|
|
continue
|
|
for tableSpace1 in tablespacePaths:
|
|
tableSpaces1 = tableSpace1.split('/')
|
|
for tableSpace2 in tablespacePaths:
|
|
if (tableSpace1 == tableSpace2):
|
|
continue
|
|
tableSpaces2 = tableSpace2.split('/')
|
|
if (tableSpace1.find(tableSpace2) == 0 and
|
|
tableSpaces1[:len(tableSpaces2)] == tableSpaces2):
|
|
flag = "Error"
|
|
self.result.val += "Table space path[%s] and table space" \
|
|
" path[%s] are nested.\n" \
|
|
% (tableSpace1, tableSpace2)
|
|
|
|
if (flag == "Error"):
|
|
self.result.rst = ResultStatus.NG
|
|
elif (flag == "Warning"):
|
|
self.result.rst = ResultStatus.WARNING
|
|
else:
|
|
self.result.rst = ResultStatus.OK
|
|
self.result.val = "All table space path is normal."
|