Skip to content

v2.5.0

Choose a tag to compare

@NitinKumar004 NitinKumar004 released this 15 Aug 15:22
· 815 commits to development since this release
f147a91

cloudemu — the cloud, in memory

Release Notes — v2.5.0

This release adds two more AWS services, ships cloudemu's redesigned logo, makes the built-in Kubernetes cluster work smoothly inside Docker, and rewrites the docs so anyone — in any language, not just Go — can see what cloudemu really is: a local cloud you run and point your apps at.

🎨 New look

cloudemu has a brand-new logo — a cloud paired with a terminal prompt and the tagline "the cloud, in memory." It's transparent and theme-adaptive, so it looks crisp on both light and dark backgrounds across GitHub, the docs, and pkg.go.dev.

✨ Features

Two more AWS services

Point the real AWS SDK (or the aws CLI) at cloudemu and these respond just like the real thing — only in memory, with no account and no bill.

  1. GuardDuty (threat detection) — manage detectors, threat-intelligence sets, filters, and findings entirely in memory. Full coverage of all 87 operations, so aws-sdk-go-v2/service/guardduty and the aws guardduty CLI work by only changing the endpoint.
  2. MSK — Managed Streaming for Apache Kafka — create and manage Kafka clusters, configurations, and connectors. Full coverage of all 59 operations for aws-sdk-go-v2/service/kafka and the aws kafka CLI.

🔧 Enhancements

Clearer documentation

  • The README now speaks to everyone. It leads with what cloudemu actually is — a runnable local cloud (via Docker or a single binary) that you point any app, in any language, at — rather than a Go-testing-only tool. New copy-paste Docker quickstart, a "three ways to run it" overview, and a proper Contributing & community section for newcomers.

Cleaner internals

  • OCI tidy-up. Oracle Cloud (OCI)-only capabilities moved out of the shared service packages, keeping each provider's code self-contained and easier to extend.

🐛 Fixes

Kubernetes

  • Works inside Docker now. When you run the cloudemu container, its built-in Kubernetes cluster is reachable from your machine with kubectl and client libraries — previously it advertised an address that couldn't be dialed from outside the container.
  • kubectl apply --server-side for core resources. Server-side apply, "create the object if it doesn't exist yet," and finalizer-aware deletes now work for ConfigMaps, Secrets, Services, and Deployments — so real tools and operators behave the way they would on a genuine cluster.

Technical Details

New AWS SDK-compat services (#388, #389)
  • #388 GuardDuty — REST-JSON (awsRestjson1), path + HTTP-method routing, no version prefix; four-layer architecture (services/guardduty/driverproviders/aws/guarddutyserver/aws/guardduty → registration). 87 operations: detectors + child resources (IP sets, threat-intel/entity/trusted-entity sets, filters), findings, and members, with atomic creates, typed exceptions, and deep-copied reads. Real-SDK roundtrip tests.
  • #389 MSK (Kafka) — REST-JSON under three version prefixes (/v1/, /api/v2/, /replication/v1/); same four-layer architecture. 59 operations: clusters (v1 + v2, atomic name claim with ConflictException), configurations, and connectors, with deterministic Clock/idgen and real-SDK roundtrip tests.
Kubernetes data plane (#390, #400)
  • #390 typed server-side apply for core kinds — application/apply-patch+yaml now runs through real field-ownership (managedFields) + conflict detection instead of a plain RFC-7396 merge; apply-to-missing now creates (no more 404 on a fresh cluster); typed deletes honor metadata.finalizers (Terminating instead of hard delete) for ConfigMap, Secret, Service, and Deployment. Verified against real kubectl.
  • #400 Docker-reachable Kubernetes endpoint — when --host binds all interfaces (0.0.0.0, as the Docker image does), the data plane now advertises a routable host (default 127.0.0.1) with matching cert SANs, so an EKS/AKS/GKE kubeconfig from the container works with host kubectl/client-go. New --advertise-host flag for reaching it from another machine; OCI port (4571) declared for opt-in use.
Brand, docs & internals (#396, #397, #401, #393)
  • #396 / #397 redesigned, transparent, theme-adaptive logo (light/dark PNG exports with type baked in, served via a <picture> block).
  • #401 README/metadata reframe — any-language, three-modes-first framing; Docker quickstart; fixed broken snippets; Contributing/community footer; aligned llms.txt / AGENTS.md / doc.go / docs/README.md openers.
  • #393 moved OCI-only capabilities out of shared driver packages.