Skip to content

Commit 6532137

Browse files
committed
feat(orchestrator): Add Argo CD integration for GitOps-based network slice deployment
Implemented comprehensive Argo CD integration to enable declarative GitOps continuous delivery for O-RAN network slices. Key Features: - Kubernetes manifests generation for network slices (Namespace, ConfigMap, Deployment, Service) - Argo CD Application CRD creation and management - Real-time sync and health status monitoring - ConfigMap-based manifest storage for rapid deployment - HTTP API endpoints for slice deployment and status retrieval Implementation Details: - pkg/argocd/: Argo CD client with Application CRD management - pkg/slices/: Type-safe network slice manifest generation - Custom API types to avoid dependency conflicts - TDD approach with 21/21 tests passing (12 manifests + 9 Argo CD) API Endpoints: - POST /api/v1/argocd/slices - Deploy network slice via Argo CD - GET /api/v1/argocd/slices/{id}/status - Get slice sync/health status Testing: - End-to-end validation: Intent → Argo CD → Kubernetes - Test client: orchestrator/test/argocd_test_client.go - Successfully deployed test slice to oran-slice-test namespace Documentation: - Updated README.md with Argo CD integration section - Architecture diagrams and API usage examples - Testing instructions and prerequisites This enables automated, self-healing network slice deployments with full GitOps workflow support.
1 parent 61fb876 commit 6532137

13 files changed

Lines changed: 2309 additions & 75 deletions

File tree

README.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ kubectl get pods -A | grep oran-mano
127127

128128
### Key Technologies
129129
- **[Nephio](https://nephio.org/)**: Kubernetes-native GitOps for telco
130+
- **[Argo CD](https://argo-cd.readthedocs.io/)**: Declarative GitOps continuous delivery for network slices
130131
- **[Kube-OVN](https://kubeovn.github.io/)**: Advanced Kubernetes networking
131132
- **[O-RAN O2](https://oranalliance.org/)**: Standards-compliant management interface
132133
- **[Prometheus](https://prometheus.io/)**: Metrics collection and alerting
@@ -215,6 +216,112 @@ Our modern CI/CD pipeline demonstrates production-ready practices:
215216
make verify-deployment
216217
```
217218

219+
## ⚙️ Argo CD Integration
220+
221+
The orchestrator now supports **Argo CD** for GitOps-based network slice deployment, providing automated synchronization and health monitoring.
222+
223+
### Architecture
224+
225+
```
226+
Intent → Orchestrator → Argo CD Application → Kubernetes Resources
227+
228+
ConfigMap (manifests storage)
229+
230+
Slice Deployment (Namespace, Deployment, Service, QoS Config)
231+
```
232+
233+
### Key Features
234+
235+
- **Automated Deployment**: Network slice manifests automatically deployed via Argo CD
236+
- **Health Monitoring**: Real-time sync and health status tracking
237+
- **Self-Healing**: Automatic drift detection and correction
238+
- **ConfigMap-Based**: Manifests stored in Kubernetes ConfigMaps for rapid deployment
239+
240+
### API Usage
241+
242+
#### Deploy Slice via Argo CD
243+
244+
```http
245+
POST /api/v1/argocd/slices
246+
Content-Type: application/json
247+
248+
{
249+
"slice_id": "embb-video-001",
250+
"slice_type": "eMBB",
251+
"namespace": "oran-slice-embb",
252+
"qos": {
253+
"throughput": 1000,
254+
"latency": 20,
255+
"reliability": 99.9
256+
}
257+
}
258+
```
259+
260+
**Response:**
261+
```json
262+
{
263+
"application_name": "embb-video-001",
264+
"sync_status": "Synced",
265+
"health_status": "Healthy",
266+
"created_at": "2025-10-01T00:29:38Z"
267+
}
268+
```
269+
270+
#### Get Slice Status
271+
272+
```http
273+
GET /api/v1/argocd/slices/embb-video-001/status
274+
```
275+
276+
**Response:**
277+
```json
278+
{
279+
"slice_id": "embb-video-001",
280+
"sync_status": "Synced",
281+
"health_status": "Healthy",
282+
"resources": {
283+
"namespace": "oran-slice-embb",
284+
"deployment": "embb-video-001",
285+
"service": "embb-video-001-svc",
286+
"configmap": "embb-video-001-qos"
287+
}
288+
}
289+
```
290+
291+
### Testing
292+
293+
Run the Argo CD integration test:
294+
295+
```bash
296+
cd orchestrator
297+
go run test/argocd_test_client.go
298+
```
299+
300+
Expected output:
301+
```
302+
✓ Argo CD client created successfully
303+
✓ Manifests generated successfully
304+
✓ Manifests serialized (2017 bytes)
305+
✓ Argo CD Application created: test-e2e-slice
306+
✓ Sync Status: Synced
307+
✓ Health Status: Healthy
308+
```
309+
310+
### Generated Resources
311+
312+
Each network slice deployment creates:
313+
314+
1. **Namespace**: Isolated environment for slice resources
315+
2. **QoS ConfigMap**: Quality of Service parameters
316+
3. **Deployment**: Slice controller with resource limits
317+
4. **Service**: ClusterIP service for metrics exposure
318+
319+
### Prerequisites
320+
321+
- Argo CD installed in `argocd` namespace
322+
- Kubernetes cluster access
323+
- RBAC permissions for Application CRDs
324+
218325
## 🔌 API Documentation
219326

220327
### WebSocket API (New)

go.work.sum

Lines changed: 392 additions & 43 deletions
Large diffs are not rendered by default.

o2-client/go.sum

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrP
1313
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
1414
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
1515
github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
16+
github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
1617
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
1718
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
1819
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
@@ -24,6 +25,7 @@ github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAu
2425
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
2526
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
2627
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
28+
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
2729
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
2830
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
2931
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -47,7 +49,9 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
4749
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
4850
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
4951
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
52+
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
5053
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
54+
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
5155
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5256
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
5357
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -56,23 +60,32 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
5660
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
5761
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
5862
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
63+
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
5964
github.com/thc1006/O-RAN-Intent-MANO-for-Network-Slicing v0.0.0-20250923132651-9222c3967202 h1:lDNBe9/hfWMxIyRocBEpz3lCofe3Aquc5uFSGcibmZ4=
6065
github.com/thc1006/O-RAN-Intent-MANO-for-Network-Slicing v0.0.0-20250923132651-9222c3967202/go.mod h1:qjC1cWNMWidIkzz485KMQ9oPEPq9zdSP2V+TZxJc06Y=
6166
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
6267
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
6368
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
6469
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
6570
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
71+
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
6672
golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
6773
golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
6874
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
75+
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
6976
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
77+
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
7078
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
79+
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
7180
golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
81+
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
7282
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
7383
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
84+
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
7485
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
86+
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
7587
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
88+
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
7689
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
7790
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
7891
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

0 commit comments

Comments
 (0)