Contributing
Contributions are welcome! floci-oci follows the same architecture and conventions as its siblings floci (AWS), floci-az and floci-gcp.
Development setup
Requirements: JDK 25, Docker (for the compat suite).
./mvnw quarkus:dev # dev mode on port 4599
./mvnw test # unit + integration tests
make test-java-compat # oci-java-sdk suite against a running emulator
Project structure
io.floci.oci
├── config/ EmulatorConfig (@ConfigMapping prefix floci-oci)
├── core/
│ ├── common/ OciException/mapper, opc-request-id filter, Ocids, OciPage, Etags,
│ │ ServiceRegistry + self-registering ServiceDescriptor
│ ├── auth/ OCI Signature parsing (never verified)
│ ├── storage/ StorageBackend (memory/persistent/hybrid/wal), tenancy isolation
│ └── workrequest/ Shared async-operation plane
├── lifecycle/ Boot/shutdown, init hooks, /health + /_floci-oci/*
└── services/<svc>/ Controller (JAX-RS) → Service → model/Stored*.java
Adding a new OCI service
- Create
services/<svc>/with<Svc>Controller,<Svc>Service,model/ - The service registers its own
ServiceDescriptorin an@Observes StartupEventmethod — adding a service must never require a service-keyed switch in core - Add
<Svc>ServiceConfig { enabled(); }toEmulatorConfig.ServicesConfig+ the YAML block - Wire storage through
StorageFactory - Add the test trio:
<Svc>ServiceTest(unit),<Svc>RestIntegrationTest,<Svc>DisabledRestIntegrationTest(asserts 503) - Validate against the real SDK in
compatibility-tests/ - Add
docs/services/<svc>.mdand the mkdocs nav entry
Never invent protocol behavior — check the wire contract against the OCI SDK sources
(the oci-go-sdk generated models are the closest thing OCI has to a machine-readable
wire model).
Pull requests
- Conventional commits:
feat:,fix:,perf:,docs:,chore: - Keep changes focused; behaviour changes come with a test
- See AGENTS.md for the full operating rules