Skip to content

Commit e1c1c77

Browse files
committed
feat: migrate MongoDB to Helm deployment
Adds MongoDB as an optional component to eagle-api Helm chart, replacing legacy DeploymentConfig. Enables zero-downtime migration by scaling down old DC before Helm creates new Deployment. Changes: - Add mongodb-deployment.yaml and mongodb-service.yaml templates - Add MongoDB configuration to values files (enabled for dev/test) - Update workflows to handle zero-downtime migration - Fix secret key consistency (all environments use MONGODB_USER) - Remove legacy templates: eagle-api.dc.json, eagle-api.bc.json, pipeline/ MongoDB deployment uses: - Existing PVC (eagle-api-mongodb-data) to preserve data - Existing secret (eagle-api-mongodb) for credentials - tcpSocket probes (fixes zombie process issue) - Recreate strategy for stateful workload Fixes: - Prevents zombie mongo processes from readiness probes - Standardizes deployment mechanism across all EPIC apps
1 parent 999d647 commit e1c1c77

File tree

11 files changed

+257
-1342
lines changed

11 files changed

+257
-1342
lines changed

.github/workflows/deploy-to-dev.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,30 @@ jobs:
215215
oc -n ${{ env.OPENSHIFT_NAMESPACE_TOOLS }} tag \
216216
${{ env.IMAGE_NAME }}:${{ needs.push.outputs.SHORT_SHA }} ${{ env.IMAGE_NAME }}:ci-latest
217217
218+
- name: Migrate MongoDB from DeploymentConfig to Deployment
219+
run: |
220+
echo "Checking MongoDB deployment status..."
221+
222+
# Check if new Helm-managed MongoDB Deployment exists
223+
if oc get deployment eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_DEV }} &>/dev/null; then
224+
echo "✓ MongoDB Deployment already exists (Helm-managed)"
225+
else
226+
echo "MongoDB Deployment not found - migrating from DeploymentConfig..."
227+
228+
# Check if legacy DeploymentConfig exists
229+
if oc get dc eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_DEV }} &>/dev/null; then
230+
echo "Scaling down legacy MongoDB DeploymentConfig to 0 replicas..."
231+
oc scale dc/eagle-api-mongodb --replicas=0 -n ${{ env.OPENSHIFT_NAMESPACE_DEV }}
232+
233+
echo "Waiting for MongoDB pod to terminate..."
234+
oc wait --for=delete pod -l name=eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_DEV }} --timeout=120s || true
235+
236+
echo "✓ Legacy DeploymentConfig scaled down - Helm will create new Deployment"
237+
else
238+
echo "No legacy DeploymentConfig found - proceeding with fresh Helm install"
239+
fi
240+
fi
241+
218242
- name: Deploy with Helm
219243
run: |
220244
helm upgrade --install ${{ env.APP_NAME }} ./helm/${{ env.APP_NAME }} \
@@ -233,3 +257,12 @@ jobs:
233257
234258
echo "Deployment successful!"
235259
oc get pods -n ${{ env.OPENSHIFT_NAMESPACE_DEV }} -l app.kubernetes.io/name=${{ env.APP_NAME }}
260+
261+
# Verify MongoDB deployment if enabled
262+
if oc get deployment eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_DEV }} &>/dev/null; then
263+
echo ""
264+
echo "Verifying MongoDB deployment..."
265+
oc rollout status deployment/eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_DEV }} --timeout=3m
266+
echo "✓ MongoDB deployment verified"
267+
fi
268+

.github/workflows/deploy-to-test.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,30 @@ jobs:
131131
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
132132
helm version
133133
134+
- name: Migrate MongoDB from DeploymentConfig to Deployment
135+
run: |
136+
echo "Checking MongoDB deployment status..."
137+
138+
# Check if new Helm-managed MongoDB Deployment exists
139+
if oc get deployment eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_TEST }} &>/dev/null; then
140+
echo "✓ MongoDB Deployment already exists (Helm-managed)"
141+
else
142+
echo "MongoDB Deployment not found - migrating from DeploymentConfig..."
143+
144+
# Check if legacy DeploymentConfig exists
145+
if oc get dc eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_TEST }} &>/dev/null; then
146+
echo "Scaling down legacy MongoDB DeploymentConfig to 0 replicas..."
147+
oc scale dc/eagle-api-mongodb --replicas=0 -n ${{ env.OPENSHIFT_NAMESPACE_TEST }}
148+
149+
echo "Waiting for MongoDB pod to terminate..."
150+
oc wait --for=delete pod -l name=eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_TEST }} --timeout=120s || true
151+
152+
echo "✓ Legacy DeploymentConfig scaled down - Helm will create new Deployment"
153+
else
154+
echo "No legacy DeploymentConfig found - proceeding with fresh Helm install"
155+
fi
156+
fi
157+
134158
- name: Deploy with Helm
135159
run: |
136160
helm upgrade --install ${{ env.APP_NAME }} ./helm/${{ env.APP_NAME }} \
@@ -143,4 +167,13 @@ jobs:
143167
run: |
144168
echo "Deployment successful!"
145169
oc get pods -n ${{ env.OPENSHIFT_NAMESPACE_TEST }} -l app.kubernetes.io/name=${{ env.APP_NAME }}
170+
171+
# Verify MongoDB deployment if enabled
172+
if oc get deployment eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_TEST }} &>/dev/null; then
173+
echo ""
174+
echo "Verifying MongoDB deployment..."
175+
oc rollout status deployment/eagle-api-mongodb -n ${{ env.OPENSHIFT_NAMESPACE_TEST }} --timeout=3m
176+
echo "✓ MongoDB deployment verified"
177+
fi
178+
146179

helm/eagle-api/templates/_helpers.tpl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,32 @@ Selector labels
4848
app.kubernetes.io/name: {{ include "eagle-api.name" . }}
4949
app.kubernetes.io/instance: {{ .Release.Name }}
5050
{{- end }}
51+
52+
{{/*
53+
MongoDB fullname - must be "eagle-api-mongodb" for backward compatibility
54+
*/}}
55+
{{- define "eagle-api.mongodb.fullname" -}}
56+
eagle-api-mongodb
57+
{{- end }}
58+
59+
{{/*
60+
MongoDB labels
61+
*/}}
62+
{{- define "eagle-api.mongodb.labels" -}}
63+
helm.sh/chart: {{ include "eagle-api.chart" . }}
64+
{{ include "eagle-api.mongodb.selectorLabels" . }}
65+
{{- if .Chart.AppVersion }}
66+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
67+
{{- end }}
68+
app.kubernetes.io/managed-by: {{ .Release.Service }}
69+
app: eagle-epic
70+
role: database-eagle-epic
71+
{{- end }}
72+
73+
{{/*
74+
MongoDB selector labels
75+
*/}}
76+
{{- define "eagle-api.mongodb.selectorLabels" -}}
77+
app.kubernetes.io/name: eagle-api-mongodb
78+
app.kubernetes.io/instance: {{ .Release.Name }}
79+
{{- end }}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
{{- if .Values.mongodb.enabled }}
2+
apiVersion: apps/v1
3+
kind: Deployment
4+
metadata:
5+
name: {{ include "eagle-api.mongodb.fullname" . }}
6+
labels:
7+
{{- include "eagle-api.mongodb.labels" . | nindent 4 }}
8+
annotations:
9+
description: "MongoDB database for eagle-api"
10+
spec:
11+
replicas: 1
12+
strategy:
13+
type: Recreate # Critical: MongoDB is stateful with single replica
14+
selector:
15+
matchLabels:
16+
{{- include "eagle-api.mongodb.selectorLabels" . | nindent 6 }}
17+
template:
18+
metadata:
19+
labels:
20+
{{- include "eagle-api.mongodb.selectorLabels" . | nindent 8 }}
21+
spec:
22+
containers:
23+
- name: mongodb
24+
image: "{{ .Values.mongodb.image.repository }}:{{ .Values.mongodb.image.tag }}"
25+
imagePullPolicy: {{ .Values.mongodb.image.pullPolicy }}
26+
ports:
27+
- containerPort: 27017
28+
protocol: TCP
29+
name: mongodb
30+
env:
31+
- name: MONGODB_USER
32+
valueFrom:
33+
secretKeyRef:
34+
name: {{ .Values.mongodb.existingSecret }}
35+
key: {{ .Values.mongodb.secretKeys.user }}
36+
- name: MONGODB_PASSWORD
37+
valueFrom:
38+
secretKeyRef:
39+
name: {{ .Values.mongodb.existingSecret }}
40+
key: {{ .Values.mongodb.secretKeys.password }}
41+
- name: MONGODB_DATABASE
42+
valueFrom:
43+
secretKeyRef:
44+
name: {{ .Values.mongodb.existingSecret }}
45+
key: {{ .Values.mongodb.secretKeys.database }}
46+
- name: MONGODB_ADMIN_PASSWORD
47+
valueFrom:
48+
secretKeyRef:
49+
name: {{ .Values.mongodb.existingSecret }}
50+
key: {{ .Values.mongodb.secretKeys.adminPassword }}
51+
volumeMounts:
52+
- name: mongodb-data
53+
mountPath: /var/lib/mongodb/data
54+
resources:
55+
{{- toYaml .Values.mongodb.resources | nindent 10 }}
56+
livenessProbe:
57+
tcpSocket:
58+
port: 27017
59+
initialDelaySeconds: {{ .Values.mongodb.probes.liveness.initialDelaySeconds }}
60+
periodSeconds: {{ .Values.mongodb.probes.liveness.periodSeconds }}
61+
timeoutSeconds: {{ .Values.mongodb.probes.liveness.timeoutSeconds }}
62+
failureThreshold: {{ .Values.mongodb.probes.liveness.failureThreshold }}
63+
readinessProbe:
64+
tcpSocket:
65+
port: 27017
66+
initialDelaySeconds: {{ .Values.mongodb.probes.readiness.initialDelaySeconds }}
67+
periodSeconds: {{ .Values.mongodb.probes.readiness.periodSeconds }}
68+
timeoutSeconds: {{ .Values.mongodb.probes.readiness.timeoutSeconds }}
69+
failureThreshold: {{ .Values.mongodb.probes.readiness.failureThreshold }}
70+
volumes:
71+
- name: mongodb-data
72+
persistentVolumeClaim:
73+
claimName: {{ .Values.mongodb.persistence.existingClaim }}
74+
{{- end }}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{{- if .Values.mongodb.enabled }}
2+
apiVersion: v1
3+
kind: Service
4+
metadata:
5+
name: {{ include "eagle-api.mongodb.fullname" . }}
6+
labels:
7+
{{- include "eagle-api.mongodb.labels" . | nindent 4 }}
8+
spec:
9+
type: ClusterIP
10+
ports:
11+
- port: 27017
12+
targetPort: mongodb
13+
protocol: TCP
14+
name: mongodb
15+
selector:
16+
{{- include "eagle-api.mongodb.selectorLabels" . | nindent 4 }}
17+
{{- end }}

helm/eagle-api/values-dev.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ keycloak:
3434
secrets:
3535
mongodb:
3636
name: eagle-api-mongodb
37-
usernameKey: MONGODB_USERNAME
37+
usernameKey: MONGODB_USER
3838
passwordKey: MONGODB_PASSWORD
3939
minio:
4040
name: nr-object-store-credential
@@ -52,3 +52,15 @@ persistence:
5252

5353
autoscaling:
5454
enabled: false
55+
56+
# MongoDB enabled for dev environment
57+
mongodb:
58+
enabled: true
59+
resources:
60+
requests:
61+
cpu: 100m
62+
memory: 1Gi
63+
limits:
64+
cpu: 250m
65+
memory: 2Gi
66+

helm/eagle-api/values-test.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,15 @@ persistence:
5252

5353
autoscaling:
5454
enabled: false
55+
56+
# MongoDB enabled for test environment
57+
mongodb:
58+
enabled: true
59+
resources:
60+
requests:
61+
cpu: 100m
62+
memory: 1Gi
63+
limits:
64+
cpu: 500m
65+
memory: 2Gi
66+

helm/eagle-api/values.yaml

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ env:
7878
secrets:
7979
mongodb:
8080
name: eagle-api-mongodb
81-
usernameKey: database-user
82-
passwordKey: database-password
81+
usernameKey: MONGODB_USER
82+
passwordKey: MONGODB_PASSWORD
8383

8484
minio:
8585
name: eagle-api-minio-keys
@@ -135,3 +135,47 @@ migrations:
135135
requests:
136136
cpu: 100m
137137
memory: 256Mi
138+
139+
# MongoDB Configuration
140+
# Disabled by default for local development (use external MongoDB)
141+
# Enable in environment values files (values-dev.yaml, values-test.yaml, values-prod.yaml)
142+
mongodb:
143+
enabled: false
144+
145+
image:
146+
repository: image-registry.openshift-image-registry.svc:5000/6cdc9e-tools/mongodb-44
147+
tag: "4.4.30"
148+
pullPolicy: IfNotPresent
149+
150+
# Use existing secret created by legacy DeploymentConfig
151+
existingSecret: eagle-api-mongodb
152+
secretKeys:
153+
user: MONGODB_USER
154+
password: MONGODB_PASSWORD
155+
database: MONGODB_DATABASE
156+
adminPassword: MONGODB_ADMIN_PASSWORD
157+
158+
# Use existing PVC to preserve data during migration
159+
persistence:
160+
existingClaim: eagle-api-mongodb-data
161+
162+
resources:
163+
requests:
164+
cpu: 100m
165+
memory: 1Gi
166+
limits:
167+
cpu: 250m
168+
memory: 2Gi
169+
170+
probes:
171+
liveness:
172+
initialDelaySeconds: 30
173+
periodSeconds: 10
174+
timeoutSeconds: 1
175+
failureThreshold: 3
176+
readiness:
177+
initialDelaySeconds: 3
178+
periodSeconds: 10
179+
timeoutSeconds: 1
180+
failureThreshold: 3
181+

0 commit comments

Comments
 (0)