From b74452b8c92adbaf7bd8823b0a1b7bef65f06ba0 Mon Sep 17 00:00:00 2001
From: kaw67872 <kawtar.laariche@iais.fraunhofer.de>
Date: Thu, 26 Jun 2025 13:27:45 +0200
Subject: [PATCH] bug: fix backend api ingress config

---
 .../kubernetes/consolidated-ingress.yaml      | 64 +++++++++++-----
 ...e-double-prefix.yaml => dsce-ingress.yaml} | 19 ++++-
 src/deployment/kubernetes/dsce-prefix.yaml    | 21 -----
 src/deployment/kubernetes/setup_ingress.sh    | 76 +++++++++++++++++++
 4 files changed, 134 insertions(+), 46 deletions(-)
 rename src/deployment/kubernetes/{dsce-double-prefix.yaml => dsce-ingress.yaml} (62%)
 delete mode 100644 src/deployment/kubernetes/dsce-prefix.yaml
 create mode 100644 src/deployment/kubernetes/setup_ingress.sh

diff --git a/src/deployment/kubernetes/consolidated-ingress.yaml b/src/deployment/kubernetes/consolidated-ingress.yaml
index 1841aff..e60d7b0 100644
--- a/src/deployment/kubernetes/consolidated-ingress.yaml
+++ b/src/deployment/kubernetes/consolidated-ingress.yaml
@@ -1,3 +1,6 @@
+# ------------------------------------------------------------
+# 1. Everything except /api/v2/**
+# ------------------------------------------------------------
 apiVersion: networking.k8s.io/v1
 kind: Ingress
 metadata:
@@ -10,7 +13,7 @@ metadata:
     nginx.ingress.kubernetes.io/proxy-buffers-size: "256k"
     nginx.ingress.kubernetes.io/proxy-busy-buffers-size: "256k"
     nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
-    nginx.ingress.kubernetes.io/proxy-send-timeout: "300" 
+    nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
     nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
     nginx.ingress.kubernetes.io/enable-cors: "true"
     nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, OPTIONS, PUT, DELETE"
@@ -20,32 +23,22 @@ metadata:
 spec:
   ingressClassName: nginx
   tls:
-    - hosts:
-      - dev02.ki-lab.nrw 
+    - hosts: [dev02.ki-lab.nrw]
       secretName: ingress-cert
   rules:
     - host: dev02.ki-lab.nrw
       http:
         paths:
-          # New UI API path
-          - path: "/api/v2"
-            pathType: Prefix
-            backend:
-              service:
-                name: portal-be-service
-                port: 
-                  number: 8083
-          
-          # Old UI API path - goes to frontend
+          # OLD-UI gateway (Zuul)
           - path: "/api"
             pathType: Prefix
             backend:
               service:
                 name: portal-fe-service
-                port: 
+                port:
                   number: 8085
-                  
-          # Public endpoints
+
+          # Public endpoints served directly by portal-be
           - path: "/public"
             pathType: Prefix
             backend:
@@ -67,8 +60,8 @@ spec:
                 name: portal-be-service
                 port:
                   number: 8083
-                  
-          # New Angular UI
+
+          # NEW Angular 17 front-end (static assets)
           - path: "/v2"
             pathType: Prefix
             backend:
@@ -76,12 +69,41 @@ spec:
                 name: angular-frontend-service
                 port:
                   number: 80
-                  
-          # Root path (for static assets and old UI)
+
+          # Root path – legacy AngularJS UI
           - path: "/"
             pathType: Prefix
             backend:
               service:
                 name: portal-fe-service
                 port:
-                  number: 8085
\ No newline at end of file
+                  number: 8085
+---
+# ------------------------------------------------------------
+# 2. Regex rule for /api/v2/**   →   /**   (strips the prefix)
+# ------------------------------------------------------------
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: api-v2-ingress
+  namespace: graphene
+  annotations:
+    kubernetes.io/ingress.class: nginx
+    nginx.ingress.kubernetes.io/use-regex: "true"
+    nginx.ingress.kubernetes.io/rewrite-target: /$2
+spec:
+  ingressClassName: nginx
+  tls:
+    - hosts: [dev02.ki-lab.nrw]
+      secretName: ingress-cert
+  rules:
+    - host: dev02.ki-lab.nrw
+      http:
+        paths:
+          - path: /api/v2(/|$)(.*)
+            pathType: ImplementationSpecific
+            backend:
+              service:
+                name: portal-be-service
+                port:
+                  number: 8083
diff --git a/src/deployment/kubernetes/dsce-double-prefix.yaml b/src/deployment/kubernetes/dsce-ingress.yaml
similarity index 62%
rename from src/deployment/kubernetes/dsce-double-prefix.yaml
rename to src/deployment/kubernetes/dsce-ingress.yaml
index 11d763e..b9df5aa 100644
--- a/src/deployment/kubernetes/dsce-double-prefix.yaml
+++ b/src/deployment/kubernetes/dsce-ingress.yaml
@@ -1,23 +1,34 @@
 apiVersion: networking.k8s.io/v1
 kind: Ingress
 metadata:
-  name: dsce-double-prefix
+  name: dsce-ingress
   namespace: graphene
   annotations:
+    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
+    nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
     kubernetes.io/ingress.class: nginx
     nginx.ingress.kubernetes.io/use-regex: "true"
     nginx.ingress.kubernetes.io/rewrite-target: /dsce$1
-    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
-    nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
 spec:
   ingressClassName: nginx
+  tls:
+    - hosts: [dev02.ki-lab.nrw]
+      secretName: ingress-cert
   rules:
     - host: dev02.ki-lab.nrw
       http:
         paths:
-          # /dsce/dsce/<anything>  →  /dsce/<anything>
+          # old UI calls  /dsce/dsce/…
           - path: /dsce/dsce(/.*)
             pathType: ImplementationSpecific
+            backend:
+              service:
+                name: dsce-service
+                port:
+                  number: 8088
+          # future UI (or API) can use the cleaner single prefix /dsce/…
+          - path: /dsce/
+            pathType: Prefix
             backend:
               service:
                 name: dsce-service
diff --git a/src/deployment/kubernetes/dsce-prefix.yaml b/src/deployment/kubernetes/dsce-prefix.yaml
deleted file mode 100644
index 3c53a8e..0000000
--- a/src/deployment/kubernetes/dsce-prefix.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: dsce-prefix
-  namespace: graphene
-  annotations:
-    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
-    nginx.ingress.kubernetes.io/proxy-buffer-size: "16k"
-spec:
-  ingressClassName: nginx
-  rules:
-    - host: dev02.ki-lab.nrw
-      http:
-        paths:
-          - path: /dsce/
-            pathType: Prefix
-            backend:
-              service:
-                name: dsce-service
-                port:
-                  number: 8088
\ No newline at end of file
diff --git a/src/deployment/kubernetes/setup_ingress.sh b/src/deployment/kubernetes/setup_ingress.sh
new file mode 100644
index 0000000..4d4dd86
--- /dev/null
+++ b/src/deployment/kubernetes/setup_ingress.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+# ===============LICENSE_START=======================================================
+# Graphene Apache-2.0
+# ===================================================================================
+# Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+# ===================================================================================
+# This Graphene software file is distributed by AT&T
+# under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# This file is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ===============LICENSE_END=========================================================
+#
+# What this is: script to setup an Nginx-based ingress controller and related
+# ingress rules for the Graphene platform, as deployed under kubernetes. See
+# https://github.com/helm/charts/tree/master/stable/nginx-ingress for more
+# info.
+#
+# Prerequisites:
+# - Graphene core components through oneclick_deploy.sh
+#
+# Usage:
+# For k8s-based deployment, run this script on the AIO host or a workstation
+# connected to the k8s cluster via kubectl (e.g. via tools/setup_kubectl.sh)
+# $ bash setup_ingress.sh
+#
+# Openshift
+# oc login -u system:admin
+# oc project default
+# oc get -o yaml service/router dc/router clusterrolebinding/router-router-role serviceaccount/router > default-router-backup.yam
+# git clone https://github.com/nginxinc/nginx-openshift-router
+# cd nginx-openshift-router/src/nginx
+# docker build -t nginx-openshift-router:0.2 .
+# cd ~
+# oc delete -f default-router-backup.yaml
+# oc adm router router --images=nginx-openshift-router:0.2 --type=''
+
+function clean_ingress() {
+  trap 'fail' ERR
+  apps="cds kubernetes-client onboarding license-profile-editor playground-deployer federation dsce consolidated api-v2"
+  for app in $apps; do
+    if [[ $(kubectl get ingress -n $GRAPHENE_NAMESPACE $app-ingress) ]]; then
+      kubectl delete ingress -n $GRAPHENE_NAMESPACE $app-ingress
+      log "Ingress $app-ingress deleted"
+    fi
+  done
+}
+
+function setup_ingress() {
+  trap 'fail' ERR
+  log "Create ingress resources for services"
+  if [[ ! -d deploy ]]; then mkdir deploy; fi
+  cp templates/* deploy/.
+  replace_env deploy
+  ings=$(ls deploy)
+  for ing in $ings; do
+    kubectl create -f deploy/$ing
+  done
+}
+
+set -x
+trap 'fail' ERR
+WORK_DIR=$(pwd)
+cd $(dirname "$0")
+if [[ -z "$AIO_ROOT" ]]; then export AIO_ROOT="$(cd ..; pwd -P)"; fi
+source $AIO_ROOT/utils.sh
+source $AIO_ROOT/graphene_env.sh
+clean_ingress
+setup_ingress
+cd $WORK_DIR
-- 
GitLab