Skip to content

feat: 100% alchemy local AWS coverage - #6

Draft
sam-goodwin wants to merge 372 commits into
mainfrom
feat/alchemy-100-local-dev
Draft

feat: 100% alchemy local AWS coverage#6
sam-goodwin wants to merge 372 commits into
mainfrom
feat/alchemy-100-local-dev

Conversation

@sam-goodwin

@sam-goodwin sam-goodwin commented Aug 25, 2026

Copy link
Copy Markdown

This is the emulator half of alchemy local AWS coverage. Scoped TDD commits land here so the live AWS suite can run against floci (pnpm test:aws:dev) without loosening alchemy tests.

Alchemy counterpart: alchemy-run/alchemy#1352

IAM policy enforcement stays off. Lambda Function, ECS Service, and ECS Task keep dedicated local providers and are not dualized.

@github-actions

Copy link
Copy Markdown

🎉 Thanks for your first pull request to Floci!

Your CI checks need a maintainer to approve them before they run. That is GitHub's standard gate on first-time contributors, not a problem with your PR — so if the checks look like they are doing nothing, that is why. Once a maintainer approves, CI and the compatibility suite start automatically. Nothing is needed from you in the meantime.

While you wait, a couple of things that make review faster:

  • Link the issue this fixes with Closes #N in the description
  • Commits follow Conventional Commits (feat(s3): ..., fix(dynamodb): ...)
  • Behaviour changes come with a test — see CONTRIBUTING.md

Come join us in Slack — it is the fastest way to reach maintainers if you get stuck, or want feedback on an approach before investing more time in it.

Register emr-containers restJson1 and cover create/describe/list/delete
for job templates, including typed not-found and delete validation.
Route AWSFMS_20180101 admin-account APIs through the JSON 1.1 dispatcher.
Add a restJson1 Glacier service (vaults, archives, jobs, multipart) so
Alchemy binding probes get typed ResourceNotFoundException instead of
UnknownOperationException.
YAML already declares glacier.enabled; without the ConfigMapping the
emulator fails SmallRye validation on startup.
Implement restJson1 List/Create/Get/Update/DeleteDetector plus tags so
Alchemy's GuardDuty Detector resource converges locally.
Add restJson1 Create/Get/Update/Delete/ListChannel and tag APIs so Alchemy Channel tests converge locally. GetChannel of an unknown ARN returns typed ResourceNotFoundException.
GetStream/PutMetadata/StopStream/InsertAdBreak raise
ChannelNotBroadcasting; session lists are empty; viewer
revocation is a no-op success.
Cover Get/Create/Update/Delete/List and tags for playback restriction policies.
JSON 1.1 GlobalAccelerator_V20180706 APIs for Alchemy Accelerator/Listener/EndpointGroup: create/describe/update/delete, tags, flow-log attributes, and ordered teardown.
Add a focused integration test for Get/Create/List/Tag/Delete of IVS
recording configurations, including typed ResourceNotFoundException and
ConflictException when a configuration is still attached to a channel.
GetRoom on a missing ARN returns typed ResourceNotFoundException with
resourceId/resourceType. Create/Get/List/Update/Delete Room and tag
APIs converge so Alchemy Room.test.ts can run against floci.
POST /GetStage on a missing ARN returns ResourceNotFoundException,
and Create/Update/Delete/ListStages plus /tags/{arn} converge.
AWS conceals missing topic rules as UnauthorizedException 401 with
"Access to topic rule '<name>' was denied", which distilled maps to
TopicRuleNotFound. Match that so reconcile observe/delete converge.
Add restJson1 BatchGetAccountStatus, Enable, and Disable so Alchemy's
Inspector2 Enabler can converge locally without waiting on ENABLING.
GetSubscriptionState and DescribeAttackStatistics succeed without
Shield Advanced. Gated ListAttacks, DescribeDRTAccess, and missing
protection groups return the live typed tags.
Cover availability, suggestions, prices, list/detail, and typed
InvalidInput/UnsupportedTLD errors used by Alchemy Bindings.test.ts.
Prefixing /lambda-url/{id}/bindings with /aws-s3tables 404s the Bindings fixture.
…cycle

Canary create/update/delete, groups, tags, and StartCanary runs round-trip
against storage for Alchemy Canary tests.
Prefixing rewritten /lambda-url/{id}/... paths 404s the Bindings Lambda fixture at /bindings.
Route Feature Store restJson1 by SigV4 scope or advertised host, skip
Function URL paths, require EventTime on DeleteRecord, and match
EventBridge ListRuleNamesByTarget against qualified Lambda ARNs.
Store Create/UpdateFunctionConfiguration FileSystemConfigs, return them
from GetFunction, and mount a shared Docker volume at LocalMountPath
named by file-system id so a config-only redeploy keeps written files.
Alchemy prefixes DescribeEndpoints Address with https://. On HTTP-only
quarkus:dev, advertise a sidecar TLS port covering localhost.floci.io and
host.docker.internal so Lambda RecordsSink batches and out-of-retention
RejectedRecordsException land on the emulator.
NO_SOURCE projects only run echo-style buildspec commands. Running them
through Docker contended with Lambda Function URL containers on the same
daemon during Alchemy bindings suites. Simulate the phase machine
in-process so StartBuild still reaches a terminal status.
…indings

Route restJson1 email-contact APIs off S3, leave Function URL paths alone, stamp X-Amzn-Errortype, and return ConflictException for already-active contacts so Lambda bindings can GetEmailContact, SendActivationCode, and reject a bogus ActivateEmailContact code.
Leave /lambda-url/* and lambda-url hosts un-prefixed so Bindings
fixture probes hit Lambda. Stamp X-Amzn-Errortype on JSON errors
so distilled decodes ResourceNotFoundException and InvalidInputException.
Cover call analytics, medical, scribe, filter, category, language model,
and tagging operations used by Alchemy Transcribe bindings.
Rewrite eks-signed restJson1 paths onto /aws-eks so ListAccessPolicies,
DescribeClusterVersions, DescribeAddonVersions, and DescribeAddonConfiguration
are not swallowed by S3's path-style catch-all or the Lambda Function URL
/bindings probe.
Route SigV4 synthetics requests onto /synthetics so /canary and /bindings
stay available for Lambda Function URLs. StartCanary records a one-shot
run and emits aws.synthetics EventBridge events for consumeCanaryEvents.
Leave /lambda-url/{urlId}/... unprefixed so the Bindings Lambda fixture
can serve /bindings, and emit FailedFindings on BatchImportFindings.
Return DocumentMetadata.Pages on AnalyzeExpense without nested Blocks,
validate Document input, and enable TCP keepalive so nested Lambda calls
are not dropped when Netty fails SO_KEEPALIVE=false on accept.
CreateChatToken/SendEvent/DeleteMessage/DisconnectUser plus the
messaging websocket, served off the Vert.x event loop so nested
Function URL calls do not deadlock.
Alchemy VerifiedPermissions Bindings.test.ts probes GET /info on a
fresh Function URL. A new container still in INIT sat in the executor
queue for minutes, so beforeAll never reached IsAuthorized. Cap the
front-door wait, add an explicit /info route, skip already-rewritten
/lambda-url paths, and do not treat *.lambda-url.* hosts as S3 buckets.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant