777 lines
30 KiB
Python
777 lines
30 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 : Install.py is a utility to do gs_install.
|
|
#############################################################################
|
|
|
|
import getopt
|
|
import os
|
|
import sys
|
|
import subprocess
|
|
import traceback
|
|
|
|
sys.path.append(sys.path[0] + "/../")
|
|
from gspylib.common.GaussLog import GaussLog
|
|
from gspylib.common.Common import DefaultValue, CmPackageException
|
|
from gspylib.common.ParameterParsecheck import Parameter
|
|
from gspylib.common.ErrorCode import ErrorCode
|
|
from gspylib.common.LocalBaseOM import LocalBaseOM
|
|
from gspylib.common.DbClusterInfo import dbClusterInfo
|
|
from domain_utils.cluster_file.cluster_dir import ClusterDir
|
|
from domain_utils.cluster_file.cluster_log import ClusterLog
|
|
from base_utils.os.env_util import EnvUtil
|
|
from base_utils.os.file_util import FileUtil
|
|
from domain_utils.cluster_file.package_info import PackageInfo
|
|
from domain_utils.cluster_file.profile_file import ProfileFile
|
|
from domain_utils.cluster_file.version_info import VersionInfo
|
|
from base_utils.os.net_util import NetUtil
|
|
from domain_utils.domain_common.cluster_constants import ClusterConstants
|
|
|
|
#################################################################
|
|
ACTION_INSTALL_CLUSTER = "install_cluster"
|
|
ACTION_INIT_INSTNACE = "init_instance"
|
|
ACTION_CONFIG_CLUSTER = "config_cluster"
|
|
ACTION_START_CLUSTER = "start_cluster"
|
|
ACTION_CLEAN_TEMP_FILE = "clean_temp_file"
|
|
ACTION_PREPARE_CONFIG_CLUSTER = "prepare_config_cluster"
|
|
ACTION_BUILD_STANDBY = "build_standby"
|
|
ACTION_BUILD_CASCADESTANDBY = "build_cascadestandby"
|
|
#################################################################
|
|
g_opts = None
|
|
|
|
|
|
#################################################################
|
|
|
|
class CmdOptions():
|
|
"""
|
|
class: cmdOptions
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""
|
|
Constructor
|
|
"""
|
|
self.action = ""
|
|
self.installPath = ""
|
|
self.logPath = ""
|
|
self.tmpPath = ""
|
|
self.user = ""
|
|
self.group = ""
|
|
self.clusterName = ""
|
|
self.clusterConfig = ""
|
|
self.mpprcFile = ""
|
|
self.static_config_file = ""
|
|
self.installflag = False
|
|
self.logFile = ""
|
|
self.alarmComponent = ""
|
|
self.dws_mode = False
|
|
self.upgrade = False
|
|
self.productVersion = None
|
|
# License mode
|
|
self.licenseMode = None
|
|
self.time_out = None
|
|
self.logger = None
|
|
|
|
|
|
def usage():
|
|
"""
|
|
Usage:
|
|
python3 --help | -?
|
|
python3 Install.py -t action -U username:groupname -X xmlfile
|
|
[--alarm=ALARMCOMPONENT]
|
|
[-l logfile]
|
|
[--dws-mode]
|
|
[-R installPath]
|
|
[-c clusterName]
|
|
[-M logPath]
|
|
[-P tmpPath]
|
|
[-f staticConfigFile]
|
|
Common options:
|
|
-t The type of action.
|
|
-U The user and group name.
|
|
-X --xmlfile = xmlfile Cluster config file.
|
|
--alarm = ALARMCOMPONENT alarm component path.
|
|
--dws-mode dws mode.
|
|
-l --log-file=logfile The path of log file.
|
|
-R Install path.
|
|
-c Cluster name.
|
|
-M The directory of log file.
|
|
-P The tmp path.
|
|
-f The static_config_file.
|
|
-? --help Show this help screen.
|
|
"""
|
|
print(usage.__doc__)
|
|
|
|
def check_parameter(opts, parameter_keys, parameter_map):
|
|
"""
|
|
function: check parameter
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
for key, value in opts:
|
|
if key == "-U":
|
|
strTemp = value
|
|
strList = strTemp.split(":")
|
|
if len(strList) != 2:
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"]
|
|
% "U")
|
|
if strList[0] == "" or strList[1] == "":
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"]
|
|
% "U")
|
|
g_opts.user = strList[0]
|
|
g_opts.group = strList[1]
|
|
elif key in parameter_keys:
|
|
parameter_map[key] = value
|
|
elif key == "-t":
|
|
g_opts.action = value
|
|
elif key == "--dws-mode":
|
|
g_opts.dws_mode = True
|
|
elif key == "-u":
|
|
g_opts.upgrade = True
|
|
elif key == "-T":
|
|
g_opts.installflag = True
|
|
else:
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50000"] % value)
|
|
Parameter.checkParaVaild(key, value)
|
|
if key in ["-c", "--alarm", "--product", "--licensemode"]:
|
|
Parameter.check_parse(key, value)
|
|
|
|
return parameter_map
|
|
|
|
def parseCommandLine():
|
|
"""
|
|
function: parse input parameters
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
try:
|
|
# option '-M' specify the environment parameter GAUSSLOG
|
|
# option '-P' specify the environment parameter PGHOST|GAUSSTMP
|
|
# option '-u' install new binary for upgrade
|
|
opts, args = getopt.getopt(sys.argv[1:], "t:U:X:R:M:P:i:l:c:f:Tu",
|
|
["alarm=", "dws-mode", "time_out=",
|
|
"product=", "licensemode="])
|
|
except getopt.GetoptError 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()
|
|
|
|
parameter_map = {"-X": g_opts.clusterConfig, "-R": g_opts.installPath,
|
|
"-l": g_opts.logFile, "-c": g_opts.clusterName,
|
|
"-M": g_opts.logPath, "-P": g_opts.tmpPath,
|
|
"-f": g_opts.static_config_file,
|
|
"--alarm": g_opts.alarmComponent,
|
|
"--licensemode": g_opts.licenseMode,
|
|
"--time_out": g_opts.time_out}
|
|
parameter_keys = parameter_map.keys()
|
|
parameter_map = check_parameter(opts, parameter_keys, parameter_map)
|
|
|
|
g_opts.clusterConfig = parameter_map["-X"]
|
|
g_opts.installPath = parameter_map["-R"]
|
|
g_opts.logFile = parameter_map["-l"]
|
|
g_opts.clusterName = parameter_map["-c"]
|
|
g_opts.logPath = parameter_map["-M"]
|
|
g_opts.tmpPath = parameter_map["-P"]
|
|
g_opts.static_config_file = parameter_map["-f"]
|
|
g_opts.alarmComponent = parameter_map["--alarm"]
|
|
g_opts.licenseMode = parameter_map["--licensemode"]
|
|
g_opts.time_out = parameter_map["--time_out"]
|
|
|
|
|
|
def checkParameterEmpty(parameter, parameterName):
|
|
"""
|
|
function: check parameter empty
|
|
input : parameter, parameterName
|
|
output: NA
|
|
"""
|
|
if parameter == "":
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50001"]
|
|
% parameterName + ".")
|
|
|
|
|
|
def checkParameter():
|
|
"""
|
|
function: check install parameter
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
if g_opts.action == "":
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50001"] % 't' + '.')
|
|
|
|
if (g_opts.action != ACTION_INSTALL_CLUSTER
|
|
and g_opts.action != ACTION_PREPARE_CONFIG_CLUSTER
|
|
and g_opts.action != ACTION_INIT_INSTNACE
|
|
and g_opts.action != ACTION_CONFIG_CLUSTER
|
|
and g_opts.action != ACTION_START_CLUSTER
|
|
and g_opts.action != ACTION_CLEAN_TEMP_FILE
|
|
and g_opts.action != ACTION_BUILD_STANDBY
|
|
and g_opts.action != ACTION_BUILD_CASCADESTANDBY):
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_500["GAUSS_50004"] % "t")
|
|
|
|
if (g_opts.clusterConfig != "" and
|
|
not os.path.exists(g_opts.clusterConfig)):
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_502["GAUSS_50201"]
|
|
% g_opts.clusterConfig)
|
|
|
|
if (g_opts.logPath != "" and not os.path.exists(g_opts.logPath)
|
|
and not os.path.isabs(g_opts.logPath)):
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_502["GAUSS_50219"]
|
|
% g_opts.logPath)
|
|
|
|
if (g_opts.static_config_file != "" and
|
|
not os.path.isfile(g_opts.static_config_file)):
|
|
GaussLog.exitWithError(ErrorCode.GAUSS_502["GAUSS_50219"]
|
|
% g_opts.static_config_file)
|
|
|
|
# check mpprc file path
|
|
g_opts.mpprcFile = EnvUtil.getMpprcFile()
|
|
g_opts.logger = GaussLog(g_opts.logFile)
|
|
checkParameterEmpty(g_opts.user, "U")
|
|
g_opts.installPath = os.path.normpath(g_opts.installPath)
|
|
g_opts.installPath = os.path.realpath(g_opts.installPath)
|
|
g_opts.logger.log("Using " + g_opts.user + ":" + g_opts.group
|
|
+ " to install database.")
|
|
g_opts.logger.log("Using installation program path : "
|
|
+ g_opts.installPath)
|
|
|
|
if g_opts.logFile == "":
|
|
g_opts.logFile = ClusterLog.getOMLogPath(
|
|
ClusterConstants.LOCAL_LOG_FILE, g_opts.user, "",
|
|
g_opts.clusterConfig)
|
|
|
|
if g_opts.alarmComponent == "":
|
|
g_opts.alarmComponent = DefaultValue.ALARM_COMPONENT_PATH
|
|
|
|
|
|
def createLinkToApp():
|
|
"""
|
|
function: create link to app
|
|
input : NA
|
|
output : NA
|
|
"""
|
|
if g_opts.upgrade:
|
|
g_opts.logger.log("Under upgrade process,"
|
|
" no need to create symbolic link.")
|
|
return
|
|
g_opts.logger.debug("Created symbolic link to $GAUSSHOME with commitid.")
|
|
gaussHome = ClusterDir.getInstallDir(g_opts.user)
|
|
if gaussHome == "":
|
|
raise Exception(ErrorCode.GAUSS_518["GAUSS_51800"] % "$GAUSSHOME")
|
|
versionFile = VersionInfo.get_version_file()
|
|
commitid = VersionInfo.get_version_info(versionFile)[2]
|
|
actualPath = gaussHome + "_" + commitid
|
|
if os.path.exists(gaussHome):
|
|
if not os.path.islink(gaussHome):
|
|
raise Exception(ErrorCode.GAUSS_502["GAUSS_50200"] % gaussHome
|
|
+ " Cannot create symbolic link,"
|
|
" please rename or delete it.")
|
|
else:
|
|
if os.path.realpath(gaussHome) == actualPath:
|
|
g_opts.logger.log("$GAUSSHOME points to %s, no need to create"
|
|
" symbolic link." % actualPath)
|
|
return
|
|
|
|
cmd = "ln -snf %s %s" % (actualPath, gaussHome)
|
|
g_opts.logger.log("Command for creating symbolic link: %s." % cmd)
|
|
(status, output) = subprocess.getstatusoutput(cmd)
|
|
if status != 0:
|
|
g_opts.logger.log(output)
|
|
g_opts.logger.logExit(ErrorCode.GAUSS_501["GAUSS_50107"] % "app.")
|
|
g_opts.logger.debug("Successfully created symbolic link to"
|
|
" $GAUSSHOME with commitid.")
|
|
|
|
|
|
class Install(LocalBaseOM):
|
|
"""
|
|
class: install
|
|
"""
|
|
|
|
def __init__(self, logFile, user, clusterConf, dwsMode=False,
|
|
mpprcFile="", installPath="", alarmComponent="",
|
|
upgrade=False):
|
|
"""
|
|
function: Constructor
|
|
input : logFile, user, clusterConf, dwsMode, mpprcFile, installPath
|
|
alarmComponent, upgrade
|
|
output: NA
|
|
"""
|
|
LocalBaseOM.__init__(self, logFile, user, clusterConf, dwsMode)
|
|
|
|
if self.clusterConfig == "":
|
|
# Read config from static config file
|
|
self.readConfigInfo()
|
|
else:
|
|
self.clusterInfo = dbClusterInfo()
|
|
self.clusterInfo.initFromXml(self.clusterConfig)
|
|
hostName = NetUtil.GetHostIpOrName()
|
|
self.dbNodeInfo = self.clusterInfo.getDbNodeByName(hostName)
|
|
if self.dbNodeInfo is None:
|
|
self.logger.logExit(ErrorCode.GAUSS_516["GAUSS_51619"]
|
|
% hostName)
|
|
# 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))
|
|
# init every component
|
|
self.initComponent()
|
|
|
|
self.mpprcFile = mpprcFile
|
|
self.installPath = installPath
|
|
self.alarmComponent = alarmComponent
|
|
self.upgrade = upgrade
|
|
# This script will be not validating the parameters.
|
|
# Because this should be detected by which instance call
|
|
# this local script.
|
|
self.productVersion = None
|
|
self.time_out = None
|
|
|
|
def decompress_cm_package(self):
|
|
"""
|
|
Decompress CM package
|
|
"""
|
|
cm_package = os.path.join(EnvUtil.getEnvironmentParameterValue(
|
|
"GPHOME", self.user), "%s-cm.tar.gz" % PackageInfo.getPackageFile(
|
|
"bz2File").replace(".tar.bz2", ""))
|
|
if DefaultValue.get_cm_server_num_from_static(self.clusterInfo) == 0 and \
|
|
not os.path.isfile(cm_package):
|
|
self.logger.log("No need to decompress cm package.")
|
|
return
|
|
|
|
if not DefaultValue.check_cm_package(self.clusterInfo, cm_package, self.logger):
|
|
raise CmPackageException()
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, cm_package)
|
|
tar_cmd = "export LD_LIBRARY_PATH=$GPHOME/script/gspylib/clib:" \
|
|
"$LD_LIBRARY_PATH && "
|
|
# decompress tar file.
|
|
decompress_cmd = tar_cmd + "tar -zxf \"" + cm_package + "\" -C \"" + \
|
|
self.installPath + "\""
|
|
self.logger.log("Decompress CM package command: " + decompress_cmd)
|
|
status, output = subprocess.getstatusoutput(decompress_cmd)
|
|
if status != 0:
|
|
self.logger.log("Decompress CM package failed. Output: %s" % output)
|
|
self.logger.logExit(ErrorCode.GAUSS_502["GAUSS_50217"]
|
|
% cm_package + " Error: \n%s" % str(output))
|
|
self.logger.log("Decompress CM package successfully.")
|
|
|
|
def generate_install_path(self):
|
|
"""
|
|
Generate install path
|
|
"""
|
|
if os.path.isdir(self.installPath):
|
|
self.logger.debug("[{0}] is normal. "
|
|
"No need to generate install directory.".format(self.installPath))
|
|
return
|
|
self.logger.debug("Try to create new app path.")
|
|
FileUtil.createDirectory(self.installPath, True, DefaultValue.KEY_DIRECTORY_MODE)
|
|
self.logger.debug("Try to create new app path successfully.")
|
|
|
|
def __decompressBinPackage(self):
|
|
"""
|
|
function: Install database binary file.
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
self.logger.log("Decompressing bin file.")
|
|
tar_file = PackageInfo.getPackageFile("bz2File")
|
|
# let bin executable
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, tar_file)
|
|
|
|
cmd = "export LD_LIBRARY_PATH=$GPHOME/script/gspylib/clib:" \
|
|
"$LD_LIBRARY_PATH && "
|
|
# decompress tar file.
|
|
self.generate_install_path()
|
|
str_cmd = cmd + "tar -xpf \"" + tar_file + "\" -C \"" + \
|
|
self.installPath + "\""
|
|
self.logger.debug("Decompress cmd is: %s" % str_cmd)
|
|
status, output = subprocess.getstatusoutput(str_cmd)
|
|
if status != 0:
|
|
self.logger.logExit(ErrorCode.GAUSS_502["GAUSS_50217"]
|
|
% tar_file + " Error: \n%s" % str(output))
|
|
|
|
# mv $GPHOME/script/transfer.py to $GAUSSHOME/bin/
|
|
dirName = os.path.dirname(os.path.realpath(__file__))
|
|
transferFile = dirName + "/../../script/transfer.py"
|
|
if os.path.exists(transferFile):
|
|
FileUtil.cpFile(transferFile, self.installPath + "/bin/")
|
|
FileUtil.removeFile(transferFile)
|
|
# cp $GPHOME/script to $GAUSSHOME/bin/
|
|
FileUtil.cpFile(dirName + "/../../script",
|
|
self.installPath + "/bin/")
|
|
|
|
# cp $GAUSSHOME/bin/script/gspylib/etc/sql/pmk to /share/postgresql
|
|
destPath = self.installPath + "/share/postgresql/"
|
|
pmkPath = self.installPath + "/bin/script/gspylib/etc/sql/"
|
|
pmkFile = pmkPath + "pmk_schema.sql"
|
|
if os.path.exists(pmkFile):
|
|
FileUtil.cpFile(pmkFile, destPath)
|
|
|
|
pmk_singe_inst_file = pmkPath + "pmk_schema_single_inst.sql"
|
|
if os.path.exists(pmk_singe_inst_file):
|
|
FileUtil.cpFile(pmk_singe_inst_file, destPath)
|
|
|
|
# decompress CM package
|
|
self.decompress_cm_package()
|
|
|
|
# change owner for tar file.
|
|
FileUtil.changeOwner(self.user, self.installPath, True)
|
|
self.logger.log("Successfully decompressed bin file.")
|
|
|
|
def __saveUpgradeVerionInfo(self):
|
|
"""
|
|
function: save upgrade version info
|
|
input: NA
|
|
output: NA
|
|
"""
|
|
if self.dws_mode:
|
|
versionCfgFile = "%s/version.cfg" % DefaultValue.DWS_PACKAGE_PATH
|
|
upgradeVersionFile = "%s/bin/upgrade_version" % self.installPath
|
|
else:
|
|
dirName = os.path.dirname(os.path.realpath(__file__))
|
|
versionCfgFile = "%s/../../version.cfg" % dirName
|
|
upgradeVersionFile = "%s/bin/upgrade_version" % self.installPath
|
|
|
|
if not os.path.exists(versionCfgFile):
|
|
self.logger.logExit(ErrorCode.GAUSS_502["GAUSS_50201"]
|
|
% versionCfgFile)
|
|
if not os.path.isfile(versionCfgFile):
|
|
self.logger.logExit(ErrorCode.GAUSS_502["GAUSS_50210"]
|
|
% versionCfgFile)
|
|
|
|
try:
|
|
# read version info from version.cfg file
|
|
(newClusterVersion, newClusterNumber, commitId) = \
|
|
VersionInfo.get_version_info(versionCfgFile)
|
|
# save version info to upgrade_version file
|
|
if os.path.isfile(upgradeVersionFile):
|
|
os.remove(upgradeVersionFile)
|
|
|
|
FileUtil.createFile(upgradeVersionFile)
|
|
FileUtil.writeFile(upgradeVersionFile,
|
|
[newClusterVersion, newClusterNumber, commitId])
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE, upgradeVersionFile)
|
|
except Exception as e:
|
|
self.logger.logExit(str(e))
|
|
|
|
def __modifyAlarmItemConfFile(self):
|
|
"""
|
|
function: modify alarm item conf file
|
|
input: NA
|
|
output: NA
|
|
"""
|
|
# modify alarmItem.conf file
|
|
alarmItemConfigFile = "%s/bin/alarmItem.conf" % self.installPath
|
|
if not os.path.exists(alarmItemConfigFile):
|
|
self.logger.log("Alarm's configuration file %s does not exist."
|
|
% alarmItemConfigFile)
|
|
return
|
|
|
|
self.logger.log("Modifying Alarm configuration.")
|
|
FileUtil.replaceFileLineContent("^.*\(alarm_component.*=.*\)", "#\\1",
|
|
alarmItemConfigFile)
|
|
FileUtil.writeFile(alarmItemConfigFile, [' '])
|
|
FileUtil.writeFile(alarmItemConfigFile, ['alarm_component = %s'
|
|
% self.alarmComponent])
|
|
|
|
def __set_manual_start(self):
|
|
"""
|
|
function: Set manual start:
|
|
1.set cluster_manual_start
|
|
2.set etcd_manual_start
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
if self.upgrade:
|
|
return
|
|
cluster_manual_start_file = "'%s'/bin/cluster_manual_start" % self.installPath
|
|
FileUtil.createFile(cluster_manual_start_file)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE, cluster_manual_start_file)
|
|
|
|
def __createStaticConfig(self):
|
|
"""
|
|
function: Save cluster info to static config
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
staticConfigPath = "%s/bin/cluster_static_config" % self.installPath
|
|
# save static config
|
|
nodeId = self.dbNodeInfo.id
|
|
self.clusterInfo.saveToStaticConfig(staticConfigPath, nodeId)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE, staticConfigPath)
|
|
FileUtil.changeOwner(self.user, staticConfigPath, False)
|
|
|
|
def __bakInstallPackage(self):
|
|
"""
|
|
function: backup install package for replace
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
dirName = os.path.dirname(os.path.realpath(__file__))
|
|
packageFile = "%s/%s" % (os.path.join(dirName, "./../../"),
|
|
PackageInfo.get_package_back_name())
|
|
# Check if MPPDB package exist
|
|
if not os.path.exists(packageFile):
|
|
self.logger.logExit(ErrorCode.GAUSS_502["GAUSS_50201"]
|
|
% 'MPPDB package' + " Can not back up.")
|
|
# Save MPPDB package to bin path
|
|
destPath = "'%s'/bin/" % self.installPath
|
|
FileUtil.cpFile(packageFile, destPath)
|
|
|
|
def __fixInstallPathPermission(self):
|
|
"""
|
|
function: fix the whole install path's permission
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
installPathFileTypeDict = {}
|
|
try:
|
|
# get files type
|
|
installPathFileTypeDict = FileUtil.getFilesType(self.installPath)
|
|
except Exception as e:
|
|
self.logger.logExit(str(e))
|
|
|
|
for key in installPathFileTypeDict:
|
|
if not os.path.exists(key):
|
|
self.logger.debug("[%s] does not exist. Please skip it."
|
|
% key)
|
|
continue
|
|
if os.path.islink(key):
|
|
self.logger.debug("[%s] is a link file. Please skip it."
|
|
% key)
|
|
continue
|
|
# skip DbClusterInfo.pyc
|
|
if os.path.basename(key) == "DbClusterInfo.pyc":
|
|
continue
|
|
if (installPathFileTypeDict[key].find("executable") >= 0 or
|
|
installPathFileTypeDict[key].find("ELF") >= 0 or
|
|
installPathFileTypeDict[key].find("directory") >= 0):
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, key, True)
|
|
else:
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE, key)
|
|
|
|
def __setCgroup(self):
|
|
"""
|
|
function: copy cgroup config file to gausshome which generated at
|
|
preinstall step.
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
self.logger.log("Set Cgroup config file to appPath.")
|
|
|
|
source_path = os.path.join(os.getenv("GPHOME"),
|
|
self.user, "etc")
|
|
target_path = os.path.join(self.installPath, "etc")
|
|
cmd = "cp %s/* %s" % (source_path, target_path)
|
|
self.logger.debug("set cgroup at install step cmd: %s" % cmd)
|
|
(status, output) = subprocess.getstatusoutput(cmd)
|
|
if status != 0:
|
|
self.logger.debug("set cgroup at install step result: %s" % output)
|
|
|
|
self.logger.log("Successfully Set Cgroup.")
|
|
|
|
def __changeEnv(self):
|
|
"""
|
|
function: Change GAUSS_ENV
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
# modified user's environmental variable $GAUSS_ENV
|
|
self.logger.log("Modifying user's environmental variable $GAUSS_ENV.")
|
|
ProfileFile.updateUserEnvVariable(self.mpprcFile, "GAUSS_ENV", "2")
|
|
ProfileFile.updateUserEnvVariable(self.mpprcFile, "GS_CLUSTER_NAME",
|
|
g_opts.clusterName)
|
|
self.logger.log("Successfully modified user's environmental"
|
|
" variable $GAUSS_ENV.")
|
|
|
|
def __fixFilePermission(self):
|
|
"""
|
|
function: modify permission for app path
|
|
input: NA
|
|
ouput: NA
|
|
"""
|
|
self.logger.log("Fixing file permission.")
|
|
binPath = "'%s'/bin" % self.installPath
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, binPath, True)
|
|
libPath = "'%s'/lib" % self.installPath
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, libPath, True)
|
|
sharePath = "'%s'/share" % self.installPath
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, sharePath, True)
|
|
etcPath = "'%s'/etc" % self.installPath
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, etcPath, True)
|
|
includePath = "'%s'/include" % self.installPath
|
|
FileUtil.changeMode(DefaultValue.KEY_DIRECTORY_MODE, includePath, True)
|
|
|
|
tarFile = "'%s'/bin/'%s'" % (self.installPath,
|
|
PackageInfo.get_package_back_name())
|
|
if (os.path.isfile(tarFile)):
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE, tarFile)
|
|
|
|
# ./script/util/*.conf *.service
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/script/gspylib/etc/conf/check_list.conf"
|
|
% self.installPath)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/script/gspylib/etc/conf/"
|
|
"check_list_dws.conf" % self.installPath)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/script/gspylib/etc/conf/gs-OS-set.service"
|
|
% self.installPath)
|
|
# bin config file
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/alarmItem.conf" % self.installPath)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/cluster_guc.conf" % self.installPath)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/upgrade_version" % self.installPath)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/retry_errcodes.conf" % self.installPath)
|
|
FileUtil.changeMode(DefaultValue.KEY_FILE_MODE,
|
|
"'%s'/bin/cluster_static_config" % self.installPath)
|
|
|
|
# ./script/local/*.sql
|
|
cmd = "find '%s'/bin/script -type f -name \"*.sql\" -exec" \
|
|
" chmod 600 {} \\;" % self.installPath
|
|
# ./lib files
|
|
cmd += " && find '%s'/lib/ -type f -exec chmod 600 {} \\;" \
|
|
% self.installPath
|
|
# ./share files
|
|
cmd += " && find '%s'/share/ -type f -exec chmod 600 {} \\;" \
|
|
% self.installPath
|
|
self.logger.debug("Command: %s" % cmd)
|
|
(status, output) = subprocess.getstatusoutput(cmd)
|
|
if status != 0:
|
|
self.logger.log(output)
|
|
self.logger.logExit(ErrorCode.GAUSS_501["GAUSS_50107"] % "app.")
|
|
|
|
def installCluster(self):
|
|
"""
|
|
function: install application
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
self.__decompressBinPackage()
|
|
self.__saveUpgradeVerionInfo()
|
|
self.__modifyAlarmItemConfFile()
|
|
self.__set_manual_start()
|
|
self.__createStaticConfig()
|
|
if not self.dws_mode:
|
|
self.__bakInstallPackage()
|
|
self.__fixInstallPathPermission()
|
|
self.__changeEnv()
|
|
self.__fixFilePermission()
|
|
self.__setCgroup()
|
|
|
|
def startCluster(self):
|
|
"""
|
|
function: start cluster
|
|
input: NA
|
|
output: NA
|
|
"""
|
|
for dn in self.dnCons:
|
|
dn.start(self.time_out)
|
|
|
|
def buildStandby(self):
|
|
"""
|
|
function: build standby
|
|
input: NA
|
|
output: NA
|
|
"""
|
|
for dn in self.dnCons:
|
|
if dn.instInfo.instanceType == DefaultValue.STANDBY_INSTANCE:
|
|
dn.build()
|
|
|
|
def buildCascadeStandby(self):
|
|
"""
|
|
function: build standby
|
|
input: NA
|
|
output: NA
|
|
"""
|
|
for dn in self.dnCons:
|
|
if dn.instInfo.instanceType == DefaultValue.CASCADE_STANDBY:
|
|
dn.build_cascade()
|
|
|
|
def cleanTempFile(self):
|
|
"""
|
|
function: clean temp file
|
|
input: NA
|
|
output: NA
|
|
"""
|
|
filename = "/tmp/temp.%s" % self.user
|
|
try:
|
|
if os.path.isfile(filename):
|
|
FileUtil.removeFile(filename)
|
|
except Exception as e:
|
|
raise Exception(ErrorCode.GAUSS_502["GAUSS_50207"]
|
|
% ("file [%s]" % filename))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
##########################################################################
|
|
# This is the main install flow.
|
|
##########################################################################
|
|
"""
|
|
function: install the cluster
|
|
input : NA
|
|
output: NA
|
|
"""
|
|
try:
|
|
# Initialize self and Parse command line and save to global variable
|
|
parseCommandLine()
|
|
# check the parameters is not OK
|
|
checkParameter()
|
|
createLinkToApp()
|
|
# Initialize globals parameters
|
|
installer = Install(g_opts.logFile, g_opts.user, g_opts.clusterConfig,
|
|
g_opts.dws_mode, g_opts.mpprcFile,
|
|
g_opts.installPath, g_opts.alarmComponent,
|
|
g_opts.upgrade)
|
|
installer.productVersion = g_opts.productVersion
|
|
installer.time_out = g_opts.time_out
|
|
try:
|
|
functionDict = {ACTION_INSTALL_CLUSTER: installer.installCluster,
|
|
ACTION_START_CLUSTER: installer.startCluster,
|
|
ACTION_CLEAN_TEMP_FILE: installer.cleanTempFile,
|
|
ACTION_BUILD_STANDBY: installer.buildStandby,
|
|
ACTION_BUILD_CASCADESTANDBY:
|
|
installer.buildCascadeStandby}
|
|
functionKeys = functionDict.keys()
|
|
|
|
if g_opts.action in functionKeys:
|
|
functionDict[g_opts.action]()
|
|
else:
|
|
g_opts.logger.logExit(ErrorCode.GAUSS_500["GAUSS_50004"] % 't'
|
|
+ " Value: %s." % g_opts.action)
|
|
except Exception as e:
|
|
g_opts.logger.log(traceback.format_exc())
|
|
g_opts.logger.logExit(str(e))
|
|
|
|
# close the log file
|
|
g_opts.logger.closeLog()
|
|
except Exception as e:
|
|
GaussLog.exitWithError(str(e))
|
|
|
|
sys.exit(0)
|