From 807a0bfd1fbb43b9b5e143ce6ad3a1c04b747528 Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Fri, 28 Mar 2025 16:08:43 +0100
Subject: [PATCH] OZG-7906 set up server

---
 aggregation-manager-server/pom.xml            |  80 +++++
 .../src/main/helm/.helmignore                 |  23 ++
 .../src/main/helm/Chart.yaml                  |  30 ++
 .../src/main/helm/templates/_helpers.tpl      | 114 +++++++
 .../templates/configmap_bindings_type.yaml    |  32 ++
 .../src/main/helm/templates/deployment.yaml   | 116 +++++++
 .../main/helm/templates/network_policy.yaml   |  73 +++++
 .../src/main/helm/templates/service.yaml      |  41 +++
 .../main/helm/templates/service_account.yaml  |  31 ++
 .../main/helm/templates/service_monitor.yaml  |  43 +++
 .../src/main/helm/values.yaml                 |  47 +++
 .../AggregationManagerApplication.java        |  40 +++
 .../src/main/resources/application-local.yml  |  13 +
 .../src/main/resources/application.yml        |  28 ++
 .../src/test/helm-linter-values.yaml          |  29 ++
 .../test/helm/deployment_63_char_test.yaml    |  55 ++++
 .../test/helm/deployment_resources_test.yaml  |  61 ++++
 .../src/test/helm/deployment_test.yaml        | 291 ++++++++++++++++++
 .../src/test/helm/network_policy_test.yaml    | 230 ++++++++++++++
 .../src/test/helm/service_account_test.yaml   |  63 ++++
 .../src/test/helm/service_monitor_test.yaml   |  84 +++++
 .../src/test/helm/service_test.yaml           |  81 +++++
 pom.xml                                       |   1 +
 run_helm_test_aggregation_server.sh           |  32 ++
 24 files changed, 1638 insertions(+)
 create mode 100644 aggregation-manager-server/pom.xml
 create mode 100644 aggregation-manager-server/src/main/helm/.helmignore
 create mode 100644 aggregation-manager-server/src/main/helm/Chart.yaml
 create mode 100644 aggregation-manager-server/src/main/helm/templates/_helpers.tpl
 create mode 100644 aggregation-manager-server/src/main/helm/templates/configmap_bindings_type.yaml
 create mode 100644 aggregation-manager-server/src/main/helm/templates/deployment.yaml
 create mode 100644 aggregation-manager-server/src/main/helm/templates/network_policy.yaml
 create mode 100644 aggregation-manager-server/src/main/helm/templates/service.yaml
 create mode 100644 aggregation-manager-server/src/main/helm/templates/service_account.yaml
 create mode 100644 aggregation-manager-server/src/main/helm/templates/service_monitor.yaml
 create mode 100644 aggregation-manager-server/src/main/helm/values.yaml
 create mode 100644 aggregation-manager-server/src/main/java/de/ozgcloud/aggregation/AggregationManagerApplication.java
 create mode 100644 aggregation-manager-server/src/main/resources/application-local.yml
 create mode 100644 aggregation-manager-server/src/main/resources/application.yml
 create mode 100644 aggregation-manager-server/src/test/helm-linter-values.yaml
 create mode 100644 aggregation-manager-server/src/test/helm/deployment_63_char_test.yaml
 create mode 100644 aggregation-manager-server/src/test/helm/deployment_resources_test.yaml
 create mode 100644 aggregation-manager-server/src/test/helm/deployment_test.yaml
 create mode 100644 aggregation-manager-server/src/test/helm/network_policy_test.yaml
 create mode 100644 aggregation-manager-server/src/test/helm/service_account_test.yaml
 create mode 100644 aggregation-manager-server/src/test/helm/service_monitor_test.yaml
 create mode 100644 aggregation-manager-server/src/test/helm/service_test.yaml
 create mode 100755 run_helm_test_aggregation_server.sh

diff --git a/aggregation-manager-server/pom.xml b/aggregation-manager-server/pom.xml
new file mode 100644
index 0000000..51420dc
--- /dev/null
+++ b/aggregation-manager-server/pom.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+    Ministerpräsidenten des Landes Schleswig-Holstein
+    Staatskanzlei
+    Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+
+    Lizenziert unter der EUPL, Version 1.2 oder - sobald
+    diese von der Europäischen Kommission genehmigt wurden -
+    Folgeversionen der EUPL ("Lizenz");
+    Sie dürfen dieses Werk ausschließlich gemäß
+    dieser Lizenz nutzen.
+    Eine Kopie der Lizenz finden Sie hier:
+
+    https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+
+    Sofern nicht durch anwendbare Rechtsvorschriften
+    gefordert oder in schriftlicher Form vereinbart, wird
+    die unter der Lizenz verbreitete Software "so wie sie
+    ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+    ausdrücklich oder stillschweigend - verbreitet.
+    Die sprachspezifischen Genehmigungen und Beschränkungen
+    unter der Lizenz sind dem Lizenztext zu entnehmen.
+
+-->
+<project xmlns="https://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>de.ozgcloud.aggregation</groupId>
+		<artifactId>aggregation-manager-parent</artifactId>
+		<version>1.3.0-SNAPSHOT</version>
+		<relativePath>../</relativePath>
+	</parent>
+	<artifactId>aggregation-manager-server</artifactId>
+	<name>OZG-Cloud Aggregation Manager Job</name>
+
+	<properties>
+		<spring-boot.build-image.imageName>docker.ozg-sh.de/aggregation-manager-server:build-latest</spring-boot.build-image.imageName>
+	</properties>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.springframework.boot</groupId>
+				<artifactId>spring-boot-maven-plugin</artifactId>
+				<configuration>
+					<mainClass>de.ozgcloud.aggregation.AggregationManagerApplication</mainClass>
+					<image>
+						<env>
+							<BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
+							<BPE_APPEND_JAVA_TOOL_OPTIONS>-Dfile.encoding=UTF-8</BPE_APPEND_JAVA_TOOL_OPTIONS>
+						</env>
+					</image>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-failsafe-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<groupId>com.mycila</groupId>
+				<artifactId>license-maven-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/aggregation-manager-server/src/main/helm/.helmignore b/aggregation-manager-server/src/main/helm/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/aggregation-manager-server/src/main/helm/Chart.yaml b/aggregation-manager-server/src/main/helm/Chart.yaml
new file mode 100644
index 0000000..a4ac9f3
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/Chart.yaml
@@ -0,0 +1,30 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: v1
+appVersion: "1.0"
+description: OZG-Cloud Helm chart for aggregation-manager-server
+name: aggregation-manager-server
+version: 0.0.0-MANAGED-BY-JENKINS
+icon: https://simpleicons.org/icons/helm.svg
diff --git a/aggregation-manager-server/src/main/helm/templates/_helpers.tpl b/aggregation-manager-server/src/main/helm/templates/_helpers.tpl
new file mode 100644
index 0000000..9f2c1fc
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/templates/_helpers.tpl
@@ -0,0 +1,114 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+
+{{/* error check 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec) */}}
+{{/* Namespace */}}
+{{- define "app.namespace" -}}
+{{- if gt (len (.Release.Namespace)) 63 -}}
+{{- fail (printf ".Release.Namespace %s ist zu lang (max. 63 Zeichen)" .Release.Namespace) -}}
+{{- end -}}
+{{ printf "%s" .Release.Namespace }}
+{{- end -}}
+
+{{/* Chart: Name + Version */}}
+{{- define "app.chart" -}}
+{{- if gt (len (printf "%s-%s" .Chart.Name .Chart.Version)) 63 -}}
+{{- fail (printf ".Chart.Name-.Chart.Version %s-%s ist zu lang (max. 63 Zeichen)" .Chart.Name .Chart.Version) -}}
+{{- end -}}
+{{ printf "%s-%s" .Chart.Name .Chart.Version }}
+{{- end -}}
+
+{{/* Managed-by -> On Helm, this value is always Helm */}}
+{{- define "app.managedBy" -}}
+{{- if gt (len (.Release.Service)) 63 -}}
+{{- fail (printf ".Release.Service %s ist zu lang (max. 63 Zeichen)" .Release.Service) -}}
+{{- end -}}
+{{ printf "%s" .Release.Service }}
+{{- end -}}
+
+
+{{/* Default Labels: Helm recommended best-practice labels https://helm.sh/docs/chart_best_practices/labels/ */}}
+{{- define "app.defaultLabels" }}
+app.kubernetes.io/instance: aggregation-manager-server
+app.kubernetes.io/managed-by: {{ include "app.managedBy" . }}
+app.kubernetes.io/name: {{ .Release.Name }}
+app.kubernetes.io/namespace: {{ include "app.namespace" . }}
+app.kubernetes.io/part-of: ozgcloud
+app.kubernetes.io/version: {{ .Chart.Version }}
+helm.sh/chart: {{ include "app.chart" . }}
+ozgcloud-mongodb-client: "true"
+{{- end -}}
+
+{{- define "app.matchLabels" }}
+app.kubernetes.io/name: {{ .Release.Name }}
+app.kubernetes.io/namespace: {{ include "app.namespace" . }}
+{{- end -}}
+
+
+{{- define "app.envSpringProfiles" }}
+{{- if (.Values.env).overrideSpringProfiles -}}
+{{ printf "%s" (.Values.env).overrideSpringProfiles }}
+{{- else -}}
+{{ printf "oc, %s" (include "app.ozgcloudEnvironment" . ) }}
+{{- end -}}
+{{- end -}}
+
+{{- define "app.ozgcloudEnvironment" -}}
+{{- required "Environment muss angegeben sein" (.Values.ozgcloud).environment -}}
+{{- end -}}
+
+{{- define "app.grpcClientVorgangManagerAddress" -}}
+{{- if (.Values.env).grpcClientVorgangManagerAddress -}}
+{{ printf "%s" (.Values.env).grpcClientVorgangManagerAddress }}
+{{- else -}}
+{{ printf "dns:///%s.%s:9090" ( coalesce .Values.vorgangManagerName "vorgang-manager" ) (include "app.namespace" . ) }}
+{{- end -}}
+{{- end -}}
+
+{{- define "app.getCustomList" -}}
+{{- with (.Values.env).customList -}}
+{{- if kindIs "map" . -}}
+{{ include "app.dictToList" . }}
+{{- else if kindIs "slice" . -}}
+{{ . | toYaml }}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{- define "app.dictToList" -}}
+{{- $customList := list -}}
+{{- range $key, $value := . -}}
+{{- $customList = append $customList (dict "name" $key "value" $value) }}
+{{- end -}}
+{{- $customList | toYaml -}}
+{{- end -}}
+
+{{- define "app.getOzgcloudAdministrationAddress" -}}
+{{- if .Values.administrationAddress -}}
+{{ printf "%s" .Values.administrationAddress }}
+{{- else -}}
+{{ printf "http://%s.%s:8080" .Values.administrationName .Release.Namespace }}
+{{- end -}}
+{{- end -}}
\ No newline at end of file
diff --git a/aggregation-manager-server/src/main/helm/templates/configmap_bindings_type.yaml b/aggregation-manager-server/src/main/helm/templates/configmap_bindings_type.yaml
new file mode 100644
index 0000000..6acf2ce
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/templates/configmap_bindings_type.yaml
@@ -0,0 +1,32 @@
+#
+# Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: bindings-type
+  namespace: {{ include "app.namespace" . }}
+data:
+  type: |
+    ca-certificates
\ No newline at end of file
diff --git a/aggregation-manager-server/src/main/helm/templates/deployment.yaml b/aggregation-manager-server/src/main/helm/templates/deployment.yaml
new file mode 100644
index 0000000..f8e7c6b
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/templates/deployment.yaml
@@ -0,0 +1,116 @@
+#
+# Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: {{ .Release.Name }}
+  namespace: {{ include "app.namespace" . }}
+  labels:
+      {{- include "app.defaultLabels" . | indent 4 }}
+spec:
+  progressDeadlineSeconds: 600
+  replicas: {{ .Values.replicaCount }}
+  revisionHistoryLimit: 10
+  selector:
+    matchLabels:
+        {{- include "app.matchLabels" . | indent 6 }}
+  strategy:
+    rollingUpdate:
+      maxSurge: 1
+      maxUnavailable: 0
+    type: RollingUpdate
+  template:
+    metadata:
+      labels:
+        {{- include "app.defaultLabels" . | indent 8 }}
+        component: aggregation-manager-server
+    spec:
+      topologySpreadConstraints:
+        - maxSkew: 1
+          topologyKey: kubernetes.io/hostname
+          whenUnsatisfiable: ScheduleAnyway
+          labelSelector:
+            matchLabels:
+              app.kubernetes.io/name: {{ .Release.Name }}
+      containers:
+      - name: aggregation-manager-server
+        image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}"
+        imagePullPolicy: Always
+        env:
+        - name: SERVICE_BINDING_ROOT
+          value: "/bindings"
+        - name: spring_profiles_active
+          value: {{ include "app.envSpringProfiles" . }}
+        ports:
+          - containerPort: 8081
+            name: metrics
+            protocol: TCP
+        readinessProbe:
+          failureThreshold: 3
+          httpGet:
+            path: /actuator/health/readiness
+            port: 8081
+            scheme: HTTP
+          periodSeconds: 10
+          successThreshold: 1
+          timeoutSeconds: 3
+        startupProbe:
+          httpGet:
+            path: /actuator/health/readiness
+            port: 8081
+            scheme: HTTP
+          failureThreshold: 10
+          initialDelaySeconds: 30
+          periodSeconds: 10
+          successThreshold: 1
+          timeoutSeconds: 5
+        resources:
+        {{- with .Values.resources }}
+{{ toYaml . | indent 10 }}
+        {{- end }}
+        securityContext:
+          allowPrivilegeEscalation: false
+          privileged: false
+          readOnlyRootFilesystem: false
+          runAsNonRoot: false
+        stdin: true
+        terminationMessagePath: /dev/termination-log
+        terminationMessagePolicy: File
+        tty: true
+        volumeMounts:
+          - name: bindings
+            mountPath: "/bindings/ca-certificates/type"
+            subPath: type
+            readOnly: true
+      volumes:
+        - name: bindings
+          configMap:
+            name: bindings-type
+      dnsConfig: { }
+      dnsPolicy: ClusterFirst
+      restartPolicy: Always
+      schedulerName: default-scheduler
+      securityContext: { }
+      terminationGracePeriodSeconds: 30
diff --git a/aggregation-manager-server/src/main/helm/templates/network_policy.yaml b/aggregation-manager-server/src/main/helm/templates/network_policy.yaml
new file mode 100644
index 0000000..66f7b05
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/templates/network_policy.yaml
@@ -0,0 +1,73 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+{{- if not (.Values.networkPolicy).disabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: network-policy-aggregation-manager-server
+  namespace: {{ include "app.namespace" . }}
+spec:
+  podSelector:
+    matchLabels:
+      component: aggregation-manager-server
+  policyTypes:
+    - Ingress
+    - Egress
+  ingress:
+  - from:
+    - namespaceSelector:
+        matchLabels:
+          name: {{ (.Values.networkPolicy).monitoringNamespace | default "openshift-user-workload-monitoring" }}
+    ports:
+    - protocol: TCP
+      port: 8081
+{{- with (.Values.networkPolicy).additionalIngressConfigLocal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+{{- with (.Values.networkPolicy).additionalIngressConfigGlobal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+  egress:
+    - to:
+      - namespaceSelector:
+          matchLabels:
+            kubernetes.io/metadata.name: {{ required "networkPolicy.dnsServerNamespace must be set" (.Values.networkPolicy).dnsServerNamespace }}
+      ports:
+        - port: 53
+          protocol: UDP
+        - port: 53
+          protocol: TCP
+        - port: 5353
+          protocol: UDP
+        - port: 5353
+          protocol: TCP
+{{- with (.Values.networkPolicy).additionalEgressConfigLocal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+{{- with (.Values.networkPolicy).additionalEgressConfigGlobal }}
+{{ toYaml . | indent 2 }}
+{{- end }}
+
+{{- end }}
\ No newline at end of file
diff --git a/aggregation-manager-server/src/main/helm/templates/service.yaml b/aggregation-manager-server/src/main/helm/templates/service.yaml
new file mode 100644
index 0000000..55d72c4
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/templates/service.yaml
@@ -0,0 +1,41 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ .Release.Name }}
+  namespace: {{ include "app.namespace" . }}
+  labels:
+    {{- include "app.defaultLabels" . | indent 4 }}
+    component: aggregation-manager-server-service
+spec:
+  type: ClusterIP
+  ports:
+    - name: metrics
+      port: 8081
+      protocol: TCP
+  selector:
+    {{- include "app.matchLabels" . | indent 4 }}
+    component: aggregation-manager-server
diff --git a/aggregation-manager-server/src/main/helm/templates/service_account.yaml b/aggregation-manager-server/src/main/helm/templates/service_account.yaml
new file mode 100644
index 0000000..02ff46e
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/templates/service_account.yaml
@@ -0,0 +1,31 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+{{- if (.Values.serviceAccount).create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  name: {{ .Values.serviceAccount.name }}
+  namespace: {{ include "app.namespace" . }}
+{{- end }}
\ No newline at end of file
diff --git a/aggregation-manager-server/src/main/helm/templates/service_monitor.yaml b/aggregation-manager-server/src/main/helm/templates/service_monitor.yaml
new file mode 100644
index 0000000..102cf41
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/templates/service_monitor.yaml
@@ -0,0 +1,43 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+  name: {{ .Release.Name }}
+  namespace: {{ include "app.namespace" . }}
+  labels:
+    {{- include "app.defaultLabels" . | indent 4 }}
+    component: aggregation-manager-server-service-monitor
+spec:
+  endpoints:
+  - port: metrics
+    path: /actuator/prometheus
+  namespaceSelector:
+    matchNames:
+    - {{ include "app.namespace" . }}
+  selector:
+    matchLabels:
+      {{- include "app.matchLabels" . | indent 6 }}
+      component: aggregation-manager-server-service
\ No newline at end of file
diff --git a/aggregation-manager-server/src/main/helm/values.yaml b/aggregation-manager-server/src/main/helm/values.yaml
new file mode 100644
index 0000000..f4eb0eb
--- /dev/null
+++ b/aggregation-manager-server/src/main/helm/values.yaml
@@ -0,0 +1,47 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+image:
+  repo: docker.ozg-sh.de
+  name: aggregation-manager-server
+  tag: latest
+
+ozgcloud:
+  environment:
+
+database:
+  useExternal: false
+  databaseName: aggregation-manager-database
+  secretName: ozg-mongodb-admin-aggregation-manager-user
+  tls:
+    enabled: false
+    secretName: ozg-mongodb-tls-cert
+
+serviceAccount:
+  create: true
+  name: aggregation-manager-server-service-account
+
+imagePullSecret: ""
+
+replicaCount: 1
diff --git a/aggregation-manager-server/src/main/java/de/ozgcloud/aggregation/AggregationManagerApplication.java b/aggregation-manager-server/src/main/java/de/ozgcloud/aggregation/AggregationManagerApplication.java
new file mode 100644
index 0000000..882c75f
--- /dev/null
+++ b/aggregation-manager-server/src/main/java/de/ozgcloud/aggregation/AggregationManagerApplication.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+ * Ministerpräsidenten des Landes Schleswig-Holstein
+ * Staatskanzlei
+ * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+ *
+ * Lizenziert unter der EUPL, Version 1.2 oder - sobald
+ * diese von der Europäischen Kommission genehmigt wurden -
+ * Folgeversionen der EUPL ("Lizenz");
+ * Sie dürfen dieses Werk ausschließlich gemäß
+ * dieser Lizenz nutzen.
+ * Eine Kopie der Lizenz finden Sie hier:
+ *
+ * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+ *
+ * Sofern nicht durch anwendbare Rechtsvorschriften
+ * gefordert oder in schriftlicher Form vereinbart, wird
+ * die unter der Lizenz verbreitete Software "so wie sie
+ * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+ * ausdrücklich oder stillschweigend - verbreitet.
+ * Die sprachspezifischen Genehmigungen und Beschränkungen
+ * unter der Lizenz sind dem Lizenztext zu entnehmen.
+ */
+package de.ozgcloud.aggregation;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan({ "de.ozgcloud.*" })
+@ConfigurationPropertiesScan("de.ozgcloud.*")
+public class AggregationManagerApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(AggregationManagerApplication.class, args);
+	}
+
+}
\ No newline at end of file
diff --git a/aggregation-manager-server/src/main/resources/application-local.yml b/aggregation-manager-server/src/main/resources/application-local.yml
new file mode 100644
index 0000000..fe32e63
--- /dev/null
+++ b/aggregation-manager-server/src/main/resources/application-local.yml
@@ -0,0 +1,13 @@
+logging:
+  level:
+    ROOT: WARN
+    '[de.ozgcloud]': DEBUG
+  config: classpath:log4j2-local.xml
+
+spring:
+  data:
+    mongodb:
+      host: localhost
+      port: 27017
+      database: aggregation-manager-land
+
diff --git a/aggregation-manager-server/src/main/resources/application.yml b/aggregation-manager-server/src/main/resources/application.yml
new file mode 100644
index 0000000..b62baf8
--- /dev/null
+++ b/aggregation-manager-server/src/main/resources/application.yml
@@ -0,0 +1,28 @@
+logging:
+  level:
+    ROOT: WARN
+    '[de.ozgcloud]': INFO,
+    '[org.springframework.security]': WARN
+
+management:
+  server:
+    port: 8081
+  health:
+    livenessState:
+      enabled: true
+    readinessState:
+      enabled: true
+  endpoint:
+    health:
+      group:
+        exploratory:
+          include: livenessState,readinessState,ping
+          show-details: always
+      probes:
+        enabled: true
+    prometheus:
+      enabled: true
+  endpoints:
+    web:
+      exposure:
+        include: health,prometheus
diff --git a/aggregation-manager-server/src/test/helm-linter-values.yaml b/aggregation-manager-server/src/test/helm-linter-values.yaml
new file mode 100644
index 0000000..5024cc9
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm-linter-values.yaml
@@ -0,0 +1,29 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+ozgcloud:
+  environment: dev
+
+networkPolicy:
+  dnsServerNamespace: dummy-dns
diff --git a/aggregation-manager-server/src/test/helm/deployment_63_char_test.yaml b/aggregation-manager-server/src/test/helm/deployment_63_char_test.yaml
new file mode 100644
index 0000000..39f12c1
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm/deployment_63_char_test.yaml
@@ -0,0 +1,55 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test deployment less than 63 chars
+release:
+  name: aggregation-manager-server
+  namespace: aggregation-manager-server
+
+templates:
+  - templates/deployment.yaml
+set:
+  ozgcloud:
+    environment: dev
+  imagePullSecret: image-pull-secret
+
+tests:
+  - it: should fail on .Release.Namespace length longer than 63 characters
+    release:
+      namespace: test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890
+    asserts:
+      - failedTemplate:
+          errorMessage: .Release.Namespace test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen)
+  - it: should not fail on .Release.Namespace length less than 63 characters
+    asserts:
+      - notFailedTemplate: {}
+  - it: should fail on .Chart.Name-.Chart.Version length longer than 63 characters
+    chart:
+      version: 1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890
+    asserts:
+      - failedTemplate:
+          errorMessage: .Chart.Name-.Chart.Version aggregation-manager-server-1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen)
+  - it: should not fail on .Chart.Name-.Chart.Version length less than 63 characters
+    asserts:
+      - notFailedTemplate: {}
diff --git a/aggregation-manager-server/src/test/helm/deployment_resources_test.yaml b/aggregation-manager-server/src/test/helm/deployment_resources_test.yaml
new file mode 100644
index 0000000..90f47f1
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm/deployment_resources_test.yaml
@@ -0,0 +1,61 @@
+#
+# Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: deployment_resources_test
+release:
+  name: aggregation-manager-server
+  namespace: aggregation-manager-server
+templates:
+  - templates/deployment.yaml
+set:
+  ozgcloud:
+    environment: test
+  imagePullSecret: image-pull-secret
+tests:
+  - it: validate container resources
+    set:
+      resources:
+        limits:
+          cpu: "11m"
+          memory: "22Mi"
+        requests:
+          cpu: "33m"
+          memory: "44Mi"
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].resources.limits.cpu
+          value: "11m"
+      - equal:
+          path: spec.template.spec.containers[0].resources.limits.memory
+          value: "22Mi"
+      - equal:
+          path: spec.template.spec.containers[0].resources.requests.cpu
+          value: "33m"
+      - equal:
+          path: spec.template.spec.containers[0].resources.requests.memory
+          value: "44Mi"
+  - it: test empty resources
+    asserts:
+      - isEmpty:
+          path: spec.template.spec.containers[0].resources
diff --git a/aggregation-manager-server/src/test/helm/deployment_test.yaml b/aggregation-manager-server/src/test/helm/deployment_test.yaml
new file mode 100644
index 0000000..6b70a10
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm/deployment_test.yaml
@@ -0,0 +1,291 @@
+#
+# Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: deployment_test
+release:
+  name: aggregation-manager-server
+  namespace: aggregation-manager-server
+templates:
+  - templates/deployment.yaml
+set:
+  ozgcloud:
+    environment: dev
+  imagePullSecret: image-pull-secret
+tests:
+  - it: validate deployment root configuration
+    asserts:
+      - isAPIVersion:
+          of: apps/v1
+      - isKind:
+          of: Deployment
+  - it: validate metadata
+    asserts:
+      - equal:
+          path: metadata.name
+          value: aggregation-manager-server
+      - equal:
+          path: metadata.namespace
+          value: aggregation-manager-server
+      - equal:
+          path: metadata.labels["app.kubernetes.io/instance"]
+          value: aggregation-manager-server
+      - equal:
+          path: metadata.labels["app.kubernetes.io/name"]
+          value: aggregation-manager-server
+      - equal:
+          path: metadata.labels["app.kubernetes.io/namespace"]
+          value: aggregation-manager-server
+      - equal:
+          path: metadata.labels["app.kubernetes.io/part-of"]
+          value: ozgcloud
+      - equal:
+          path: metadata.labels["app.kubernetes.io/version"]
+          value: 0.0.0-MANAGED-BY-JENKINS
+      - equal:
+          path: metadata.labels["helm.sh/chart"]
+          value: aggregation-manager-server-0.0.0-MANAGED-BY-JENKINS
+  - it: validate spec root configuration
+    asserts:
+      - equal:
+          path: spec.progressDeadlineSeconds
+          value: 600
+      - equal:
+          path: spec.replicas
+          value: 1
+      - equal:
+          path: spec.revisionHistoryLimit
+          value: 10
+  - it: validate spec selector
+    asserts:
+      - equal:
+          path: spec.selector.matchLabels["app.kubernetes.io/name"]
+          value: aggregation-manager-server
+      - equal:
+          path: spec.selector.matchLabels["app.kubernetes.io/namespace"]
+          value: aggregation-manager-server
+  - it: validate rolling updates
+    asserts:
+      - equal:
+          path: spec.strategy.rollingUpdate.maxSurge
+          value: 1
+      - equal:
+          path: spec.strategy.rollingUpdate.maxUnavailable
+          value: 0
+      - equal:
+          path: spec.strategy.type
+          value: RollingUpdate
+  - it: validate spec template metadata
+    asserts:
+      - equal:
+          path: spec.template.metadata.labels.component
+          value: aggregation-manager-server
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/instance"]
+          value: aggregation-manager-server
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/name"]
+          value: aggregation-manager-server
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/namespace"]
+          value: aggregation-manager-server
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/part-of"]
+          value: ozgcloud
+      - equal:
+          path: spec.template.metadata.labels["app.kubernetes.io/version"]
+          value: 0.0.0-MANAGED-BY-JENKINS
+      - equal:
+          path: spec.template.metadata.labels["helm.sh/chart"]
+          value: aggregation-manager-server-0.0.0-MANAGED-BY-JENKINS
+  - it: validate spec template spec topology spread constraints
+    asserts:
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].maxSkew
+          value: 1
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].topologyKey
+          value: kubernetes.io/hostname
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable
+          value: ScheduleAnyway
+      - equal:
+          path: spec.template.spec.topologySpreadConstraints[0].labelSelector.matchLabels["app.kubernetes.io/name"]
+          value: aggregation-manager-server
+  - it: validate containers environment
+    asserts:
+      - contains:
+          path: spec.template.spec.containers[0].env
+          content:
+            name: SERVICE_BINDING_ROOT
+            value: "/bindings"
+  - it: validate image name
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].image
+          value: "docker.ozg-sh.de/aggregation-manager-server:latest"
+      - isAPIVersion:
+          of: apps/v1
+  - it: validate image pull policy
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].imagePullPolicy
+          value: Always
+  - it: validate container name
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].name
+          value: aggregation-manager-server
+  - it: validate container ports
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].ports[0].containerPort
+          value: 8081
+      - equal:
+          path: spec.template.spec.containers[0].ports[0].name
+          value: "metrics"
+      - equal:
+          path: spec.template.spec.containers[0].ports[0].protocol
+          value: "TCP"
+  - it: validate readiness probe
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.failureThreshold
+          value: 3
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.httpGet.path
+          value: /actuator/health/readiness
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.httpGet.port
+          value: 8081
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.httpGet.scheme
+          value: HTTP
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.periodSeconds
+          value: 10
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.successThreshold
+          value: 1
+      - equal:
+          path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds
+          value: 3
+  - it: validate startup probe
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.failureThreshold
+          value: 10
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.httpGet.path
+          value: /actuator/health/readiness
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.httpGet.port
+          value: 8081
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.httpGet.scheme
+          value: HTTP
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.failureThreshold
+          value: 10
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.initialDelaySeconds
+          value: 30
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.periodSeconds
+          value: 10
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.successThreshold
+          value: 1
+      - equal:
+          path: spec.template.spec.containers[0].startupProbe.timeoutSeconds
+          value: 5
+  - it: validate container security context
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation
+          value: false
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.privileged
+          value: false
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem
+          value: false
+      - equal:
+          path: spec.template.spec.containers[0].securityContext.runAsNonRoot
+          value: false
+  - it: validate container volume mounts
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].volumeMounts[0].name
+          value: bindings
+      - equal:
+          path: spec.template.spec.containers[0].volumeMounts[0].mountPath
+          value: "/bindings/ca-certificates/type"
+      - equal:
+          path: spec.template.spec.containers[0].volumeMounts[0].subPath
+          value: type
+      - equal:
+          path: spec.template.spec.containers[0].volumeMounts[0].readOnly
+          value: true
+  - it: validate volumes
+    asserts:
+      - equal:
+          path: spec.template.spec.volumes[0].name
+          value: bindings
+      - equal:
+          path: spec.template.spec.volumes[0].configMap.name
+          value: bindings-type
+  - it: validate container root config
+    asserts:
+      - equal:
+          path: spec.template.spec.containers[0].stdin
+          value: true
+      - equal:
+          path: spec.template.spec.containers[0].terminationMessagePath
+          value: /dev/termination-log
+      - equal:
+          path: spec.template.spec.containers[0].terminationMessagePolicy
+          value: File
+      - equal:
+          path: spec.template.spec.containers[0].tty
+          value: true
+  - it: validate spec template spec root config
+    asserts:
+      - equal:
+          path: spec.template.spec.dnsConfig
+          value: {}
+      - equal:
+          path: spec.template.spec.dnsPolicy
+          value: ClusterFirst
+      - equal:
+          path: spec.template.spec.restartPolicy
+          value: Always
+      - equal:
+          path: spec.template.spec.schedulerName
+          value: default-scheduler
+      - equal:
+          path: spec.template.spec.securityContext
+          value: {}
+      - equal:
+          path: spec.template.spec.terminationGracePeriodSeconds
+          value: 30
diff --git a/aggregation-manager-server/src/test/helm/network_policy_test.yaml b/aggregation-manager-server/src/test/helm/network_policy_test.yaml
new file mode 100644
index 0000000..ac8acb0
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm/network_policy_test.yaml
@@ -0,0 +1,230 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: network policy aggregation-manager-server test
+release:
+  name: aggregation-manager-server
+  namespace: by-helm-test
+templates:
+  - templates/network_policy.yaml
+
+tests:
+  - it: should match apiVersion
+    set:
+      networkPolicy:
+        dnsServerNamespace: kube-system
+    asserts:
+      - isAPIVersion:
+          of: networking.k8s.io/v1
+  - it: should match kind
+    set:
+      networkPolicy:
+        dnsServerNamespace: kube-system
+    asserts:
+      - isKind:
+          of: NetworkPolicy
+  - it: validate metadata
+    set:
+      networkPolicy:
+        dnsServerNamespace: kube-system
+    asserts:
+      - equal:
+          path: metadata
+          value:
+            name: network-policy-aggregation-manager-server
+            namespace: by-helm-test
+  - it: validate spec
+    set:
+      networkPolicy:
+        dnsServerNamespace: kube-system
+    asserts:
+      - equal:
+          path: spec
+          value:
+            egress:
+              - ports:
+                  - port: 53
+                    protocol: UDP
+                  - port: 53
+                    protocol: TCP
+                  - port: 5353
+                    protocol: UDP
+                  - port: 5353
+                    protocol: TCP
+                to:
+                  - namespaceSelector:
+                      matchLabels:
+                        kubernetes.io/metadata.name: kube-system
+            ingress:
+              - from:
+                  - namespaceSelector:
+                      matchLabels:
+                        name: openshift-user-workload-monitoring
+                ports:
+                  - port: 8081
+                    protocol: TCP
+            podSelector:
+              matchLabels:
+                component: aggregation-manager-server
+            policyTypes:
+              - Ingress
+              - Egress
+
+  - it: add ingress rule by values local
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigLocal:
+          - from:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+
+  - it: set ingress monitoring namespace rule
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        monitoringNamespace: monitoring
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+              - namespaceSelector:
+                  matchLabels:
+                    name: "monitoring"
+            ports:
+              - protocol: TCP
+                port: 8081
+  - it: add ingress rule by values global
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigGlobal:
+          - from:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+
+  - it: add ingress rule by values global
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigGlobal:
+          - from:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            from:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+
+  - it: add egress rule by values local
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigLocal:
+          - to:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            to:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+
+  - it: add egress rule by values global
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-namespace-dns
+        additionalIngressConfigGlobal:
+          - to:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+    asserts:
+      - contains:
+          path: spec.ingress
+          content:
+            to:
+              - podSelector:
+                  matchLabels:
+                    component: client2
+
+  - it: test network policy disabled
+    set:
+      networkPolicy:
+        disabled: true
+    asserts:
+      - hasDocuments:
+          count: 0
+
+  - it: test network policy unset should be disabled
+    set:
+      networkPolicy:
+        disabled: false
+        dnsServerNamespace: test-dns-server-namespace
+    asserts:
+      - hasDocuments:
+          count: 1
+  - it: test network policy dnsServerNamespace must be set message
+    set:
+      networkPolicy:
+        disabled: false
+    asserts:
+      - failedTemplate:
+          errorMessage: networkPolicy.dnsServerNamespace must be set
+
+  - it: test network policy should be enabled by default
+    set:
+      networkPolicy:
+        dnsServerNamespace: test-dns-server-namespace
+    asserts:
+      - hasDocuments:
+          count: 1
diff --git a/aggregation-manager-server/src/test/helm/service_account_test.yaml b/aggregation-manager-server/src/test/helm/service_account_test.yaml
new file mode 100644
index 0000000..865a883
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm/service_account_test.yaml
@@ -0,0 +1,63 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test service account
+release:
+  name: aggregation-manager-server
+  namespace: sh-helm-test
+templates:
+  - templates/service_account.yaml
+tests:
+  - it: should create service account with default name
+    asserts:
+      - isKind:
+          of: ServiceAccount
+      - isAPIVersion:
+          of: v1
+      - equal:
+          path: metadata.name
+          value: aggregation-manager-server-service-account
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
+  - it: should set service account with name
+    set:
+      serviceAccount:
+        name: helm-service-account
+    asserts:
+      - isKind:
+          of: ServiceAccount
+      - equal:
+          path: metadata.name
+          value: helm-service-account
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
+  - it: should not create service account
+    set:
+      serviceAccount:
+        create: false
+    asserts:
+      - hasDocuments:
+        count: 0
diff --git a/aggregation-manager-server/src/test/helm/service_monitor_test.yaml b/aggregation-manager-server/src/test/helm/service_monitor_test.yaml
new file mode 100644
index 0000000..cc66c4a
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm/service_monitor_test.yaml
@@ -0,0 +1,84 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: test service_monitor
+release:
+  name: aggregation-manager-server
+  namespace: sh-helm-test
+templates:
+  - templates/service_monitor.yaml
+tests:
+  - it: should have basic info and the label component with value aggregation-manager-server-service-monitor attached
+    asserts:
+      - isKind:
+          of: ServiceMonitor
+      - isAPIVersion:
+          of: monitoring.coreos.com/v1
+      - equal:
+          path: metadata.name
+          value: aggregation-manager-server
+      - equal:
+          path: metadata.namespace
+          value: sh-helm-test
+      - equal:
+          path: metadata.labels["component"]
+          value: aggregation-manager-server-service-monitor
+
+  - it: should contain default lables and component lables
+    asserts:
+      - equal:
+          path: metadata.labels
+          value:
+            app.kubernetes.io/instance: aggregation-manager-server
+            app.kubernetes.io/managed-by: Helm
+            app.kubernetes.io/name: aggregation-manager-server
+            app.kubernetes.io/namespace: sh-helm-test
+            app.kubernetes.io/part-of: ozgcloud
+            app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS
+            component: aggregation-manager-server-service-monitor
+            helm.sh/chart: aggregation-manager-server-0.0.0-MANAGED-BY-JENKINS
+            ozgcloud-mongodb-client: "true"
+
+  - it: should have the metrics endpoint configured by default
+    asserts:
+      - contains:
+          path: spec.endpoints
+          content:
+            port: metrics
+            path: /actuator/prometheus
+
+  - it: namespace selector should contain the namespace
+    asserts:
+      - contains:
+          path: spec.namespaceSelector.matchNames
+          content: sh-helm-test
+
+  - it: selector should contain helm recommended labels name and namespace
+    asserts:
+      - equal:
+          path: spec.selector.matchLabels
+          value:
+            app.kubernetes.io/name: aggregation-manager-server
+            app.kubernetes.io/namespace: sh-helm-test
+            component: aggregation-manager-server-service
diff --git a/aggregation-manager-server/src/test/helm/service_test.yaml b/aggregation-manager-server/src/test/helm/service_test.yaml
new file mode 100644
index 0000000..95cc6af
--- /dev/null
+++ b/aggregation-manager-server/src/test/helm/service_test.yaml
@@ -0,0 +1,81 @@
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+suite: service
+
+templates:
+  - templates/service.yaml
+release:
+  name: aggregation-manager-server
+  namespace: helm-test
+
+tests:
+  - it: has expected document values
+    asserts:
+      - containsDocument:
+          kind: Service
+          apiVersion: v1
+          name: aggregation-manager-server
+          namespace: helm-test
+  - it: should be of type ClusterIP
+    asserts:
+      - equal:
+          path: spec.type
+          value: ClusterIP
+
+  - it: has metrics port
+    asserts:
+      - contains:
+          path: spec.ports
+          content:
+            name: metrics
+            port: 8081
+            protocol: TCP
+  - it: should contain helm recommended labels name and namespace
+    asserts:
+      - equal:
+          path: spec.selector["app.kubernetes.io/name"]
+          value: aggregation-manager-server
+      - equal:
+          path: spec.selector["app.kubernetes.io/namespace"]
+          value: helm-test
+  - it: has selector component
+    asserts:
+      - equal:
+          path: spec.selector.component
+          value: aggregation-manager-server
+  - it: should contain default lables and component lables
+    asserts:
+      - equal:
+          path: metadata.labels
+          value:
+            app.kubernetes.io/instance: aggregation-manager-server
+            app.kubernetes.io/managed-by: Helm
+            app.kubernetes.io/name: aggregation-manager-server
+            app.kubernetes.io/namespace: helm-test
+            app.kubernetes.io/part-of: ozgcloud
+            app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS
+            component: aggregation-manager-server-service
+            helm.sh/chart: aggregation-manager-server-0.0.0-MANAGED-BY-JENKINS
+            ozgcloud-mongodb-client: "true"
diff --git a/pom.xml b/pom.xml
index ed5c50d..3478192 100644
--- a/pom.xml
+++ b/pom.xml
@@ -43,6 +43,7 @@
 
 	<modules>
 		<module>aggregation-manager-job</module>
+		<module>aggregation-manager-server</module>
 	</modules>
 	<properties>
 		<ozgcloud.api-lib.version>0.18.0</ozgcloud.api-lib.version>
diff --git a/run_helm_test_aggregation_server.sh b/run_helm_test_aggregation_server.sh
new file mode 100755
index 0000000..e0130ad
--- /dev/null
+++ b/run_helm_test_aggregation_server.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+#
+# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
+# Ministerpräsidenten des Landes Schleswig-Holstein
+# Staatskanzlei
+# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
+#
+# Lizenziert unter der EUPL, Version 1.2 oder - sobald
+# diese von der Europäischen Kommission genehmigt wurden -
+# Folgeversionen der EUPL ("Lizenz");
+# Sie dürfen dieses Werk ausschließlich gemäß
+# dieser Lizenz nutzen.
+# Eine Kopie der Lizenz finden Sie hier:
+#
+# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
+#
+# Sofern nicht durch anwendbare Rechtsvorschriften
+# gefordert oder in schriftlicher Form vereinbart, wird
+# die unter der Lizenz verbreitete Software "so wie sie
+# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
+# ausdrücklich oder stillschweigend - verbreitet.
+# Die sprachspezifischen Genehmigungen und Beschränkungen
+# unter der Lizenz sind dem Lizenztext zu entnehmen.
+#
+
+
+set -e
+
+helm template  ./aggregation-manager-server/src/main/helm/ -f aggregation-manager-server/src/test/helm-linter-values.yaml
+helm lint -f aggregation-manager-server/src/test/helm-linter-values.yaml ./aggregation-manager-server/src/main/helm/
+cd aggregation-manager-server/src/main/helm && helm unittest  -f '../../test/helm/**/*test.yaml' .
+
-- 
GitLab