Skip to content

Commit 0700121

Browse files
committed
feat: add Knative integration for notifications
- Add CloudEvents sink deployment for eoapi-notifier integration - Configure dynamic secret name for PostgreSQL connection - Add local development configuration with reduced resources - Support both CI and local test environments
1 parent 878a10d commit 0700121

File tree

15 files changed

+1081
-106
lines changed

15 files changed

+1081
-106
lines changed

.github/workflows/helm-tests.yml

Lines changed: 142 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ jobs:
2525
- name: Run Helm unit tests
2626
run: make tests
2727

28-
integration:
29-
name: Integration Tests (K3s)
28+
k3s-integration-tests:
29+
name: K3s Integration Tests
3030
if: github.event.pull_request.head.repo.full_name == github.repository
3131
permissions:
3232
contents: 'read'
@@ -47,106 +47,169 @@ jobs:
4747
- name: Set release name
4848
run: echo "RELEASE_NAME=eoapi-$(echo "${{ github.sha }}" | cut -c1-8)" >> "$GITHUB_ENV"
4949

50+
- name: Wait for K3s to be fully ready
51+
run: |
52+
echo "=== Waiting for K3s to be fully ready ==="
53+
54+
# Wait for core K3s components to be ready
55+
echo "Waiting for kube-system pods to be ready..."
56+
kubectl wait --for=condition=Ready pod -l k8s-app=kube-dns -n kube-system --timeout=300s
57+
kubectl wait --for=condition=Ready pod -l app.kubernetes.io/name=traefik -n kube-system --timeout=300s
58+
59+
# Wait for API server to be fully responsive
60+
echo "Checking API server responsiveness..."
61+
kubectl get nodes
62+
kubectl get pods --all-namespaces
63+
64+
# Give K3s a moment to initialize all CRDs
65+
echo "Waiting for K3s initialization to complete..."
66+
sleep 10
67+
68+
echo "✅ K3s is ready"
69+
70+
71+
- name: Wait for Traefik to be ready
72+
run: |
73+
echo "=== Waiting for Traefik to be ready ==="
74+
75+
# Wait for Traefik pods to be ready first
76+
echo "Waiting for Traefik controller to be ready..."
77+
kubectl wait --for=condition=Ready pod -l app.kubernetes.io/name=traefik -n kube-system --timeout=300s
78+
79+
# Wait for essential Traefik CRDs to be available
80+
echo "Checking for Traefik CRDs..."
81+
timeout=300
82+
counter=0
83+
required_crds=("middlewares.traefik.io" "ingressroutes.traefik.io")
84+
85+
for crd in "${required_crds[@]}"; do
86+
echo "Checking for CRD: $crd"
87+
counter=0
88+
while [ $counter -lt $timeout ]; do
89+
if kubectl get crd "$crd" &>/dev/null; then
90+
echo "✅ $crd is available"
91+
break
92+
fi
93+
echo "⏳ Waiting for $crd... ($counter/$timeout)"
94+
sleep 3
95+
counter=$((counter + 3))
96+
done
97+
98+
if [ $counter -ge $timeout ]; then
99+
echo "❌ Timeout waiting for $crd"
100+
echo "Available Traefik CRDs:"
101+
kubectl get crd | grep traefik || echo "No Traefik CRDs found"
102+
echo "All CRDs:"
103+
kubectl get crd
104+
exit 1
105+
fi
106+
done
107+
108+
echo "✅ All required Traefik CRDs are ready"
109+
110+
- name: Pre-deployment debugging
111+
run: |
112+
echo "=== Pre-deployment State Check ==="
113+
114+
# Check basic cluster state
115+
echo "Cluster nodes:"
116+
kubectl get nodes -o wide
117+
echo ""
118+
119+
echo "All namespaces:"
120+
kubectl get namespaces
121+
echo ""
122+
123+
# Check PGO status
124+
echo "PostgreSQL Operator status:"
125+
kubectl get deployment pgo -o wide || echo "PGO not found"
126+
kubectl get pods -l postgres-operator.crunchydata.com/control-plane=postgres-operator -o wide || echo "No PGO pods found"
127+
echo ""
128+
129+
# Check for any existing knative-operator
130+
echo "Looking for knative-operator before deployment:"
131+
kubectl get deployment knative-operator --all-namespaces -o wide || echo "knative-operator not found yet"
132+
echo ""
133+
134+
# Check available helm repositories
135+
echo "Helm repositories:"
136+
helm repo list
137+
echo ""
138+
139+
# Check if eoapi namespace exists (shouldn't yet)
140+
echo "eoAPI namespace check:"
141+
kubectl get namespace eoapi || echo "eoapi namespace doesn't exist yet (expected)"
142+
echo ""
143+
144+
- name: Validate deployment script
145+
run: |
146+
echo "=== Script Validation ==="
147+
echo "Checking script exists and is executable:"
148+
ls -la scripts/deploy.sh
149+
echo ""
150+
echo "Testing script help:"
151+
./scripts/deploy.sh --help
152+
echo ""
153+
echo "✅ Script validation complete"
154+
50155
- name: Deploy eoAPI
51156
id: deploy
52-
continue-on-error: true
53157
run: |
54158
echo "=== Starting eoAPI deployment ==="
55-
export RELEASE_NAME="$RELEASE_NAME"
159+
echo "Working directory: $(pwd)"
160+
echo "Environment: RELEASE_NAME=${RELEASE_NAME}, PGO_VERSION=${{ env.PGO_VERSION }}"
161+
162+
echo "Setting environment variables..."
163+
export RELEASE_NAME="${RELEASE_NAME}"
56164
export PGO_VERSION="${{ env.PGO_VERSION }}"
57165
export GITHUB_SHA="${{ github.sha }}"
166+
167+
echo "=== Executing deployment script ==="
58168
./scripts/deploy.sh --ci
59169
60-
- name: Check deployment status
61-
id: check
62-
if: steps.deploy.outcome == 'success'
170+
- name: Validate Helm dependencies
63171
run: |
64-
echo "=== Checking deployment status ==="
65-
export RELEASE_NAME="$RELEASE_NAME"
66-
./scripts/test.sh check-deployment --debug
172+
echo "=== Validating Helm Dependencies Post-Deployment ==="
67173
68-
- name: Debug pgstac jobs if deployment failed
69-
if: steps.deploy.outcome == 'failure'
70-
continue-on-error: true
71-
run: |
72-
echo "=== Debugging pgstac job failures ==="
73-
74-
# Check pgstac-migrate job
75-
echo "===== pgstac-migrate Job Status ====="
76-
kubectl get jobs -l app.kubernetes.io/name=pgstac-migrate -o wide || echo "No pgstac-migrate jobs found"
77-
78-
MIGRATE_PODS=$(kubectl get pods -l app.kubernetes.io/name=pgstac-migrate -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
79-
if [ -n "$MIGRATE_PODS" ]; then
80-
for POD in $MIGRATE_PODS; do
81-
echo "--- Logs from migrate pod $POD ---"
82-
kubectl logs "$POD" --tail=100 || true
83-
echo "--- Description of migrate pod $POD ---"
84-
kubectl describe pod "$POD"
85-
done
86-
fi
87-
88-
# Check pgstac-load-samples job
89-
echo "===== pgstac-load-samples Job Status ====="
90-
kubectl get jobs -l app.kubernetes.io/name=pgstac-load-samples -o wide || echo "No pgstac-load-samples jobs found"
91-
92-
SAMPLES_PODS=$(kubectl get pods -l app.kubernetes.io/name=pgstac-load-samples -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
93-
if [ -n "$SAMPLES_PODS" ]; then
94-
for POD in $SAMPLES_PODS; do
95-
echo "--- Logs from samples pod $POD ---"
96-
kubectl logs "$POD" --tail=100 || true
97-
echo "--- Description of samples pod $POD ---"
98-
kubectl describe pod "$POD"
99-
done
100-
fi
174+
# Check helm repositories
175+
echo "Configured helm repositories:"
176+
helm repo list || echo "No repositories configured"
177+
echo ""
101178
102-
# Check database status
103-
echo "===== Database Pod Status ====="
104-
kubectl get pods -l postgres-operator.crunchydata.com/cluster -o wide
105-
kubectl get postgrescluster -o wide
179+
# Check if Chart.lock files exist
180+
echo "Chart.lock files:"
181+
find charts/ -name "Chart.lock" -exec ls -la {} \; || echo "No Chart.lock files found"
182+
echo ""
106183
107-
# Check ConfigMaps
108-
echo "===== Relevant ConfigMaps ====="
109-
kubectl get configmaps | grep -E "initdb|pgstac" || echo "No relevant configmaps found"
184+
# Check if dependencies were downloaded
185+
echo "Downloaded chart dependencies:"
186+
find charts/ -name "charts" -type d -exec ls -la {} \; || echo "No chart dependencies found"
187+
echo ""
110188
111-
# Check for any related events
112-
echo "===== Related Kubernetes Events ====="
113-
kubectl get events | grep -E "pgstac|initdb" || echo "No relevant events found"
189+
# Check knative-operator specifically
190+
echo "Checking for knative-operator deployment:"
191+
kubectl get deployment knative-operator --all-namespaces -o wide || echo "knative-operator deployment not found"
192+
echo ""
114193
115-
# Check notification system status
116-
echo "===== Notification System Status ====="
117-
kubectl get deployments -l app.kubernetes.io/name=eoapi-notifier -o wide || echo "No eoapi-notifier deployment found"
118-
kubectl get ksvc -l app.kubernetes.io/component=cloudevents-sink -o wide || echo "No Knative CloudEvents sink found"
194+
# Check helm release status
195+
echo "Helm release status:"
196+
helm status "$RELEASE_NAME" -n eoapi || echo "Release status unavailable"
197+
echo ""
119198
120-
exit 1
199+
# Check eoAPI namespace resources
200+
echo "Resources in eoAPI namespace:"
201+
kubectl get all -n eoapi -o wide || echo "No resources in eoapi namespace"
121202
122203
- name: Run integration tests
123-
if: steps.deploy.outcome == 'success'
124204
run: |
125205
echo "=== Running integration tests ==="
126206
export RELEASE_NAME="$RELEASE_NAME"
127207
./scripts/test.sh integration --debug
128208
129-
- name: Debug deployment status
130-
if: always()
209+
- name: Debug failed deployment
210+
if: failure()
131211
run: |
132-
echo "=== Final Deployment Status ==="
133-
kubectl get pods -o wide
134-
kubectl get jobs -o wide
135-
kubectl get services -o wide
136-
kubectl get ingress
137-
138-
# Check notification system final status
139-
echo "=== Notification System Final Status ==="
140-
kubectl get deployments -l app.kubernetes.io/name=eoapi-notifier -o wide || echo "No eoapi-notifier deployment"
141-
kubectl get pods -l app.kubernetes.io/name=eoapi-notifier -o wide || echo "No eoapi-notifier pods"
142-
kubectl get ksvc -l app.kubernetes.io/component=cloudevents-sink -o wide || echo "No Knative CloudEvents sink"
143-
kubectl get pods -l serving.knative.dev/service -o wide || echo "No Knative CloudEvents sink pods"
144-
145-
# Show notification logs if they exist
146-
echo "=== eoapi-notifier Logs ==="
147-
kubectl logs -l app.kubernetes.io/name=eoapi-notifier --tail=20 || echo "No eoapi-notifier logs"
148-
echo "=== Knative CloudEvents Sink Logs ==="
149-
kubectl logs -l serving.knative.dev/service --tail=20 || echo "No Knative CloudEvents sink logs"
212+
./scripts/debug-deployment.sh
150213
151214
152215
- name: Cleanup

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ charts/config.yaml
55
charts/eoapi/charts/*.tgz
66
config_ingress.yaml
77
__pycache__
8+
9+
CLAUDE.md

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
- Added knative in CI to test eoapi-notifier.
11+
1012
## [0.7.12] - 2025-10-17
1113

1214
- Bumped eoapi-notifier dependency version to 0.0.7

charts/eoapi/Chart.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ dependencies:
5454
repository: "https://devseed.com/eoapi-k8s/"
5555
condition: postgrescluster.enabled
5656
- name: eoapi-notifier
57-
version: 0.0.7
57+
version: 0.0.8
5858
repository: "oci://ghcr.io/developmentseed/charts"
5959
condition: eoapi-notifier.enabled
60+
- name: knative-operator
61+
version: 1.17.8
62+
repository: https://knative.github.io/operator
63+
condition: knative.enabled
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{{- $hasCloudEventsOutput := false }}
2+
{{- range (index .Values "eoapi-notifier").outputs }}
3+
{{- if eq .type "cloudevents" }}
4+
{{- $hasCloudEventsOutput = true }}
5+
{{- end }}
6+
{{- end }}
7+
{{- if and (index .Values "eoapi-notifier").enabled .Values.knative.enabled .Values.knative.cloudEventsSink.enabled $hasCloudEventsOutput }}
8+
---
9+
apiVersion: serving.knative.dev/v1
10+
kind: Service
11+
metadata:
12+
name: eoapi-cloudevents-sink
13+
namespace: {{ .Release.Namespace }}
14+
labels:
15+
{{- include "eoapi.labels" . | nindent 4 }}
16+
app.kubernetes.io/component: cloudevents-sink
17+
annotations:
18+
helm.sh/hook: "post-install,post-upgrade"
19+
helm.sh/hook-weight: "10"
20+
helm.sh/hook-delete-policy: "before-hook-creation"
21+
spec:
22+
template:
23+
metadata:
24+
annotations:
25+
autoscaling.knative.dev/minScale: "1"
26+
autoscaling.knative.dev/maxScale: "1"
27+
labels:
28+
{{- include "eoapi.selectorLabels" . | nindent 8 }}
29+
app.kubernetes.io/component: cloudevents-sink
30+
spec:
31+
containers:
32+
- name: cloudevents-sink
33+
image: gcr.io/knative-samples/helloworld-go:latest
34+
ports:
35+
- containerPort: 8080
36+
env:
37+
- name: PORT
38+
value: "8080"
39+
- name: TARGET
40+
value: "eoAPI CloudEvents Sink"
41+
command: ["/ko-app/helloworld"]
42+
readinessProbe:
43+
httpGet:
44+
path: /
45+
port: 8080
46+
initialDelaySeconds: 5
47+
periodSeconds: 10
48+
livenessProbe:
49+
httpGet:
50+
path: /
51+
port: 8080
52+
initialDelaySeconds: 15
53+
periodSeconds: 20
54+
resources:
55+
{{- toYaml .Values.knative.cloudEventsSink.resources | nindent 10 }}
56+
{{- end }}

0 commit comments

Comments
 (0)