From f01d551eae59bc9397b0fc03443e6369a74c1465 Mon Sep 17 00:00:00 2001 From: Nick Larsen Date: Mon, 21 Jul 2025 16:40:25 +0200 Subject: [PATCH 1/3] chore: Bump to 25.7.0-rc1 --- .../03-enable-and-run-spark-dag.yaml | 2 +- .../airflow-scheduled-job/04-enable-and-run-date-dag.yaml | 2 +- .../create-nifi-ingestion-job.yaml | 4 ++-- .../create-spark-ingestion-job.yaml | 6 +++--- .../create-trino-tables.yaml | 4 ++-- .../setup-superset.yaml | 2 +- demos/end-to-end-security/create-spark-report.yaml | 4 ++-- demos/end-to-end-security/create-trino-tables.yaml | 2 +- .../create-hfile-and-import-to-hbase.yaml | 2 +- .../load-test-data.yaml | 2 +- .../create-druid-ingestion-job.yaml | 4 ++-- .../create-nifi-ingestion-job.yaml | 4 ++-- .../nifi-kafka-druid-earthquake-data/setup-superset.yaml | 4 ++-- .../create-druid-ingestion-job.yaml | 4 ++-- .../create-nifi-ingestion-job.yaml | 4 ++-- .../nifi-kafka-druid-water-level-data/setup-superset.yaml | 4 ++-- demos/signal-processing/Dockerfile-nifi | 2 +- demos/signal-processing/create-nifi-ingestion-job.yaml | 4 ++-- demos/signal-processing/create-timescale-tables.yaml | 2 +- .../create-spark-anomaly-detection-job.yaml | 4 ++-- .../setup-superset.yaml | 2 +- demos/trino-taxi-data/create-table-in-trino.yaml | 2 +- demos/trino-taxi-data/setup-superset.yaml | 2 +- stacks/_templates/keycloak.yaml | 2 +- stacks/end-to-end-security/krb5.yaml | 8 ++++---- stacks/end-to-end-security/setup-postgresql.yaml | 2 +- stacks/end-to-end-security/superset.yaml | 2 +- stacks/jupyterhub-keycloak/jupyterhub.yaml | 2 +- stacks/jupyterhub-keycloak/keycloak.yaml | 2 +- stacks/jupyterhub-pyspark-hdfs/jupyterlab.yaml | 4 ++-- stacks/jupyterhub-pyspark-hdfs/spark_connect.yaml | 2 +- stacks/keycloak-opa-poc/keycloak.yaml | 2 +- stacks/keycloak-opa-poc/setup-keycloak.yaml | 2 +- stacks/logging/setup-opensearch-dashboards.yaml | 2 +- stacks/signal-processing/jupyterhub.yaml | 4 ++-- stacks/signal-processing/nifi.yaml | 2 +- 36 files changed, 54 insertions(+), 54 deletions(-) diff --git a/demos/airflow-scheduled-job/03-enable-and-run-spark-dag.yaml b/demos/airflow-scheduled-job/03-enable-and-run-spark-dag.yaml index 32257322..18130730 100644 --- a/demos/airflow-scheduled-job/03-enable-and-run-spark-dag.yaml +++ b/demos/airflow-scheduled-job/03-enable-and-run-spark-dag.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: start-pyspark-job - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 # N.B. it is possible for the scheduler to report that a DAG exists, only for the worker task to fail if a pod is unexpectedly # restarted. Additionally, the db-init job takes a few minutes to complete before the cluster is deployed. The wait/watch steps # below are not "water-tight" but add a layer of stability by at least ensuring that the db is initialized and ready and that diff --git a/demos/airflow-scheduled-job/04-enable-and-run-date-dag.yaml b/demos/airflow-scheduled-job/04-enable-and-run-date-dag.yaml index 3c13cbe9..39a94301 100644 --- a/demos/airflow-scheduled-job/04-enable-and-run-date-dag.yaml +++ b/demos/airflow-scheduled-job/04-enable-and-run-date-dag.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: start-date-job - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 # N.B. it is possible for the scheduler to report that a DAG exists, only for the worker task to fail if a pod is unexpectedly # restarted. Additionally, the db-init job takes a few minutes to complete before the cluster is deployed. The wait/watch steps # below are not "water-tight" but add a layer of stability by at least ensuring that the db is initialized and ready and that diff --git a/demos/data-lakehouse-iceberg-trino-spark/create-nifi-ingestion-job.yaml b/demos/data-lakehouse-iceberg-trino-spark/create-nifi-ingestion-job.yaml index 201f81f9..ed70cc51 100644 --- a/demos/data-lakehouse-iceberg-trino-spark/create-nifi-ingestion-job.yaml +++ b/demos/data-lakehouse-iceberg-trino-spark/create-nifi-ingestion-job.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-kafka - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -22,7 +22,7 @@ spec: kubectl wait --for=condition=ready --timeout=30m pod -l app.kubernetes.io/instance=kafka,app.kubernetes.io/name=kafka containers: - name: create-nifi-ingestion-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/data-lakehouse-iceberg-trino-spark/create-spark-ingestion-job.yaml b/demos/data-lakehouse-iceberg-trino-spark/create-spark-ingestion-job.yaml index 8bd8c692..4abd5c54 100644 --- a/demos/data-lakehouse-iceberg-trino-spark/create-spark-ingestion-job.yaml +++ b/demos/data-lakehouse-iceberg-trino-spark/create-spark-ingestion-job.yaml @@ -12,7 +12,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-resources - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -26,7 +26,7 @@ spec: echo 'Waiting for all nifi instances to be ready' kubectl wait --for=condition=ready --timeout=30m pod -l app.kubernetes.io/name=nifi,app.kubernetes.io/instance=nifi - name: wait-for-kafka-topics - image: oci.stackable.tech/sdp/kafka:3.9.1-stackable25.7.0 + image: oci.stackable.tech/sdp/kafka:3.9.1-stackable25.7.0-rc1 command: - bash - -euo @@ -92,7 +92,7 @@ spec: mountPath: /stackable/tls-kcat containers: - name: create-spark-ingestion-job - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/data-lakehouse-iceberg-trino-spark/create-trino-tables.yaml b/demos/data-lakehouse-iceberg-trino-spark/create-trino-tables.yaml index 18a3d746..86580a62 100644 --- a/demos/data-lakehouse-iceberg-trino-spark/create-trino-tables.yaml +++ b/demos/data-lakehouse-iceberg-trino-spark/create-trino-tables.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-testdata - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -20,7 +20,7 @@ spec: kubectl wait --for=condition=complete --timeout=30m job/load-test-data containers: - name: create-tables-in-trino - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: ["bash", "-c", "python -u /tmp/script/script.py"] volumeMounts: - name: script diff --git a/demos/data-lakehouse-iceberg-trino-spark/setup-superset.yaml b/demos/data-lakehouse-iceberg-trino-spark/setup-superset.yaml index faf21e3b..248c26ab 100644 --- a/demos/data-lakehouse-iceberg-trino-spark/setup-superset.yaml +++ b/demos/data-lakehouse-iceberg-trino-spark/setup-superset.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: setup-superset - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/end-to-end-security/create-spark-report.yaml b/demos/end-to-end-security/create-spark-report.yaml index a3d6eb8c..53f4f71a 100644 --- a/demos/end-to-end-security/create-spark-report.yaml +++ b/demos/end-to-end-security/create-spark-report.yaml @@ -12,7 +12,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-trino-tables - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo @@ -23,7 +23,7 @@ spec: kubectl wait --timeout=30m --for=condition=complete job/create-tables-in-trino containers: - name: create-spark-report - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/end-to-end-security/create-trino-tables.yaml b/demos/end-to-end-security/create-trino-tables.yaml index 50771fca..a9b464ea 100644 --- a/demos/end-to-end-security/create-trino-tables.yaml +++ b/demos/end-to-end-security/create-trino-tables.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: create-tables-in-trino - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: ["bash", "-c", "python -u /tmp/script/script.py"] volumeMounts: - name: script diff --git a/demos/hbase-hdfs-load-cycling-data/create-hfile-and-import-to-hbase.yaml b/demos/hbase-hdfs-load-cycling-data/create-hfile-and-import-to-hbase.yaml index abccf2e9..13a044b8 100644 --- a/demos/hbase-hdfs-load-cycling-data/create-hfile-and-import-to-hbase.yaml +++ b/demos/hbase-hdfs-load-cycling-data/create-hfile-and-import-to-hbase.yaml @@ -9,7 +9,7 @@ spec: spec: containers: - name: create-hfile-and-import-to-hbase - image: oci.stackable.tech/sdp/hbase:2.6.1-stackable25.7.0 + image: oci.stackable.tech/sdp/hbase:2.6.1-stackable25.7.0-rc1 env: - name: HADOOP_USER_NAME value: stackable diff --git a/demos/jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data/load-test-data.yaml b/demos/jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data/load-test-data.yaml index 3c8773be..31dde424 100644 --- a/demos/jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data/load-test-data.yaml +++ b/demos/jupyterhub-pyspark-hdfs-anomaly-detection-taxi-data/load-test-data.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: load-ny-taxi-data - image: oci.stackable.tech/sdp/hadoop:3.4.1-stackable25.7.0 + image: oci.stackable.tech/sdp/hadoop:3.4.1-stackable25.7.0-rc1 # yamllint disable rule:line-length command: ["bash", "-c", "/stackable/hadoop/bin/hdfs dfs -mkdir -p /ny-taxi-data/raw \ && cd /tmp \ diff --git a/demos/nifi-kafka-druid-earthquake-data/create-druid-ingestion-job.yaml b/demos/nifi-kafka-druid-earthquake-data/create-druid-ingestion-job.yaml index aa2c037a..f046e448 100644 --- a/demos/nifi-kafka-druid-earthquake-data/create-druid-ingestion-job.yaml +++ b/demos/nifi-kafka-druid-earthquake-data/create-druid-ingestion-job.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-druid-coordinator - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -22,7 +22,7 @@ spec: kubectl wait --for=condition=Ready pod/druid-coordinator-default-0 --timeout=30m containers: - name: create-druid-ingestion-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/nifi-kafka-druid-earthquake-data/create-nifi-ingestion-job.yaml b/demos/nifi-kafka-druid-earthquake-data/create-nifi-ingestion-job.yaml index 15f2807e..c364c372 100644 --- a/demos/nifi-kafka-druid-earthquake-data/create-nifi-ingestion-job.yaml +++ b/demos/nifi-kafka-druid-earthquake-data/create-nifi-ingestion-job.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-nifi - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -22,7 +22,7 @@ spec: kubectl wait --for=condition=Ready pod/nifi-node-default-0 --timeout=30m containers: - name: create-nifi-ingestion-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/nifi-kafka-druid-earthquake-data/setup-superset.yaml b/demos/nifi-kafka-druid-earthquake-data/setup-superset.yaml index 6afd419f..0f40c982 100644 --- a/demos/nifi-kafka-druid-earthquake-data/setup-superset.yaml +++ b/demos/nifi-kafka-druid-earthquake-data/setup-superset.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-superset - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -22,7 +22,7 @@ spec: kubectl wait --for=condition=Ready pod/superset-node-default-0 --timeout=30m containers: - name: setup-superset - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/nifi-kafka-druid-water-level-data/create-druid-ingestion-job.yaml b/demos/nifi-kafka-druid-water-level-data/create-druid-ingestion-job.yaml index 4323b121..7ae387fb 100644 --- a/demos/nifi-kafka-druid-water-level-data/create-druid-ingestion-job.yaml +++ b/demos/nifi-kafka-druid-water-level-data/create-druid-ingestion-job.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-druid-coordinator - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -22,7 +22,7 @@ spec: kubectl wait --for=condition=Ready pod/druid-coordinator-default-0 --timeout=30m containers: - name: create-druid-ingestion-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/nifi-kafka-druid-water-level-data/create-nifi-ingestion-job.yaml b/demos/nifi-kafka-druid-water-level-data/create-nifi-ingestion-job.yaml index f02c6f08..54e23b48 100644 --- a/demos/nifi-kafka-druid-water-level-data/create-nifi-ingestion-job.yaml +++ b/demos/nifi-kafka-druid-water-level-data/create-nifi-ingestion-job.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-nifi - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -22,7 +22,7 @@ spec: kubectl wait --for=condition=Ready pod/nifi-node-default-0 --timeout=30m containers: - name: create-nifi-ingestion-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/nifi-kafka-druid-water-level-data/setup-superset.yaml b/demos/nifi-kafka-druid-water-level-data/setup-superset.yaml index 3f74b1e3..162e75b1 100644 --- a/demos/nifi-kafka-druid-water-level-data/setup-superset.yaml +++ b/demos/nifi-kafka-druid-water-level-data/setup-superset.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-superset - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -22,7 +22,7 @@ spec: kubectl wait --for=condition=Ready pod/superset-node-default-0 --timeout=30m containers: - name: setup-superset - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/signal-processing/Dockerfile-nifi b/demos/signal-processing/Dockerfile-nifi index 2c8a1973..ecd5ef50 100644 --- a/demos/signal-processing/Dockerfile-nifi +++ b/demos/signal-processing/Dockerfile-nifi @@ -1,4 +1,4 @@ -FROM oci.stackable.tech/sdp/nifi:2.2.0-stackable25.7.0 +FROM oci.stackable.tech/sdp/nifi:2.2.0-stackable25.7.0-rc1 # This is the postgresql JDBC driver from https://jdbc.postgresql.org/download/ # There appear to be no signatures to validate against 😬 diff --git a/demos/signal-processing/create-nifi-ingestion-job.yaml b/demos/signal-processing/create-nifi-ingestion-job.yaml index f72756aa..f08a8d4e 100644 --- a/demos/signal-processing/create-nifi-ingestion-job.yaml +++ b/demos/signal-processing/create-nifi-ingestion-job.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-timescale-job-and-nifi - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo @@ -28,7 +28,7 @@ spec: kubectl wait --for=condition=Ready pod/nifi-node-default-0 --timeout=30m containers: - name: create-nifi-ingestion-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/signal-processing/create-timescale-tables.yaml b/demos/signal-processing/create-timescale-tables.yaml index de1d8977..67d844f2 100644 --- a/demos/signal-processing/create-timescale-tables.yaml +++ b/demos/signal-processing/create-timescale-tables.yaml @@ -9,7 +9,7 @@ spec: serviceAccountName: demo-serviceaccount initContainers: - name: wait-for-timescale - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/spark-k8s-anomaly-detection-taxi-data/create-spark-anomaly-detection-job.yaml b/demos/spark-k8s-anomaly-detection-taxi-data/create-spark-anomaly-detection-job.yaml index 9dc11b19..69e43c98 100644 --- a/demos/spark-k8s-anomaly-detection-taxi-data/create-spark-anomaly-detection-job.yaml +++ b/demos/spark-k8s-anomaly-detection-taxi-data/create-spark-anomaly-detection-job.yaml @@ -8,7 +8,7 @@ spec: spec: initContainers: - name: wait-for-testdata - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo @@ -19,7 +19,7 @@ spec: kubectl wait --for=condition=complete --timeout=30m job/load-ny-taxi-data containers: - name: create-spark-anomaly-detection-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/spark-k8s-anomaly-detection-taxi-data/setup-superset.yaml b/demos/spark-k8s-anomaly-detection-taxi-data/setup-superset.yaml index 0e60dba0..622d3ed6 100644 --- a/demos/spark-k8s-anomaly-detection-taxi-data/setup-superset.yaml +++ b/demos/spark-k8s-anomaly-detection-taxi-data/setup-superset.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: setup-superset - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -euo diff --git a/demos/trino-taxi-data/create-table-in-trino.yaml b/demos/trino-taxi-data/create-table-in-trino.yaml index 2405f669..c0c13043 100644 --- a/demos/trino-taxi-data/create-table-in-trino.yaml +++ b/demos/trino-taxi-data/create-table-in-trino.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: create-ny-taxi-data-table-in-trino - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: ["bash", "-c", "python -u /tmp/script/script.py"] volumeMounts: - name: script diff --git a/demos/trino-taxi-data/setup-superset.yaml b/demos/trino-taxi-data/setup-superset.yaml index b463e4be..d902c1b0 100644 --- a/demos/trino-taxi-data/setup-superset.yaml +++ b/demos/trino-taxi-data/setup-superset.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: setup-superset - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: ["bash", "-c", "curl -o superset-assets.zip https://raw.githubusercontent.com/stackabletech/demos/release-25.7/demos/trino-taxi-data/superset-assets.zip && python -u /tmp/script/script.py"] volumeMounts: - name: script diff --git a/stacks/_templates/keycloak.yaml b/stacks/_templates/keycloak.yaml index 9c2ad4d8..f1b066d6 100644 --- a/stacks/_templates/keycloak.yaml +++ b/stacks/_templates/keycloak.yaml @@ -48,7 +48,7 @@ spec: - name: tls mountPath: /tls/ - name: create-auth-class - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: ["/bin/bash", "-c"] args: - | diff --git a/stacks/end-to-end-security/krb5.yaml b/stacks/end-to-end-security/krb5.yaml index 5d0896d4..04f385cd 100644 --- a/stacks/end-to-end-security/krb5.yaml +++ b/stacks/end-to-end-security/krb5.yaml @@ -14,7 +14,7 @@ spec: spec: initContainers: - name: init - image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0 + image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0-rc1 args: - sh - -euo @@ -35,7 +35,7 @@ spec: name: data containers: - name: kdc - image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0 + image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0-rc1 args: - krb5kdc - -n @@ -48,7 +48,7 @@ spec: - mountPath: /var/kerberos/krb5kdc name: data - name: kadmind - image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0 + image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0-rc1 args: - kadmind - -nofork @@ -61,7 +61,7 @@ spec: - mountPath: /var/kerberos/krb5kdc name: data - name: client - image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0 + image: oci.stackable.tech/sdp/krb5:1.21.1-stackable25.7.0-rc1 tty: true stdin: true env: diff --git a/stacks/end-to-end-security/setup-postgresql.yaml b/stacks/end-to-end-security/setup-postgresql.yaml index 262abf51..abcd94ea 100644 --- a/stacks/end-to-end-security/setup-postgresql.yaml +++ b/stacks/end-to-end-security/setup-postgresql.yaml @@ -9,7 +9,7 @@ spec: initContainers: # The postgres image does not contain curl or wget... - name: download-dump - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -c diff --git a/stacks/end-to-end-security/superset.yaml b/stacks/end-to-end-security/superset.yaml index f3e2e6f1..9ce46414 100644 --- a/stacks/end-to-end-security/superset.yaml +++ b/stacks/end-to-end-security/superset.yaml @@ -24,7 +24,7 @@ spec: spec: initContainers: - name: wait-for-setup-db-job - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -c diff --git a/stacks/jupyterhub-keycloak/jupyterhub.yaml b/stacks/jupyterhub-keycloak/jupyterhub.yaml index 82c32a20..7dfe0412 100644 --- a/stacks/jupyterhub-keycloak/jupyterhub.yaml +++ b/stacks/jupyterhub-keycloak/jupyterhub.yaml @@ -151,7 +151,7 @@ options: stackable.tech/vendor: Stackable initContainers: - name: download-notebook - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: ['sh', '-c', 'curl https://raw.githubusercontent.com/stackabletech/demos/release-25.7/stacks/jupyterhub-keycloak/process-s3.ipynb -o /notebook/process-s3.ipynb'] volumeMounts: - mountPath: /notebook diff --git a/stacks/jupyterhub-keycloak/keycloak.yaml b/stacks/jupyterhub-keycloak/keycloak.yaml index 9bbc5892..d09a2c62 100644 --- a/stacks/jupyterhub-keycloak/keycloak.yaml +++ b/stacks/jupyterhub-keycloak/keycloak.yaml @@ -50,7 +50,7 @@ spec: mountPath: /tls/ - name: create-configmap resources: {} - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: ["/bin/bash", "-c"] args: - | diff --git a/stacks/jupyterhub-pyspark-hdfs/jupyterlab.yaml b/stacks/jupyterhub-pyspark-hdfs/jupyterlab.yaml index d4f5d4a0..11b9c957 100644 --- a/stacks/jupyterhub-pyspark-hdfs/jupyterlab.yaml +++ b/stacks/jupyterhub-pyspark-hdfs/jupyterlab.yaml @@ -21,7 +21,7 @@ spec: serviceAccountName: default containers: - name: jupyterlab - image: oci.stackable.tech/stackable/spark-connect-client:3.5.6-stackable25.7.0 + image: oci.stackable.tech/stackable/spark-connect-client:3.5.6-stackable25.7.0-rc1 imagePullPolicy: IfNotPresent command: - bash @@ -39,7 +39,7 @@ spec: name: notebook initContainers: - name: download-notebook - image: oci.stackable.tech/stackable/spark-connect-client:3.5.6-stackable25.7.0 + image: oci.stackable.tech/stackable/spark-connect-client:3.5.6-stackable25.7.0-rc1 command: ['sh', '-c', 'curl https://raw.githubusercontent.com/stackabletech/demos/release-25.7/stacks/jupyterhub-pyspark-hdfs/notebook.ipynb -o /notebook/notebook.ipynb'] volumeMounts: - mountPath: /notebook diff --git a/stacks/jupyterhub-pyspark-hdfs/spark_connect.yaml b/stacks/jupyterhub-pyspark-hdfs/spark_connect.yaml index 8113e33b..8fe67be5 100644 --- a/stacks/jupyterhub-pyspark-hdfs/spark_connect.yaml +++ b/stacks/jupyterhub-pyspark-hdfs/spark_connect.yaml @@ -30,7 +30,7 @@ spec: image: # Using an image that includes scikit-learn (among other things) # because this package needs to be available on the executors. - custom: oci.stackable.tech/stackable/spark-connect-client:3.5.6-stackable25.7.0 + custom: oci.stackable.tech/stackable/spark-connect-client:3.5.6-stackable25.7.0-rc1 productVersion: 3.5.6 pullPolicy: IfNotPresent args: diff --git a/stacks/keycloak-opa-poc/keycloak.yaml b/stacks/keycloak-opa-poc/keycloak.yaml index c0305f31..5cd22788 100644 --- a/stacks/keycloak-opa-poc/keycloak.yaml +++ b/stacks/keycloak-opa-poc/keycloak.yaml @@ -70,7 +70,7 @@ spec: spec: containers: - name: propagate-keycloak-address - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 command: - bash - -x diff --git a/stacks/keycloak-opa-poc/setup-keycloak.yaml b/stacks/keycloak-opa-poc/setup-keycloak.yaml index 4f180ec0..e66b019a 100644 --- a/stacks/keycloak-opa-poc/setup-keycloak.yaml +++ b/stacks/keycloak-opa-poc/setup-keycloak.yaml @@ -29,7 +29,7 @@ spec: spec: containers: - name: setup-keycloak - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 env: - name: KEYCLOAK_ADMIN_PASSWORD valueFrom: diff --git a/stacks/logging/setup-opensearch-dashboards.yaml b/stacks/logging/setup-opensearch-dashboards.yaml index e15fbc84..10e305c3 100644 --- a/stacks/logging/setup-opensearch-dashboards.yaml +++ b/stacks/logging/setup-opensearch-dashboards.yaml @@ -8,7 +8,7 @@ spec: spec: containers: - name: setup-opensearch-dashboards - image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0 + image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 env: - name: OPEN_SEARCH_ADMIN_PASSWORD valueFrom: diff --git a/stacks/signal-processing/jupyterhub.yaml b/stacks/signal-processing/jupyterhub.yaml index 86273fe4..ffa3b44d 100644 --- a/stacks/signal-processing/jupyterhub.yaml +++ b/stacks/signal-processing/jupyterhub.yaml @@ -30,7 +30,7 @@ options: singleuser: cmd: null image: - # TODO (@NickLarsenNZ): Use a versioned image with stackable25.7.0 or stackableXX.X.X so that + # TODO (@NickLarsenNZ): Use a versioned image with stackable25.7.0-rc1 or stackableXX.X.X so that # the demo is reproducable for the release and it will be automatically replaced for the release branch. name: oci.stackable.tech/demos/jupyter-pyspark-with-alibi-detect tag: python-3.9 @@ -41,7 +41,7 @@ options: stackable.tech/vendor: Stackable initContainers: - name: download-notebook - image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0 + image: oci.stackable.tech/sdp/tools:1.0.0-stackable25.7.0-rc1 command: ['sh', '-c', 'curl https://raw.githubusercontent.com/stackabletech/demos/release-25.7/stacks/signal-processing/tsdb.ipynb -o /notebook/tsdb.ipynb'] volumeMounts: - mountPath: /notebook diff --git a/stacks/signal-processing/nifi.yaml b/stacks/signal-processing/nifi.yaml index 1aeb6da5..acdfa8c5 100644 --- a/stacks/signal-processing/nifi.yaml +++ b/stacks/signal-processing/nifi.yaml @@ -6,7 +6,7 @@ metadata: spec: image: productVersion: 2.4.0 - # TODO (@NickLarsenNZ): Use a versioned image with stackable25.7.0 or stackableXX.X.X so that + # TODO (@NickLarsenNZ): Use a versioned image with stackable25.7.0-rc1 or stackableXX.X.X so that # the demo is reproducable for the release and it will be automatically replaced for the release branch. custom: oci.stackable.tech/demos/nifi:2.4.0-postgresql # pullPolicy: IfNotPresent From 1aedc98a4cfd0e7cf80e454b47dbaaada18bc974 Mon Sep 17 00:00:00 2001 From: Nick Larsen Date: Mon, 21 Jul 2025 16:43:31 +0200 Subject: [PATCH 2/3] chore: Add local release file Demos can then be run like so: ```sh stackablectl demo install blah --release-file releases.yaml --demo-file=demos/demos-v2.yaml --stack-file=stacks/stacks-v2.yaml ``` --- releases.yaml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 releases.yaml diff --git a/releases.yaml b/releases.yaml new file mode 100644 index 00000000..ae677231 --- /dev/null +++ b/releases.yaml @@ -0,0 +1,36 @@ +--- +releases: + 25.7: + releaseDate: &latest-release-release-date 2025-07-21 + description: The July 2025 release + products: &latest-release-products + airflow: + operatorVersion: 25.7.0-rc1 + commons: + operatorVersion: 25.7.0-rc1 + druid: + operatorVersion: 25.7.0-rc1 + hbase: + operatorVersion: 25.7.0-rc1 + hdfs: + operatorVersion: 25.7.0-rc1 + hive: + operatorVersion: 25.7.0-rc1 + kafka: + operatorVersion: 25.7.0-rc1 + listener: + operatorVersion: 25.7.0-rc1 + nifi: + operatorVersion: 25.7.0-rc1 + opa: + operatorVersion: 25.7.0-rc1 + secret: + operatorVersion: 25.7.0-rc1 + spark-k8s: + operatorVersion: 25.7.0-rc1 + superset: + operatorVersion: 25.7.0-rc1 + trino: + operatorVersion: 25.7.0-rc1 + zookeeper: + operatorVersion: 25.7.0-rc1 From 13d632cbc40ee433af0a0275955886c0001a63bb Mon Sep 17 00:00:00 2001 From: Nick Larsen Date: Tue, 22 Jul 2025 10:23:27 +0200 Subject: [PATCH 3/3] fix(demo/trino-taxi-data): Revert the superset assets zip, but add the `http_scheme: https` setting back in. --- demos/trino-taxi-data/setup-superset.yaml | 2 +- demos/trino-taxi-data/superset-assets.zip | Bin 9602 -> 9419 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/trino-taxi-data/setup-superset.yaml b/demos/trino-taxi-data/setup-superset.yaml index d902c1b0..00ab5e9f 100644 --- a/demos/trino-taxi-data/setup-superset.yaml +++ b/demos/trino-taxi-data/setup-superset.yaml @@ -9,7 +9,7 @@ spec: containers: - name: setup-superset image: oci.stackable.tech/sdp/testing-tools:0.2.0-stackable25.7.0-rc1 - command: ["bash", "-c", "curl -o superset-assets.zip https://raw.githubusercontent.com/stackabletech/demos/release-25.7/demos/trino-taxi-data/superset-assets.zip && python -u /tmp/script/script.py"] + command: ["bash", "-c", "curl -o superset-assets.zip https://raw.githubusercontent.com/stackabletech/demos/pr-release-25.7-rc1/demos/trino-taxi-data/superset-assets.zip && python -u /tmp/script/script.py"] volumeMounts: - name: script mountPath: /tmp/script diff --git a/demos/trino-taxi-data/superset-assets.zip b/demos/trino-taxi-data/superset-assets.zip index 9dc7a395477940b53aa4b4d2a7b9e4eedba25ed1..b0127d3ef3ba0c5a36acfaf6efb46be8c03cc43a 100644 GIT binary patch literal 9419 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 b--`M_Z7UK?Z~Ingu>rxbWXVMO?brVS;Odew literal 9602 zcmd^FTW=e=6;}4r2cbY)V1f2&!J-ezb}_c@js+B`VyljuSaxM4n{3e%)C@;rJQrmy zvX!F1{)M7XMgKtG`wR9@^s(>#1MOSU?~okbBHJ;NU1Vz+GBk(e;kl7K{LY*_`tYMq zO6K#^(%-)R{(pas2l{@FuSipwrCeT2;w0m>O08MhskR2yYNOd~Y=<%vp2)=3OoYKy zCaH>}Hmhz`wkqXpHj!;+#+Ne{$}|(}Dce>E}+@2woVh4N0dwp9Hb+3c9?= z645R*rl(5zR3%w10uHkTk{lVt35=knVXW{VpNK?+nEelb#84THR3r-;2#mRL6iGMZ zA{nK`oj&lm@@K`whBnT!2~Wwcn1miubk@%zE-Sl!1MV8aagBzH zUzMgaba#i%s^_*`zgb4GCCWwkI23pIX&0m$=TU|*fn$fXXpGVKj-T`f_kR8v8f4xJV|8aB6hW15%GG}nCL$jNu;6?&p@;t3X?!` z^V77zR8Dk&_Y#!6aN;JyZ{=%Dz$i+&bt&6WTjgmN@ z3?aE)!NxD-^EqkRGA{N)c0QI7Bj>YUFsI5gdMrd{5*v^<1D3r91vVLQGRwv>LZ4!9 z&6EqvU1FOo&anM_$E>pu`Wv?o7M_C5zeAy8CH}@NWB1kUdYjlaaM@}a93FK~2c4sn zd#%sd7l(s~j415O<6al$es_z^uG)9Ca;*NyLvpM)z2M(EI-Yj=dk;JP_gU>?M|x{r z_m7`Ec>G>_c(J|Q0%eOdNz7vZT*|YzR{5|u=pJ<6>sVgaIgF!he2bKxNs-(Jb?q_8 z12MV{>K3QcEsN%HoZqHsz7>&-o6!HIo@>a+9QV2bxU!0-v^)IZC*@L!zV&O-6n88V zU@5)ld>}3quWB464U}74>3h!^wQPV(T$yCbSGe)g)mG=zmgEXTRk#PJQ3U`cblX(D zvbW+;U0{&L7lB6M8f5_!_*Z!2*tNI?1_ESSqj8{eh8jhC*RM*snUu?nbb7!CJ`KzA0hdx~wt#g)9u4e|!EzA5YLv%c0_tZkGCs3a1V%?K*Q ze0HPN*Pr=qU(0Eq=5hyeggg5&^p1@9fB@nNrZNo!4Z#ALiZwD3isVct-Bo-D;L0)? z`W48aCZ7TjYO^L-nr`%rKD7!_3OI)`hl$ZBks}Q)b)Fuel^{dHkqWTzDt8*_a6=5( z2F=JqE{p3jHEz0c5q%i~v9~iKZvab(Jh!sdooEC{wzM7^t(gnA2msw{9oQk_6=(@H z8#rf?#1=FTXCj6H3X^r|vkHhU=}|yb4pW| zcPR=1{JspjOE8_)zy=P&7@fYw&?(Tmn}^V)D4J#U8Wcjx-!Ry!HS2Yt8SgyWmSTs( zZxL!s4ev#?t@-HEs1wzl`%!B*s5S%MRO8x? zHeal|E%JbU#3onSx=+uE2Y{FMnfcbZAkj{2_Y5rDG0);S$P}tv1rf!bK!pl8apIv6b29OT@79@z0;uHkNPvkMiYd9a|;$$*sEbUlT>XHffY^jkRmpao~ z2~dej8RopPA)x6vj7G3cFSgMOb_@Evn4v2`4pWgE2t7oW%Rs5MxggT4xMe934E7ZI3`3HtIg_U_E`r!4+QyqDh-qcW1Uc zvIpCJQ%0I13q%1f4f4@yM*5~n>LecqDjhFsamG50R{eg}^MzA$>qDne^>-Xm5z?vp z^@>;9^@pPFmghc&I|;WPI7h>z@pSJuYUkKwRPI;>9*S5tRW%9AdRL6rd73T=({G)k zAKHzA2xF;6V{A{&;`Gsbi8O{o^m3vq|OI$?SRD{8D!@Ig?fo&-Dh+X}P~IFtfCrtuM+be>Yxnt}-|3y6 zbo$*M34mPqP2FAy{sonZ^;;z*Z;C4=)|*a8sW6QTmc2KvUcazVakNSw72z?*e{6ZW zyh~d@GGc*^-{U&8i}4#+(n;s>f{O~n94|o>gY*SVFCW@TeKpDxePguZ;LQ*mghiEn ztp~=gUCmD(-TB~?4=;c323w&1e1(@@ZuAz;I^*@XXAIj?>8m?`zLs%;A1uF1v(A70 zeTxPEuRpj>aC>TOdi!F1nsp#zG0hKP#H-&@+6YUmPq2OfEhf15^tuV=r_6Q7(aEEa RzekKe#^1l;+3C;d>3^v&B-#J~