Files
openGauss-OM/script/local/ConfigInstance.py
coolany eae422baf3 适配CM组件
Signed-off-by: coolany <kyosang@163.com>

support cgroup

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

372 lines
13 KiB
Python

#!/usr/bin/env python3
# -*- 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.
# ----------------------------------------------------------------------------
# Description : ConfigInstance.py is a utility to config
# CN/DN/gtm/cm_agent/cm_server instance.
#############################################################################
import getopt
import sys
import os
sys.path.append(sys.path[0] + "/../")
from gspylib.common.GaussLog import GaussLog
from gspylib.common.Common import DefaultValue, ClusterInstanceConfig
from gspylib.common.ParameterParsecheck import Parameter
from gspylib.common.LocalBaseOM import LocalBaseOM
from gspylib.common.ErrorCode import ErrorCode
from gspylib.threads.parallelTool import parallelTool
from domain_utils.cluster_file.cluster_log import ClusterLog
from domain_utils.domain_common.cluster_constants import ClusterConstants
from domain_utils.cluster_os.cluster_user import ClusterUser
#############################################################################
# Global variables
# INSTANCE_TYPE_UNDEFINED: the signal about instance
# MASTER_INSTANCE: the signal about instance
# STANDBY_INSTANCE: the signal about instance
# DUMMY_STANDBY_INSTANCE: the signal about instance
#############################################################################
INSTANCE_TYPE_UNDEFINED = -1
MASTER_INSTANCE = 0
STANDBY_INSTANCE = 1
DUMMY_STANDBY_INSTANCE = 2
CONFIG_ITEM_TYPE = "ConfigInstance"
CONFIG_PG_FILE = "pg_config"
CONFIG_GS_FILE = "gs_config"
CONFIG_ALL_FILE = "all"
########################################################################
# Global variables define
########################################################################
g_opts = None
########################################################################
class CmdOptions():
"""
class: cmdOptions
"""
def __init__(self):
"""
function: constructor
"""
self.clusterUser = ""
self.dataGucParams = []
self.cmsGucParams = []
self.configType = CONFIG_ALL_FILE
self.clusterStaticConfigFile = ""
self.logFile = ""
self.alarmComponent = ""
self.gucXml = False
self.vcMode = False
self.dws_mode = False
self.clusterConf = ""
def usage():
"""
Usage:
python3 -h | -help
python3 ConfigInstance.py -U user
[-T config_type]
[-P cluster_static_config]
[-C "PARAMETER=VALUE" [...]]
[-D "PARAMETER=VALUE" [...]]
[-L log]
target file: pg_config, gs_config, all
"""
print(usage.__doc__)
def parseCommandLine():
"""
function: parseCommandLine
input: NA
output: NA
"""
try:
paraLine = sys.argv[1]
paraLine = DefaultValue.encodeParaline(paraLine,
DefaultValue.BASE_DECODE)
paraLine = paraLine.strip()
paraList = paraLine.split("*==SYMBOL==*")
opts, args = getopt.getopt(paraList[1:], "U:C:D:S:T:P:l:hX:",
["help", "alarm=", "gucXml",
"vc_mode", "dws-mode"])
except Exception as e:
usage()
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50000"]
% str(e))
if (len(args) > 0):
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50000"]
% str(args[0]))
global g_opts
g_opts = CmdOptions()
for (key, value) in opts:
if (key == "-h" or key == "--help"):
usage()
sys.exit(0)
elif (key == "-U"):
g_opts.clusterUser = value
elif (key == "-D"):
g_opts.dataGucParams.append(value)
elif key == "-S":
g_opts.cmsGucParams.append(value)
elif (key == "-T"):
g_opts.configType = value
elif (key == "-P"):
g_opts.clusterStaticConfigFile = value
elif (key == "-l"):
g_opts.logFile = os.path.realpath(value)
elif (key == "--alarm"):
g_opts.alarmComponent = value
elif (key == "--gucXml"):
g_opts.gucXml = True
elif (key == "--vc_mode"):
g_opts.vcMode = True
elif (key == "--dws-mode"):
g_opts.dws_mode = True
elif key == "-X":
g_opts.clusterConf = os.path.realpath(value)
Parameter.checkParaVaild(key, value)
def checkParameter():
"""
function: checkParameter
input: NA
output: NA
"""
# check if user exist and is the right user
if (g_opts.clusterUser == ""):
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50001"] % 'U' + ".")
ClusterUser.checkUser(g_opts.clusterUser)
if (g_opts.configType not in [CONFIG_ALL_FILE,
CONFIG_GS_FILE, CONFIG_PG_FILE]):
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"]
% 'T' + " Value: %s." % g_opts.configType)
if (g_opts.logFile == ""):
g_opts.logFile = ClusterLog.getOMLogPath(
ClusterConstants.LOCAL_LOG_FILE, g_opts.clusterUser, "")
if (g_opts.alarmComponent == ""):
g_opts.alarmComponent = DefaultValue.ALARM_COMPONENT_PATH
def getAlarmDict(configItemType=None, alarmComponent=None):
"""
function: Get Alarm configuration for om_monitor
input : configItemType, alarmComponent
output: NA
"""
tmpAlarmDict = {}
if (configItemType == "ConfigInstance"):
tmpAlarmDict["alarm_component"] = "%s" % alarmComponent
return tmpAlarmDict
class ConfigInstance(LocalBaseOM):
"""
Class: ConfigInstance
"""
def __init__(self, logFile, user, clusterConf, dwsMode=False,
dataParams=None, confType="",
clusterStaticConfigFile="", alarmComponent="", cmsParams=None):
"""
function: configure all instance on local node
"""
if dataParams is None:
dataParams = []
if cmsParams is None:
cmsParams = []
LocalBaseOM.__init__(self, logFile, user, clusterConf, dwsMode)
if (self.clusterConfig == ""):
# Read config from static config file
self.readConfigInfo()
else:
self.readConfigInfoByXML()
# get user info
self.getUserInfo()
if (user != "" and self.user != user.strip()):
self.logger.debug("User parameter : %s." % user)
self.logger.logExit(ErrorCode.GAUSS_503["GAUSS_50315"]
% (self.user, self.clusterInfo.appPath))
# get log file info
# init every component
self.initComponent()
self.dataGucParams = dataParams
self.cmsGucParams = cmsParams
self.configType = confType
self.clusterStaticConfigFile = clusterStaticConfigFile
self.alarmComponent = alarmComponent
self.__dataConfig = {}
self.__cmsConfig = {}
def __checkconfigParams(self, param, instance_type):
"""
function:
Check parameter for postgresql.conf
port : this is calculated automatically
input : param
output: int
"""
configInvalidArgs = ["port", "alarm_component"]
# get key name and key value
# split by '='
keyValue = param.split("=")
if (len(keyValue) != 2):
return 1
# the type like this: "key = value"
key = keyValue[0].strip()
value = keyValue[1].strip()
if key in configInvalidArgs:
return 1
if instance_type == "dn":
self.__dataConfig[key] = value
else:
self.__cmsConfig[key] = value
return 0
def __checkGUCInstParameters(self):
"""
function: Check parameters for instance configuration
input : NA
output: NA
"""
# Checking parameters for configuration CN and DN.
self.logger.log("Checking parameters for configuration database node.")
for param in self.dataGucParams:
if self.__checkconfigParams(param.strip(), "dn") != 0:
self.logger.logExit(ErrorCode.GAUSS_500["GAUSS_50000"]
% param)
for param in self.cmsGucParams:
if self.__checkconfigParams(param.strip(), "cms") != 0:
self.logger.logExit(ErrorCode.GAUSS_500["GAUSS_50000"] % param)
def __modifyConfig(self):
"""
function: Modify all instances on loacl node
input : NA
output: NA
"""
self.logger.log("Modifying Alarm configuration.")
tmpAlarmDict = getAlarmDict(self.configType, self.alarmComponent)
# init alarmItem.conf file
configFile = "%s/bin/alarmItem.conf" % self.clusterInfo.appPath
ClusterInstanceConfig.setConfigItem(
DefaultValue.INSTANCE_ROLE_CMAGENT, "", configFile, tmpAlarmDict)
componentList = self.dnCons + self.cmCons
if len(componentList) == 0:
return
try:
# config instance in paralle
parallelTool.parallelExecute(self.configInst, componentList)
except Exception as e:
self.logger.logExit(str(e))
def configInst(self, dbCon):
"""
function: Config the instance
input : dbCon
output: NA
"""
if dbCon.instInfo.instanceRole == DefaultValue.INSTANCE_ROLE_DATANODE:
# modifying database node configuration.
self.logger.log("Modifying database node configuration.")
peerInsts = self.clusterInfo.getPeerInstance(dbCon.instInfo)
azNames = self.clusterInfo.getazNames()
allConfig = {}
allConfig.update(self.__dataConfig)
dbCon.configInstance(self.user, allConfig,
peerInsts, CONFIG_ITEM_TYPE,
self.alarmComponent, azNames,
g_opts.gucXml)
if dbCon.instInfo.instanceRole == DefaultValue.INSTANCE_ROLE_CMSERVER:
# modifying CMServer configuration.
if len(self.cmsGucParams) != 0:
self.logger.log("Modifying CMServer configuration.")
dbCon.configInstance(self.user, CONFIG_ITEM_TYPE,
self.alarmComponent, self.__cmsConfig)
else:
self.logger.log("No need to modify CMServer configuration.")
if dbCon.instInfo.instanceRole == DefaultValue.INSTANCE_ROLE_CMAGENT:
# modifying CMAgent configuration.
if len(self.cmsGucParams) != 0:
self.logger.log("Modifying CMAgent configuration.")
tmp_config = {}
temp_cma_config = {}
tmp_config.update(self.__cmsConfig)
if 'enable_dcf' in tmp_config:
temp_cma_config['enable_dcf'] = tmp_config['enable_dcf']
dbCon.configInstance(self.user, CONFIG_ITEM_TYPE,
self.alarmComponent, temp_cma_config)
else:
self.logger.log("No need to modify CMAgent configuration.")
def modifyInstance(self):
"""
Class: modifyInstance
"""
self.__checkGUCInstParameters()
# modify all instances on loacl node
if self.configType in [CONFIG_PG_FILE, CONFIG_ALL_FILE]:
self.__modifyConfig()
if __name__ == '__main__':
##########################################################################
# config instance
##########################################################################
"""
function: config instance
1.check dbInitParams
2.modify instance
3.genarate cert files
input : NA
output: NA
"""
try:
# parse and check input parameters
parseCommandLine()
checkParameter()
# modify Instance
configer = ConfigInstance(g_opts.logFile, g_opts.clusterUser,
g_opts.clusterConf,
False,
g_opts.dataGucParams, g_opts.configType,
g_opts.clusterStaticConfigFile,
g_opts.alarmComponent, g_opts.cmsGucParams)
configer.modifyInstance()
except Exception as e:
GaussLog.exitWithError(str(e))
sys.exit(0)