From ea7e83b412a45b5df173cf0c73aa97b2d4fb748a Mon Sep 17 00:00:00 2001 From: Kostis Trantzas Date: Fri, 23 Jan 2026 16:30:05 +0200 Subject: [PATCH] Adding MCP Backend to the OpenSlice HELM chart --- .../assets/config/config.prod.default.json | 1 + .../helm/openslice/templates/mcp-backend.yaml | 108 ++++++++++++++++++ ...ress.yaml.yaml => mcp-server-ingress.yaml} | 0 kubernetes/helm/openslice/values.yaml | 25 +++- 4 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 kubernetes/helm/openslice/templates/mcp-backend.yaml rename kubernetes/helm/openslice/templates/{mcp-server-ingress.yaml.yaml => mcp-server-ingress.yaml} (100%) diff --git a/kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config/config.prod.default.json b/kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config/config.prod.default.json index 92af948..20473ce 100644 --- a/kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config/config.prod.default.json +++ b/kubernetes/helm/openslice/files/org.etsi.osl.tmf.web/src/assets/config/config.prod.default.json @@ -5,6 +5,7 @@ "BUGZILLA": "{BASEURL}/bugzilla/", "STATUS": "{BASEURL}/healthstatus/", "WEBURL": "{BASEURL}", + "ASSISTANT_URL": "{BASEURL}/ask", "PORTAL_REPO_APIURL": "{BASEURL}/osapi", "ASSURANCE_SERVICE_MGMT_APIURL": "{BASEURL}/oas-api", "APITMFURL": "{BASEURL}/tmf-api", diff --git a/kubernetes/helm/openslice/templates/mcp-backend.yaml b/kubernetes/helm/openslice/templates/mcp-backend.yaml new file mode 100644 index 0000000..b60eff6 --- /dev/null +++ b/kubernetes/helm/openslice/templates/mcp-backend.yaml @@ -0,0 +1,108 @@ +{{- if .Values.mcpbackend.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: {{ .Release.Namespace }} + labels: + app: {{ include "openslice.fullname" . }} + org.etsi.osl.service: mcpbackend + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + {{- include "openslice.labels" . | nindent 4 }} + name: {{ include "openslice.fullname" . }}-mcpbackend +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ include "openslice.fullname" . }} + org.etsi.osl.service: mcpbackend + {{- include "openslice.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + app: {{ include "openslice.fullname" . }} + org.etsi.osl.service: mcpbackend + {{- include "openslice.selectorLabels" . | nindent 8 }} + spec: + containers: + - name: {{ include "openslice.fullname" . }}-mcpbackend + image: "{{ .Values.image.mcpbackend.repository }}:{{ .Values.image.mcpbackend.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.mcpbackend.pullPolicy | default "Always" }} + env: + - name: SPRING_APPLICATION_JSON + value: >- + { + "origins":"{{ .Values.rooturl }}", + "spring.config.import": "configtree:/etc/config/", + "server.forward-headers-strategy":"FRAMEWORK" + } + - name: SERVER_PORT + value: "11880" + - name: SPRING_APPLICATION_NAME + value: "osl-mcp-backend" + - name: SPRING_AI_OLLAMA_BASE_URL + value: "{{ .Values.mcpbackend.spring.ai.ollama.apiUrl }}" + - name: SPRING_AI_OLLAMA_CHAT_MODEL + value: "{{ .Values.mcpbackend.spring.ai.ollama.model }}" + - name: SPRING_AI_OLLAMA_CHAT_TEMPERATURE + value: "{{ .Values.mcpbackend.spring.ai.ollama.temperature }}" + - name: SPRING_AI_CHAT_SYSTEM_PROMPT + value: "{{ .Values.mcpbackend.spring.ai.chat.systemPrompt }}" + - name: SPRING_AI_CHAT_MAX_MESSAGES + value: "{{ .Values.mcpbackend.spring.ai.chat.maxMessages }}" + - name: SPRING_AI_MCP_CLIENT_TYPE + value: "SYNC" + - name: SPRING_AI_MCP_CLIENT_STREAMABLE_HTTP_CONNECTIONS_OPENSLICE_SERVER_URL + value: "http://{{ include "openslice.fullname" . }}-mcpserver:13015/sse" + - name: SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI + value: "{{ .Values.rooturl }}/auth/realms/openslice" + - name: SPRING_SECURITY_OAUTH2_CLIENT_PROVIDER_KEYCLOAK_ISSUER_URI + value: "{{ .Values.rooturl }}/auth/realms/openslice" + - name: SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KEYCLOAK_CLIENT_ID + value: "osapiWebClientId" + - name: SPRING_ACTIVEMQ_BROKER_URL + value: "tcp://{{ include "openslice.fullname" . }}-artemis:61616?jms.watchTopicAdvisories=false" + - name: LOGGING_LEVEL_ROOT + value: "{{ .Values.mcpbackend.logLevelRoot | default "INFO" }}" + - name: LOGGING_LEVEL_OSL + value: "{{ .Values.mcpbackend.logLevelOSL | default "INFO" }}" + - name: LOGGING_LEVEL_SPRING_AI + value: "{{ .Values.mcpbackend.spring.logLevel | default "INFO" }}" + ports: + - containerPort: 11880 + resources: + {{- toYaml .Values.resources | nindent 12 }} + volumeMounts: + - mountPath: "/etc/config/spring.activemq.user" + name: artemis-secrets + subPath: username + readOnly: true + - mountPath: "/etc/config/spring.activemq.password" + name: artemis-secrets + subPath: password + readOnly: true + restartPolicy: Always + volumes: + - name: artemis-secrets + secret: + secretName: {{ include "openslice.secrets.activemq" . }} +--- +apiVersion: v1 +kind: Service +metadata: + namespace: {{ .Release.Namespace }} + labels: + app: {{ include "openslice.fullname" . }} + org.etsi.osl.service: mcpbackend + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + {{- include "openslice.labels" . | nindent 4 }} + name: {{ include "openslice.fullname" . }}-mcpbackend +spec: + ports: + - name: "11880" + port: 11880 + targetPort: 11880 + selector: + app: {{ include "openslice.fullname" . }} + org.etsi.osl.service: mcpbackend + {{- include "openslice.selectorLabels" . | nindent 4 }} +{{- end }} diff --git a/kubernetes/helm/openslice/templates/mcp-server-ingress.yaml.yaml b/kubernetes/helm/openslice/templates/mcp-server-ingress.yaml similarity index 100% rename from kubernetes/helm/openslice/templates/mcp-server-ingress.yaml.yaml rename to kubernetes/helm/openslice/templates/mcp-server-ingress.yaml diff --git a/kubernetes/helm/openslice/values.yaml b/kubernetes/helm/openslice/values.yaml index 68c48ab..0129c95 100644 --- a/kubernetes/helm/openslice/values.yaml +++ b/kubernetes/helm/openslice/values.yaml @@ -1,4 +1,4 @@ -# Default values for openslice. +# Default values for OpenSlice. # This is a YAML-formatted file. # Declare variables to be passed into your templates. @@ -90,6 +90,11 @@ image: # Overrides the image tag whose default is the chart appVersion. tag: develop pullPolicy: Always + mcpbackend: + repository: labs.etsi.org:5050/osl/code/org.etsi.osl.mcp.backend + # Overrides the image tag whose default is the chart appVersion. + tag: develop + pullPolicy: Always bugzillaurl: example.com:443/bugzilla bugzillakey: VH2Vw0iI5aYgALFFzVDWqhACwt6Hu3bXla9kSC1Z @@ -219,6 +224,21 @@ mcpserver: spring: logLevel: INFO +mcpbackend: + enabled: true + logLevelRoot: INFO + logLevelOSL: INFO + spring: + logLevel: INFO + ai: # AI Configuration + ollama: + model: "gtp-oss:20b" # Change the used model here + temperature: 0.5 + apiUrl: "http://ollama:11434" # Change the Ollama API here + chat: + systemPrompt: "You are an OpenSlice AI Assistant." # Customize your initial Assistant prompt + maxMessages: 100 # Maximum number of messages to keep in context + # Storage class to be used for provisioning. Default is manual # storageClass: ~ @@ -278,6 +298,9 @@ ingress: - path: "/" service: "tmfweb" port: 80 + - path: "/ask" + service: "mcpbackend" + port: 11880 annotations: {} -- GitLab