tree: 8ce8ccc4954c666587ce55e7076367f5e355db0e
  1. bin/
  2. src/
  3. pom.xml
  4. README.md
docs/upgrade/java/README.md

CMDB Graph API (Java, Micronaut 4, Gremlin Server)

This is a language/framework example project implementing the DevOps CMDB + Incident Knowledge Graph API described in ../spec/spec.md. It connects remotely to a Gremlin Server and does not use any embedded graph.

Key facts:

  • Java 17
  • Micronaut 4
  • Apache TinkerPop 3.7.4 (gremlin-driver)
  • Deterministic dataset: ../spec/cmdb-data.gremlin

Quick start (Gremlin Server via Docker):

  • From this directory (docs/upgrade/java):
    • Make helper executable (first time only): chmod +x ./bin/gremlin-dev.sh
    • Start server: ./bin/gremlin-dev.sh up
    • Wait until ready: ./bin/gremlin-dev.sh wait
    • Load dataset: ./bin/gremlin-dev.sh seed
    • Or all-in-one reset: ./bin/gremlin-dev.sh reset
    • Stop server: ./bin/gremlin-dev.sh down

TEMPORARY QUICK START STEPS ON STARTUP:

# connect to the running container after: ./bin/gremlin-dev.sh up`
docker exec -it cmdb-gremlin /bin/bash

# run the following in the container  
sed -i "s#org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer#org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer#" "conf/gremlin-server.yaml"
exit

# restart the container
docker container restart cmdb-gremlin

The helper uses the Docker image tinkerpop/gremlin-server:3.7.4 and loads data by posting each line of ../spec/cmdb-data.gremlin to the Gremlin Server HTTP endpoint. No Gremlin Console is required.

Manual alternative (without the helper script):

  • Start server: docker run -d --name cmdb-gremlin -p 8182:8182 tinkerpop/gremlin-server:3.7.4
  • Wait for readiness (simple probe): curl -sS -H 'Content-Type: application/json' -X POST http://localhost:8182/gremlin --data '{"gremlin":"g.V().limit(1)"}'
  • Load dataset lines over HTTP (bash example):
    while IFS= read -r line; do \
      [[ -z "$line" || "$line" =~ ^// || "$line" =~ ^# ]] && continue; \
      json=$(printf '%s' "$line" | sed -e 's/\\/\\\\/g' -e 's/"/\\"/g'); \
      curl -sS -H 'Content-Type: application/json' -X POST http://localhost:8182/gremlin --data "{\"gremlin\":\"$json\"}" >/dev/null; \
    done < ../spec/cmdb-data.gremlin
    

Build & Run API:

  • Build: mvn -q -f ./pom.xml clean package
  • Run: mvn -q -f ./pom.xml mn:run
  • Run Integration Tests: mvn test -Dtest=ServiceIT

Endpoints (examples):

  • GET http://localhost:8080/health/ready
  • GET http://localhost:8080/incidents/{incidentId}/blastRadius?depth=2
  • GET http://localhost:8080/services/{serviceId}/dependencies?depth=2
  • GET http://localhost:8080/services/{serviceId}/owners
  • GET http://localhost:8080/deployments/{deployId}/timeline
  • POST http://localhost:8080/alerts with JSON { "alertId": "a1", "source": "prom", "metric": "cpu", "firedAt": 1700000000000 }

Configuration:

  • See src/main/resources/application.yml for Gremlin connection settings.

License:

  • All files in this example are licensed under the Apache License, Version 2.0.