diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ba3cd7c --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ + + +SOURCE=SOURCES/weka-tools.tgz +SPECS=$(wildcard SPECS/*) + +TARG=RPMS/noarch/weka-tools-8.10-1.el8.x86_64.rpm +.PHONY: all clean Makefile + +all: ${SOURCE} ${TARG} + echo Done + +${TARG}: ${SOURCE} ${SPECS} + rpmbuild --define "_topdir ${CURDIR}" -ba ${SPECS} + +${SOURCE}: + tar -czvf ${SOURCE} --exclude-from=tar_excludes.txt * + +clean: + rm -rf ${TARG} BUILD BUILDROOT RPMS SRPMS ${SOURCE}/* diff --git a/SPECS/wekatools.spec b/SPECS/wekatools.spec new file mode 100644 index 0000000..4ab550b --- /dev/null +++ b/SPECS/wekatools.spec @@ -0,0 +1,46 @@ +Name: weka-tools +Version: 1.0 +Release: 1%{?dist} +Summary: WEKA Tools Collection +BuildArch: x86_64 + +License: GPL +URL: https://weka.io + +# unset __brp_mangle_shebangs - it chokes on ansible files. +%define __brp_mangle_shebangs /usr/bin/true + + +Requires: coreutils +Requires: tar +Requires: findutils + +# These all get installed in /opt/tools +Source0: weka-tools.tgz + +%define destdir /opt/tools + +%description +WEKA Tools Collection + +%build +echo Good + +%install +rm -rf $RPM_BUILD_ROOT + +install -d -m 0755 %{buildroot}%{destdir} +tar xvf %{SOURCE0} -C %{buildroot}%{destdir} + +%pre +# detach it from the git repo, if it exists +if [ -d %{destdir}/.git ]; then + rm -rf %{destdir}/.git +fi + +%files +%{destdir}/* + +%changelog +* Thu Feb 13 2025 Vince Fleming +-- diff --git a/install/wekaconfig b/install/wekaconfig index ec6ac9a..afa76fa 100755 Binary files a/install/wekaconfig and b/install/wekaconfig differ diff --git a/tar_excludes.txt b/tar_excludes.txt new file mode 100644 index 0000000..697b2fb --- /dev/null +++ b/tar_excludes.txt @@ -0,0 +1,9 @@ +tar_excludes.txt +.git* +BUILD* +RPMS +S* +Makefile +CNAME +_config.yml +.vscode diff --git a/weka_upgrade_checker/upgrade_path.json b/weka_upgrade_checker/upgrade_path.json index 8c15c1f..579fe5f 100644 --- a/weka_upgrade_checker/upgrade_path.json +++ b/weka_upgrade_checker/upgrade_path.json @@ -1,13 +1,14 @@ { - "4.4.1-2": ["4.2.16"], - "4.4.1": ["4.2.16"], - "4.4.0": ["4.2.16"], - "4.3.5.105": ["4.2.16"], - "4.3.5": ["4.2.16"], - "4.3.4-2": ["4.2.16"], - "4.3.3": ["4.2.16"], - "4.3.2.161": ["4.2.16"], - "4.3.0": ["4.2.16"], + "4.4.1-2": ["4.3.5.105"], + "4.4.1": ["4.3.5.105"], + "4.4.0": ["4.3.5.105"], + "4.3.5.105": ["4.3.0"], + "4.3.5": ["4.3.0"], + "4.3.4-2": ["4.3.0"], + "4.3.3": ["4.3.0"], + "4.3.2.161": ["4.3.0"], + "4.3.0": [""], + "4.2.18.14": ["4.1.2.36"], "4.2.16": ["4.1.2.36"], "4.2.15": ["4.1.2.36"], "4.2.14": ["4.1.2.36"], @@ -40,4 +41,4 @@ "4.0.2": ["3.14.1"], "4.0.1": ["3.14.1"], "4.0": ["3.14.1"] -} \ No newline at end of file +} diff --git a/weka_upgrade_checker/version.txt b/weka_upgrade_checker/version.txt index e1ebd35..b6e2cc7 100644 --- a/weka_upgrade_checker/version.txt +++ b/weka_upgrade_checker/version.txt @@ -1 +1 @@ -1.4.03 \ No newline at end of file +1.4.05 diff --git a/weka_upgrade_checker/weka_upgrade_checker b/weka_upgrade_checker/weka_upgrade_checker index cd20b8e..2a73560 100755 Binary files a/weka_upgrade_checker/weka_upgrade_checker and b/weka_upgrade_checker/weka_upgrade_checker differ diff --git a/weka_upgrade_checker/weka_upgrade_checker.py b/weka_upgrade_checker/weka_upgrade_checker.py index 85205f8..9878025 100755 --- a/weka_upgrade_checker/weka_upgrade_checker.py +++ b/weka_upgrade_checker/weka_upgrade_checker.py @@ -46,7 +46,7 @@ InvalidVersion = ValueError # Since distutils doesn't have InvalidVersion, we use a generic exception -pg_version = "1.4.03" +pg_version = "1.4.05" log_file_path = os.path.abspath("./weka_upgrade_checker.log") @@ -360,7 +360,7 @@ def check_version(): check_version() -def weka_cluster_checks(skip_mtu_check): +def weka_cluster_checks(skip_mtu_check, target_version): INFO("VERIFYING WEKA AGENT STATUS") weka_agent_service = subprocess.call( ["sudo", "service", "weka-agent", "status"], @@ -442,6 +442,12 @@ def clean_version_string(version_string): weka_version = clean_version_string(weka_versions) + if V(target_version) <= V(weka_version): + BAD( + f"Target version {target_version} should be higher than cluster version {weka_version}, cannot continue" + ) + sys.exit(1) + class Machine: def __init__(self, machine_json): self.name = str(machine_json["name"]) @@ -990,7 +996,7 @@ def run_command(node_id): ratio = usable_capacity / total_compute_memory if ratio > 2000: WARN( - f"The current ratio of {ratio} is below the recommended value, it is recommended to increase compute RAM" + f"The current ratio of {ratio} is below the recommended value and may cause performance issues during upgrade, it is recommended to increase compute RAM" ) else: GOOD("Memory to SSD ratio validation ok") @@ -3999,19 +4005,28 @@ def load_upgrade_map(upgrade_path): def parse_version(version): """Converts a version string into a Version object for comparison.""" + if not version or not isinstance(version, str) or version.strip() == "": + return None # Return None to indicate an invalid version return V(version) + def find_upgrade_path(weka_version, target_version, upgrade_map): path = [weka_version] # Start the path with the current version weka_version = parse_version(weka_version) target_version = parse_version(target_version) + if weka_version is None or target_version is None: + WARN("No valid upgrade path due to an invalid version in the upgrade map.") + return [] + while weka_version < target_version: next_versions = [ (ver, parse_version(ver)) for ver, min_ver in upgrade_map.items() if isinstance(min_ver, list) and len(min_ver) > 0 + and parse_version(min_ver[0]) is not None + and parse_version(ver) is not None and parse_version(min_ver[0]) <= weka_version and parse_version(ver) > weka_version ] @@ -4032,29 +4047,17 @@ def find_upgrade_path(weka_version, target_version, upgrade_map): try: upgrade_map = load_upgrade_map(upgrade_path) if not upgrade_map: - WARN( - "Invalid or empty upgrade map. Ensure upgrade_path.json exists and not empty." - ) + WARN("Invalid or empty upgrade map. Ensure upgrade_path.json exists and is not empty.") return upgrade_hops = find_upgrade_path(weka_version, target_version, upgrade_map) - if isinstance(upgrade_hops, list): - if len(upgrade_hops) >= 1: - total_hops = len(upgrade_hops) - 1 - if total_hops == 1: - total_hops = "Direct path upgrade" - print( - f"{colors.OKCYAN}Total upgrade hops: {total_hops}.{colors.ENDC}" - ) - elif len(upgrade_hops) > 1: - print( - f"{colors.OKCYAN}Total upgrade hops: {total_hops}.{colors.ENDC}" - ) - - print( - f"{colors.OKCYAN}Upgrade path: {' > '.join(upgrade_hops)}{colors.ENDC}" - ) + if upgrade_hops: # Only proceed if a valid path exists + total_hops = len(upgrade_hops) - 1 + if total_hops == 1: + total_hops = "Direct path upgrade" + print(f"{colors.OKCYAN}Total upgrade hops: {total_hops}.{colors.ENDC}") + print(f"{colors.OKCYAN}Upgrade path: {' > '.join(upgrade_hops)}{colors.ENDC}") # Check for known issues with protocol filtering check_known_issues( @@ -4066,10 +4069,9 @@ def find_upgrade_path(weka_version, target_version, upgrade_map): link_type, obj_store_enabled, ) - else: - WARN("Error: Upgrade path is not a valid list.") + except (FileNotFoundError, ValueError) as e: - WARN("Error:", e) + WARN(f"Error: {e}") def main(): @@ -4127,6 +4129,8 @@ def main(): parser.add_argument( "-t", "--target-version", + type=str, + required=True, help="Specify the target version for upgrade path calculation.", ) parser.add_argument( @@ -4137,6 +4141,8 @@ def main(): ) args = parser.parse_args() + if not args.target_version: + parser.error("--target-version is required.") ssh_identity = args.ssh_identity or None @@ -4145,7 +4151,7 @@ def main(): sys.exit(0) if args.run_all_checks: - weka_cluster_results = weka_cluster_checks(skip_mtu_check=args.skip_mtu_check) + weka_cluster_results = weka_cluster_checks(skip_mtu_check=args.skip_mtu_check, target_version=args.target_version) backend_hosts = weka_cluster_results[0] ssh_bk_hosts = weka_cluster_results[1] client_hosts = weka_cluster_results[2] @@ -4171,13 +4177,13 @@ def main(): sys.exit(0) elif args.cluster_checks_only: - weka_cluster_checks(skip_mtu_check=args.skip_mtu_check) + weka_cluster_checks(skip_mtu_check=args.skip_mtu_check, target_version=args.target_version) cluster_summary() INFO(f"Cluster upgrade checks complete!") sys.exit(0) elif args.check_specific_backend_hosts: - weka_cluster_results = weka_cluster_checks(skip_mtu_check=args.skip_mtu_check) + weka_cluster_results = weka_cluster_checks(skip_mtu_check=args.skip_mtu_check, target_version=args.target_version) backend_hosts = weka_cluster_results[0] ssh_bk_hosts = weka_cluster_results[1] client_hosts = weka_cluster_results[2] @@ -4202,7 +4208,7 @@ def main(): sys.exit(0) elif args.skip_client_checks: - weka_cluster_results = weka_cluster_checks(skip_mtu_check=args.skip_mtu_check) + weka_cluster_results = weka_cluster_checks(skip_mtu_check=args.skip_mtu_check, target_version=args.target_version) backend_hosts = weka_cluster_results[0] ssh_bk_hosts = weka_cluster_results[1] client_hosts = weka_cluster_results[2]