Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
6de31d6
feat(cloudformation): provision EC2 VPN, traffic mirror, route server…
Sep 26, 2026
995bc34
feat(kinesisvideo): Kinesis Video Streams control plane
Sep 26, 2026
7091879
docs: regenerate READMEs
Sep 26, 2026
405e5d9
fix(batch): route matcher no longer captures MSK Connect /v1 paths
Sep 26, 2026
1f154ab
feat(ecrpublic): Amazon ECR Public
Sep 26, 2026
ffcc9d2
feat(kafkaconnect): Amazon MSK Connect; wire ECR Public and MSK Connect
Sep 26, 2026
fb6f1d2
fix(ecrpublic): expire unfinished layer uploads after 24 hours
Sep 26, 2026
d5ffb39
feat(kafkaconnect): RestartConnector
Sep 26, 2026
4dd4599
feat(cloudformation): provision Kinesis Video, ECR Public and MSK Con…
Sep 26, 2026
7b4c5f1
docs: regenerate READMEs
Sep 26, 2026
b1286d6
chore(bd): track cfnattrgen coverage drift
Sep 26, 2026
1d98f05
feat(s3): S3 Express One Zone directory buckets
Sep 26, 2026
e1aa370
chore(bd): close S3 Express issue
Sep 26, 2026
5a0bc40
docs: regenerate READMEs
Sep 26, 2026
f112ac9
chore(bd): track RDS lifecycle test flake
Sep 26, 2026
87abbc8
fix(eks,inspector2): route matchers no longer claim Aurora DSQL paths
Sep 26, 2026
c5bca6b
feat(dsql): Aurora DSQL control plane
Sep 26, 2026
a13ff9e
chore(bd): close Aurora DSQL issue
Sep 26, 2026
3e5167c
docs: regenerate READMEs
Sep 26, 2026
5b1e61f
test(rds): drive instance and cluster lifecycle transitions determini…
Sep 26, 2026
cdf1c9b
chore(bd): close RDS lifecycle flake
Sep 26, 2026
fe3a540
fix(sns): reject malformed cidr operands in subscription filter policies
Sep 26, 2026
cdc24fe
feat(cloudformation): StackSets DeploymentTargets honour AccountFilte…
Sep 26, 2026
e601f2d
feat(kinesis): streams pass through CREATING, UPDATING and DELETING
Sep 26, 2026
8546c07
feat(apigateway): REST API stages serve their deployment's snapshot
Sep 26, 2026
bad5112
feat(iam,sts): complete policy condition operator enforcement
Sep 26, 2026
e1e3f18
docs: regenerate READMEs
Sep 26, 2026
18cb660
feat(dynamodb): replica and index auto-scaling settings round-trip
Sep 26, 2026
cb0149e
docs: regenerate READMEs
Sep 26, 2026
7ad43c0
feat(stepfunctions): Distributed Map ResultWriter honours WriterConfig
Sep 26, 2026
78fed47
feat(stepfunctions): Distributed Map ItemReader lists S3 objects and …
Sep 26, 2026
da92b79
fix(sqs): FIFO throughput budgets per API method, with batch calls co…
Sep 26, 2026
973b5f4
docs: regenerate READMEs
Sep 26, 2026
d18a31a
feat(lambda): Invoke starts and reuses durable executions by name
Sep 26, 2026
07741df
docs: regenerate READMEs
Sep 26, 2026
5903845
feat(stepfunctions): ItemReader CSVDelimiter and ItemsPointer
Sep 26, 2026
940d62d
docs: regenerate READMEs
Sep 26, 2026
5d73abf
fix(cloudformation): complete Fn::GetAtt attribute table with drift test
Sep 26, 2026
3cb5f30
fix(cognitoidp): evict expired refresh tokens and clear revocation ma…
Sep 26, 2026
92e03e2
fix(scheduler,redshiftdata): evict expired ClientToken idempotency en…
Sep 26, 2026
53a976b
fix(swf): prune closed executions past domain retention
Sep 26, 2026
eed0a33
fix(sqs): route visibility, retention, delay and cooldown timing thro…
Sep 26, 2026
bb752b3
fix(s3): stop logging header-derived region in CreateBucket
Sep 26, 2026
02f2f6a
feat(applicationautoscaling): bridge DynamoDB scalable targets and po…
Sep 26, 2026
d11ebd9
perf(s3): cut object Put/Get copies and allocations
Sep 26, 2026
b074880
docs: regenerate READMEs
Sep 26, 2026
7fd1b5c
perf(sqs): cheaper FIFO receive and query-protocol parameter parsing
Sep 26, 2026
929fa2c
test(s3): run notification dispatch tests in synctest bubbles
Sep 26, 2026
fdad59d
perf(dynamodb): cheaper ExtractResource and string comparisons
Sep 26, 2026
9e30c27
test(s3): replace wall-clock polling with synctest and synchronous sw…
Sep 26, 2026
b71d247
test: replace wall-clock sleeps with synctest bubbles and readiness p…
Sep 26, 2026
d770844
fix(ssm): UpdateAssociation replace semantics, UpdatePatchBaseline Re…
Sep 26, 2026
b12e055
feat(lambda): async durable invocations record completion
Sep 26, 2026
95deea6
fix(applicationautoscaling): reject DynamoDB on-demand tables with AA…
Sep 26, 2026
7cbe410
test: run Step Functions, EventBridge, Pipes, Firehose and SNS async …
Sep 26, 2026
3b9ea9a
docs: regenerate READMEs
Sep 26, 2026
34ce4b7
test(stepfunctions): replace execution polling with synctest or direc…
Sep 26, 2026
b9b02d1
feat(lambda): enforce documented durable function restrictions
Sep 26, 2026
cb4d0ae
test(fis,dynamodb): drive lifecycle timers with synctest instead of w…
Sep 26, 2026
edcde33
perf(s3): hand-written XML encoder for ListObjects and ListObjectsV2
Sep 26, 2026
7d25ed8
fix(ssm): Replace semantics for UpdateMaintenanceWindowTask and Updat…
Sep 26, 2026
930a143
fix(ssm): real not-found errors instead of stub successes
Sep 26, 2026
765d118
test: drive ACM, AppConfig, DataBrew, EMR, EC2, RDS, SES and schedule…
Sep 26, 2026
dde782f
chore(bd): file gopherstack-k1b28 ACM certificate ID collision
Sep 26, 2026
129361d
docs: regenerate READMEs
Sep 26, 2026
4f16bd5
fix(acm): UUID certificate IDs instead of nanosecond timestamps
Sep 26, 2026
16bcff8
fix(athena): GetResourceDashboard returns ResourceNotFoundException f…
Sep 26, 2026
4c3de19
fix: collision-free IDs where services used time.Now().UnixNano()
Sep 26, 2026
2de926b
test: synctest for Secrets Manager, CloudWatch Logs, Glacier, Textrac…
Sep 26, 2026
c95248d
fix(opensearch): unique serverless policy and config version tokens
Sep 26, 2026
b33e013
fix(macie2): read tables under the lock in paginated List ops
Sep 26, 2026
57a43df
test(secretsmanager): exercise the cron scheduler path
Sep 26, 2026
095369a
chore(bd): file secretsmanager rotation window gap
Sep 26, 2026
7edb137
test: assert full-server shutdown leaves no goroutines behind
Sep 26, 2026
c648b80
fix(translate): return copies of jobs, parallel data and terminologies
Sep 26, 2026
8e489ac
feat(secretsmanager): rotation windows per RotationRules.Duration
Sep 26, 2026
ba87e3d
chore(bd): close gopherstack-hgjl8 (fixed by d18a31a4c)
Sep 26, 2026
31e2a2d
fix(lambda): return copies of functions, event source mappings, code-…
Sep 26, 2026
1f9b459
fix(s3control): return copies of access grants instances and locations
Sep 26, 2026
07090a9
fix(waf): deep-copy web ACLs, IP sets, rules and match sets on return
Sep 26, 2026
5fd035f
perf(cloudtrail): trim the event store in place at capacity
Sep 26, 2026
e8be935
perf(service): buffer response bodies for CloudTrail only on errors
Sep 26, 2026
5ca7cfc
perf(lockmetrics): cache per-operation metric handles
Sep 26, 2026
bd58ffe
fix(cloudformation): treat NotFound on resource delete as deleted
Sep 26, 2026
75925d1
chore(bd): sync issue state
Sep 26, 2026
3f9c519
fix(iam): return copies of roles, users and policies
Sep 26, 2026
e13b157
fix(lambda,ecs,ecrpublic): copy function URL configs, capacity provid…
Sep 26, 2026
48d0116
fix: clone Tags maps on return where UntagResource deletes in place
Sep 26, 2026
92f3c5b
test(terraform): serialise fixtures that share account-singleton reso…
Sep 26, 2026
51e0cb2
fix(lockmetrics): re-create the active-readers gauge after Close
Sep 26, 2026
1d899d0
fix(autoscaling): copy group Instances and Tags on return
Sep 26, 2026
beebaf3
fix(rds): copy DBClusterMembers on return
Sep 26, 2026
f503e08
perf(s3): skip cloning UploadPart bodies the buffer pool discards
Sep 26, 2026
5f33fb5
test(dynamodb): Scan pagination and 100k-item benchmarks
Sep 26, 2026
b663eb1
fix(dynamodb): write replica GlobalTableName and Replicas under the t…
Sep 26, 2026
ba75116
chore(bd): file persistence snapshot locking race
Sep 26, 2026
3d0b0ab
perf(dynamoattr): unwrap attribute values by key lookup, not map iter…
Sep 26, 2026
d2d6159
fix(iot): close the MQTT broker on shutdown
Sep 26, 2026
511d69b
fix(iam): paginate ListGroupsForUser, ListServerCertificates and List…
Sep 26, 2026
db9137b
fix(dynamodb,s3,sqs,kinesis): snapshot resources under their own locks
Sep 26, 2026
2eac8f2
test(kinesis): advance the fake clock past CREATING before ACTIVE-onl…
Sep 26, 2026
b221d6d
docs: regenerate READMEs
Sep 26, 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 .badges/operations.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions .badges/parity.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions .badges/services.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 15 additions & 8 deletions .beads/issues.jsonl

Large diffs are not rendered by default.

16 changes: 15 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: build build-check ui-install ui-lint ui-check ui-lint-fix ui-fmt ui-fmt-fix ui-test ui-build install-deps install-tofu lint lint-changed lint-fix test integration-test terraform-test e2e e2e-test total-coverage clean demo all dev-mcp-install dev-mcp-check pgo docs check-pins bd-audit parity-lint
.PHONY: build build-check ui-install ui-lint ui-check ui-lint-fix ui-fmt ui-fmt-fix ui-test ui-build install-deps install-tofu lint lint-changed lint-fix test integration-test terraform-test e2e e2e-test total-coverage clean demo all dev-mcp-install dev-mcp-check pgo docs check-pins bd-audit parity-lint cfn-attrs-gen cfn-attrs-spec-refresh

BINARY_NAME=gopherstack
VERSION_PKG=github.com/blackbirdworks/gopherstack/pkgs/version
Expand Down Expand Up @@ -240,6 +240,20 @@ bd-audit:
parity-lint:
go run ./cmd/paritylint

# Regenerate services/cloudformation/cfn_attributes.json (Fn::GetAtt
# attribute table) from the committed spec fixture and the current
# resTypeXxx constants. See cmd/cfnattrgen.
cfn-attrs-gen:
go run ./cmd/cfnattrgen -spec cmd/cfnattrgen/testdata/cfn_resource_spec.json -src services/cloudformation -out services/cloudformation/cfn_attributes.json

# Refresh cmd/cfnattrgen/testdata/cfn_resource_spec.json from a fresh
# download of the full CloudFormation resource specification. Run this
# occasionally, then `make cfn-attrs-gen` and commit both files.
cfn-attrs-spec-refresh:
curl -sL https://d1uauaxba7bl26.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json | gunzip > /tmp/cfn_full_spec.json
go run ./cmd/cfnattrgen -spec /tmp/cfn_full_spec.json -trimspec-out cmd/cfnattrgen/testdata/cfn_resource_spec.json
rm -f /tmp/cfn_full_spec.json

demo: ui-build
docker compose down
docker compose build
Expand Down
18 changes: 11 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ Every service links to its own page with a coverage breakdown — audited operat
| [Batch](services/batch/README.md) | A | 45 | 8 gaps |
| [EC2](services/ec2/README.md) | A | — | 22 families; 16 gaps; 2 structural gaps; 8 deferred |
| [Elastic Beanstalk](services/elasticbeanstalk/README.md) | A | 47 | 13 gaps |
| [Lambda](services/lambda/README.md) | A | — | 10 families; 2 gaps |
| [Lambda](services/lambda/README.md) | A | — | 10 families |

### Containers

Expand All @@ -488,7 +488,7 @@ Every service links to its own page with a coverage breakdown — audited operat
| [Data Lifecycle Manager](services/dlm/README.md) | A | 8 | clean |
| [EFS](services/efs/README.md) | A | 31 | 4 gaps; 2 deferred |
| [FSx](services/fsx/README.md) | A | — | 13 families; 12 gaps |
| [S3](services/s3/README.md) | A | 24 | 8 gaps |
| [S3](services/s3/README.md) | A | 26 | 8 gaps |
| [S3 Control](services/s3control/README.md) | A | 44 | 4 gaps; 3 deferred |
| [S3 Glacier](services/glacier/README.md) | A | 33 | 2 gaps |
| [S3 Tables](services/s3tables/README.md) | A | 49 | 1 gap |
Expand All @@ -499,7 +499,7 @@ Every service links to its own page with a coverage breakdown — audited operat
|---|---|---|---|
| [DAX](services/dax/README.md) | A | 21 | 1 gap; 1 deferred |
| [DocumentDB](services/docdb/README.md) | A | 55 | 10 gaps; 1 deferred |
| [DynamoDB](services/dynamodb/README.md) | A | — | 15 families; 8 gaps; 2 deferred |
| [DynamoDB](services/dynamodb/README.md) | A | — | 15 families; 6 gaps; 2 deferred |
| [DynamoDB Streams](services/dynamodbstreams/README.md) | A | 4 | clean |
| [ElastiCache](services/elasticache/README.md) | A | 75 | 3 gaps; 2 deferred |
| [MemoryDB](services/memorydb/README.md) | A | 45 | 5 gaps; 3 deferred |
Expand All @@ -517,7 +517,7 @@ Every service links to its own page with a coverage breakdown — audited operat

| Service | Parity | PARITY Entries | Notes |
|---|---|---|---|
| [API Gateway](services/apigateway/README.md) | A | 123 | 3 gaps; 1 deferred |
| [API Gateway](services/apigateway/README.md) | A | 123 | 2 gaps; 1 deferred |
| [API Gateway Management API](services/apigatewaymanagementapi/README.md) | A | 3 | 1 gap; 2 deferred |
| [API Gateway v2](services/apigatewayv2/README.md) | A | 77 | 4 gaps; 6 deferred |
| [App Mesh](services/appmesh/README.md) | A | 38 | 2 gaps |
Expand All @@ -543,7 +543,7 @@ Every service links to its own page with a coverage breakdown — audited operat
| [SES](services/ses/README.md) | A | 71 | 6 gaps; 1 deferred |
| [SES v2](services/sesv2/README.md) | A | 112 | 3 gaps |
| [SNS](services/sns/README.md) | A | 34 | 2 gaps; 2 deferred |
| [SQS](services/sqs/README.md) | A | 20 | 4 gaps; 4 deferred |
| [SQS](services/sqs/README.md) | A | 20 | 3 gaps; 4 deferred |
| [SWF](services/swf/README.md) | A | 39 | 4 gaps |
| [Step Functions](services/stepfunctions/README.md) | A | 37 | 9 gaps |
| [WorkMail](services/workmail/README.md) | A | 92 | 5 gaps |
Expand Down Expand Up @@ -594,7 +594,7 @@ Every service links to its own page with a coverage breakdown — audited operat
| [Cognito Identity](services/cognitoidentity/README.md) | A | 23 | 2 gaps; 4 deferred |
| [Cognito Identity Provider](services/cognitoidp/README.md) | A | 68 | 2 gaps |
| [Directory Service](services/directoryservice/README.md) | A | 80 | 10 gaps; 2 deferred |
| [IAM](services/iam/README.md) | A | 37 | 8 gaps |
| [IAM](services/iam/README.md) | A | 38 | 5 gaps |
| [IAM Access Analyzer](services/accessanalyzer/README.md) | A | 39 | 6 gaps; 1 deferred |
| [IAM Identity Center (SSO)](services/ssoadmin/README.md) | A | 56 | 4 gaps |
| [IAM Roles Anywhere](services/rolesanywhere/README.md) | A | 30 | 5 gaps |
Expand Down Expand Up @@ -622,7 +622,7 @@ Every service links to its own page with a coverage breakdown — audited operat
| [Resource Access Manager](services/ram/README.md) | A | 36 | 5 gaps; 3 deferred |
| [Resource Groups](services/resourcegroups/README.md) | A | 23 | 3 gaps |
| [Resource Groups Tagging API](services/resourcegroupstaggingapi/README.md) | A | 9 | 3 gaps; 1 deferred |
| [Systems Manager](services/ssm/README.md) | A | 105 | 31 gaps |
| [Systems Manager](services/ssm/README.md) | A | 105 | 29 gaps |

### Developer Tools

Expand Down Expand Up @@ -704,8 +704,12 @@ Every service links to its own page with a coverage breakdown — audited operat
| [Azurestoragevhost](services/azurestoragevhost/README.md) | B | 2 | 2 gaps; 1 deferred |
| [Cloudfrontkeyvaluestore](services/cloudfrontkeyvaluestore/README.md) | A | 6 | 2 structural gaps |
| [Directconnect](services/directconnect/README.md) | A | 64 | 4 gaps; 8 structural gaps; 1 deferred |
| [Dsql](services/dsql/README.md) | B | 16 | 5 gaps |
| [Ecrpublic](services/ecrpublic/README.md) | B | 23 | 5 gaps |
| [Grafana](services/grafana/README.md) | A | 25 | 2 gaps; 1 structural gap |
| [HealthOmics](services/omics/README.md) | A | — | 25 families; 4 gaps; 1 deferred |
| [Kafkaconnect](services/kafkaconnect/README.md) | B | 19 | 3 gaps |
| [Kinesisvideo](services/kinesisvideo/README.md) | B | 22 | 3 gaps |
| [Lightsail](services/lightsail/README.md) | A | — | 28 families; 18 gaps; 2 deferred |
| [Managed Blockchain](services/managedblockchain/README.md) | A | 27 | 4 gaps |
| [Mgn](services/mgn/README.md) | A | 95 | 3 gaps; 5 structural gaps; 1 deferred |
Expand Down
82 changes: 64 additions & 18 deletions cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,13 @@ import (
dlmbackend "github.com/blackbirdworks/gopherstack/services/dlm"
dmsbackend "github.com/blackbirdworks/gopherstack/services/dms"
docdbbackend "github.com/blackbirdworks/gopherstack/services/docdb"
dsqlbackend "github.com/blackbirdworks/gopherstack/services/dsql"
ddbbackend "github.com/blackbirdworks/gopherstack/services/dynamodb"
ddbmodels "github.com/blackbirdworks/gopherstack/services/dynamodb/models"
dynamodbstreamsbackend "github.com/blackbirdworks/gopherstack/services/dynamodbstreams"
ec2backend "github.com/blackbirdworks/gopherstack/services/ec2"
ecrbackend "github.com/blackbirdworks/gopherstack/services/ecr"
ecrpublicbackend "github.com/blackbirdworks/gopherstack/services/ecrpublic"
ecsbackend "github.com/blackbirdworks/gopherstack/services/ecs"
efsbackend "github.com/blackbirdworks/gopherstack/services/efs"
eksbackend "github.com/blackbirdworks/gopherstack/services/eks"
Expand Down Expand Up @@ -154,9 +156,11 @@ import (
iotdataplanebackend "github.com/blackbirdworks/gopherstack/services/iotdataplane"
iotwirelessbackend "github.com/blackbirdworks/gopherstack/services/iotwireless"
kafkabackend "github.com/blackbirdworks/gopherstack/services/kafka"
kafkaconnectbackend "github.com/blackbirdworks/gopherstack/services/kafkaconnect"
kinesisbackend "github.com/blackbirdworks/gopherstack/services/kinesis"
kinesisanalyticsbackend "github.com/blackbirdworks/gopherstack/services/kinesisanalytics"
kinesisanalyticsv2backend "github.com/blackbirdworks/gopherstack/services/kinesisanalyticsv2"
kinesisvideobackend "github.com/blackbirdworks/gopherstack/services/kinesisvideo"
kmsbackend "github.com/blackbirdworks/gopherstack/services/kms"
lakeformationbackend "github.com/blackbirdworks/gopherstack/services/lakeformation"
lambdabackend "github.com/blackbirdworks/gopherstack/services/lambda"
Expand Down Expand Up @@ -358,8 +362,10 @@ type CLI struct {
codeStarConnectionsHandler service.Registerable
dynamodbStreamsHandler service.Registerable
docdbHandler service.Registerable
dsqlHandler service.Registerable
elasticbeanstalkHandler service.Registerable
ecrHandler service.Registerable
ecrPublicHandler service.Registerable
ecsHandler service.Registerable
efsHandler service.Registerable
eksHandler service.Registerable
Expand All @@ -381,7 +387,9 @@ type CLI struct {
inspector2Handler service.Registerable
iotanalyticsHandler service.Registerable
kafkaHandler service.Registerable
kafkaconnectHandler service.Registerable
kinesisanalyticsv2Handler service.Registerable
kinesisvideoHandler service.Registerable
managedblockchainHandler service.Registerable
mediaconvertHandler service.Registerable
mqHandler service.Registerable
Expand Down Expand Up @@ -1302,6 +1310,11 @@ func (c *CLI) GetSupportHandler() service.Registerable { return c.supportHandler
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetECRHandler() service.Registerable { return c.ecrHandler }

// GetECRPublicHandler returns the ECR Public handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetECRPublicHandler() service.Registerable { return c.ecrPublicHandler }

// GetECSHandler returns the ECS handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
Expand Down Expand Up @@ -1367,13 +1380,23 @@ func (c *CLI) GetInspector2Handler() service.Registerable { return c.inspector2H
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetKafkaHandler() service.Registerable { return c.kafkaHandler }

// GetKafkaConnectHandler returns the MSK Connect handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetKafkaConnectHandler() service.Registerable { return c.kafkaconnectHandler }

// GetKinesisAnalyticsV2Handler returns the Kinesis Data Analytics v2 handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetKinesisAnalyticsV2Handler() service.Registerable {
return c.kinesisanalyticsv2Handler
}

// GetKinesisVideoHandler returns the Kinesis Video Streams handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetKinesisVideoHandler() service.Registerable { return c.kinesisvideoHandler }

// GetManagedBlockchainHandler returns the Managed Blockchain handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
Expand Down Expand Up @@ -1736,6 +1759,11 @@ func (c *CLI) GetElasticbeanstalkHandler() service.Registerable { return c.elast
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetDocDBHandler() service.Registerable { return c.docdbHandler }

// GetDSQLHandler returns the Aurora DSQL handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
func (c *CLI) GetDSQLHandler() service.Registerable { return c.dsqlHandler }

// GetFISHandler returns the FIS handler (dashboard.AWSSDKProvider).
//
//nolint:ireturn // architecturally required to return interface
Expand Down Expand Up @@ -2778,6 +2806,7 @@ func storeCLIExtendedHandlers(cli *CLI, byName map[string]service.Registerable)
cli.bedrockHandler = byName["Bedrock"]
cli.bedrockruntimeHandler = byName["BedrockRuntime"]
cli.ecrHandler = byName["ECR"]
cli.ecrPublicHandler = byName["ECRPublic"]
cli.ecsHandler = byName["ECS"]
cli.iotHandler = byName["IoT"]
cli.cognitoIDPHandler = byName["CognitoIDP"]
Expand Down Expand Up @@ -2819,7 +2848,9 @@ func storeCLILatestHandlers(cli *CLI, byName map[string]service.Registerable) {
cli.inspector2Handler = byName["Inspector2"]
cli.iotanalyticsHandler = byName["IoTAnalytics"]
cli.kafkaHandler = byName["Kafka"]
cli.kafkaconnectHandler = byName["KafkaConnect"]
cli.kinesisanalyticsv2Handler = byName["KinesisAnalyticsV2"]
cli.kinesisvideoHandler = byName["KinesisVideo"]
cli.managedblockchainHandler = byName["ManagedBlockchain"]
cli.mediaconvertHandler = byName["MediaConvert"]
cli.mqHandler = byName["MQ"]
Expand All @@ -2835,6 +2866,7 @@ func storeCLINewestHandlers(cli *CLI, byName map[string]service.Registerable) {
cli.mwaaHandler = byName["MWAA"]
cli.neptuneHandler = byName["Neptune"]
cli.docdbHandler = byName["DocDB"]
cli.dsqlHandler = byName["DSQL"]
cli.pinpointHandler = byName["Pinpoint"]
cli.pipesHandler = byName["Pipes"]
cli.rdsdataHandler = byName["RDSData"]
Expand Down Expand Up @@ -3448,22 +3480,39 @@ type elbCertificateResolverAdapter struct {
iamBackend *iambackend.InMemoryBackend
}

// elbResolverServerCertMatches walks every page of IAM server certificates
// looking for certARN, since ListServerCertificates now paginates.
func elbResolverServerCertMatches(b *iambackend.InMemoryBackend, certARN string) bool {
marker := ""
for {
p, err := b.ListServerCertificates("", marker, 0)
if err != nil {
return false
}

for _, c := range p.Data {
if c.Arn == certARN {
return true
}
}

if p.Next == "" {
return false
}

marker = p.Next
}
}

func (a *elbCertificateResolverAdapter) ResolveCertificate(ctx context.Context, certARN string) bool {
if a.acmBackend != nil {
if _, err := a.acmBackend.DescribeCertificate(ctx, certARN); err == nil {
return true
}
}

if a.iamBackend != nil {
certs, err := a.iamBackend.ListServerCertificates("")
if err == nil {
for _, c := range certs {
if c.Arn == certARN {
return true
}
}
}
if a.iamBackend != nil && elbResolverServerCertMatches(a.iamBackend, certARN) {
return true
}

return false
Expand Down Expand Up @@ -3519,15 +3568,8 @@ func (a *elbv2CertificateResolverAdapter) ResolveCertificate(certARN string) boo
}
}

if a.iamBackend != nil {
certs, err := a.iamBackend.ListServerCertificates("")
if err == nil {
for _, c := range certs {
if c.Arn == certARN {
return true
}
}
}
if a.iamBackend != nil && elbResolverServerCertMatches(a.iamBackend, certARN) {
return true
}

return false
Expand Down Expand Up @@ -4052,12 +4094,16 @@ func getRemainingServiceProviders() []service.Provider {
&guarddutybackend.Provider{},
&inspector2backend.Provider{},
&docdbbackend.Provider{},
&dsqlbackend.Provider{},
&glacierbackend.Provider{},
&iotanalyticsbackend.Provider{},
&iotwirelessbackend.Provider{},
&kinesisanalyticsbackend.Provider{},
&kafkabackend.Provider{},
&kafkaconnectbackend.Provider{},
&kinesisanalyticsv2backend.Provider{},
&kinesisvideobackend.Provider{},
&ecrpublicbackend.Provider{},
&lakeformationbackend.Provider{},
&managedblockchainbackend.Provider{},
&mediaconvertbackend.Provider{},
Expand Down
Loading
Loading