83 lines
3.4 KiB
Python
Executable File
83 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# RUN THIS SCRIPT AFTER oceanbase_upgrade_dep.yml MODIFIED
|
|
#
|
|
# PREPARE: install yaml with `pip install PyYaml` before run this script
|
|
# RUN: run this script in tools/upgrade/ directory
|
|
|
|
import yaml
|
|
import os
|
|
|
|
def get_yaml(filename):
|
|
yaml_data = None
|
|
with open(filename, 'r', encoding='utf-8') as f:
|
|
yaml_data = yaml.safe_load(f)
|
|
return yaml_data
|
|
|
|
def dump_to_yaml_obj(content):
|
|
return yaml.safe_dump(content, explicit_start=True, explicit_end=True, default_flow_style=False, encoding="utf-8")
|
|
|
|
def write_yaml_to_file(content, filename):
|
|
with open(filename, 'w',) as f :
|
|
yaml.safe_dump(content, f, explicit_start=True, explicit_end=True, default_flow_style=False, encoding="utf-8")
|
|
print('Dump yaml format data to file successfully. File path: {0}'.format(filename))
|
|
|
|
def collect_can_upgrade_from(target_ver):
|
|
target_set = set()
|
|
target_set.add(target_ver)
|
|
if target_ver in can_upgrade_from_map.keys():
|
|
can_upgrade_to_target_set = can_upgrade_from_map[target_ver]
|
|
for target in can_upgrade_to_target_set:
|
|
target_set.update(collect_can_upgrade_from(target))
|
|
return target_set
|
|
|
|
|
|
if __name__ == '__main__':
|
|
dir_path = os.path.dirname(os.path.realpath(__file__))
|
|
ob_upgrade_deps_file = dir_path + "/oceanbase_upgrade_dep.yml"
|
|
obcdc_compatiable_info_file = dir_path + "/obcdc_compatiable_ob_info.yaml"
|
|
ob_upgrade_deps = get_yaml(ob_upgrade_deps_file)
|
|
support_ob_versions = []
|
|
cur_ob_version = ''
|
|
|
|
# key: upgraded_to_version
|
|
# value: direct_upgrade_from_version_set
|
|
can_upgrade_from_map = {}
|
|
detect_cur_ob_ver_succ = False
|
|
|
|
if ob_upgrade_deps is not None:
|
|
for ob_ver in ob_upgrade_deps:
|
|
cur_ver = str(ob_ver['version'])
|
|
if 'can_be_upgraded_to' not in ob_ver.keys():
|
|
if detect_cur_ob_ver_succ:
|
|
print("duplicate detect cur_ob_version, last_detect_version: {cur_ob_version}, current_decect_info: {ob_ver}")
|
|
break
|
|
else:
|
|
detect_cur_ob_ver_succ = True
|
|
cur_ob_version = cur_ver
|
|
if can_upgrade_to not in can_upgrade_from_map.keys():
|
|
can_upgrade_from_set = set()
|
|
can_upgrade_from_map[can_upgrade_to] = can_upgrade_from_set
|
|
else:
|
|
can_upgrade_to_list = list(ob_ver['can_be_upgraded_to'])
|
|
for can_upgrade_to in can_upgrade_to_list:
|
|
if can_upgrade_to not in can_upgrade_from_map.keys():
|
|
can_upgrade_from_set = set()
|
|
can_upgrade_from_set.add(cur_ver)
|
|
can_upgrade_from_map[can_upgrade_to] = can_upgrade_from_set
|
|
else:
|
|
can_upgrade_from_map[can_upgrade_to].add(cur_ver)
|
|
|
|
|
|
if detect_cur_ob_ver_succ:
|
|
can_upgrade_from_set = can_upgrade_from_map[cur_ob_version]
|
|
can_upgrade_from_set.update(collect_can_upgrade_from(cur_ob_version))
|
|
res_map = {}
|
|
res_list = []
|
|
res_map["compatiable_ob_version"] = sorted(list(can_upgrade_from_set))
|
|
res_map["obcdc_version"] = cur_ob_version
|
|
res_list.append(res_map)
|
|
print(dump_to_yaml_obj(res_list))
|
|
write_yaml_to_file(res_list, obcdc_compatiable_info_file)
|