From c6b63263d605293ee4b426f855efbdea62da2d2f Mon Sep 17 00:00:00 2001 From: Lars Francke Date: Tue, 3 Nov 2026 00:15:25 +0100 Subject: [PATCH 1/2] feat(olm): Set createdAt and the CSI feature annotation --- scripts/generate-olm.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/scripts/generate-olm.py b/scripts/generate-olm.py index 20dd8815..89d6b1a3 100755 --- a/scripts/generate-olm.py +++ b/scripts/generate-olm.py @@ -20,9 +20,11 @@ Requirements: - uv (https://docs.astral.sh/uv/) — installs PyYAML automatically - helm (https://helm.sh) + - git (createdAt is the commit date of the checked-out release tag) """ import argparse +import datetime import subprocess import json import urllib.request @@ -1286,6 +1288,32 @@ def min_kube_version(release: str) -> str: return lowest_kube_version(platforms) +def created_at() -> str: + """Return the commit date of the checked-out commit, so createdAt stays the same when the bundle is rebuilt.""" + try: + result = subprocess.run( + ["git", "log", "-1", "--format=%ct"], + capture_output=True, + text=True, + check=True, + cwd=REPO_ROOT, + ) + except subprocess.CalledProcessError as exc: + raise RuntimeError(f"Failed to read the commit date: {exc.stderr}") from exc + return format_created_at(int(result.stdout)) + + +def format_created_at(epoch_seconds: int) -> str: + """Format a Unix timestamp the way OLM bundles write createdAt, in UTC. + + >>> format_created_at(1784628000) + '2026-07-21T10:00:00Z' + """ + return datetime.datetime.fromtimestamp( + epoch_seconds, tz=datetime.timezone.utc + ).strftime("%Y-%m-%dT%H:%M:%SZ") + + def build_csv( version: str, helm_docs: list[dict], @@ -1379,7 +1407,7 @@ def build_csv( "operatorframework.io/suggested-namespace": "stackable-operators", "features.operators.openshift.io/cnf": "false", "features.operators.openshift.io/cni": "false", - "features.operators.openshift.io/csi": "false", + "features.operators.openshift.io/csi": "true", "features.operators.openshift.io/disconnected": "false", "features.operators.openshift.io/fips-compliant": "false", "features.operators.openshift.io/proxy-aware": "false", @@ -1392,6 +1420,7 @@ def build_csv( "capabilities": "Basic Install", "description": chart["description"], "repository": "https://github.com/stackabletech/listener-operator", + "createdAt": created_at(), "com.redhat.openshift.versions": openshift_versions, }, }, From 0b894df4fb9c693a744fe24b3da21989f09e76c2 Mon Sep 17 00:00:00 2001 From: Lars Francke Date: Thu, 12 Nov 2026 13:48:35 +0100 Subject: [PATCH 2/2] chore(olm): Fix ruff findings in the OLM script --- scripts/generate-olm.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/scripts/generate-olm.py b/scripts/generate-olm.py index 89d6b1a3..e77456c6 100755 --- a/scripts/generate-olm.py +++ b/scripts/generate-olm.py @@ -25,15 +25,14 @@ import argparse import datetime -import subprocess import json -import urllib.request +import subprocess import urllib.error +import urllib.request from pathlib import Path import yaml - SCRIPT_DIR = Path(__file__).parent.resolve() REPO_ROOT = SCRIPT_DIR.parent HELM_CHART = REPO_ROOT / "deploy" / "helm" / "listener-operator" @@ -1181,9 +1180,7 @@ def build_configmap( key = "storageclass.yaml" elif kind == "Service": key = "service.yaml" - elif kind == "DaemonSet": - key = f"{name}.yaml" - elif kind == "Deployment": + elif kind == "DaemonSet" or kind == "Deployment": key = f"{name}.yaml" else: continue @@ -1309,9 +1306,9 @@ def format_created_at(epoch_seconds: int) -> str: >>> format_created_at(1784628000) '2026-07-21T10:00:00Z' """ - return datetime.datetime.fromtimestamp( - epoch_seconds, tz=datetime.timezone.utc - ).strftime("%Y-%m-%dT%H:%M:%SZ") + return datetime.datetime.fromtimestamp(epoch_seconds, tz=datetime.UTC).strftime( + "%Y-%m-%dT%H:%M:%SZ" + ) def build_csv(