From 8c444c7ca3b0146e0436fa832c8863e4ed4b3329 Mon Sep 17 00:00:00 2001 From: Pantelis Malekas Date: Thu, 6 Aug 2026 15:43:35 +0300 Subject: [PATCH] feat: add option for digest --- .../hypo/templates/fabric-api/deployment.yaml | 4 + .../hypo/templates/oss-client/deployment.yaml | 4 + .../templates/peering-api/deployment.yaml | 4 + .../templates/pkg-manager/deployment.yaml | 4 + .../templates/portal-cart/deployment.yaml | 4 + charts/hypo/templates/portal/deployment.yaml | 4 + .../templates/registry-api/deployment.yaml | 4 + .../templates/service-monitor/deployment.yaml | 4 + charts/hypo/templates/sonata/deployment.yaml | 4 + .../telemetry-client/deployment.yaml | 4 + charts/hypo/templates/tmf-api/deployment.yaml | 4 + charts/hypo/values.yaml | 11 ++ scripts/collect_digest.sh | 37 +++++++ scripts/get_digest.sh | 74 +++++++++++++ scripts/helm_update_etsi.py | 100 +++++++++++++++--- 15 files changed, 249 insertions(+), 17 deletions(-) create mode 100755 scripts/collect_digest.sh create mode 100755 scripts/get_digest.sh diff --git a/charts/hypo/templates/fabric-api/deployment.yaml b/charts/hypo/templates/fabric-api/deployment.yaml index 88e885d..c0c96c4 100644 --- a/charts/hypo/templates/fabric-api/deployment.yaml +++ b/charts/hypo/templates/fabric-api/deployment.yaml @@ -57,7 +57,11 @@ spec: {{- end }} containers: - name: {{ $fabricApi.name }} + {{- if $fabricApi.image.digest }} + image: "{{ $fabricApi.image.repository }}@{{ $fabricApi.image.digest }}" + {{ else }} image: "{{ $fabricApi.image.repository }}:{{ $fabricApi.image.tag }}" + {{- end }} imagePullPolicy: {{ $fabricApi.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/oss-client/deployment.yaml b/charts/hypo/templates/oss-client/deployment.yaml index 01c8fc1..f0c0b08 100644 --- a/charts/hypo/templates/oss-client/deployment.yaml +++ b/charts/hypo/templates/oss-client/deployment.yaml @@ -54,7 +54,11 @@ spec: {{- end }} containers: - name: {{ $ossClient.name }} + {{- if $ossClient.image.digest }} + image: "{{ $ossClient.image.repository }}@{{ $ossClient.image.digest }}" + {{ else }} image: "{{ $ossClient.image.repository }}:{{ $ossClient.image.tag }}" + {{- end }} imagePullPolicy: {{ $ossClient.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/peering-api/deployment.yaml b/charts/hypo/templates/peering-api/deployment.yaml index 73f6052..69c4f0f 100644 --- a/charts/hypo/templates/peering-api/deployment.yaml +++ b/charts/hypo/templates/peering-api/deployment.yaml @@ -57,7 +57,11 @@ spec: {{- end }} containers: - name: {{ $peeringApi.name }} + {{- if $peeringApi.image.digest }} + image: "{{ $peeringApi.image.repository }}@{{ $peeringApi.image.digest }}" + {{ else }} image: "{{ $peeringApi.image.repository }}:{{ $peeringApi.image.tag }}" + {{- end }} imagePullPolicy: {{ $peeringApi.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/pkg-manager/deployment.yaml b/charts/hypo/templates/pkg-manager/deployment.yaml index 3aa483e..4a2be4e 100644 --- a/charts/hypo/templates/pkg-manager/deployment.yaml +++ b/charts/hypo/templates/pkg-manager/deployment.yaml @@ -55,7 +55,11 @@ spec: {{- end }} containers: - name: {{ $pkgManager.name }} + {{- if $pkgManager.image.digest }} + image: "{{ $pkgManager.image.repository }}@{{ $pkgManager.image.digest }}" + {{ else }} image: "{{ $pkgManager.image.repository }}:{{ $pkgManager.image.tag }}" + {{- end }} imagePullPolicy: {{ $pkgManager.image.pullPolicy }} #ports: # - name: http diff --git a/charts/hypo/templates/portal-cart/deployment.yaml b/charts/hypo/templates/portal-cart/deployment.yaml index 3220c3b..9d93404 100644 --- a/charts/hypo/templates/portal-cart/deployment.yaml +++ b/charts/hypo/templates/portal-cart/deployment.yaml @@ -49,7 +49,11 @@ spec: {{- end }} containers: - name: {{ $portalCart.name }} + {{- if $portalCart.image.digest }} + image: "{{ $portalCart.image.repository }}@{{ $portalCart.image.digest }}" + {{ else }} image: "{{ $portalCart.image.repository }}:{{ $portalCart.image.tag }}" + {{- end }} imagePullPolicy: {{ $portalCart.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/portal/deployment.yaml b/charts/hypo/templates/portal/deployment.yaml index b8be043..f536cfe 100644 --- a/charts/hypo/templates/portal/deployment.yaml +++ b/charts/hypo/templates/portal/deployment.yaml @@ -34,7 +34,11 @@ spec: {{- end }} containers: - name: {{ .Values.portal.name }} + {{- if .Values.portal.image.digest }} + image: "{{ .Values.portal.image.repository }}@{{ .Values.portal.image.digest }}" + {{ else }} image: "{{ .Values.portal.image.repository }}:{{ .Values.portal.image.tag }}" + {{- end }} imagePullPolicy: {{ .Values.portal.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/registry-api/deployment.yaml b/charts/hypo/templates/registry-api/deployment.yaml index f816d64..dbf207c 100644 --- a/charts/hypo/templates/registry-api/deployment.yaml +++ b/charts/hypo/templates/registry-api/deployment.yaml @@ -50,7 +50,11 @@ spec: {{- end }} containers: - name: {{ $registryApi.name }} + {{- if $registryApi.image.digest }} + image: "{{ $registryApi.image.repository }}@{{ $registryApi.image.digest }}" + {{ else }} image: "{{ $registryApi.image.repository }}:{{ $registryApi.image.tag }}" + {{- end }} imagePullPolicy: {{ $registryApi.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/service-monitor/deployment.yaml b/charts/hypo/templates/service-monitor/deployment.yaml index 63e176e..9cdeb9f 100644 --- a/charts/hypo/templates/service-monitor/deployment.yaml +++ b/charts/hypo/templates/service-monitor/deployment.yaml @@ -53,7 +53,11 @@ spec: {{- end }} containers: - name: {{ $serviceMonitor.name }} + {{- if $serviceMonitor.image.digest }} + image: "{{ $serviceMonitor.image.repository }}@{{ $serviceMonitor.image.digest }}" + {{ else }} image: "{{ $serviceMonitor.image.repository }}:{{ $serviceMonitor.image.tag }}" + {{- end }} imagePullPolicy: {{ $serviceMonitor.image.pullPolicy }} env: - name: KAFKA_BROKERS diff --git a/charts/hypo/templates/sonata/deployment.yaml b/charts/hypo/templates/sonata/deployment.yaml index f8aa6cf..921e2b6 100644 --- a/charts/hypo/templates/sonata/deployment.yaml +++ b/charts/hypo/templates/sonata/deployment.yaml @@ -43,7 +43,11 @@ spec: {{- end }} containers: - name: {{ .Values.sonata.name }} + {{- if .Values.sonata.image.digest }} + image: "{{ .Values.sonata.image.repository }}@{{ .Values.sonata.image.digest }}" + {{ else }} image: "{{ .Values.sonata.image.repository }}:{{ .Values.sonata.image.tag }}" + {{- end }} imagePullPolicy: {{ .Values.sonata.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/telemetry-client/deployment.yaml b/charts/hypo/templates/telemetry-client/deployment.yaml index 1de0ae6..057ffa8 100644 --- a/charts/hypo/templates/telemetry-client/deployment.yaml +++ b/charts/hypo/templates/telemetry-client/deployment.yaml @@ -49,7 +49,11 @@ spec: {{- end }} containers: - name: {{ $telemetryClient.name }} + {{- if $telemetryClient.image.digest }} + image: "{{ $telemetryClient.image.repository }}@{{ $telemetryClient.image.digest }}" + {{ else }} image: "{{ $telemetryClient.image.repository }}:{{ $telemetryClient.image.tag }}" + {{- end }} imagePullPolicy: {{ $telemetryClient.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/templates/tmf-api/deployment.yaml b/charts/hypo/templates/tmf-api/deployment.yaml index 53bbfcc..7918a19 100644 --- a/charts/hypo/templates/tmf-api/deployment.yaml +++ b/charts/hypo/templates/tmf-api/deployment.yaml @@ -54,7 +54,11 @@ spec: {{- end }} containers: - name: {{ $tmfApi.name }} + {{- if $tmfApi.image.digest }} + image: "{{ $tmfApi.image.repository }}@{{ $tmfApi.image.digest }}" + {{ else }} image: "{{ $tmfApi.image.repository }}:{{ $tmfApi.image.tag }}" + {{- end }} imagePullPolicy: {{ $tmfApi.image.pullPolicy }} ports: - name: http diff --git a/charts/hypo/values.yaml b/charts/hypo/values.yaml index b807823..a198edd 100644 --- a/charts/hypo/values.yaml +++ b/charts/hypo/values.yaml @@ -23,6 +23,7 @@ portal: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.portal/web/hypo-portal pullPolicy: Always tag: "1.0.0" + digest: "" imagePullSecrets: - name: regcred @@ -78,6 +79,7 @@ tmf-api: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.api/tmf/tmf-api-jvm pullPolicy: Always tag: "1.0.2" + digest: "" imagePullSecrets: - name: regcred @@ -130,6 +132,7 @@ pkg-manager: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.core/pkg-manager.helm/pkg-manager pullPolicy: Always tag: "1.0.1" + digest: "" imagePullSecrets: - name: regcred @@ -174,6 +177,7 @@ oss-client: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.clients/oss/oss-client-jvm pullPolicy: Always tag: "1.0.0" + digest: "" imagePullSecrets: - name: regcred @@ -231,6 +235,7 @@ sonata: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.core/sonata/sonata-core-jvm pullPolicy: Always tag: "1.0.0" + digest: "" env: SONATA_VAULT_TOKEN_PATH: "/vault/secrets/token" @@ -284,6 +289,7 @@ portal-cart: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.portal/cart/hypo-portal-jvm pullPolicy: Always tag: "1.0.1" + digest: "" imagePullSecrets: - name: regcred @@ -334,6 +340,7 @@ telemetry-client: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.clients/telemetry/telemetry-api-jvm pullPolicy: Always tag: "1.0.0" + digest: "" imagePullSecrets: - name: regcred @@ -381,6 +388,7 @@ peering-api: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.api/peering/peering-api-jvm pullPolicy: Always tag: "1.1.0" + digest: "" env: PEERING_VAULT_TOKEN_PATH: "/vault/secrets/token" imagePullSecrets: @@ -432,6 +440,7 @@ registry-api: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.api/registry/registry-api-jvm pullPolicy: Always tag: "1.0.0" + digest: "" imagePullSecrets: - name: regcred @@ -479,6 +488,7 @@ fabric-api: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.api/fabric/fabric-api-jvm pullPolicy: Always tag: "1.0.1" + digest: "" env: CONFIG_HYPO_DIAL_ROLE: "hypo_dial_x" FABRIC_POLLER_INTERVAL: "120s" @@ -530,6 +540,7 @@ service-monitor: labs.etsi.org:5050/osl/hypo/code/org.etsi.osl.hypo.core/service.monitor/service-monitor pullPolicy: Always tag: "latest" + digest: "" imagePullSecrets: - name: regcred diff --git a/scripts/collect_digest.sh b/scripts/collect_digest.sh new file mode 100755 index 0000000..4710d2f --- /dev/null +++ b/scripts/collect_digest.sh @@ -0,0 +1,37 @@ + +#!/bin/bash + +sudo apt install jq + +# Exit on any error +set -e + +# Check if token argument is provided +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +# Set the token +PRIVATE_TOKEN="$1" + +./get_digest.sh $PRIVATE_TOKEN + +source build.env + +cat build.env + +VALUES_YAML="${2:-values.yaml}" + +if [ $VALUES_YAML not eq "values.yaml"]; then + cp ../charts/hypo/values.yaml ../charts/hypo/$VALUES_YAML +fi + +cd .. && python3 scripts/helm_update_etsi.py $PKG_MANAGER $OSS_CLIENT $SONATA $TMF_API $PORTAL_CART $TELEMETRY_CLIENT $PEERING_API $REGISTRY_API $FABRIC_API $PORTAL $MONITOR --file=./charts/hypo/$VALUES_YAML + + + + + + + diff --git a/scripts/get_digest.sh b/scripts/get_digest.sh new file mode 100755 index 0000000..234b3ec --- /dev/null +++ b/scripts/get_digest.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +set -euo pipefail + +# Install jq if needed +sudo apt-get install -y jq + +# Check if token argument is provided +if [ $# -lt 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +PRIVATE_TOKEN="$1" + +# GitLab API endpoints (repository tags endpoint) +TMF_API_URL="https://labs.etsi.org/rep/api/v4/projects/470/registry/repositories/3021/tags" +SONATA_URL="https://labs.etsi.org/rep/api/v4/projects/479/registry/repositories/3031/tags" +OSS_CLIENT_URL="https://labs.etsi.org/rep/api/v4/projects/474/registry/repositories/3023/tags" +PKG_MANAGER_URL="https://labs.etsi.org/rep/api/v4/projects/478/registry/repositories/3033/tags" +PORTAL_CART_URL="https://labs.etsi.org/rep/api/v4/projects/465/registry/repositories/3041/tags" +TELEMETRY_CLIENT_URL="https://labs.etsi.org/rep/api/v4/projects/475/registry/repositories/3028/tags" +PEERING_API_URL="https://labs.etsi.org/rep/api/v4/projects/468/registry/repositories/3014/tags" +REGISTRY_API_URL="https://labs.etsi.org/rep/api/v4/projects/469/registry/repositories/3018/tags" +FABRIC_API_URL="https://labs.etsi.org/rep/api/v4/projects/467/registry/repositories/3011/tags" +PORTAL_URL="https://labs.etsi.org/rep/api/v4/projects/466/registry/repositories/3038/tags" +MONITOR_URL="https://labs.etsi.org/rep/api/v4/projects/480/registry/repositories/3119/tags" + +get_digest() { + local url="$1" + + curl -s \ + --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" \ + "$url/latest" | + jq -r '.digest' +} + +echo "Fetching image digests..." + +TMF_API=$(get_digest "$TMF_API_URL") +SONATA=$(get_digest "$SONATA_URL") +OSS_CLIENT=$(get_digest "$OSS_CLIENT_URL") +PKG_MANAGER=$(get_digest "$PKG_MANAGER_URL") +PORTAL_CART=$(get_digest "$PORTAL_CART_URL") +TELEMETRY_CLIENT=$(get_digest "$TELEMETRY_CLIENT_URL") +PEERING_API=$(get_digest "$PEERING_API_URL") +REGISTRY_API=$(get_digest "$REGISTRY_API_URL") +FABRIC_API=$(get_digest "$FABRIC_API_URL") +PORTAL=$(get_digest "$PORTAL_URL") +MONITOR=$(get_digest "$MONITOR_URL") + +cat > build.env < /dev/null 2>&1') return contents_changed + def main(): # Default YAML files yaml_files = ["./charts/hypo/values-cd.yaml"] @@ -73,34 +105,65 @@ def main(): # If --file arguments are found, use them instead of the default yaml_files if file_args: yaml_files = file_args - # Remove the --file arguments from sys.argv to handle only image args sys.argv = [arg for arg in sys.argv if not arg.startswith('--file=')] chart_file = "./charts/hypo/Chart.yaml" - print("YAML files to be processed: ", yaml_files) + print("YAML files to be processed:", yaml_files) print("--------------------------------------") # Adding all of our microservices - microservices = ["pkg-manager", "oss-client", "tmf-api", "sonata", "portal-cart", "telemetry-client", "peering-api", "registry-api", "fabric-api", "portal", "service-monitor"] + microservices = [ + "pkg-manager", + "oss-client", + "tmf-api", + "sonata", + "portal-cart", + "telemetry-client", + "peering-api", + "registry-api", + "fabric-api", + "portal", + "service-monitor" + ] tag_changed = False - chart_updated = False # Track if chart has been updated already + chart_updated = False # Track if chart has been updated already for yaml_file in yaml_files: - print("YAML currently processed: ", yaml_file) + print("YAML currently processed:", yaml_file) print("--------------------------------------") temp_file = yaml_file.replace('.yaml', '-temp.yaml') for image in sys.argv[1:]: - # Getting image by command line args - image_name, image_tag = image.rsplit(':', 1) - # Update YAML values - print("Processing image:", image_name, "for YAML file:", yaml_file) - update_yaml_values(yaml_file, temp_file, microservices, image_name, image_tag) + if "@" in image: + image_name, image_digest = image.split("@", 1) + + print("Processing image:", image_name, "for YAML file:", yaml_file) + + update_yaml_values( + yaml_file, + temp_file, + microservices, + image_name, + image_digest=image_digest + ) + + else: + image_name, image_tag = image.rsplit(':', 1) + + print("Processing image:", image_name, "for YAML file:", yaml_file) + + update_yaml_values( + yaml_file, + temp_file, + microservices, + image_name, + image_tag=image_tag + ) if compare_yaml(yaml_file, temp_file): print(f"The YAML files are exactly the same for image: {image_name} in {yaml_file}.") @@ -109,14 +172,17 @@ def main(): print(f"The YAML files are different for image: {image_name} in {yaml_file}.") shutil.move(temp_file, yaml_file) tag_changed = True + if not chart_updated and BUMP_CHART: # Update chart only once, when the first change occurs update_chart(chart_file) chart_updated = True + print("--------------------------------------") if not tag_changed: print("No changes were made to any YAML files.") + if __name__ == "__main__": - main() + main() \ No newline at end of file -- GitLab