Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
85017dd
Add Azure Cosmos DB for PostgreSQL full-parity support
thzgajendra Aug 1, 2026
7ff82bb
Address Cosmos DB for PostgreSQL review: crash + replica model + vali…
thzgajendra Aug 2, 2026
b6c6f42
Address Cosmos DB for PostgreSQL re-review: re-PUT graph + wire fidelity
thzgajendra Aug 3, 2026
9aff0c6
Cosmos DB for PostgreSQL review nits: config type/id agreement + test
thzgajendra Aug 3, 2026
d355a74
Merge pull request #311 from thzgajendra/feat/azure-cosmos-postgresql
thzgajendra Aug 3, 2026
0bb3189
Resource discovery: generic resource-shape attributes (#315)
thzgajendra Aug 3, 2026
d0be4cb
ARG #315 follow-ups: doc resource-shape fields + RG limitation, flex-…
thzgajendra Aug 3, 2026
68ec042
Merge pull request #316 from thzgajendra/feat/315-arg-resource-fields
thzgajendra Aug 3, 2026
3939f8a
AWS networking parity: transit gateway, VPN, DHCP, prefix lists, egre…
thzgajendra Aug 3, 2026
d3b75b5
AWS networking parity: tests, docs, lint
thzgajendra Aug 3, 2026
83b0f47
AWS networking (Stage A): Transit Gateway routing depth
thzgajendra Aug 3, 2026
59f25d5
AWS networking (Stage A): VPN/prefix/endpoint/Client VPN + Network Fi…
thzgajendra Aug 3, 2026
9e7b428
AWS networking (Stage A): address review — thread safety, FK validati…
thzgajendra Aug 3, 2026
37598fb
Merge pull request #317 from thzgajendra/feat/aws-networking-parity
thzgajendra Aug 3, 2026
85ac07e
AWS networking (Stage B): VPC IPAM core lifecycle
thzgajendra Aug 4, 2026
11d5878
AWS networking (Stage B): full IPAM — discovery, BYOASN/BYOIP, resolv…
thzgajendra Aug 4, 2026
db0936d
fix(cloudwatch): serve the query protocol so the AWS CLI works (#319)
thzgajendra Aug 4, 2026
ab8c259
fix(sns): deliver published messages to SQS subscriptions (#319)
thzgajendra Aug 4, 2026
fcf2aea
fix(eventbridge): deliver matched-rule events to SQS targets (#319)
thzgajendra Aug 4, 2026
2eb4dc5
fix(ec2): return *.NotFound for Describe by nonexistent ID (#319)
thzgajendra Aug 4, 2026
070116b
feat(sqs): serve GetQueueAttributes/SetQueueAttributes/PurgeQueue (#319)
thzgajendra Aug 4, 2026
6496d94
feat(lambda): route configuration, version, and alias sub-paths (#319)
thzgajendra Aug 4, 2026
85a08dd
feat(lambda): support AddPermission/GetPolicy/RemovePermission (#319)
thzgajendra Aug 4, 2026
6e53fd2
feat(ecr): implement GetAuthorizationToken (#319)
thzgajendra Aug 4, 2026
d4769e3
feat(secretsmanager): support UpdateSecret, TagResource, UntagResourc…
thzgajendra Aug 4, 2026
7b42b43
feat(ec2): implement CreateTags/DeleteTags (#319)
thzgajendra Aug 4, 2026
0a886a8
feat(sns): support TagResource and UntagResource (#319)
thzgajendra Aug 4, 2026
c8a5443
feat(dynamodb): serve TagResource/UntagResource/ListTagsOfResource (#…
thzgajendra Aug 4, 2026
9188143
fix(lambda): serve the tagging API (TagResource/UntagResource/ListTag…
thzgajendra Aug 4, 2026
8080944
feat(sqs): support TagQueue/UntagQueue/ListQueueTags (#319)
thzgajendra Aug 4, 2026
fa8f1f9
feat(ssm): support parameter tagging (Add/Remove/ListTagsForResource)…
thzgajendra Aug 4, 2026
d937b01
fix(s3): route HeadBucket and the bucket ?tagging sub-resource (#319)
thzgajendra Aug 4, 2026
54c86bd
test(ec2): update integration tests for Describe NotFound behavior (#…
thzgajendra Aug 4, 2026
cf5de0e
fix(resourceexplorer2): serve CreateIndex and GetDefaultView (#319)
thzgajendra Aug 4, 2026
b7983f4
feat(cloudwatchlogs): implement PutRetentionPolicy (#319)
thzgajendra Aug 4, 2026
2c74b80
feat(iam): support inline role policies (Put/Get/Delete/ListRolePolic…
thzgajendra Aug 4, 2026
e29e719
feat(elasticache): implement ModifyCacheCluster (#319)
thzgajendra Aug 4, 2026
ede9324
fix(dynamodb): apply FilterExpression in Query (#319)
thzgajendra Aug 4, 2026
3f725f4
fix(s3): honor max-keys and pagination in ListObjects (#319)
thzgajendra Aug 4, 2026
745d9fe
test(bedrock): stop ConverseStream flaking on connection teardown (#319)
thzgajendra Aug 4, 2026
acb7fe8
feat(ec2): implement DescribeRegions and DescribeInstanceTypes (#319)
thzgajendra Aug 4, 2026
7217888
feat(ec2): add CreateNetworkInterface, MonitorInstances, DescribeInst…
thzgajendra Aug 4, 2026
3fde28c
feat(redshift): implement CreateClusterParameterGroup and CreateClust…
thzgajendra Aug 4, 2026
3aab1bd
feat(dynamodb): serve DescribeTimeToLive and UpdateTimeToLive (#319)
thzgajendra Aug 4, 2026
dfc43ff
test(dynamodb): update unrouted-op assertion after TTL routing (#319)
thzgajendra Aug 4, 2026
4ea055c
feat(sns): implement SetTopicAttributes (#319)
thzgajendra Aug 4, 2026
45aaf11
feat(s3): bucket notifications with S3 -> SQS delivery (#319)
thzgajendra Aug 4, 2026
cb29dee
feat(lambda): stub invoke without a handler + event source mappings (…
thzgajendra Aug 4, 2026
14665d4
feat(cloudwatchlogs): support log-group tagging (#319)
thzgajendra Aug 4, 2026
b8ba473
feat(ecr): support repository tagging (Tag/Untag/ListTagsForResource)…
thzgajendra Aug 4, 2026
6796d69
feat(eventbridge): support TagResource/UntagResource/ListTagsForResou…
thzgajendra Aug 4, 2026
1af6358
feat(iam): support role tagging (TagRole/UntagRole/ListRoleTags) (#319)
thzgajendra Aug 4, 2026
dcb5fc6
feat(redshift): support CreateTags/DeleteTags/DescribeTags (#319)
thzgajendra Aug 4, 2026
8dacc6e
fix(ec2): move CreateNetworkInterface off the shared NetworkInterface…
thzgajendra Aug 4, 2026
513012e
fix(redshift): gate generic tag verbs by SigV4 scope to avoid collisi…
thzgajendra Aug 4, 2026
fcf2fc6
feat(elbv2): support AddTags and RemoveTags (#319)
thzgajendra Aug 4, 2026
37f2842
feat(eks): support cluster tagging (Tag/Untag/ListTagsForResource) (#…
thzgajendra Aug 4, 2026
697e709
feat(route53): support ChangeTagsForResource and ListTagsForResource …
thzgajendra Aug 4, 2026
8421354
fix(eventbridge): emit well-formed rule ARNs with region and account …
thzgajendra Aug 4, 2026
192b938
fix(eks): default cluster Kubernetes version instead of null (#319)
thzgajendra Aug 4, 2026
e2ef707
fix(ipam): address PR review — persistence, CIDR derivation, metric s…
thzgajendra Aug 4, 2026
ead94bb
fix(aws): address #320 review — event/notification fidelity + parity …
thzgajendra Aug 4, 2026
51f2490
Merge pull request #320 from thzgajendra/fix/aws-parity-audit-319
thzgajendra Aug 4, 2026
fd8641e
fix(gcp): address GCP parity audit — bugs, gaps & fidelity across 19 …
thzgajendra Aug 4, 2026
68608ea
fix(gcp): resolve full-server E2E findings — dispatch collisions & br…
thzgajendra Aug 4, 2026
9af10fb
fix(gcp): close deferred low-severity parity nits (#321)
thzgajendra Aug 5, 2026
a7046e4
fix(ipam): address second review round — allocation-rule wire shapes …
thzgajendra Aug 5, 2026
8c96ee7
fix(cloudwatch): keep server New single-arg; inject IPAM metrics via …
thzgajendra Aug 5, 2026
f92f7f5
Merge upstream/development into feat/aws-ipam
thzgajendra Aug 5, 2026
52bb2a4
fix(gcp): address PR #322 review — silent-wrong-data, GAPIC LRO, miss…
thzgajendra Aug 5, 2026
ee148fc
Merge pull request #318 from thzgajendra/feat/aws-ipam
thzgajendra Aug 5, 2026
b47edfa
feat(databricks): remaining Microsoft.Databricks ARM resources (#209)…
Satyam-Trivedi-ZS Aug 5, 2026
df42bec
feat(aws): add Traffic Mirroring, Network Insights, and VPC Block Pub…
thzgajendra Aug 5, 2026
a7e0fb5
Merge branch 'development' of https://github.com/stackshy/cloudemu in…
thzgajendra Aug 5, 2026
91c238d
fix(pubsub): sort subscriptions.list output by name for determinism
thzgajendra Aug 5, 2026
eac1cc0
Merge pull request #322 from thzgajendra/feat/gcp-parity-audit
thzgajendra Aug 5, 2026
a2413d6
fix(aws): address Stage-B networking review — findings shape, determi…
thzgajendra Aug 5, 2026
bff367b
test(aws): cover ModifyTrafficMirrorSession referential validation
thzgajendra Aug 5, 2026
b82d3ca
fix(bedrock): drain request body before streaming to fix CI flake
thzgajendra Aug 5, 2026
d9f6a46
Merge branch 'development' into feat/aws-networking-stage-b
thzgajendra Aug 5, 2026
6e84d62
Merge pull request #324 from thzgajendra/feat/aws-networking-stage-b
thzgajendra Aug 5, 2026
4bd1336
feat(resourcediscovery): Azure Resource Graph cost-field projection a…
NitinKumar004 Aug 5, 2026
eee8b6b
feat(k8s): full data-plane parity (CRDs, SSA, metrics/HPA, admission,…
NitinKumar004 Aug 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ SDK-compat coverage across AWS, Azure, and GCP:
| Storage | S3 | Blob Storage | GCS |
| Compute | EC2 (+ VPC, EBS, Snapshots, AMIs, Spot, Launch Templates, Auto Scaling) | Virtual Machines (+ Disks, Snapshots, Images, SSH keys) | Compute Engine (+ Disks, Snapshots, Images) |
| NoSQL DB | DynamoDB | Cosmos DB | Firestore |
| Relational DB | RDS + Aurora (incl. Neptune & DocumentDB engines), Redshift | SQL Database, PostgreSQL Flexible Server, MySQL Flexible Server | Cloud SQL, AlloyDB |
| Relational DB | RDS + Aurora (incl. Neptune & DocumentDB engines), Redshift | SQL Database, PostgreSQL Flexible Server, MySQL Flexible Server, Cosmos DB for PostgreSQL (Citus) | Cloud SQL, AlloyDB |
| Wide-column NoSQL | Keyspaces (Cassandra) | Managed Instance for Apache Cassandra | Bigtable |
| In-memory / Redis | ElastiCache, MemoryDB | Cache for Redis | Memorystore |
| Kubernetes | EKS (control plane + data plane) | AKS (control plane + data plane) | GKE (control plane + data plane) |
Expand All @@ -139,9 +139,9 @@ SDK-compat coverage across AWS, Azure, and GCP:
The Kubernetes story is two layers, both shipped:

- **Control plane** (EKS / AKS / GKE) — cluster, node-pool, addon / Fargate / maintenance-config lifecycle via the real cloud SDKs.
- **Data plane** (in-memory Kubernetes API) — Namespace, Pod, Service, ConfigMap, Secret, ServiceAccount, Deployment, Endpoints. Supports CRUD + JSON-merge Patch + Watch streaming, so real `client-go` `Informer`/`Reflector` machinery works against a cloudemu-emulated cluster. Kubeconfigs returned by the control plane point at the in-memory data plane — `kubectl apply -f deployment.yaml` followed by `kubectl get pods` round-trips end-to-end.
- **Data plane** (in-memory Kubernetes API) — core, apps, batch, networking, rbac, storage, autoscaling, policy, discovery, **apiextensions** (CRDs) and **admissionregistration** kinds. Supports CRUD, all patch types + **server-side apply** (field ownership + conflicts), `?dryRun=All`, finalizers, `limit`/`continue` pagination, watch streaming with `resourceVersion` resume + BOOKMARK — so real `client-go` `Informer`/`Reflector` machinery works against a cloudemu-emulated cluster. Kubeconfigs returned by the control plane point at the in-memory data plane — `kubectl apply -f deployment.yaml` followed by `kubectl get pods` round-trips end-to-end.

What's intentionally out of scope: real controllers (Deployment ReplicaSet ↛ Pod), scheduler (Pods stay Pending), RBAC, PV/PVC, StatefulSet/DaemonSet/Job/CronJob, Ingress.
Emulation model: there is no scheduler or kubelet, so controllers converge **synchronously** — a Deployment interposes a ReplicaSet and materializes Pods straight to Running (a Job's straight to Succeeded), and Services get Endpoints, on every write. On top of the raw object store it also serves **CRDs** (dynamic servable kinds), **`metrics.k8s.io`** + **HPA** actuation, object-count **ResourceQuota** / **LimitRange** / **PDB-gated eviction** enforcement, **RBAC** SubjectAccessReview + **NetworkPolicy** evaluation, and **opt-in admission webhooks**. See [docs/services.md](docs/services.md) §18 for the authoritative capability list.

Full per-service operation list: [docs/services.md](docs/services.md).
Per-handler protocol details and limitations: [docs/sdk-server.md](docs/sdk-server.md).
Expand Down
11 changes: 4 additions & 7 deletions cloudemu_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7097,13 +7097,10 @@ func TestVolumeLifecycleAWS(t *testing.T) {
t.Fatal(err)
}

vols, err = p.EC2.DescribeVolumes(ctx, []string{vol.ID})
if err != nil {
t.Fatal(err)
}

if len(vols) != 0 {
t.Errorf("expected 0 volumes after delete, got %d", len(vols))
// Describing the deleted volume by ID now yields NotFound (issue #319,
// theme C: InvalidVolume.NotFound), not an empty success.
if _, err = p.EC2.DescribeVolumes(ctx, []string{vol.ID}); err == nil {
t.Error("expected NotFound describing a deleted volume, got nil")
}
}

Expand Down
7 changes: 5 additions & 2 deletions docs/sdk-server.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,10 +197,11 @@ All handlers speak ARM JSON over HTTPS unless noted.
| **SQL Database** | `Microsoft.Sql/servers[/databases]` — servers and databases, full CRUD lifecycle |
| **Managed Cassandra** | `Microsoft.DocumentDB/cassandraClusters[/dataCenters]` — clusters (CreateOrUpdate, Get, ListByResourceGroup, ListBySubscription, Update, Delete, deallocate, start, invokeCommand, status) and datacenters (CreateOrUpdate, Get, List, Update, Delete). Real `armcosmos` `CassandraClusters`/`CassandraDataCenters` clients round-trip end-to-end, including the LRO pollers. |
| **PostgreSQL Flexible Server** | `Microsoft.DBforPostgreSQL/flexibleServers` — full CRUD lifecycle |
| **Cosmos DB for PostgreSQL** | `Microsoft.DBforPostgreSQL/serverGroupsv2` — clusters (CreateOrUpdate, Get, ListByResourceGroup, ListBySubscription, Update, Delete, restart, start, stop, promote, checkNameAvailability), firewall rules, roles, derived servers/nodes, configurations (cluster/coordinator/node reads + updates), and private endpoint connections/links. Real `armcosmosforpostgresql` clients round-trip end-to-end, including the LRO pollers. |
| **MySQL Flexible Server** | `Microsoft.DBforMySQL/flexibleServers` — full CRUD lifecycle |
| **AKS** | `Microsoft.ContainerService/managedClusters` — ManagedClusters (CreateOrUpdate, Get, UpdateTags, Delete, List/ListByResourceGroup), AgentPools (CreateOrUpdate, Get, Delete, List), MaintenanceConfigurations (CreateOrUpdate, Get, Delete, List), ListClusterAdmin/User/MonitoringUser Credentials, RotateClusterCertificates. Stub kubeconfig only — data plane deferred to Wave 2. |
| **IAM (armauthorization)** | `Microsoft.Authorization` — RoleDefinitions (CreateOrUpdate, Get, List, Delete) and RoleAssignments (Create, Get, ListForScope, Delete) at any scope (subscription, resource group, resource, management group). Real `armauthorization` SDK clients round-trip end-to-end. Microsoft Graph (users/groups) is out of scope — deferred to a future handler. |
| **Resource Graph** | `Microsoft.ResourceGraph` — `POST /providers/Microsoft.ResourceGraph/resources?api-version=2022-10-01` with a KQL-shaped query over the cross-service inventory; supports `subscriptions[]` scoping and `$top`/`$skipToken` pagination |
| **Resource Graph** | `Microsoft.ResourceGraph` — `POST /providers/Microsoft.ResourceGraph/resources?api-version=2022-10-01` with a KQL-shaped query over the cross-service inventory; supports `subscriptions[]` scoping and `$top`/`$skipToken` pagination. Rows carry the fixed columns (`id` [ARM-shaped], `name`, `type`, `location`, `resourceGroup`, `subscriptionId`, `tags`) plus resource-shape columns emitted when present — `sku.name`, `properties`, `managedBy`, `kind`, `zones` — so SKU/tier/size-sensitive consumers (e.g. a discovery + cost engine) can read a VM's size, a managed disk's tier/`diskSizeGB`/owning VM, or a flexible server's compute SKU. `project`/`summarize`/`join` are tolerated but ignored (the full row is always returned). |
| **Databricks (ARM control plane)** | `Microsoft.Databricks/workspaces` — CreateOrUpdate, Get, Delete, UpdateTags, List / ListByResourceGroup. Real `armdatabricks` SDK clients round-trip end-to-end. |
| **Databricks (workspace data plane)** *(`databricks-sdk-go`, `/api/2.x`)* | Point the real `WorkspaceClient` at `Config.Host`. Clusters (create/edit/start/restart/resize/pin/unpin/delete + list-node-types / spark-versions / zones), instance pools, jobs + runs (submit / run-now / get / list / cancel / cancel-all / repair / output / delete), cluster policies, libraries (install / uninstall / status), and object permissions. Self-contained families: secrets (scopes / secrets / ACLs), tokens, git credentials, repos, DBFS (incl. block upload), workspace notebooks/directories, SQL warehouses, pipelines, serving endpoints, SCIM identity (users / groups / service principals), and Unity Catalog (catalogs / schemas / tables + metastores / external locations / storage credentials / volumes). Also serves `GET /.well-known/databricks-config` so the SDK's host-metadata resolution succeeds (workspace-host stub) instead of logging a warning. |

Expand Down Expand Up @@ -297,6 +298,7 @@ Each handler uses a different signal so dispatch is unambiguous within a provide
| Azure SQL | ARM provider `Microsoft.Sql` |
| Azure Managed Cassandra | ARM provider `Microsoft.DocumentDB/cassandraClusters` |
| Azure PostgreSQL Flexible | ARM provider `Microsoft.DBforPostgreSQL/flexibleServers` |
| Azure Cosmos DB for PostgreSQL | ARM provider `Microsoft.DBforPostgreSQL/serverGroupsv2` |
| Azure MySQL Flexible | ARM provider `Microsoft.DBforMySQL/flexibleServers` |
| Azure AKS | ARM provider `Microsoft.ContainerService/managedClusters` |
| Azure Databricks (ARM) | ARM provider `Microsoft.Databricks/workspaces` |
Expand Down Expand Up @@ -328,7 +330,7 @@ Registration order matters when handlers share a path prefix — `awsserver.New`

Kubernetes ships as **two cooperating handlers**: per-provider control planes (EKS / AKS / GKE — clusters + node pools + addons / Fargate / maintenance configs) and a shared in-memory **data plane** registered under `/k8s/{cluster-uid}/`. The control plane mints a UID on every cluster Create and embeds it in the kubeconfig (or `Cluster.Endpoint` for GKE) along with a CA that certifies the data-plane serving cert, so `client-go` and `kubectl` connect over **validated TLS**. The data plane behaves like a tiny always-converged cluster (minikube-like): a synchronous reconcile engine runs on every write, so Deployments/ReplicaSets/StatefulSets/DaemonSets materialize **Running** Pods, Services get populated Endpoints, PVCs bind, and Jobs complete — all immediately and deterministically (no controller goroutines). Core, apps, batch, networking, rbac, storage, autoscaling, discovery, and policy groups are served, with `/scale` and `/status` subresources, label/field selectors, and `?watch=true` streaming (selector-filtered) so real `Informer` / `Reflector` machinery works. Data-plane lists are unpaginated (`limit`/`continue` are ignored — every list returns the full set).

Non-goals are deliberate emulation boundaries: no kubelet-backed Pod subresources (`/log`, `/exec`, `/attach`, `/portforward`), no real scheduling (single synthetic node, no affinity/taints), no admission/quota/policy **enforcement** (ResourceQuota, LimitRange, NetworkPolicy, RBAC, PDB are stored but not enforced), HPA does not autoscale, CronJob does not fire on schedule, and rollouts converge instantly with no surge pacing or revision history. See `docs/services.md` §18 for the full resource list.
The data plane now covers CustomResourceDefinitions (dynamic servable kinds), server-side apply with `managedFields` field ownership + conflict detection, `?dryRun=All`, finalizer-gated deletion, `?limit=&continue=` pagination, synthetic `pods/log` + PDB-gated `pods/eviction`, `metrics.k8s.io` (`kubectl top`) + HPA actuation, object-count ResourceQuota / LimitRange / PDB enforcement, RBAC SubjectAccessReview + NetworkPolicy evaluation, opt-in admission webhooks, watch `resourceVersion` resume + BOOKMARK, and a deterministic injectable clock. Remaining emulation boundaries are deliberate simplifications: no real kubelet (synthetic logs; `exec`/`attach`/`portforward` return a typed 501), no scheduling beyond the single synthetic node (DaemonSet `nodeSelector` honored; no affinity/taints), admission webhooks call out only when explicitly enabled, RBAC/NetworkPolicy are queryable rather than request-time-enforced, CronJob fires via `TickCronJobs` (no wall clock), and rollouts converge instantly. See `docs/services.md` §18 for the full resource list.

Two provider-specific services also ship as full SDK-compat handlers. **AWS Bedrock** covers the `bedrock` control plane (foundation models, customization jobs, custom models, guardrails with policy configs + versions, provisioned throughput, invocation logging, resource tagging, model import/copy/evaluation jobs, inference profiles, prompt routers, marketplace model endpoints, foundation-model agreements, and automated-reasoning policies) and the `bedrock-runtime` data plane (InvokeModel with family-aware response envelopes, Converse, streaming ConverseStream / InvokeModelWithResponseStream over `vnd.amazon.eventstream`, CountTokens, ApplyGuardrail, and async invoke). A companion **AWS Bedrock Agent** handler covers the `bedrock-agent` control plane (agents, knowledge bases, data sources, flows, prompts) and the `bedrock-agent-runtime` data plane (InvokeAgent streaming, Retrieve, RetrieveAndGenerate); its runtime handler registers before the control plane and matches only POST so the two never collide on the shared `/agents` and `/knowledgebases` roots. `bedrock-agent` coverage is intentionally scoped to this core resource lifecycle and runtime data plane — agent versioning/aliases beyond basic create, action groups, and agent collaborators are out of scope for this iteration. **Azure Databricks** covers the `armdatabricks` ARM workspace resource plus the `databricks-sdk-go` workspace data plane — clusters, instance pools, jobs and runs, cluster policies, libraries, permissions, secrets, tokens, git credentials, repos, DBFS, workspace notebooks/directories, SQL warehouses, pipelines, serving endpoints, SCIM identity, and Unity Catalog.

Expand Down Expand Up @@ -364,5 +366,6 @@ The `Handler` interface is the only contract — no registration is needed in co
- **GCS direct-media downloads** assume path-style URLs.
- **DynamoDB / Cosmos / Firestore filters and queries** support common patterns but are not full DSL parsers.
- **Pagination tokens** are honored where present in the SDK contract; some list operations short-circuit to a single page.
- **Resource Graph `resourceGroup`.** Rows expose `resourceGroup` derived from the resource's ARM id. Where a mock doesn't model a per-resource resource group, the id (and thus `resourceGroup`) falls back to `default`, so all such resources share one resource group — fine for SKU/tier/size-sensitive discovery and cost tests, but consumers that key on distinct resource groups should be aware. Event Hubs (`microsoft.eventhub/namespaces`) is not yet modeled, so its `sku.tier` isn't surfaced.

When a client hits an unsupported operation, the server responds with the provider's native error code so failures are easy to diagnose.
Loading
Loading