216 lines
7.0 KiB
Python
216 lines
7.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding:utf-8 -*-
|
|
#############################################################################
|
|
# Copyright (c) 2023 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 : gs_upgradechk is a utility to check meta data in gaussdb after upgrade.
|
|
#############################################################################
|
|
"""
|
|
”工程“文件,将整个程序的运行抽象为一个工程类。
|
|
通过这个功能工程类来启动和运行工程。
|
|
"""
|
|
|
|
import time
|
|
import os
|
|
|
|
from upgrade_checker.utils.param import Action, ReportFormat, ReportMode, Param
|
|
from upgrade_checker.log import logger
|
|
from upgrade_checker.opengauss import og
|
|
from upgrade_checker.report import Reporter
|
|
from upgrade_checker.rules.vmap import VerifyMap
|
|
from upgrade_checker.verifier import Collector, Analyzer, Exporter
|
|
|
|
|
|
class Project(object):
|
|
|
|
def __init__(self, param):
|
|
"""
|
|
初始化程序运行的各种数据参数,主要拼接路径,路径的创建等后续逐步进行。
|
|
:param param: 启动参数
|
|
"""
|
|
assert param.action != Action.HELP
|
|
self.param = param
|
|
|
|
self.dir_root = param.root_path
|
|
self.dir_workspace = "{0}/workspace".format(self.dir_root)
|
|
self.dir_vmap = "{0}/vmap".format(self.dir_workspace)
|
|
self.dir_results = "{0}/results".format(self.dir_root)
|
|
|
|
self.id = int(time.time())
|
|
self.name = "{0}-{1}".format(
|
|
param.action.name,
|
|
time.strftime('%Y-%m-%d-%H_%M_%S', time.localtime(self.id))
|
|
)
|
|
self.workspace = "{0}/{1}_{2}".format(self.dir_workspace, self.name, os.getpid())
|
|
self.log = "{0}/run.log".format(self.workspace)
|
|
|
|
def __str__(self):
|
|
info = self.param.__str__()
|
|
info += 'dir_root: ' + self.dir_root + '\n'
|
|
info += 'dir_workspace: ' + self.dir_workspace + '\n'
|
|
info += 'dir_vmap: ' + self.dir_vmap + '\n'
|
|
info += 'dir_results: ' + self.dir_results + '\n'
|
|
info += 'id: ' + str(self.id) + '\n'
|
|
info += 'name: ' + self.name + '\n'
|
|
info += 'workspace: ' + self.workspace + '\n'
|
|
info += 'log: ' + self.log + '\n'
|
|
return info
|
|
|
|
def _prepare_workspace(self):
|
|
"""
|
|
创建工作目录文件夹等。
|
|
:return:
|
|
"""
|
|
if not os.access(self.dir_root, os.F_OK):
|
|
os.mkdir(self.dir_root, 0o700)
|
|
|
|
if not os.access(self.dir_workspace, os.F_OK):
|
|
os.mkdir(self.dir_workspace, 0o700)
|
|
|
|
if not os.access(self.dir_vmap, os.F_OK):
|
|
os.mkdir(self.dir_vmap, 0o700)
|
|
|
|
if not os.access(self.dir_results, os.F_OK):
|
|
os.mkdir(self.dir_results, 0o700)
|
|
|
|
os.mkdir(self.workspace, 0o700)
|
|
|
|
def init(self):
|
|
self._prepare_workspace()
|
|
|
|
logger.set_file(self.log)
|
|
logger.set_debug(self.param.debug.value)
|
|
|
|
og.connect('postgres', self.param.port.value)
|
|
|
|
def run(self):
|
|
pass
|
|
|
|
def close(self):
|
|
pass
|
|
|
|
|
|
class ExportProj(Project):
|
|
def __init__(self, param):
|
|
assert param.action == Action.EXPORT
|
|
super(ExportProj, self).__init__(param)
|
|
self.vmap = "{0}/{1}.vmap".format(self.dir_results, self.name)
|
|
|
|
def __str__(self):
|
|
info = 'Export Project as:'
|
|
info += super(ExportProj, self).__str__()
|
|
info += 'vmap: ' + self.vmap + '\n'
|
|
return info
|
|
|
|
def init(self):
|
|
super(ExportProj, self).init()
|
|
|
|
logger.log("工程初始配置完成。")
|
|
logger.debug('工程信息:\n' + self.__str__())
|
|
|
|
def run(self):
|
|
db_list = Collector.prepare_db_list(self.param)
|
|
collector = Collector(db_list)
|
|
exporter = Exporter(self.vmap)
|
|
|
|
logger.info('开始进行数据采集与记录。')
|
|
for rule in collector:
|
|
exporter.record(rule)
|
|
|
|
percentage = collector.get_progress()
|
|
logger.process_bar(percentage)
|
|
|
|
logger.process_bar(100)
|
|
logger.info('数据采集与记录完成,开始导出基准校验地图。')
|
|
exporter.export()
|
|
logger.info('基准校验地图导出完成:{0}'.format(self.vmap))
|
|
|
|
def close(self):
|
|
return self.vmap
|
|
|
|
|
|
class VerifyProj(Project):
|
|
def __init__(self, param):
|
|
assert param.action == Action.VERIFY
|
|
super(VerifyProj, self).__init__(param)
|
|
self.vmap = self.param.vmap.value
|
|
self.report = "{0}/{1}-report.{2}".format(
|
|
self.dir_results,
|
|
self.name,
|
|
ReportFormat.suffix(self.param.report_format.value)
|
|
)
|
|
|
|
def __str__(self):
|
|
info = 'Verify Project as:'
|
|
info += super(VerifyProj, self).__str__()
|
|
info += 'vmap: ' + self.vmap + '\n'
|
|
info += 'report: ' + self.report + '\n'
|
|
return info
|
|
|
|
def init(self):
|
|
super(VerifyProj, self).init()
|
|
|
|
# 准备基准校验文件,仅保证文件存在,是否可用将在后续加载时校验
|
|
if self.vmap is not None:
|
|
if os.access(self.vmap, os.F_OK):
|
|
return
|
|
else:
|
|
logger.err('指定的基准校验地图文件{0}不存在。'.format(self.vmap))
|
|
self.vmap = VerifyMap.prepare_vmap_file(self.dir_vmap)
|
|
|
|
logger.log("工程初始配置完成。")
|
|
logger.debug('工程信息:\n' + self.__str__())
|
|
|
|
def run(self):
|
|
db_list = Collector.prepare_db_list(self.param)
|
|
collector = Collector(db_list)
|
|
analyzer = Analyzer(self.vmap)
|
|
reporter = Reporter(self.report,
|
|
self.param.report_format.value,
|
|
self.param.report_mode.value)
|
|
reporter.record_info(og, analyzer.vmap)
|
|
|
|
logger.info('开始进行数据采集与分析。')
|
|
for rule in collector:
|
|
conclusion = analyzer.analyze(rule)
|
|
reporter.record(collector.current_db(), conclusion)
|
|
|
|
percentage = collector.get_progress()
|
|
logger.process_bar(percentage)
|
|
|
|
logger.process_bar(100)
|
|
logger.info('数据采集与分析完成,准备整理报告。')
|
|
reporter.report()
|
|
logger.info('报告导出完成:{0}'.format(self.report))
|
|
|
|
def close(self):
|
|
return self.report
|
|
|
|
|
|
class ProjectFactory(object):
|
|
@staticmethod
|
|
def produce(param):
|
|
if param.action == Action.EXPORT:
|
|
return ExportProj(param)
|
|
elif param.action == Action.VERIFY:
|
|
return VerifyProj(param)
|
|
else:
|
|
assert False
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pass
|