From 59ca79e545e309c5f57698b8efc07c1545dbde19 Mon Sep 17 00:00:00 2001 From: Blind-Striker Date: Fri, 23 Oct 2026 23:10:26 +0300 Subject: [PATCH 1/4] feat: add 11 LocalStack services to the endpoint catalog --- Directory.Packages.props | 14 +++ src/LocalStack.Client/Enums/AwsService.cs | 13 ++- .../Enums/AwsServiceEndpointMetadata.cs | 14 ++- .../CreateClientByImplementationTests.cs | 101 +++++++++++++++++- .../CreateClientByInterfaceTests.cs | 99 +++++++++++++++++ .../GlobalUsings.cs | 14 +++ ...LocalStack.Client.Integration.Tests.csproj | 14 +++ 7 files changed, 266 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index c5b974a..b44e398 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -35,6 +35,7 @@ + @@ -43,6 +44,7 @@ + @@ -52,6 +54,7 @@ + @@ -63,7 +66,10 @@ + + + @@ -81,8 +87,10 @@ + + @@ -98,6 +106,8 @@ + + @@ -121,6 +131,8 @@ + + @@ -135,7 +147,9 @@ + + diff --git a/src/LocalStack.Client/Enums/AwsService.cs b/src/LocalStack.Client/Enums/AwsService.cs index 22dd038..27d030a 100644 --- a/src/LocalStack.Client/Enums/AwsService.cs +++ b/src/LocalStack.Client/Enums/AwsService.cs @@ -124,4 +124,15 @@ public enum AwsService MemoryDb, Shield, VerifiedPermissions, -} \ No newline at end of file + Dsql, + S3Tables, + BedrockRuntime, + CodeArtifact, + DatabaseMigrationService, + IdentityStore, + ManagedBlockchain, + SsoAdmin, + Textract, + LambdaWeb, + S3Files, +} diff --git a/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs b/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs index b5405fd..8a1cb1d 100644 --- a/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs +++ b/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs @@ -127,6 +127,17 @@ public class AwsServiceEndpointMetadata public static readonly AwsServiceEndpointMetadata MemoryDb = new("MemoryDB", "memorydb", CommonEndpointPattern, 4567, AwsService.MemoryDb); public static readonly AwsServiceEndpointMetadata Shield = new("Shield", "shield", CommonEndpointPattern, 4567, AwsService.Shield); public static readonly AwsServiceEndpointMetadata VerifiedPermissions = new("VerifiedPermissions", "verifiedpermissions", CommonEndpointPattern, 4567, AwsService.VerifiedPermissions); + public static readonly AwsServiceEndpointMetadata Dsql = new("DSQL", "dsql", CommonEndpointPattern, 4566, AwsService.Dsql); + public static readonly AwsServiceEndpointMetadata S3Tables = new("S3Tables", "s3tables", CommonEndpointPattern, 4566, AwsService.S3Tables); + public static readonly AwsServiceEndpointMetadata BedrockRuntime = new("Bedrock Runtime", "bedrock-runtime", CommonEndpointPattern, 4566, AwsService.BedrockRuntime); + public static readonly AwsServiceEndpointMetadata CodeArtifact = new("codeartifact", "codeartifact", CommonEndpointPattern, 4566, AwsService.CodeArtifact); + public static readonly AwsServiceEndpointMetadata DatabaseMigrationService = new("Database Migration Service", "dms", CommonEndpointPattern, 4566, AwsService.DatabaseMigrationService); + public static readonly AwsServiceEndpointMetadata IdentityStore = new("identitystore", "identitystore", CommonEndpointPattern, 4566, AwsService.IdentityStore); + public static readonly AwsServiceEndpointMetadata ManagedBlockchain = new("ManagedBlockchain", "managedblockchain", CommonEndpointPattern, 4566, AwsService.ManagedBlockchain); + public static readonly AwsServiceEndpointMetadata SsoAdmin = new("SSO Admin", "sso-admin", CommonEndpointPattern, 4566, AwsService.SsoAdmin); + public static readonly AwsServiceEndpointMetadata Textract = new("Textract", "textract", CommonEndpointPattern, 4566, AwsService.Textract); + public static readonly AwsServiceEndpointMetadata LambdaWeb = new("Lambda Web", "lambda-web", CommonEndpointPattern, 4566, AwsService.LambdaWeb); + public static readonly AwsServiceEndpointMetadata S3Files = new("S3Files", "s3files", CommonEndpointPattern, 4566, AwsService.S3Files); public static readonly AwsServiceEndpointMetadata[] All = [ @@ -137,6 +148,7 @@ public class AwsServiceEndpointMetadata TimeStreamQuery, TimeStreamWrite, S3Control, ElbV2, Support, Neptune, DocDb, ServiceDiscovery, ServerlessApplicationRepository, AppConfig, CostExplorer, MediaConvert, ResourceGroupsTaggingApi, ResourceGroups, Efs, Backup, LakeFormation, Waf, WafV2, ConfigService, Mwaa, EventBridge, Fis, MarketplaceMetering, Transcribe, Mq, EmrServerless, Appflow, Route53Domains, Keyspaces, Scheduler, Ram, AppConfigData, Pinpoint, Pipes, Account, ACMPCA, Bedrock, CloudControl, CodeBuild, CodeConnections, CodeDeploy, CodePipeline, ElasticTranscoder, MemoryDb, Shield, VerifiedPermissions, + Dsql, S3Tables, BedrockRuntime, CodeArtifact, DatabaseMigrationService, IdentityStore, ManagedBlockchain, SsoAdmin, Textract, LambdaWeb, S3Files, ]; private AwsServiceEndpointMetadata(string serviceId, string cliName, string endPointPattern, int port, AwsService @enum) @@ -204,4 +216,4 @@ public override string ToString() { return $"{ServiceId} - {CliName} - {Port}"; } -} \ No newline at end of file +} diff --git a/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs b/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs index bbba6ec..86ef86c 100644 --- a/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs +++ b/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs @@ -1144,4 +1144,103 @@ public void Should_Able_To_Create_AmazonVerifiedPermissionsClient() Assert.NotNull(amazonVerifiedPermissionsClient); AssertAmazonClient.AssertClientConfiguration(amazonVerifiedPermissionsClient); } -} \ No newline at end of file + + [Fact] + public void Should_Able_To_Create_AmazonDSQLClient() + { + var amazonDSQLClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonDSQLClient); + AssertAmazonClient.AssertClientConfiguration(amazonDSQLClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonS3TablesClient() + { + var amazonS3TablesClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonS3TablesClient); + AssertAmazonClient.AssertClientConfiguration(amazonS3TablesClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonBedrockRuntimeClient() + { + var amazonBedrockRuntimeClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonBedrockRuntimeClient); + AssertAmazonClient.AssertClientConfiguration(amazonBedrockRuntimeClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonCodeArtifactClient() + { + var amazonCodeArtifactClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonCodeArtifactClient); + AssertAmazonClient.AssertClientConfiguration(amazonCodeArtifactClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonDatabaseMigrationServiceClient() + { + var amazonDatabaseMigrationServiceClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonDatabaseMigrationServiceClient); + AssertAmazonClient.AssertClientConfiguration(amazonDatabaseMigrationServiceClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonIdentityStoreClient() + { + var amazonIdentityStoreClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonIdentityStoreClient); + AssertAmazonClient.AssertClientConfiguration(amazonIdentityStoreClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonManagedBlockchainClient() + { + var amazonManagedBlockchainClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonManagedBlockchainClient); + AssertAmazonClient.AssertClientConfiguration(amazonManagedBlockchainClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonSSOAdminClient() + { + var amazonSSOAdminClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonSSOAdminClient); + AssertAmazonClient.AssertClientConfiguration(amazonSSOAdminClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonTextractClient() + { + var amazonTextractClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonTextractClient); + AssertAmazonClient.AssertClientConfiguration(amazonTextractClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonLambdaWebClient() + { + var amazonLambdaWebClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonLambdaWebClient); + AssertAmazonClient.AssertClientConfiguration(amazonLambdaWebClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonS3FilesClient() + { + var amazonS3FilesClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonS3FilesClient); + AssertAmazonClient.AssertClientConfiguration(amazonS3FilesClient); + } +} diff --git a/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs b/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs index 0ba0500..63bd640 100644 --- a/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs +++ b/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs @@ -1172,4 +1172,103 @@ public void Should_Able_To_Create_AmazonVerifiedPermissions() Assert.NotNull(amazonVerifiedPermissions); AssertAmazonClient.AssertClientConfiguration(amazonVerifiedPermissions); } + + [Fact] + public void Should_Able_To_Create_AmazonDSQL() + { + AmazonServiceClient amazonDSQL = Session.CreateClientByInterface(); + + Assert.NotNull(amazonDSQL); + AssertAmazonClient.AssertClientConfiguration(amazonDSQL); + } + + [Fact] + public void Should_Able_To_Create_AmazonS3Tables() + { + AmazonServiceClient amazonS3Tables = Session.CreateClientByInterface(); + + Assert.NotNull(amazonS3Tables); + AssertAmazonClient.AssertClientConfiguration(amazonS3Tables); + } + + [Fact] + public void Should_Able_To_Create_AmazonBedrockRuntime() + { + AmazonServiceClient amazonBedrockRuntime = Session.CreateClientByInterface(); + + Assert.NotNull(amazonBedrockRuntime); + AssertAmazonClient.AssertClientConfiguration(amazonBedrockRuntime); + } + + [Fact] + public void Should_Able_To_Create_AmazonCodeArtifact() + { + AmazonServiceClient amazonCodeArtifact = Session.CreateClientByInterface(); + + Assert.NotNull(amazonCodeArtifact); + AssertAmazonClient.AssertClientConfiguration(amazonCodeArtifact); + } + + [Fact] + public void Should_Able_To_Create_AmazonDatabaseMigrationService() + { + AmazonServiceClient amazonDatabaseMigrationService = Session.CreateClientByInterface(); + + Assert.NotNull(amazonDatabaseMigrationService); + AssertAmazonClient.AssertClientConfiguration(amazonDatabaseMigrationService); + } + + [Fact] + public void Should_Able_To_Create_AmazonIdentityStore() + { + AmazonServiceClient amazonIdentityStore = Session.CreateClientByInterface(); + + Assert.NotNull(amazonIdentityStore); + AssertAmazonClient.AssertClientConfiguration(amazonIdentityStore); + } + + [Fact] + public void Should_Able_To_Create_AmazonManagedBlockchain() + { + AmazonServiceClient amazonManagedBlockchain = Session.CreateClientByInterface(); + + Assert.NotNull(amazonManagedBlockchain); + AssertAmazonClient.AssertClientConfiguration(amazonManagedBlockchain); + } + + [Fact] + public void Should_Able_To_Create_AmazonSSOAdmin() + { + AmazonServiceClient amazonSSOAdmin = Session.CreateClientByInterface(); + + Assert.NotNull(amazonSSOAdmin); + AssertAmazonClient.AssertClientConfiguration(amazonSSOAdmin); + } + + [Fact] + public void Should_Able_To_Create_AmazonTextract() + { + AmazonServiceClient amazonTextract = Session.CreateClientByInterface(); + + Assert.NotNull(amazonTextract); + AssertAmazonClient.AssertClientConfiguration(amazonTextract); + } + + [Fact] + public void Should_Able_To_Create_AmazonLambdaWeb() + { + AmazonServiceClient amazonLambdaWeb = Session.CreateClientByInterface(); + + Assert.NotNull(amazonLambdaWeb); + AssertAmazonClient.AssertClientConfiguration(amazonLambdaWeb); + } + + [Fact] + public void Should_Able_To_Create_AmazonS3Files() + { + AmazonServiceClient amazonS3Files = Session.CreateClientByInterface(); + + Assert.NotNull(amazonS3Files); + AssertAmazonClient.AssertClientConfiguration(amazonS3Files); + } } diff --git a/tests/LocalStack.Client.Integration.Tests/GlobalUsings.cs b/tests/LocalStack.Client.Integration.Tests/GlobalUsings.cs index 8bc1d15..22a0fe9 100644 --- a/tests/LocalStack.Client.Integration.Tests/GlobalUsings.cs +++ b/tests/LocalStack.Client.Integration.Tests/GlobalUsings.cs @@ -11,6 +11,7 @@ global using Amazon.AppConfig; global using Amazon.AppConfigData; global using Amazon.Appflow; +global using Amazon.ApplicationAutoScaling; global using Amazon.AppSync; global using Amazon.Athena; global using Amazon.AutoScaling; @@ -19,6 +20,7 @@ global using Amazon.Backup; global using Amazon.Batch; global using Amazon.Bedrock; +global using Amazon.BedrockRuntime; global using Amazon.CertificateManager; global using Amazon.CloudControlApi; global using Amazon.CloudFormation; @@ -28,6 +30,7 @@ global using Amazon.CloudWatch; global using Amazon.CloudWatchEvents; global using Amazon.CloudWatchLogs; +global using Amazon.CodeArtifact; global using Amazon.CodeBuild; global using Amazon.CodeCommit; global using Amazon.CodeConnections; @@ -37,7 +40,10 @@ global using Amazon.CognitoIdentityProvider; global using Amazon.ConfigService; global using Amazon.CostExplorer; +global using Amazon.DatabaseMigrationService; global using Amazon.DocDB; +global using Amazon.DSQL; +global using Amazon.DynamoDBStreams; global using Amazon.DynamoDBv2; global using Amazon.EC2; global using Amazon.ECR; @@ -54,8 +60,10 @@ global using Amazon.EMRServerless; global using Amazon.EventBridge; global using Amazon.FIS; +global using Amazon.Glacier; global using Amazon.Glue; global using Amazon.IdentityManagement; +global using Amazon.IdentityStore; global using Amazon.IoT; global using Amazon.IoTAnalytics; global using Amazon.IotData; @@ -71,6 +79,8 @@ global using Amazon.KinesisFirehose; global using Amazon.LakeFormation; global using Amazon.Lambda; +global using Amazon.LambdaWeb; +global using Amazon.ManagedBlockchain; global using Amazon.MediaConvert; global using Amazon.MediaStore; global using Amazon.MediaStoreData; @@ -97,6 +107,8 @@ global using Amazon.Runtime; global using Amazon.S3; global using Amazon.S3Control; +global using Amazon.S3Files; +global using Amazon.S3Tables; global using Amazon.SageMaker; global using Amazon.SageMakerRuntime; global using Amazon.Scheduler; @@ -111,7 +123,9 @@ global using Amazon.SimpleSystemsManagement; global using Amazon.SimpleWorkflow; global using Amazon.SQS; +global using Amazon.SSOAdmin; global using Amazon.StepFunctions; +global using Amazon.Textract; global using Amazon.TimestreamQuery; global using Amazon.TimestreamWrite; global using Amazon.TranscribeService; diff --git a/tests/LocalStack.Client.Integration.Tests/LocalStack.Client.Integration.Tests.csproj b/tests/LocalStack.Client.Integration.Tests/LocalStack.Client.Integration.Tests.csproj index 8545871..3d4f157 100644 --- a/tests/LocalStack.Client.Integration.Tests/LocalStack.Client.Integration.Tests.csproj +++ b/tests/LocalStack.Client.Integration.Tests/LocalStack.Client.Integration.Tests.csproj @@ -16,6 +16,7 @@ + @@ -24,6 +25,7 @@ + @@ -33,6 +35,7 @@ + @@ -44,7 +47,10 @@ + + + @@ -62,8 +68,10 @@ + + @@ -79,6 +87,8 @@ + + @@ -102,6 +112,8 @@ + + @@ -116,7 +128,9 @@ + + From 2e2c11bd29ace93ec8d0e9c296db881207915423 Mon Sep 17 00:00:00 2001 From: Blind-Striker Date: Fri, 23 Oct 2026 23:11:40 +0300 Subject: [PATCH 2/4] test: cover client construction for CodeBuild, DynamoDB Streams, Glacier, Application Auto Scaling --- .../CreateClientByImplementationTests.cs | 27 +++++++++++++ .../CreateClientByInterfaceTests.cs | 38 ++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs b/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs index 86ef86c..d23b9b6 100644 --- a/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs +++ b/tests/LocalStack.Client.Integration.Tests/CreateClientByImplementationTests.cs @@ -1243,4 +1243,31 @@ public void Should_Able_To_Create_AmazonS3FilesClient() Assert.NotNull(amazonS3FilesClient); AssertAmazonClient.AssertClientConfiguration(amazonS3FilesClient); } + + [Fact] + public void Should_Able_To_Create_AmazonDynamoDBStreamsClient() + { + var amazonDynamoDBStreamsClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonDynamoDBStreamsClient); + AssertAmazonClient.AssertClientConfiguration(amazonDynamoDBStreamsClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonGlacierClient() + { + var amazonGlacierClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonGlacierClient); + AssertAmazonClient.AssertClientConfiguration(amazonGlacierClient); + } + + [Fact] + public void Should_Able_To_Create_AmazonApplicationAutoScalingClient() + { + var amazonApplicationAutoScalingClient = Session.CreateClientByImplementation(); + + Assert.NotNull(amazonApplicationAutoScalingClient); + AssertAmazonClient.AssertClientConfiguration(amazonApplicationAutoScalingClient); + } } diff --git a/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs b/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs index 63bd640..b137ff7 100644 --- a/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs +++ b/tests/LocalStack.Client.Integration.Tests/CreateClientByInterfaceTests.cs @@ -1074,7 +1074,7 @@ public void Should_Able_To_Create_AmazonPipes() AssertAmazonClient.AssertClientConfiguration(amazonPipes); } - [Fact] + [Fact] public void Should_Able_To_Create_AmazonAccount() { AmazonServiceClient amazonAccount = Session.CreateClientByInterface(); @@ -1271,4 +1271,40 @@ public void Should_Able_To_Create_AmazonS3Files() Assert.NotNull(amazonS3Files); AssertAmazonClient.AssertClientConfiguration(amazonS3Files); } + + [Fact] + public void Should_Able_To_Create_AmazonCodeBuild() + { + AmazonServiceClient amazonCodeBuild = Session.CreateClientByInterface(); + + Assert.NotNull(amazonCodeBuild); + AssertAmazonClient.AssertClientConfiguration(amazonCodeBuild); + } + + [Fact] + public void Should_Able_To_Create_AmazonDynamoDBStreams() + { + AmazonServiceClient amazonDynamoDBStreams = Session.CreateClientByInterface(); + + Assert.NotNull(amazonDynamoDBStreams); + AssertAmazonClient.AssertClientConfiguration(amazonDynamoDBStreams); + } + + [Fact] + public void Should_Able_To_Create_AmazonGlacier() + { + AmazonServiceClient amazonGlacier = Session.CreateClientByInterface(); + + Assert.NotNull(amazonGlacier); + AssertAmazonClient.AssertClientConfiguration(amazonGlacier); + } + + [Fact] + public void Should_Able_To_Create_AmazonApplicationAutoScaling() + { + AmazonServiceClient amazonApplicationAutoScaling = Session.CreateClientByInterface(); + + Assert.NotNull(amazonApplicationAutoScaling); + AssertAmazonClient.AssertClientConfiguration(amazonApplicationAutoScaling); + } } From 01cd386c41033fcb1fe857d4e9188a8445a2d080 Mon Sep 17 00:00:00 2001 From: Blind-Striker Date: Fri, 23 Oct 2026 23:11:41 +0300 Subject: [PATCH 3/4] docs: record catalog additions and upstream provenance --- CHANGELOG.md | 1 + docs/engineering/maintenance-playbook.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12bca02..c13cd33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Planned as **3.0.0** for both packages; not yet published. ### Added +- Added endpoint catalog entries (endpoint mapping and client construction) for DSQL, S3 Tables, Bedrock Runtime, CodeArtifact, Database Migration Service, Identity Store, Managed Blockchain, SSO Admin, Textract, Lambda Web, and S3 Files. Inputs: [LocalStack Python client `localstack/localstack-python-client@75fd327`](https://github.com/localstack/localstack-python-client/blob/75fd327/localstack_client/config.py) for DSQL and S3 Tables, and the [LocalStack service documentation](https://docs.localstack.cloud/aws/services/) for the rest. Most require a LocalStack license tier per that documentation; catalog membership does not establish operation coverage. - Added `net10.0` and `net11.0` assets to Core (`LocalStack.Client`) and Extensions (`LocalStack.Client.Extensions`). .NET 11 is not generally available yet; the `net11.0` assets are built with the .NET 11 RC2 SDK pinned in `global.json`. - Both packages support Native AOT and trimming on these targets with zero trim/AOT warnings, no suppressions, and no consumer code changes. This includes `AddLocalStack(configuration)`, all Add/TryAdd/alias registration overloads, Core `Session` / `SessionStandalone`, and the `Type`-based APIs. - On `net10.0` and `net11.0`, both packages use no runtime reflection for AWS SDK service clients and configs, or for accessible, concrete, non-generic custom clients/configs with constructors and properties eligible for the [generated registry](docs/architecture/platform-and-packaging.md#native-aot-and-trimming). The generic interface APIs (`AddAwsService` and every overload, `CreateClientByInterface()`) use the AWS SDK v4 static factories when the injected helper is exactly the default `SessionReflection` and do not depend on source generation, so they also work in F# and Visual Basic; custom or mocked helpers retain the previous calls and ordering. The `Type`-based APIs and generic implementation API use a build-time source generator that ships in Core and turns itself on for net10-compatible C# projects, with no setup or extra package. Other client shapes (private or generic custom clients, F# and Visual Basic projects for the `Type`-based APIs, assemblies loaded at run time, unusual constructors or properties) keep the previous behavior through a reflection fallback that runs only under JIT; trimmed and Native AOT apps do not include it. These claims cover LocalStack.NET's own code; the AWS SDK, dependency injection and BCL internals have their own AOT status, and LocalStack determines its own service coverage. diff --git a/docs/engineering/maintenance-playbook.md b/docs/engineering/maintenance-playbook.md index 45b7da7..e1e2a53 100644 --- a/docs/engineering/maintenance-playbook.md +++ b/docs/engineering/maintenance-playbook.md @@ -20,6 +20,8 @@ Current behavior remains owned by [client runtime](../architecture/client-runtim Inspect the official [LocalStack Python client](https://github.com/localstack/localstack-python-client) at a recorded commit. Compare its catalog with this library and the selected AWS SDK; record relevant additions, removals, renames, and intentional differences. Do not copy an upstream name without checking its meaning. +Record the inspected Python client commit and the added services in [CHANGELOG.md](../../CHANGELOG.md). + For each applicable mapping change, review these locations together: | Concern | Source to review | From 1e28f768f9815da35d2774cbc269cc3e71923afb Mon Sep 17 00:00:00 2001 From: Blind-Striker Date: Fri, 23 Oct 2026 23:47:26 +0300 Subject: [PATCH 4/4] fix: use legacy port 4566 for the services added in 2.0.0 --- CHANGELOG.md | 4 ++++ .../Enums/AwsServiceEndpointMetadata.cs | 24 +++++++++---------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c13cd33..4b6e115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,10 @@ Planned as **3.0.0** for both packages; not yet published. - With `UseLocalStack: false`, Extensions now creates clients through the AWS SDK's public `AddAWSService` factory instead of private SDK reflection. No consumer code changes are needed. +### Fixed + +- With `UseLegacyPorts: true`, Account, ACM PCA, Bedrock, CloudControl, CodeBuild, CodeConnections, CodeDeploy, CodePipeline, Elastic Transcoder, MemoryDB, Shield and Verified Permissions now use port 4566, matching the LocalStack Python client. They used 4567, the legacy API Gateway port. The default edge-port mode is unchanged. + ### Documentation - The README states that LocalStack images from 2026.03.0 on, including `latest`, need `LOCALSTACK_AUTH_TOKEN`, and links the official [auth-token](https://docs.localstack.cloud/aws/getting-started/auth-token/) and [CI documentation](https://docs.localstack.cloud/aws/ci-pipelines/). It names 4.14.0 as the last token-free release, which gets no further updates ([#51](https://github.com/localstack-dotnet/localstack-dotnet-client/issues/51)). diff --git a/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs b/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs index 8a1cb1d..59bc19f 100644 --- a/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs +++ b/src/LocalStack.Client/Enums/AwsServiceEndpointMetadata.cs @@ -115,18 +115,18 @@ public class AwsServiceEndpointMetadata public static readonly AwsServiceEndpointMetadata AppConfigData = new("AppConfigData", "appconfigdata", CommonEndpointPattern, 4632, AwsService.AppConfigData); public static readonly AwsServiceEndpointMetadata Pinpoint = new("Pinpoint", "pinpoint", CommonEndpointPattern, 4566, AwsService.Pinpoint); public static readonly AwsServiceEndpointMetadata Pipes = new("Pipes", "pipes", CommonEndpointPattern, 4566, AwsService.Pipes); - public static readonly AwsServiceEndpointMetadata Account = new("Account", "account", CommonEndpointPattern, 4567, AwsService.Account); - public static readonly AwsServiceEndpointMetadata ACMPCA = new("ACM PCA", "acm-pca", CommonEndpointPattern, 4567, AwsService.ACMPCA); - public static readonly AwsServiceEndpointMetadata Bedrock = new("Bedrock", "bedrock", CommonEndpointPattern, 4567, AwsService.Bedrock); - public static readonly AwsServiceEndpointMetadata CloudControl = new("CloudControl", "cloudcontrol", CommonEndpointPattern, 4567, AwsService.CloudControl); - public static readonly AwsServiceEndpointMetadata CodeBuild = new("CodeBuild", "codebuild", CommonEndpointPattern, 4567, AwsService.CodeBuild); - public static readonly AwsServiceEndpointMetadata CodeConnections = new("CodeConnections", "codeconnections", CommonEndpointPattern, 4567, AwsService.CodeConnections); - public static readonly AwsServiceEndpointMetadata CodeDeploy = new("CodeDeploy", "codedeploy", CommonEndpointPattern, 4567, AwsService.CodeDeploy); - public static readonly AwsServiceEndpointMetadata CodePipeline = new("CodePipeline", "codepipeline", CommonEndpointPattern, 4567, AwsService.CodePipeline); - public static readonly AwsServiceEndpointMetadata ElasticTranscoder = new("Elastic Transcoder", "elastictranscoder", CommonEndpointPattern, 4567, AwsService.ElasticTranscoder); - public static readonly AwsServiceEndpointMetadata MemoryDb = new("MemoryDB", "memorydb", CommonEndpointPattern, 4567, AwsService.MemoryDb); - public static readonly AwsServiceEndpointMetadata Shield = new("Shield", "shield", CommonEndpointPattern, 4567, AwsService.Shield); - public static readonly AwsServiceEndpointMetadata VerifiedPermissions = new("VerifiedPermissions", "verifiedpermissions", CommonEndpointPattern, 4567, AwsService.VerifiedPermissions); + public static readonly AwsServiceEndpointMetadata Account = new("Account", "account", CommonEndpointPattern, 4566, AwsService.Account); + public static readonly AwsServiceEndpointMetadata ACMPCA = new("ACM PCA", "acm-pca", CommonEndpointPattern, 4566, AwsService.ACMPCA); + public static readonly AwsServiceEndpointMetadata Bedrock = new("Bedrock", "bedrock", CommonEndpointPattern, 4566, AwsService.Bedrock); + public static readonly AwsServiceEndpointMetadata CloudControl = new("CloudControl", "cloudcontrol", CommonEndpointPattern, 4566, AwsService.CloudControl); + public static readonly AwsServiceEndpointMetadata CodeBuild = new("CodeBuild", "codebuild", CommonEndpointPattern, 4566, AwsService.CodeBuild); + public static readonly AwsServiceEndpointMetadata CodeConnections = new("CodeConnections", "codeconnections", CommonEndpointPattern, 4566, AwsService.CodeConnections); + public static readonly AwsServiceEndpointMetadata CodeDeploy = new("CodeDeploy", "codedeploy", CommonEndpointPattern, 4566, AwsService.CodeDeploy); + public static readonly AwsServiceEndpointMetadata CodePipeline = new("CodePipeline", "codepipeline", CommonEndpointPattern, 4566, AwsService.CodePipeline); + public static readonly AwsServiceEndpointMetadata ElasticTranscoder = new("Elastic Transcoder", "elastictranscoder", CommonEndpointPattern, 4566, AwsService.ElasticTranscoder); + public static readonly AwsServiceEndpointMetadata MemoryDb = new("MemoryDB", "memorydb", CommonEndpointPattern, 4566, AwsService.MemoryDb); + public static readonly AwsServiceEndpointMetadata Shield = new("Shield", "shield", CommonEndpointPattern, 4566, AwsService.Shield); + public static readonly AwsServiceEndpointMetadata VerifiedPermissions = new("VerifiedPermissions", "verifiedpermissions", CommonEndpointPattern, 4566, AwsService.VerifiedPermissions); public static readonly AwsServiceEndpointMetadata Dsql = new("DSQL", "dsql", CommonEndpointPattern, 4566, AwsService.Dsql); public static readonly AwsServiceEndpointMetadata S3Tables = new("S3Tables", "s3tables", CommonEndpointPattern, 4566, AwsService.S3Tables); public static readonly AwsServiceEndpointMetadata BedrockRuntime = new("Bedrock Runtime", "bedrock-runtime", CommonEndpointPattern, 4566, AwsService.BedrockRuntime);