Skip to content

Commit c09d410

Browse files
agbishopWitness Patrolclaude
authored
feat: parity + perf follow-ups, CI flake hardening, dependency bumps (#2518)
* feat(iot): custom authorizers on the MQTT broker and TestInvokeAuthorizer Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(persistence): refresh snapshot inventory for iot command executions Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(iot): lint fixes for commands, timeouts, cert variables and custom authorizers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ui): Azure Functions, Cloud Build, Memorystore Redis and Cloud Monitoring dashboard pages In-process proxies (fixed per-service backend, no outbound HTTP) plus pages: function apps with masked-by-default app settings (server-side reveal), functions and deployments; builds with steps/logs and triggers; Redis instances with endpoints and AUTH reveal; metric descriptors, time series over a window, alert policies, uptime checks and snoozes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(dashboard): satisfy lint for console page proxies Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(sns): stop subscription tests dialling example.com Subscribing an http(s) endpoint sends a real SubscriptionConfirmation, so tests that used example.com made live calls; in CI the HTTP/2 keep-alive conn to it outlived the package and failed testleak. Use the reserved .invalid TLD so nothing leaves the host. Also records iotjobsdataplane as a direct dependency (go mod tidy). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(iot): publish lifecycle and registry $aws/events, route egress through httpclient Lifecycle: presence connected/disconnected/connect_failed and subscriptions subscribed/unsubscribed. Registry events for THING, THING_TYPE, THING_TYPE_ASSOCIATION, THING_GROUP, THING_GROUP_HIERARCHY, THING_GROUP_MEMBERSHIP, JOB and JOB_EXECUTION, gated by UpdateEventConfigurations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(azurefunctions): validate function names and secrets paths before file ops Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(signin): rebuild loopback redirect from validated parts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(cloudformation): bound-check integer properties before narrowing Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(iot): lint fixes for lifecycle and registry events Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(signin): satisfy lint on loopback redirect rebuild Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(ses): match bulk relay sessions by recipient, not arrival order SendBulkTemplatedEmail relays destinations concurrently; CI saw b@ arrive before a@ and the ordered assertions failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service tables after the IoT parity merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(apigatewayv2): WebSocket data plane routing, authorizers, route responses, stage-prefixed @connections Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service tables after the IoT events merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(opensearch): FGAC master-user basic auth, OPENSEARCH_MULTI_CLUSTER and OPENSEARCH_CUSTOM_BACKEND Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(rds): postgis, pgvector and aws_s3/aws_lambda extensions on the docker engine Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(app): WebSocket metrics test uses a failing integration for ExecutionError Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(opensearch): lint, snapshot inventory for master-user fields Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(rds): lint and layout fixes for the postgres extension image Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(rds): bind the aws_s3/aws_lambda callout listener to the container bridge only Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service tables after the API Gateway v2 and OpenSearch merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(e2e): report why the Azure cross-SDK server never listened CI timed out waiting 15s for the blob port with no clue why: the subprocess output was interleaved and dropped. Keep a tail of it, fail fast if the process exits, and include the tail on any startup failure; allow 60s for a loaded runner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(glue): crawl DynamoDB, Delta, Iceberg, Hudi and JDBC targets Crawlers now produce catalog tables for every implemented target kind and honour SchemaChangePolicy, RecrawlPolicy and AddOrUpdateBehavior. Failed crawls end FAILED with an error message; crawl metrics come from history. ListCrawls now emits CrawlerHistory StartTime/EndTime. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(app): wire Glue DynamoDB crawling from the streams wiring group Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service tables after the RDS extensions merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(glue): crawler lint fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(lambda): encrypt env vars under function KMSKeyArn and run EFS access points as PosixUser Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(glue): run crawl target I/O outside the backend lock Snapshot crawler config, connections and the database's tables under the lock, do S3/DynamoDB/JDBC I/O unlocked, then replay the recorded catalog writes and metrics atomically, discarding results of a stopped run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(glue): lint fixes for crawl lock test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(glue): crawlRun field alignment Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(lambda): lint fixes for KMS env encryption and EFS PosixUser Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service tables after the Glue crawlers merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate Lambda README after the KMS/EFS merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(lambda): bound SQS ESM concurrency/pollers and route capacity-provider invocations SQS mappings honour ScalingConfig.MaximumConcurrency and ProvisionedPollerConfig with concurrent synchronous batch workers; capacity-provider functions are admitted through per-environment slots limited by per-environment concurrency, function scaling config and the provider vCPU budget, with ResourceNotFound/ResourceNotReady for bad providers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(sagemaker): run endpoints and jobs in real containers SAGEMAKER_ENGINE=docker starts model containers per endpoint variant (serve, /ping gate, ModelDataUrl extraction), proxies InvokeEndpoint, InvokeEndpointWithResponseStream and InvokeEndpointAsync to /invocations, and runs training, processing and transform jobs with the /opt/ml layout fed from and uploaded to emulated S3, with logs in /aws/sagemaker/*. SageMaker Runtime no longer fabricates response bodies or async locations; without the engine it returns ServiceUnavailable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(sagemaker): satisfy lint for the container engine Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(sagemaker): wrap long lines in the docker end-to-end test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(sagemaker): wrap remaining long literals and drop constant test params Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(sagemaker): wrap training resource config in the docker test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(lambda): use documented Managed Instances per-runtime concurrency defaults Unset PerExecutionEnvironmentMaxConcurrency now defaults per vCPU to the documented per-runtime values (nodejs 64, java/dotnet 32, python 16); runtimes without a documented default are uncapped per environment. Min environments (3) and MaxVCpuCount (400) are sourced to the docs. Restores the reserved-concurrency-0 throttle message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(appsync): Lambda BatchInvoke batches list-item resolvers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(appsync): EvaluateCode codeErrors with line/column/span locations Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate Lambda README after the ESM/capacity merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(appsync): DynamoDB Sync, TransactGetItems, TransactWriteItems and JS sync helper Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(appsync): $util.transform.toElasticsearchQueryDSL / toOpenSearchQueryDSL Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs(appsync): PARITY leftovers update Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(rds): opt-in real SQL Server engine for sqlserver-* instances RDS_SQLSERVER_ENGINE=docker runs sqlserver-ee/se/ex/web on the mssql image (amd64 only), with a master login, native BACKUP/RESTORE snapshots and restore points. Closes gopherstack-49qct.52. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(rds): satisfy lint on the SQL Server engine Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(appsync): lint fixes for resolver leftovers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(rds): fix SQL Server engine formatting and field order Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate AppSync README after the leftovers merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(cosmosdb): lock-free stored procedures, batch entity query, ORDER BY index checks, lazy mode rejection Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(cosmosdb): lint fixes for batch query and tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * build(deps): tidy desktop module for go-mssqldb; regenerate RDS docs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(rds): keep deferred ModifyDBInstance changes pending until reboot or apply Without ApplyImmediately, AWS holds changes until the next maintenance window or a reboot; the reconciler applied them after 250ms, which also made the pending-maintenance pagination test flaky under load. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(security): clear CodeQL zipslip, path-injection, int-conversion and redirect alerts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ociobjectstorage): OCI Object Storage emulator with pkgs/ociauth request signing Own listener (default 8150) serving Object Storage API 20160918: namespace, buckets, objects, ranges, multipart, copy/rename/batch delete, archive restore, versioning, pre-authenticated requests, lifecycle enforcement and retention rules. pkgs/ociauth verifies draft-cavage signatures for registered API keys and is accept-any otherwise. Tested through oci-go-sdk with real signing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(wfinterp): Google Cloud Workflows language interpreter YAML/JSON workflow compiler with deploy-time validation and a runtime for assign, call (subworkflows, standard library, connectors), switch, for, parallel, try/except/retry, raise, return and next, with ${...} expressions, the standard library and an injectable clock and host. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpworkflows): Cloud Workflows and Executions emulator with Eventarc workflow destinations google.cloud.workflows.v1 and executions.v1 on a dedicated gRPC+REST listener (port 8139): workflow CRUD with revisions and LROs, deploy-time syntax validation, executions run by the wfinterp interpreter (state, result, error, status.current_steps, cancel), callbacks, sys.log to Cloud Logging and Pub/Sub, Secret Manager, Firestore and Storage connectors. Eventarc workflow destinations now start executions with the CloudEvent as the argument. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * refactor(ociobjectstorage): lint-clean handlers, split complex functions, keep CLI struct aligned Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate badges after the OCI merge; tidy desktop go.sum Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocivault): OCI Vault emulator (KMS vaults/keys/crypto, secrets, secret retrieval) Own listener (default 8151) serving KMS vault/management/crypto 20180608, vault secrets 20180608 and secret retrieval 20190301. Per-vault <prefix>-management / <prefix>-crypto .localhost endpoints select the vault from the Host header. Real AES-GCM, RSA-OAEP, RSA PSS/PKCS1 and ECDSA crypto, wrapped key import/export (RSA-OAEP + AES-KWP), key versions with rotation, deletion schedules on an injectable clock, and secrets stored only as KMS-encrypted ciphertext. Tested through oci-go-sdk with real signing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(security): escape single quotes interpolated into quoted error messages CodeQL go/unsafe-quoting (alerts 508-515): ELB, ECR Public and EC2 echo request-supplied names inside '...' in AWS-style error text. Real names never contain quotes, so escaping changes no realistic message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azurefile): Azure Files data plane emulator New services/azurefile on fixed port 10009 (--azure-file-port): service properties (CORS, metrics, SMB/NFS settings), shares (quota, tier, protocols, metadata, snapshots, ACL, stats, leases, soft delete and restore, SDDL permission store), directories, files with sparse ranges (pkgs/sparse), range writes and diffs, copy from emulator files and blobs, rename and file leases. Account by path or <account>.file.<host>; Shared Key, SAS and bearer accepted, optionally verified. Wired into cli.go, the storage vhost listener, ARM primaryEndpoints, testcontainers and docs. Tests drive the azfile SDK. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azurefile): drive share soft delete from ARM fileServices/default Drop the invented ShareDeleteRetentionPolicy element from data-plane Set File Service Properties (unknown elements are now ignored). Microsoft.Storage storageAccounts/{a}/fileServices[/default] GET/PUT/PATCH in services/azurearm carries properties.shareDeleteRetentionPolicy {enabled, days} to the azurefile backend per account. Tested with armstorage plus the azfile delete/restore flow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(persistence): refresh azurefile snapshot inventory tag alignment Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocistreaming): OCI Streaming emulator (stream pools, streams, messages, cursors, consumer groups) Own listener (default 8152) serving stream admin and messages API 20180418: stream pools with kafkaSettings and Vault-validated customEncryptionKey, streams and connect harnesses with injectable-clock CREATING/DELETING transitions and work requests, murmur2 key partitioning, retention enforcement, per-partition ingest limits, plain and group cursors with reservations, commit and heartbeat. Tested through oci-go-sdk with real signing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(ocistreaming): lint-clean the streaming emulator Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * refactor(azurearm): reuse field constants in fileServices route Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate badges after the Azure Files merge; tidy modules Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate badges after the OCI Streaming merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpdns): Cloud DNS v1 emulator with an authoritative DNS data plane managedZones (public/private/forwarding/peering, DNSSEC with generated DNSKEYs, zone operations), resourceRecordSets, atomic changes with SOA serial bumps and per-type rdata validation, server policies, response policies and rules, project quota. Public zones are served over real UDP and TCP DNS through pkgs/dns. REST on port 8140, DNS on 8141. checkpins learns google.golang.org/api pins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ociidentity): add OCI Identity (IAM 20160918) with a shared API-key registry Tenancy, regions, ADs/FDs, compartments (async delete/move/recover, six-level nesting), users, groups, memberships, dynamic groups, policies with a statement grammar check, API keys, auth tokens, customer secret keys, SMTP credentials, UI password, tag namespaces/tags/defaults and work requests. API keys uploaded through Identity are linked into every OCI service's signature registry via ociauth.Registry.Link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ociidentity): lint and structure fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpdns): satisfy lint (named limits, split validators, field alignment) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate badges after the OCI Identity and Cloud DNS merges; tidy desktop Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ui): in-process proxies for OCI, Workflows, Cloud DNS and Azure Files console pages Fixed-backend proxies (no user-controlled host or URL, no outbound HTTP) for Object Storage, Vault (secret content only through an explicit reveal), Streaming (server-side cursor reads), Identity (API key fingerprints only), Workflows, Cloud DNS and Azure Files, with proxy tests covering browse, actions, rejects and the 503 not-served path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocifunctions): add OCI Functions (management API and FDK invoke) on its own listener Applications, functions and work requests under /20181201 and /20260325, API-key auth linked to the Identity registry, snapshot persistence, and InvokeFunction that runs the function image over the Fn FDK http-stream contract with a pooled container per function, timeouts, detached mode and engine opt-out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocifunctions): lint fixes, pointer-free settings, disable-engine flag Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ui): Oracle Cloud switcher entry and pages, Workflows, Cloud DNS and Azure Files Oracle Cloud joins the cloud switcher with Object Storage (buckets, prefix browsing, details, download, PARs, lifecycle and retention, delete), Vault (keys and versions, secrets with reveal-gated content), Streaming (pools, streams, recent messages) and Identity (compartment tree, users, groups, policies, API key fingerprints). GCP gains Workflows (source, revisions, executions, run, cancel) and Cloud DNS (zones, record sets, change history); Azure gains Files (shares, directory browser, downloads, snapshots). The CLI now hands the seven handlers to the dashboard, covered by a wiring test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(azurefile): bound share quota against int32 before narrowing CodeQL go/incorrect-integer-conversion (alert 516): the existing 1..102400 check went through a pointer deref the analysis does not track. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(azurefile): sort imports Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ui): satisfy lint for the console page proxies Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * perf(servicequotas): gzip-embed the docs quota catalog Binary 280.38 MB -> 279.15 MB; decompressed lazily with the catalog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azuremonitor): Azure Monitor Logs ingestion and query APIs with a KQL engine New services/azuremonitor on fixed HTTPS port 10013 (--azure-monitor-port): Logs Ingestion API (gzip, 1 MB limit, stream schema validation, DCR transformKql) and Logs Query API (workspace, resource and $batch queries) backed by services/azuremonitor/kql, a KQL subset engine (let, union, where, project, extend, summarize, sort, top, distinct, ~70 scalar functions); unsupported operators answer 400 BadArgumentError/SemanticError. ARM Microsoft.OperationalInsights (workspaces, tables, shared keys) and Microsoft.Insights (data collection endpoints and rules) are served by services/azurearm over a MonitorLogs seam. Wired into cli.go, persistence, ports, testcontainers and docs. Tests drive azlogs ingestion/query, armoperationalinsights and armmonitor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(azuremonitor): lint cleanup, decomposed KQL parser/executor, CLI field order Splits the scalar function table, lexer, parser, summarize and sort paths into small functions, replaces magic numbers and repeated literals with constants, uses crypto/rand for workspace shared keys, and places the AzureMonitor settings field where govet fieldalignment keeps CLI optimal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azuremonitor): drop mismatched ingestion records by default, strict mode opt-in Azure reports rows that fail processing only in DCRLogErrors and still accepts the upload, so the emulator now does the same by default. --azure-monitor-strict-ingest (AZURE_MONITOR_STRICT_INGEST) restores the synchronous 400 InvalidPayload. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(azuremonitor): order test struct fields for fieldalignment Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * perf(sdkwire): load schemas nothing else links from embedded models 17 SDK schemas packages (sagemaker, opensearch, sesv2, ...) were linked only by sdkwire's registry, costing ~4 MB of code plus their init functions on every startup. sfnschemagen now encodes their schema graphs to sdkwire/models/*.json.gz (schemair) and verifies the decoded copy is equivalent trait-for-trait; the registry rebuilds them lazily. Binary 279.15 -> 275.23 MB, package init ~78 -> ~53 ms, init allocs 84 -> 74 MB. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * build(deps): tidy desktop go.sum for the Azure Monitor SDKs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(rds): close client conns accepted concurrently with listener shutdown A conn accepted after close() swept the tracked set was never closed, so serve (and wg.Wait) blocked on the client forever. Track conns in connSet (store-then-check closed flag) for the forwarder, pg proxy and endpoint listener. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * build(deps): tidy desktop module after dropping SDK schemas packages Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ui): Azure Monitor Logs and OCI Functions console pages Monitor Logs: workspaces (customer id, retention, sku), tables with column schemas, data collection endpoints and rules (stream declarations, data flows, transformKql) and a KQL query console with a time range picker, typed result grid, BadArgumentError chain rendering, examples and per-viewer history. OCI Functions: applications, functions (image, memory, timeout, invoke endpoint, config with secret-looking keys masked), synchronous invoke showing status, headers and body, and work requests with logs. Both are fixed-backend in-process proxies with 503 when not served; the CLI now hands both handlers to the dashboard, covered by the wiring test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azureblob): block upload, conditional headers, leases, List Containers paging Put Block / Put Block From URL / Put Block List / Get Block List with 7-day uncommitted-block expiry, If-Match/If-None-Match/If-Modified-Since/ If-Unmodified-Since/x-ms-if-tags on blob reads and writes, container and blob leases (acquire/renew/change/release/break) with lease-id enforcement, and List Containers prefix/marker/maxresults. All time-dependent state runs on an injectable clock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * build(scripts): trim the Go cache before it fills the disk Raise the --if-low floor from 5 GB to 60 GB free, and when there is space but the cache is over 150 GB, delete entries older than 12h. Two agents building in parallel filled the 458 GB disk three times in a day. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ui): satisfy lint for the Monitor and Functions proxies Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(azureblob): lint and field-order cleanups for block/lease/conditional work Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(stepfunctions): enforce variable size limits, JSONPath variable refs in path fields, forbid Distributed Map outer-scope reads Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(stepfunctions): lint fixes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(stepfunctions): wrap long lines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(stepfunctions): wrap long lines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(rds): give each parallel pgext subtest its own DB deadline The shared dbCtx was created before t.Parallel subtests, so its 4m budget burned while they queued behind other docker tests in the package run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azureblob): blob index tags (Set/Get Blob Tags, Find Blobs by Tags, x-ms-if-tags) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(azureblob): split tag parser, wrap long lines Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(cloudformation): SAM Api event RequestParameters/TimeoutInMillis/ApiKeyRequired and StateMachine Events Api events emit swagger parameters, cacheKeyParameters, timeoutInMillis and the api_key security scheme; AWS::Serverless::StateMachine Events (Schedule, ScheduleV2, CloudWatchEvent, EventBridgeRule, Api) generate the rule/schedule, invoke role and StartExecution integration as the SAM translator fixtures do. AWS::Events::Rule/Archive now accept an EventPattern JSON object. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(cloudformation): Rules RefAll/ValueOf/ValueOfAll and opt-in async stack status Fn::RefAll, Fn::ValueOf and Fn::ValueOfAll resolve AWS::EC2::VPC/Subnet/ SecurityGroup parameter types against the EC2 backend. With GOPHERSTACK_CFN_PROVISIONING_DELAY (or SetProvisioningDelay) top-level CreateStack/UpdateStack return CREATE_IN_PROGRESS/UPDATE_IN_PROGRESS and settle through UPDATE_COMPLETE_CLEANUP_IN_PROGRESS to the terminal status; in-flight operations persist and resume on Restore. DescribeStack/ListAll return copies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcppubsub): IAMPolicy RPCs on topics, subscriptions, snapshots and schemas Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpsecretmanager): SECRET_ROTATE scheduling, managed rotation RPCs and regional secrets Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(cloudformation): satisfy lint for rules, async and SAM state machine events Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(cloudformation): extract repeated SAM literals Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpstorage): ACL endpoints, predefined ACLs, UBLA rejection, matchGlob and name-based page tokens Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service READMEs for Pub/Sub IAM, Secret Manager rotation and Storage ACLs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(cognitoidp): map multi-valued SAML attributes as bracketed form-encoded list Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(s3): presign Object Lambda inputS3Url and add sessionContext to event identity Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcp): satisfy lint for ACL, rotation and IAM additions Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ec2): CreateVolume passes through the creating state when a lifecycle delay is set Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(iot): reject unparseable CSR and certificate PEM; fixtures use real material Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(codebuild): parse NUnit, NUnit3, TestNG, Cucumber, TRX, JaCoCo, Clover and SimpleCov reports Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(glue): fold database, table and partition names to lowercase Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(persistence): refresh snapshot inventory for ec2 Volume.AvailableAt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service READMEs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(codebuild): honour cache key, fallback-keys and action; materialise S3 folder and secondary sources Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(amp): PromQL double exponential smoothing, absent_over_time, sort_by_label, limitk, limit_ratio, histogram_fraction and @ start()/end() Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(dlm): execute FastRestore, CrossRegionCopy, Share, Archive and Deprecate schedule rules Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style: satisfy lint for parity batch (formatting, constants, field alignment) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ses): SPF a/mx/ptr/exists mechanisms and public-suffix DMARC organizational domain Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(route53resolver): deliver query logs to S3 and Firehose destinations Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(athena): evaluate projection NOW in UTC via injectable clock Date partition projection is generated in UTC per AWS docs; NOW used the host local zone. Backend now has a clock (SetClock) and NOW is normalised to UTC. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test: stabilise DLM share test, refresh snapshot golden, use pkgs/arn for S3 ARN prefix Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service READMEs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(athena): reorder backend fields for fieldalignment Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style: satisfy lint for codebuild, dlm, amp, ses and route53resolver changes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(stepfunctions): drop overflowable size sum in JSONata assign merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(logger): build merged attrs with slices.Concat Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(transfer): restrict API Gateway identity provider calls to emulator endpoints Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(azuremonitor): verify bearer token signatures against the Entra issuer Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(timestreaminfluxdb): run CUSTOM_SCHEDULE cron backups Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocistreaming): expire plain cursors after five minutes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azurekeyvault): armkeyvault SDK parity test for deleted vaults, purge and name check Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpscheduler): accept the App Engine cron schedule format Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(eks): eks-auth AssumeRoleForPodIdentity via STS Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(transfer): lint fixes for loopback target helper Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate service READMEs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(eks): lint fixes for eks-auth pod identity Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azurekeyvault): format the armkeyvault SDK test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpscheduler): lint fixes for App Engine cron parsing Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ec2): future-dated Capacity Reservations and date-change quotes CreateCapacityReservation accepts StartDate/CommitmentDuration/DeliveryPreference and walks assessing -> scheduled -> active -> expired on the backend clock, with CommitmentInfo, quote-gated cancellation, per-state ModifyCapacityReservation rules, and CreateCapacityReservationDateChangeQuote / DescribeCapacityReservationDateChangeQuotes applied via ModifyCapacityReservation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpcompute): Compute Engine v1 control plane (networks, subnets, firewalls, routes, addresses, routers, disks, images, instances, operations) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs(gcpcompute): PARITY.md audit and generated docs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(persistence): refresh snapshot inventory for the CR modification-quote table Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpcompute): lint cleanups Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(ec2): lint cleanups for future-dated Capacity Reservations Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(iot): skip other clients' presence events in the rule-feed test The probe client's disconnect also matches '$aws/events/presence/+/+' and can arrive first; CI saw probe-client/disconnected before rule-dev/connected. Also records armkeyvault and eksauth as direct dependencies (go mod tidy). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(ec2): drop unused dupl nolints, fix assertion order Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azurecontainerinstance): Microsoft.ContainerInstance container groups with a real execution engine containerGroups CRUD/list/patch, start/stop/restart and container logs in azurearm, run in the container runtime with restart policies, live instanceView, secure env, volumes (emptyDir, secret, azureFile via Azure Files seam), published ports and registry credentials. Engine opt-out or a failed pull yields provisioningState Failed with the reason. Adds pkgs/container resource limits and credentialed pulls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * build(deps): tidy desktop go.sum for the compute client Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocicore): OCI Core networking (VCN, subnets, gateways, routing, security, peering, public IPs) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocicore): lint fixes and deterministic subnet tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azurecontainerinstance): lint fixes for the container group engine Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(azurefile): exercise share export/apply through the data plane Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocicore): wrap gendocs category list and align wire test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocicore): keep gendocs category table short Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocicore): fix gendocs category table Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * build(deps): tidy modules for armcontainerinstance Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * docs: regenerate badges after the OCI Core merge Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpcompute): instance templates, managed/unmanaged instance groups, health checks, autoscalers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpcompute): lint fixes for the instance group work Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ui): Compute Engine and Container Instances console pages Compute Engine gets a project/zone scoped page (instances with start/stop/reset/delete, disks, snapshots, networks with subnetworks, firewalls, routes, routers/NAT, addresses, operations) behind an in-process allow-listed proxy. Container Instances joins the Azure switcher with container groups by resource group, container state/events, a tail-N log viewer and start/stop/restart/delete; secure values and registry passwords never leave the backend. The CLI now hands the Compute handler to the dashboard, covered by the wiring test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(apigatewayv2): register WebSocket connections before completing the handshake The connection was added to the @connections registry only after the 101 upgrade, so a client could connect and immediately get GoneException from PostToConnection (CI: TestWebSocket_ManagementConnections). On AWS the connection is addressable once $connect succeeds. Unregister if the upgrade fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(app): publish IoT rule messages once after broker ready Rule actions run synchronously inside Broker.Publish, so wrapping it in require.Eventually bounded a slow dispatch with the retry deadline and re-sent on error. Wait on Broker.Ready, publish once, and read the Firehose delivery deterministically after FlushAll. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(dashboard): satisfy lint in the Compute and Container Instances proxies Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(apigatewayv2): wrap connection registration call Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcpcompute): load-balancing control plane Backend services and buckets, URL maps (with validate), target HTTP/HTTPS/TCP/SSL proxies, SSL certificates and policies, global and regional forwarding rules, network endpoint groups with attach/detach/list, getHealth, and in-use protection. State only: no traffic is forwarded and nothing is probed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azureappservice): Linux web apps on the function-app listener Microsoft.Web sites of kind app,linux and app,linux,container run their linuxFxVersion stack or DOCKER image in a container behind <app>.<domain>, with Kudu zip deploy, appCommandLine, WEBSITES_PORT/PORT, app settings as env, healthCheckPath readiness, start/stop/restart. Linux kinds require a reserved plan; function-only ARM routes reject web apps; engine-off and start failures surface as availabilityState Limited and 503/502 with the reason. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(gcpcompute): satisfy lint for the load-balancing control plane Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(gcpcompute): avoid magic numbers in proxy port list Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(azureappservice): lint fixes for Linux web apps Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(gcpcompute): give the certificate-less HTTPS proxy case its own name Two parallel subtests both inserted target HTTPS proxy "sp", so the no-certificate case could see 409 alreadyExists instead of 400 required. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcpcompute): wrap proxy test literal Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcpcompute): align proxy test literal Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(ocicore): core compute and block storage control plane Shapes, platform and custom images, instances (launch, power actions, update, terminate), VNICs and attachments, private IPs, ephemeral and reserved public IP assignment, boot and block volumes, iSCSI and paravirtualized attachments, volume backups and backup policies with assignments. Route targets and NSG membership now resolve real private IPs and VNICs. State only; no VM runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * feat(gcprun): job logs, IAM, multi-container revisions, autoscaling, soft delete Job task output goes to Cloud Logging on a cloud_run_job resource. Services and Jobs serve Get/Set/TestIamPermissions through the new pkgs/gcpiampolicy. Revisions run as instances: sidecars share the first container's network namespace, depends_on orders starts, startup and liveness probes gate and replace instances, emptyDir and Secret Manager volumes and secret env are materialized. Instances scale on max_instance_request_concurrency up to max_instance_count, queue then 429, keep min instances and scale to zero after idling, all on an injectable clock. Deleted services, jobs and executions are listable with show_deleted until expire_time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcprun): satisfy lint on the depth pass Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcprun): wrap the unknown-volume error Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcprun): wrap long line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * refactor(gcp): serve IAM policies through pkgs/gcpiampolicy pubsub, secretmanager, kms, cloudtasks, eventarc, spanner, bigtable, artifactregistry, iam and storage drop their hand-rolled etag logic. They gain version-3 condition validation, _withcond_ role renaming on v1 reads, the raw empty-policy etag, and service-scoped TestIamPermissions filtering. A guard fails when a gcp service handles etags in SetIamPolicy without importing the package. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * refactor(gcp): lint fixes for shared IAM policy migration Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcp): format IAM policy files Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * style(gcpstorage): wrap IAM test table Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(iot): publish connected before CONNACK and detect takeover via stop cause Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(codeql): bound int conversions and anchor loopback URL path Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(codeql): goimports order Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * fix(rds): merge deferred modifications into pending values; drift test applies immediately A ModifyDBInstance without ApplyImmediately now merges into existing PendingModifiedValues and a value equal to the current one cancels that pending field. The RDS drift fixture sets apply_immediately = true, as the provider default (false) defers the correction to the maintenance window. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM * test(rds): align pending-merge test struct fields Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGWXecoauvZN2AYe1vkvgM --------- Co-authored-by: Witness Patrol <blackbird7181@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
1 parent a80ed12 commit c09d410

2,141 files changed

Lines changed: 278091 additions & 6490 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.badges/operations.svg‎

Lines changed: 3 additions & 3 deletions
Loading

‎.badges/parity.svg‎

Lines changed: 3 additions & 3 deletions
Loading

‎.badges/services.svg‎

Lines changed: 3 additions & 3 deletions
Loading

‎.github/workflows/ci.yml‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,16 @@ jobs:
609609
} >> "$GITHUB_OUTPUT"
610610
echo "Running $COUNT packages in chunk $CHUNK of $TOTAL_CHUNKS"
611611
612+
# services/rds docker tests pull these on demand; a throttled or dropped
613+
# pull mid-test surfaces as a failed DB instance (gopherstack-vl8f4).
614+
- name: Pre-pull RDS engine images
615+
if: contains(steps.pkgs.outputs.pkgs, 'services/rds ') || endsWith(steps.pkgs.outputs.pkgs, 'services/rds')
616+
run: |
617+
for img in postgres:17 postgis/postgis:17-3.5 pgvector/pgvector:0.8.6-pg17-bookworm mysql:8.4 mariadb:11.4; do
618+
(for i in 1 2 3; do docker pull -q "$img" >/dev/null && exit 0; sleep $((i * 5)); done; echo "pre-pull of $img failed") &
619+
done
620+
wait
621+
612622
- name: Run Unit Tests (chunk ${{ matrix.chunk }})
613623
run: |
614624
go tool gotestsum --format pkgname -- \

‎.gitignore‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,6 @@ checkpoint.md
107107
.ua/intermediate/*
108108
!.ua/intermediate/scan-result.json
109109
.ua/diff-overlay.json
110+
111+
# go build output of the desktop module
112+
/desktop/desktop

‎AZURE.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ That said, MQTT's fixed port (`1883`) happens to fall *outside* `--port-range-st
8484
- **M0 (done)** — `pkgs/azureauth` (SharedKey canonicalization + fixed devstoreaccount1 constants); `services/azureblob` wired into `cli.go` and bound to its own fixed port (synchronous bind, fail-fast, no `PortAlloc` fallback — see section 4's port-selection note); Create/Delete/List Container, Put/Get/Delete Blob, List Blobs; `PARITY.md`; unit tests + Go integration tests using `azure-sdk-for-go`. Properties/metadata, block-blob multipart (Put Block/Put Block List), and an `errorDetails`-style error-mapping table (mirroring `services/sqs`'s pattern) remain deferred -- see `services/azureblob/README.md`/`PARITY.md` for current status and known gaps.
8585
- **M1 (done)** — `services/azurequeue`: List/Create/Delete Queue, full message lifecycle (Put/Get/Peek/Delete/Update/Clear Messages), visibility timeout with pop-receipt rotation, message TTL swept by a background `Janitor`, wired into `cli.go` and bound to its own fixed port (10001, Azurite's own Queue port; synchronous bind, fail-fast, no `PortAlloc` fallback -- mirrors Azure Blob's M0 port strategy, see section 4). See `services/azurequeue/README.md`/`PARITY.md` for current status and known gaps.
8686
- **M2 (done)** — `services/azuretable`: table CRUD (Create/Delete/List Table), full entity lifecycle (Insert/Get/Query/Replace/Merge/Delete), a hand-written `$filter` lexer/parser/evaluator (eq/ne/lt/le/gt/ge, and/or/not, parentheses, every OData literal form -- string/int/Int64/float/bool/datetime/guid/binary -- against `PartitionKey`/`RowKey`/`Timestamp` and scalar properties), all eight EDM property types (String/Int32/Int64/Double/Boolean/DateTime/Guid/Binary) with `@odata.type` annotation round-tripping matching `azure-sdk-for-go/sdk/data/aztables`'s own client-side inference, and ETag-based optimistic concurrency (If-Match `*`/specific/absent -> upsert), wired into `cli.go` and bound to its own fixed port (10002, Azurite's own Table port; synchronous bind, fail-fast, no `PortAlloc` fallback -- mirrors Blob's M0 and Queue's M1 port strategy, see section 4). Batch (`$batch` multipart/mixed changesets) and continuation-token pagination are deferred -- see `services/azuretable/PARITY.md`. See `services/azuretable/README.md`/`PARITY.md` for current status and known gaps.
87+
- **Azure Files (done)** -- `services/azurefile` (PARITY.md is the authority): the file shares data plane (service properties, shares with snapshots/leases/ACLs/soft delete, directories, files with sparse ranges, copy and rename) on fixed port 10009 (`--azure-file-port`), account by path or `<account>.file.<host>`, `.file.` also reachable through the shared storage vhost listener, ARM `primaryEndpoints.file` advertised, share soft delete driven by ARM `fileServices/default` `shareDeleteRetentionPolicy`. Tests are driven through `azure-sdk-for-go/sdk/storage/azfile`.
88+
- **Azure Monitor Logs (done)** -- `services/azuremonitor` (PARITY.md is the authority): the Logs Ingestion API (`POST /dataCollectionRules/{immutableId}/streams/{stream}`, gzip, 1 MB limit, stream schema checks that drop bad records like Azure, or reject the upload with `--azure-monitor-strict-ingest`, `transformKql` through the in-tree KQL engine) and the Logs Query API (`/v1/workspaces/{id}/query`, `$batch`, resource-centric queries) on one HTTPS listener, fixed port 10013 (`--azure-monitor-port`), bearer auth (optionally JWT-shape checked). `services/azuremonitor/kql` is a KQL subset engine (tables, let, union, where, project/extend/summarize/sort/top/distinct and about 70 scalar functions); unsupported operators answer 400 SemanticError. ARM `Microsoft.OperationalInsights` (workspaces, tables, shared keys) and `Microsoft.Insights` (data collection endpoints and rules) live in `services/azurearm` over the `MonitorLogs` seam. Tests are driven through `azure-sdk-for-go/sdk/monitor/ingestion/azlogs`, `sdk/monitor/query/azlogs`, `armoperationalinsights` and `armmonitor`.
8789
- **M3 (done)** — `services/cosmosdb`: database/container CRUD (with a single-path partition-key declaration; hierarchical/multi-path partition keys deferred), full document CRUD including upsert (`x-ms-documentdb-is-upsert`) and ETag-based optimistic concurrency (If-Match absent/specific -> upsert/conditional), and a hand-written SQL-subset query engine (tokenizer -> recursive-descent parser -> AST -> executor, directly reusing `services/azuretable/odata_filter.go`'s and `services/s3/select_sql_*.go`'s shape per this section's own M3 rationale below) supporting `SELECT *`/projections with `AS` aliasing, `FROM <alias> [<realias>]`, `WHERE` with the full comparison/boolean/`IS NULL` grammar and `@param` bindings, `ORDER BY`, `TOP`, and `OFFSET`/`LIMIT`. Auth is Cosmos's own master-key HMAC-SHA256 scheme (`services/cosmosdb/masterkey.go`, deliberately NOT `pkgs/azureauth` -- see section 3), opt-in verification via `--cosmosdb-validate-auth`, defaulting to the real Cosmos DB Local Emulator's well-known fixed master key. Bound to its own fixed port (8081, the real emulator's own published default -- NOT an Azurite-style 1000x number, since Cosmos's real emulator is a separate tool; synchronous bind, fail-fast, no `PortAlloc` fallback, and -- unlike M0/M1/M2's ports -- 8081 sits *outside* `--port-range-start`/`--port-range-end`'s own default range, mirroring `services/iot`'s MQTT precedent; see section 4). Fake `x-ms-request-charge`/`x-ms-session-token`/`x-ms-activity-id` headers on every response (real RU accounting is out of scope). Integration tests against `azure-sdk-for-go/sdk/data/azcosmos`; JS/Python SDK cross-compat smoke tests remain M4 scope. See `services/cosmosdb/README.md`/`PARITY.md` for current status and known gaps. **This completes the full 4-service Azure support plan** (Blob, Queue, Table, Cosmos); M4 (docs/polish, cross-SDK e2e) has since landed as well.
8890
- **M4 (done)** — Docs/polish: the four services now render under their own **Azure** heading in the root `README.md` services table with curated display names (`cmd/gendocs/categories.go`) rather than falling through to "Other" as auto-title-cased slugs; per-service guides at `docs/services/azureblob.md`/`azurequeue.md`/`azuretable.md`/`cosmosdb.md` following the established AWS guide format; a four-service docker-compose example at `examples/azure-services/` (indexed in `examples/README.md`), with `Dockerfile`/`Dockerfile.goreleaser` now exposing 10000/10001/10002/8081; and the cross-SDK smoke suite from section 7 -- `test/e2e/crosssdk/azure_smoke.mjs` (`@azure/storage-blob`, `@azure/storage-queue`, `@azure/data-tables`, `@azure/cosmos`) and `azure_smoke.py` (`azure-storage-blob`, `azure-storage-queue`, `azure-data-tables`, `azure-cosmos`), driven by `test/e2e/azure_crosssdk_test.go`, which starts gopherstack on ephemeral ports and runs both scripts in CI's `e2e-tests` job. Note: no per-service badges were added -- `.badges/` holds only repo-level aggregate badges (services/operations/parity counts), which already include the Azure services, so "badges/icons" resolved to verifying zero `cmd/gendocs` drift rather than adding new SVGs. The cross-SDK suite immediately earned its keep by catching a real wire-compatibility gap: `Get Blob` accepted only the `Range` header, but the Python/JS SDKs send `x-ms-range` exclusively, so single-range downloads were unreachable from those SDKs despite the Go SDK passing (fixed in `services/azureblob/handler.go`; see that service's `PARITY.md`).
8991

@@ -263,7 +265,7 @@ One useful relaxation this resolution surfaces: `FromEndpoint` reads `resourceMa
263265

264266
**Build plan given this**: extract `cli.go`'s existing `generateSelfSignedCert` into a shared `pkgs/devtls` (it already exists for the main port's optional TLS mode, so this is a lift-and-share, not new crypto code), serve `services/azurearm` over HTTPS with a cert covering `localhost`/`127.0.0.1`/the container's DNS name, and have the Terraform test harness (`test/terraform/azure/`) trust that cert for the `tofu` child process — via `SSL_CERT_FILE` in `applyTofu`'s `env` slice on Linux/CI, with a documented fallback (install into the login keychain, or run the suite in a Linux container) if `SSL_CERT_FILE` doesn't get picked up by Go's darwin verifier; this is worth a five-minute check at implementation time but is no longer a design-blocking unknown; also model the metadata document against the real `2022-09-01` schema fields (`authentication`, `resourceManager`, `graphAudience`/`graph`, `suffixes`), since `FromEndpoint` hard-fails on missing `name`, `resourceManagerEndpoint`, and `microsoftGraphResourceId` — the last of which is easy to miss because most public "custom cloud" examples predate the schema version that requires it, and easy to get *wrong even when present*: it is a **top-level** field (`json:"microsoftGraphResourceId"` directly on the document root), not nested under a `resourceIdentifiers` object the way `hashicorp/go-azure-sdk`'s own *exported* `MetaData`/`ResourceIdentifiers` types (a separate, post-parse convenience shape) might suggest by name — the actual wire-level unexported `metaDataResponse` struct (`sdk/internal/metadata/client.go`) has no such nesting. Nesting it silently zero-values the field on unmarshal, so `FromEndpoint` fails with "no `microsoftGraphResourceId` was returned" rather than a JSON error, which is why this survived one full CI run of M8's own metadata reshape fix before being caught.
265267

266-
**Resolved: azurerm's *direct data-plane* resources (`azurerm_storage_container`/`_blob`/`_queue`/`_table`) can be redirected, and don't need any suffix trickery.** (`azurerm_storage_share`/`_file`, Azure Files, stay out of scope -- gopherstack has no File Share service to back them, unrelated to this finding.) This was flagged as the plan's single biggest open risk before M7 shipped; verified directly against the provider's source once M7's `properties.primaryEndpoints` shape existed to check it against. `terraform-provider-azurerm`'s storage data-plane clients (`internal/services/storage/client/data_plane.go`'s `ContainersDataPlaneClient`/`QueuesDataPlaneClient`/etc.) call `account.DataPlaneEndpoint(EndpointTypeBlob|Queue|Table)`, which (`client/helpers.go`) returns `ad.primaryBlobEndpoint`/`primaryQueueEndpoint`/`primaryTableEndpoint` -- fields populated straight from the ARM `GetProperties`/`Create` response body's `properties.primaryEndpoints.*`, i.e. exactly the values M7's `rp_storage.go` `buildBody` already returns (`http://<host>:10000/<account>/`, `:10001/`, `:10002/`). The `{account}.{suffixes.storage}` virtual-host construction is only a *fallback* (`client/helpers.go`'s `if baseUri == nil`) for when ARM didn't return a primary endpoint at all -- never our case. The client library underneath (`hashicorp/go-azure-sdk`'s `sdk/client/dataplane/storage`) makes this explicit in its own source comment: `NewStorageClient` "require[s] the baseUri is provided" because "both the domain name _and_ the domain format can change entirely" -- it never reconstructs or validates the host, it just uses whatever URI ARM handed back. **Net effect: no new gopherstack code is required in `services/azureblob`/`azurequeue`/`azuretable` at all** -- M0-M2's existing path-style listeners are already exactly what these clients expect once ARM (M7) is advertising them. The only remaining work is Terraform fixtures/tests proving it (see M8 below); this is why M8 is scoped as a small, mechanical milestone rather than another RP.
268+
**Resolved: azurerm's *direct data-plane* resources (`azurerm_storage_container`/`_blob`/`_queue`/`_table`) can be redirected, and don't need any suffix trickery.** (`azurerm_storage_share`/`_file`, Azure Files, were out of scope when this was written; `services/azurefile` now backs the data plane, but Terraform coverage of it is unverified.) This was flagged as the plan's single biggest open risk before M7 shipped; verified directly against the provider's source once M7's `properties.primaryEndpoints` shape existed to check it against. `terraform-provider-azurerm`'s storage data-plane clients (`internal/services/storage/client/data_plane.go`'s `ContainersDataPlaneClient`/`QueuesDataPlaneClient`/etc.) call `account.DataPlaneEndpoint(EndpointTypeBlob|Queue|Table)`, which (`client/helpers.go`) returns `ad.primaryBlobEndpoint`/`primaryQueueEndpoint`/`primaryTableEndpoint` -- fields populated straight from the ARM `GetProperties`/`Create` response body's `properties.primaryEndpoints.*`, i.e. exactly the values M7's `rp_storage.go` `buildBody` already returns (`http://<host>:10000/<account>/`, `:10001/`, `:10002/`). The `{account}.{suffixes.storage}` virtual-host construction is only a *fallback* (`client/helpers.go`'s `if baseUri == nil`) for when ARM didn't return a primary endpoint at all -- never our case. The client library underneath (`hashicorp/go-azure-sdk`'s `sdk/client/dataplane/storage`) makes this explicit in its own source comment: `NewStorageClient` "require[s] the baseUri is provided" because "both the domain name _and_ the domain format can change entirely" -- it never reconstructs or validates the host, it just uses whatever URI ARM handed back. **Net effect: no new gopherstack code is required in `services/azureblob`/`azurequeue`/`azuretable` at all** -- M0-M2's existing path-style listeners are already exactly what these clients expect once ARM (M7) is advertising them. The only remaining work is Terraform fixtures/tests proving it (see M8 below); this is why M8 is scoped as a small, mechanical milestone rather than another RP.
267269

268270
For everything ARM-mediated — resource groups, storage accounts, Service Bus namespaces/queues/topics/subscriptions, Cosmos accounts/databases/containers, and later Key Vault vaults and App Configuration stores — no such uncertainty exists: those are pure ARM calls and the metadata document fully controls where they go.
269271

‎Dockerfile‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ COPY . .
2222
# to avoid OOM inside the container. Fall back to building in-container if assets are absent.
2323
RUN if [ ! -f dashboard/static/spa/index.html ]; then \
2424
npm --prefix ui ci --include=optional && \
25-
NODE_OPTIONS="--max-old-space-size=4096" npm --prefix ui run build; \
25+
NODE_OPTIONS="--max-old-space-size=8192" npm --prefix ui run build; \
2626
fi
2727

2828
# Build the Go app

0 commit comments

Comments
 (0)