Releases: floci-io/floci-gcp
0.2.1
🎉 Highlights
A focused patch release sharpening GCS JSON API conformance: closer alignment with real GCP behavior, support for gcloud storage cp uploads, and microsecond-precision timestamps.
🪣 GCS conformance pass
Three coordinated fixes bring the storage service closer to real GCP behavior:
- JSON API alignment with real GCP responses (#15)
gcloud storage cpuploads now work against the emulator (#16)- Microsecond-precision timestamps match what real GCS emits (#17)
If you've been running into subtle response shape mismatches when pointing the gcloud CLI or storage clients at floci-gcp, this release should clear them up.
🐛 Bug Fixes
- fix(storage): align GCS JSON API with real GCP behavior by @hectorvent in #15
- fix(storage): support
gcloud storage cpuploads by @hectorvent in #16 - fix(storage): emit microsecond-precision GCS timestamps by @hectorvent in #17
🧰 Internals
- chore(deps): bump the actions-minor-patch group across 1 directory with 5 updates by @dependabot in #11
Full Changelog: 0.2.0...0.2.1
0.2.0
🎉 Highlights
This release closes major API parity gaps across Firestore, Pub/Sub, and IAM, adds Cloud Tasks v2 gRPC, and lands a substantial GCS feature pack: object holds, retention policies, the batch API, and notification configs. CI now exercises real Terraform and OpenTofu suites, and the docs get a meaningful refresh with new branding.
🪣 GCS: object holds, retention, batch, and notifications
Four meaningful Cloud Storage additions land together (#7):
- Object holds (event-based and temporary)
- Retention policies at the bucket level
- Batch API for bulk object operations
- Notification configs for Pub/Sub-driven workflows
This brings GCS coverage much closer to what real GCP workloads need.
📨 Cloud Tasks v2 (gRPC)
floci-gcp now emulates Cloud Tasks v2 over gRPC (#5), enabling local testing of task queue workflows without standing up a real GCP project.
🔧 Firestore + Pub/Sub + IAM parity
A coordinated pass closes the remaining API parity gaps across the three core services (#12). Real-world SDK and IaC flows that exercise these services should now work end to end.
🧪 Terraform and OpenTofu in CI
Compatibility test suites for both Terraform and OpenTofu now run in CI (#8), so regressions in IaC behavior are caught at PR time rather than surfacing in user projects.
✨ New Features
- feat(cloud-tasks): implement Cloud Tasks v2 gRPC service by @hectorvent in #5
- feat(gcs): object holds, retention policy, batch API, and notification configs by @hectorvent in #7
- feat: close remaining API parity gaps across Firestore, Pub/Sub, and IAM by @hectorvent in #12
🐛 Bug Fixes
- fix(docker-compat): wrong gcp package install in dockerfile by @hectorvent in #4
🧰 Internals & CI
- test(compatibility-tests): run Terraform and OpenTofu suites in CI by @hectorvent in #8
- chore: replace integration tests with service unit tests by @hectorvent in #6
📚 Documentation
- docs: improve documentation by @hectorvent in #9
- docs: documentation update and logo by @hectorvent in #13
Full Changelog: 0.1.0...0.2.0
0.1.0
Highlights
Initial release of floci-gcp, a unified Google Cloud Platform emulator. Serves REST and gRPC on a single ALPN-multiplexed port and ships emulations for 7 GCP services, validated by 186 SDK compatibility tests across Java, Python, Node.js, and Go, plus dedicated Terraform and OpenTofu test suites.
✨ Added
Core platform
- Single-port transport: HTTP/2 + gRPC via ALPN on port
4588— no split-server config - Unified error model:
GcpExceptionwith paired HTTP/gRPC status codes,GcpExceptionMapperfor JAX-RS, andGcpGrpcControllerbase class mappingGcpException→StatusRuntimeException - Project context:
ProjectContextFilterresolves the GCP project ID from the URL path,x-goog-request-paramsheader, orFLOCI_GCP_DEFAULT_PROJECT_IDfallback - Resource naming:
GcpResourceNamesparses and buildsprojects/{project}/...strings - Project isolation:
ProjectAwareStorageBackendnamespaces all storage keys by GCP project ID - Request pipeline:
GzipRequestFilterfor Vert.x server-side gzip decompression (required by the Google Cloud Java SDK);ServiceRegistry+ServiceEnabledFilterto reject requests against disabled services
Configuration & storage
@ConfigMapping-basedEmulatorConfigrooted atfloci-gcp.*, every setting overridable viaFLOCI_GCP_*env vars- Four storage modes:
memory(default),persistent,hybrid,wal
Cloud Storage (GCS)
- Full REST API: buckets (create, get, list, patch, delete) and objects (multipart / resumable / media upload, download, copy, list, delete) across both XML and JSON API paths
- CRC32C + MD5 checksum support
PATCH /storage/v1/b/{bucket}for label and metadata updateslabelsfield on bucket create and patch — required for the Terraform/OpenTofugoogle_storage_bucketresource
Other services
- Pub/Sub (gRPC): topics, subscriptions, publish, pull, acknowledge,
StreamingPull - Secret Manager (gRPC): secrets, versions, access, enable/disable/destroy,
versions/latestresolution - Firestore (gRPC): documents, collections, filtered queries, transactions,
Listenstreaming - Datastore (REST/JSON): entities,
lookup,runQuery,commitwith upsert/insert/update/delete mutations, transactions - IAM (REST): service account CRUD,
getIamPolicy,setIamPolicy,testIamPermissions - Managed Kafka (REST): Tier 1 + Tier 2 coverage of clusters, topics, and consumer groups; Redpanda-backed via Docker; mock mode for CI
Compatibility, packaging & operations
- SDK compatibility test suites in Java, Python, Node.js, and Go — 186 tests across all 7 services
- Terraform compatibility suite (
compat-terraform/) using GCP provider v6 - OpenTofu compatibility suite (
compat-opentofu/) using GCP provider v6 - JVM and native Docker images
docker-compose.ymlwith/var/run/docker.sockmount for Managed Kafka container orchestration- Operational endpoints:
/_floci-gcp/healthand/_floci-gcp/info
🐛 Fixed
- gcs: multipart object upload now falls back to the
?name=query parameter when the object name is absent from the JSON metadata body — fixesgoogle_storage_bucket_objectwith the Terraform GCP provider
📝 Upgrade notes
Initial release — no migration required. Configure via floci-gcp.* properties or FLOCI_GCP_* environment variables, and pick a storage mode (memory, persistent, hybrid, wal) appropriate to your environment.
Full Changelog: https://github.com/hectorvent/floci-gcp/compare/main...HEAD