Files
2024-05-31 10:51:25 +08:00

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