diff --git a/src/trueupdate.py b/src/trueupdate.py new file mode 100644 index 00000000..ae4dfcd7 --- /dev/null +++ b/src/trueupdate.py @@ -0,0 +1,90 @@ +import subprocess +import sys + +class Chart(object): + def __setattr__(self, name, value): + if name == 'status': + value = value.casefold() + if 'update_available' in name: + value = True if value.casefold() == "true" else False + super(Chart, self).__setattr__(name, value) + + def new_attr(self, attr): + setattr(self, attr, attr) + +INSTALLED_CHARTS = [] +CATALOG = "ALL" +SEMVER = "minor" + +def parse_headers(charts: str): + for line in charts.split("\n"): + if line.startswith("+-"): + continue + if "name" in line.casefold(): + return [col.strip() for col in line.casefold().strip().split("|") if col and col != ""] + +def parse_charts(charts: str): + headers = parse_headers(charts) + table_data = charts.split("\n")[3:-2:] # Skip the header part of the table + for row in table_data: + row = [section.strip() for section in row.split("|") if section and section != ""] + chart = Chart() + for item in zip(headers, row): + setattr(chart, item[0], item[1]) + INSTALLED_CHARTS.append(chart) + +def check_semver(current: str, latest: str): + split_current_semver = current.split(".", 3) + split_latest_semver = latest.split(".", 3) + if split_current_semver[0] != split_latest_semver[0]: + type="major" + if SEMVER == "major": + return True + if split_current_semver[1] != split_latest_semver[1]: + type="minor" + if SEMVER != "patch": + return True + if split_current_semver[2] != split_latest_semver[2]: + type="patch" + return True + return False + + +def execute_upgrades(): + if CATALOG == "ALL": + filtered = filter(lambda a: a.update_available and a.status == "active", INSTALLED_CHARTS) + else: + filtered = filter(lambda a: a.update_available and a.status == "active" and a.catalog == CATALOG, INSTALLED_CHARTS) + for chart in filtered: + pre_update_ver = chart.human_version + post_update_ver = chart.human_latest_version + split_current_version = chart.human_version.split("_", 1) + current_version = split_current_version[1] + split_latest = chart.human_latest_version.split("_", 1) + latest_version = split_latest[1] + if check_semver(current_version, latest_version): + pre_update_ver = chart.human_version + result = subprocess.run(['cli', '-c', f'app chart_release upgrade release_name={chart.name}'], capture_output=True) + post_update_ver = chart.human_latest_version + if "Upgrade complete" not in result.stdout.decode('utf-8'): + print(f"{chart.name} failed to upgrade. \n{result.stdout.decode('utf-8')}") + else: + print(f"{chart.name} upgraded ({pre_update_ver} --> {post_update_ver})") + +def fetch_charts(): + rawcharts = subprocess.run(["cli", "-c", "app chart_release query"], stdout=subprocess.PIPE) + charts = rawcharts.stdout.decode('utf-8') + return(charts) + +def get_args(): + if len(sys.argv) == 3: + SEMVER = sys.argv[2] or "minor" + if len(sys.argv) == 2: + CATALOG = sys.argv[1] or "ALL" + +if __name__ == '__main__': + get_args() + charts = fetch_charts() + parse_charts(charts) + execute_upgrades() + exit(0)