# API reference Base URL (lab): `http://atc-portal01.dell-atc.lan:3090` Internal container port: `8090` All JSON unless noted. No auth middleware in lab build (protect at network edge). --- ## Health & fleet ### `GET /api/health` ```json { "status": "ok", "updated_at": 1784252683.4, "pulse": 12 } ``` ### `GET /api/fleet` Full in-memory snapshot: | Field | Description | |-------|-------------| | `ome` | Appliance name/version/url | | `summary` | totals, connected, offline, watts, samples | | `devices[]` | normalized nodes | | `subnets[]` | /24 aggregates | | `groups[]` | OME groups (names) | | `models[]` | server model counts | | `alerts[]` | recent alert feed | | `events[]` | fleet deltas (incl. device_new/removed) | | `context` | alert_severity, hottest, notifications, … | | `gpu` | latest GPU matrix | | `pulse` | monotonic refresh counter | | `openwebui_url` | companion AI URL | ### `WS /ws/fleet` - On connect: immediate `{type:"snapshot", data}` - Then server pushes `{type:"snapshot"}` / `{type:"gpu"}` / `{type:"error"}` - Client may send any text ping; server mainly broadcasts --- ## Devices ### `GET /api/devices/{device_id}` On-demand OME inventory enrichment. Response highlights: ```json { "device": { "...fleet node..." }, "power": { "watts": 320, "avg_watts": 300, "peak_watts": 400, "energy_kwh": 12.3 }, "inventory_types": ["serverProcessors", "deviceSoftware", "..."], "inventory": { "deviceSoftware": [ /* raw OME rows */ ], "...": [] }, "landscape": { "os": [], "software": [], "firmware": [], "drivers": [], "applications": [], "management": [], "licenses": [] }, "_ts": 1784252700.0 } ``` Cached ~300 seconds per device. --- ## GPU ### `GET /api/gpu` Latest GPU sidecar payload (also present on fleet snapshot). --- ## Chat & models ### `GET /api/models` ```json { "default": "llama3-70b-gptq", "models": [ { "id": "llama3-70b-gptq", "name": "llama3-70b-gptq", "source": "openwebui|vllm" }, { "id": "ome-copilot", "name": "OME Copilot", "source": "openwebui" } ] } ``` ### `POST /api/chat` ```json { "message": "List critical systems", "history": [{ "role": "user", "content": "..." }], "focus_device_id": 50374, "model": "llama3-70b-gptq" } ``` Response: ```json { "reply": "...", "model": "llama3-70b-gptq", "backend": "vllm|openwebui", "gpu": {}, "context_bytes": 4104 } ``` Errors: `502` with upstream detail (context length, auth, etc.). --- ## Tickets (Ops desk) Admins (fixed lab list): `jody`, `laurens` (+ names in API). | Method | Path | Purpose | |--------|------|---------| | GET | `/api/admins` | Admin directory | | GET | `/api/tickets` | List tickets | | POST | `/api/tickets` | Create | | GET | `/api/tickets/{id}` | Detail + messages | | POST | `/api/tickets/{id}/messages` | Add note | | PATCH | `/api/tickets/{id}` | status / assignee / priority / accepted_by | | DELETE | `/api/tickets/{id}` | Delete | SQLite file: `$COCKPIT_DATA/ops.db` (default `/data/ops.db`). --- ## SSH ### `WS /ws/ssh` **Message 1 (client → server):** ```json { "type": "auth", "host": "10.0.41.50", "port": 22, "username": "jody", "password": "***", "cols": 120, "rows": 40, "term": "xterm-256color" } ``` **Server control messages:** `{type:"status|ready|error|pong", message?: string}` **Thereafter:** raw terminal bytes as WebSocket text. **Client control (optional JSON):** ```json { "type": "resize", "cols": 100, "rows": 30 } { "type": "ping" } ``` Constraints: - `host` must appear as a management IP in the current fleet snapshot - Max 25 concurrent bridges; max 3 per client IP - Idle timeout ~30 minutes ### `GET /api/ssh/sessions` Ops visibility (no secrets): ```json { "active": 2, "max": 25, "sessions": [{ "id": "...", "client": "10.0.10.65", "host": "10.0.41.50", "user": "jody", "age_sec": 42 }] } ``` --- ## Static assets | Path | File | |------|------| | `/` | `ui/index.html` (no-store cache) | | `/app.js` `/ops.js` `/ssh.js` `/styles.css` | UI | | `/vendor/xterm/*` | Terminal library | | `/dell.png` etc. | Branding | --- ## Environment (settings) Mapped via `pydantic-settings` from `.env` (see `.env.example`): `OME_URL`, `OME_USER`, `OME_PASSWORD`, `POLL_INTERVAL`, `OPENWEBUI_URL`, `OPENWEBUI_EMAIL`, `OPENWEBUI_PASSWORD`, `GPU_METRICS_URL`, `VLLM_URL`, `VLLM_MODEL`, `VLLM_MAX_TOKENS`, `CHAT_SYSTEM_CHARS`, `COCKPIT_DATA`, `CORS_ORIGINS` ## Reports / compliance | Method | Path | Notes | |--------|------|-------| | GET | `/api/reports/fleet` | Fleet matrix + warranty join | | GET | `/api/reports/firmware` | Alias of compliance components | | GET | `/api/reports/brief` | Customer brief payload | | GET | `/api/compliance` | Dell baseline device/component compliance | | GET | `/api/warranties` | WarrantyService dump | | GET | `/api/baselines` | UpdateService baselines | | GET | `/api/catalogs` | UpdateService catalogs | | GET | `/api/ome/report-defs` | ReportService definitions | | POST | `/api/ome/reports/run` | `{report_def_id}` starts OME report job | | GET | `/api/ome/reports/{id}/results` | Report results when available | | GET | `/api/ome/jobs` | Recent jobs (read-only) | | GET | `/api/export/{kind}?fmt=csv\|json` | Downloads | | GET | `/api/devices/{id}/warranty` | Per-device warranty | | GET | `/api/devices/{id}/compliance` | Per-device Dell catalog deltas |