diff --git a/.gitea/workflows/check_manifest.yaml b/.gitea/workflows/check_manifest.yaml new file mode 100644 index 0000000..19ac1b5 --- /dev/null +++ b/.gitea/workflows/check_manifest.yaml @@ -0,0 +1,23 @@ +name: Check Release Manifest Local Charts Versions +on: + pull_request: + branches-ignore: + - "devel" + + +jobs: + sync-pr-project: + name: "Check Release Manifest Local Charts Versions" + runs-on: tumbleweed + steps: + # Waiting on PR to get merged for support in upstream action/checkout action + - uses: 'https://github.com/yangskyboxlabs/action-checkout@sha256' + name: Checkout repository + with: + object-format: 'sha256' + - name: Setup dependencies + run: | + zypper in -y python3-ruamel.yaml + - name: Check release manifest + run: | + python3 .obs/manifest-check.py --check diff --git a/.obs/manifest-check.py b/.obs/manifest-check.py new file mode 100755 index 0000000..cf862d1 --- /dev/null +++ b/.obs/manifest-check.py @@ -0,0 +1,84 @@ +#!/usr/bin/python3 + +import ruamel.yaml +import pathlib +import argparse +import sys + +yaml = ruamel.yaml.YAML() + +def get_chart_version(chart_name: str) -> str: + with open(f"./{chart_name}/Chart.yaml") as f: + chart = yaml.load(f) + return chart["version"] + +def get_charts(chart): + if not chart["chart"].startswith("%%CHART_REPO%%"): + # Not a locally managed chart + return {} + + chart_name = chart["chart"][len("%%CHART_REPO%%/%%IMG_PREFIX%%"):] + charts = { chart_name: chart["version"] } + for child_chart in chart.get("dependencyCharts", []) + chart.get("addonCharts", []): + charts.update(get_charts(child_chart)) + return charts + +def get_charts_list(): + with open("./release-manifest-image/release_manifest.yaml") as f: + manifest = yaml.load(f) + charts = {} + for chart in manifest["spec"]["components"]["workloads"]["helm"]: + charts.update(get_charts(chart)) + return charts + +def check_charts(fix: bool) -> bool: + success = True + charts = get_charts_list() + to_fix = {} + for chart in charts: + expected_version = get_chart_version(chart) + if expected_version != charts[chart]: + success = False + to_fix[f'%%CHART_REPO%%/%%IMG_PREFIX%%{chart}'] = expected_version + print(f"{chart}: Expected: {expected_version}, Got: {charts[chart]}") + if fix and not success: + fix_charts(to_fix) + return True + return success + +def fix_charts(to_fix): + manifest_path = pathlib.Path("./release-manifest-image/release_manifest.yaml") + manifest = yaml.load(manifest_path) + yaml.indent(mapping=2, sequence=4, offset=2) + yaml.width = 4096 + for chart_index, chart in enumerate(manifest["spec"]["components"]["workloads"]["helm"]): + changed = False + if chart["chart"] in to_fix.keys(): + changed = True + chart["version"] = to_fix[chart["chart"]] + for subchart_index, subchart in enumerate(chart.get("addonCharts", [])): + if subchart["chart"] in to_fix.keys(): + changed = True + subchart["version"] = to_fix[subchart["chart"]] + chart["addonCharts"][subchart_index] = subchart + for subchart_index, subchart in enumerate(chart.get("dependencyCharts", [])): + if subchart["chart"] in to_fix.keys(): + changed = True + subchart["version"] = to_fix[subchart["chart"]] + chart["dependencyCharts"][subchart_index] = subchart + if changed: + manifest["spec"]["components"]["workloads"]["helm"][chart_index] = chart + yaml.dump(manifest, manifest_path) + +def main(): + print("Checking charts versions in release manifest") + parser = argparse.ArgumentParser() + parser.add_argument('-c', '--check', action='store_true') + args = parser.parse_args() + if not check_charts(not args.check): + sys.exit(1) + else: + print("All local charts in release manifest are using the right version") + +if __name__ == "__main__": + main() diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..6297996 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,10 @@ +repos: + - repo: local + hooks: + - id: check-manifest + name: "Check release-manifest" + entry: .obs/manifest-check.py + language: python + additional_dependencies: ['ruamel.yaml'] + pass_filenames: false + always_run: true diff --git a/release-manifest-image/release_manifest.yaml b/release-manifest-image/release_manifest.yaml index 2f3135f..0829fb2 100644 --- a/release-manifest-image/release_manifest.yaml +++ b/release-manifest-image/release_manifest.yaml @@ -76,13 +76,13 @@ spec: version: 0.0.0 type: HelmChart operatingSystem: - version: "6.0" - zypperID: "SL-Micro" - cpeScheme: "cpe:/o:suse:sl-micro:6.0" - prettyName: "SUSE Linux Micro 6.0" + version: '6.0' + zypperID: SL-Micro + cpeScheme: cpe:/o:suse:sl-micro:6.0 + prettyName: SUSE Linux Micro 6.0 supportedArchs: - - "x86_64" - - "aarch64" + - x86_64 + - aarch64 workloads: helm: - prettyName: Rancher @@ -105,20 +105,20 @@ spec: repository: https://charts.rancher.io - prettyName: MetalLB releaseName: metallb - chart: %%CHART_REPO%%/%%IMG_PREFIX%%metallb-chart - version: %%CHART_MAJOR%%.0.1+up0.14.9 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%metallb-chart' + version: '%%CHART_MAJOR%%.0.1+up0.14.9' - prettyName: CDI releaseName: cdi - chart: %%CHART_REPO%%/%%IMG_PREFIX%%cdi-chart - version: %%CHART_MAJOR%%.0.0+up0.4.0 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%cdi-chart' + version: '%%CHART_MAJOR%%.0.0+up0.4.0' - prettyName: KubeVirt releaseName: kubevirt - chart: %%CHART_REPO%%/%%IMG_PREFIX%%kubevirt-chart - version: %%CHART_MAJOR%%.0.0+up0.4.0 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%kubevirt-chart' + version: '%%CHART_MAJOR%%.0.0+up0.4.0' addonCharts: - releaseName: kubevirt-dashboard-extension - chart: %%CHART_REPO%%/%%IMG_PREFIX%%kubevirt-dashboard-extension-chart - version: %%CHART_MAJOR%%.0.0+up1.2.1 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%kubevirt-dashboard-extension-chart' + version: '%%CHART_MAJOR%%.0.0+up1.2.1' - prettyName: NeuVector releaseName: neuvector chart: neuvector @@ -136,8 +136,8 @@ spec: version: 2.0.1 - prettyName: EndpointCopierOperator releaseName: endpoint-copier-operator - chart: %%CHART_REPO%%/%%IMG_PREFIX%%endpoint-copier-operator-chart - version: %%CHART_MAJOR%%.0.0+up0.2.1 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%endpoint-copier-operator-chart' + version: '%%CHART_MAJOR%%.0.0+up0.2.1' - prettyName: Elemental releaseName: elemental-operator chart: oci://registry.suse.com/rancher/elemental-operator-chart @@ -153,25 +153,25 @@ spec: version: 3.0.0 - prettyName: SRIOV releaseName: sriov-network-operator - chart: %%CHART_REPO%%/%%IMG_PREFIX%%sriov-network-operator-chart - version: %%CHART_MAJOR%%.0.0+up1.4.0 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%sriov-network-operator-chart' + version: '%%CHART_MAJOR%%.0.0+up1.4.0' dependencyCharts: - releaseName: sriov-crd - chart: %%CHART_REPO%%/%%IMG_PREFIX%%sriov-crd-chart - version: %%CHART_MAJOR%%.0.0+up1.4.0 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%sriov-crd-chart' + version: '%%CHART_MAJOR%%.0.0+up1.4.0' - prettyName: Akri releaseName: akri - chart: %%CHART_REPO%%/%%IMG_PREFIX%%akri-chart - version: %%CHART_MAJOR%%.0.0+up0.12.20 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%akri-chart' + version: '%%CHART_MAJOR%%.0.0+up0.12.20' addonCharts: - releaseName: akri-dashboard-extension - chart: %%CHART_REPO%%/%%IMG_PREFIX%%akri-dashboard-extension-chart - version: %%CHART_MAJOR%%.0.0+up1.2.1 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%akri-dashboard-extension-chart' + version: '%%CHART_MAJOR%%.0.0+up1.2.1' - prettyName: Metal3 releaseName: metal3 - chart: %%CHART_REPO%%/%%IMG_PREFIX%%metal3-chart - version: %%CHART_MAJOR%%.0.1+up0.9.4 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%metal3-chart' + version: '%%CHART_MAJOR%%.0.1+up0.9.4' - prettyName: RancherTurtles releaseName: rancher-turtles - chart: %%CHART_REPO%%/%%IMG_PREFIX%%rancher-turtles-chart - version: %%CHART_MAJOR%%.0.0+up0.14.1 + chart: '%%CHART_REPO%%/%%IMG_PREFIX%%rancher-turtles-chart' + version: '%%CHART_MAJOR%%.0.0+up0.14.1'