diff --git a/.ci/.semgrep-service-name0.yml b/.ci/.semgrep-service-name0.yml index cb886294d4d0..51577aa81c36 100644 --- a/.ci/.semgrep-service-name0.yml +++ b/.ci/.semgrep-service-name0.yml @@ -2005,6 +2005,67 @@ rules: - pattern-not-regex: "[Ss]ervice" - pattern-not-regex: "[Cc]ancel" severity: WARNING + - id: chatbot-in-func-name + languages: + - go + message: Do not use "Chatbot" in func name inside chatbot package + paths: + include: + - internal/service/chatbot + exclude: + - internal/service/chatbot/list_pages_gen.go + patterns: + - pattern: func $NAME( ... ) { ... } + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-regex: "(?i)Chatbot" + - focus-metavariable: $NAME + - pattern-not: func $NAME($T *testing.T) { ... } + severity: WARNING + - id: chatbot-in-test-name + languages: + - go + message: Include "Chatbot" in test name + paths: + include: + - internal/service/chatbot/*_test.go + patterns: + - pattern: func $NAME( ... ) { ... } + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-not-regex: "^TestAccChatbot" + - pattern-regex: ^TestAcc.* + severity: WARNING + - id: chatbot-in-const-name + languages: + - go + message: Do not use "Chatbot" in const name inside chatbot package + paths: + include: + - internal/service/chatbot + patterns: + - pattern: const $NAME = ... + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-regex: "(?i)Chatbot" + severity: WARNING + - id: chatbot-in-var-name + languages: + - go + message: Do not use "Chatbot" in var name inside chatbot package + paths: + include: + - internal/service/chatbot + patterns: + - pattern: var $NAME = ... + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-regex: "(?i)Chatbot" + severity: WARNING - id: chime-in-func-name languages: - go @@ -4052,50 +4113,3 @@ rules: patterns: - pattern-regex: "(?i)ComputeOptimizer" severity: WARNING - - id: configservice-in-func-name - languages: - - go - message: Do not use "ConfigService" in func name inside configservice package - paths: - include: - - internal/service/configservice - exclude: - - internal/service/configservice/list_pages_gen.go - patterns: - - pattern: func $NAME( ... ) { ... } - - metavariable-pattern: - metavariable: $NAME - patterns: - - pattern-regex: "(?i)ConfigService" - - focus-metavariable: $NAME - - pattern-not: func $NAME($T *testing.T) { ... } - severity: WARNING - - id: configservice-in-test-name - languages: - - go - message: Include "ConfigService" in test name - paths: - include: - - internal/service/configservice/*_test.go - patterns: - - pattern: func $NAME( ... ) { ... } - - metavariable-pattern: - metavariable: $NAME - patterns: - - pattern-not-regex: "^TestAccConfigService" - - pattern-regex: ^TestAcc.* - severity: WARNING - - id: configservice-in-const-name - languages: - - go - message: Do not use "ConfigService" in const name inside configservice package - paths: - include: - - internal/service/configservice - patterns: - - pattern: const $NAME = ... - - metavariable-pattern: - metavariable: $NAME - patterns: - - pattern-regex: "(?i)ConfigService" - severity: WARNING diff --git a/.ci/.semgrep-service-name1.yml b/.ci/.semgrep-service-name1.yml index fec6253f23cb..e5254ed3e775 100644 --- a/.ci/.semgrep-service-name1.yml +++ b/.ci/.semgrep-service-name1.yml @@ -1,5 +1,52 @@ # Generated by internal/generate/servicesemgrep/main.go; DO NOT EDIT. rules: + - id: configservice-in-func-name + languages: + - go + message: Do not use "ConfigService" in func name inside configservice package + paths: + include: + - internal/service/configservice + exclude: + - internal/service/configservice/list_pages_gen.go + patterns: + - pattern: func $NAME( ... ) { ... } + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-regex: "(?i)ConfigService" + - focus-metavariable: $NAME + - pattern-not: func $NAME($T *testing.T) { ... } + severity: WARNING + - id: configservice-in-test-name + languages: + - go + message: Include "ConfigService" in test name + paths: + include: + - internal/service/configservice/*_test.go + patterns: + - pattern: func $NAME( ... ) { ... } + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-not-regex: "^TestAccConfigService" + - pattern-regex: ^TestAcc.* + severity: WARNING + - id: configservice-in-const-name + languages: + - go + message: Do not use "ConfigService" in const name inside configservice package + paths: + include: + - internal/service/configservice + patterns: + - pattern: const $NAME = ... + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-regex: "(?i)ConfigService" + severity: WARNING - id: configservice-in-var-name languages: - go @@ -4079,18 +4126,3 @@ rules: - focus-metavariable: $NAME - pattern-not: func $NAME($T *testing.T) { ... } severity: WARNING - - id: iot-in-test-name - languages: - - go - message: Include "IoT" in test name - paths: - include: - - internal/service/iot/*_test.go - patterns: - - pattern: func $NAME( ... ) { ... } - - metavariable-pattern: - metavariable: $NAME - patterns: - - pattern-not-regex: "^TestAccIoT" - - pattern-regex: ^TestAcc.* - severity: WARNING diff --git a/.ci/.semgrep-service-name2.yml b/.ci/.semgrep-service-name2.yml index f3e09f52ec1e..dffe9ebf05fd 100644 --- a/.ci/.semgrep-service-name2.yml +++ b/.ci/.semgrep-service-name2.yml @@ -1,5 +1,20 @@ # Generated by internal/generate/servicesemgrep/main.go; DO NOT EDIT. rules: + - id: iot-in-test-name + languages: + - go + message: Include "IoT" in test name + paths: + include: + - internal/service/iot/*_test.go + patterns: + - pattern: func $NAME( ... ) { ... } + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-not-regex: "^TestAccIoT" + - pattern-regex: ^TestAcc.* + severity: WARNING - id: iot-in-const-name languages: - go @@ -4093,21 +4108,3 @@ rules: patterns: - pattern-regex: "(?i)RDS" severity: WARNING - - id: recyclebin-in-func-name - languages: - - go - message: Do not use "recyclebin" in func name inside rbin package - paths: - include: - - internal/service/rbin - exclude: - - internal/service/rbin/list_pages_gen.go - patterns: - - pattern: func $NAME( ... ) { ... } - - metavariable-pattern: - metavariable: $NAME - patterns: - - pattern-regex: "(?i)recyclebin" - - focus-metavariable: $NAME - - pattern-not: func $NAME($T *testing.T) { ... } - severity: WARNING diff --git a/.ci/.semgrep-service-name3.yml b/.ci/.semgrep-service-name3.yml index 46951e761691..a7f30ac6b9b7 100644 --- a/.ci/.semgrep-service-name3.yml +++ b/.ci/.semgrep-service-name3.yml @@ -1,5 +1,23 @@ # Generated by internal/generate/servicesemgrep/main.go; DO NOT EDIT. rules: + - id: recyclebin-in-func-name + languages: + - go + message: Do not use "recyclebin" in func name inside rbin package + paths: + include: + - internal/service/rbin + exclude: + - internal/service/rbin/list_pages_gen.go + patterns: + - pattern: func $NAME( ... ) { ... } + - metavariable-pattern: + metavariable: $NAME + patterns: + - pattern-regex: "(?i)recyclebin" + - focus-metavariable: $NAME + - pattern-not: func $NAME($T *testing.T) { ... } + severity: WARNING - id: recyclebin-in-const-name languages: - go diff --git a/.github/labeler-issue-triage.yml b/.github/labeler-issue-triage.yml index 2bba1a827738..acbad5e492e6 100644 --- a/.github/labeler-issue-triage.yml +++ b/.github/labeler-issue-triage.yml @@ -105,6 +105,8 @@ service/budgets: - '((\*|-)\s*`?|(data|resource)\s+"?)aws_budgets_' service/ce: - '((\*|-)\s*`?|(data|resource)\s+"?)aws_ce_' +service/chatbot: + - '((\*|-)\s*`?|(data|resource)\s+"?)aws_chatbot_' service/chime: - '((\*|-)\s*`?|(data|resource)\s+"?)aws_chime_' service/chimesdkidentity: diff --git a/.github/labeler-pr-triage.yml b/.github/labeler-pr-triage.yml index 01bca485e955..2b0b6a62db82 100644 --- a/.github/labeler-pr-triage.yml +++ b/.github/labeler-pr-triage.yml @@ -349,6 +349,12 @@ service/ce: - any-glob-to-any-file: - 'internal/service/ce/**/*' - 'website/**/ce_*' +service/chatbot: + - any: + - changed-files: + - any-glob-to-any-file: + - 'internal/service/chatbot/**/*' + - 'website/**/chatbot_*' service/chime: - any: - changed-files: diff --git a/.teamcity/components/generated/services_all.kt b/.teamcity/components/generated/services_all.kt index 375f1a303a4b..8cd74d9caa72 100644 --- a/.teamcity/components/generated/services_all.kt +++ b/.teamcity/components/generated/services_all.kt @@ -30,6 +30,7 @@ val services = mapOf( "bedrockagent" to ServiceSpec("Agents for Amazon Bedrock"), "budgets" to ServiceSpec("Web Services Budgets"), "ce" to ServiceSpec("CE (Cost Explorer)"), + "chatbot" to ServiceSpec("Chatbot"), "chime" to ServiceSpec("Chime"), "chimesdkmediapipelines" to ServiceSpec("Chime SDK Media Pipelines"), "chimesdkvoice" to ServiceSpec("Chime SDK Voice"), diff --git a/go.mod b/go.mod index 2e7c14516b4d..78d31c4ec40a 100644 --- a/go.mod +++ b/go.mod @@ -34,6 +34,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/bedrock v1.8.0 github.com/aws/aws-sdk-go-v2/service/bedrockagent v1.8.0 github.com/aws/aws-sdk-go-v2/service/budgets v1.22.4 + github.com/aws/aws-sdk-go-v2/service/chatbot v1.1.5 github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines v1.15.5 github.com/aws/aws-sdk-go-v2/service/chimesdkvoice v1.14.4 github.com/aws/aws-sdk-go-v2/service/cleanrooms v1.12.0 diff --git a/go.sum b/go.sum index 4089315505a3..61bcb2609294 100644 --- a/go.sum +++ b/go.sum @@ -88,6 +88,8 @@ github.com/aws/aws-sdk-go-v2/service/bedrockagent v1.8.0 h1:CWprual/fBYNa9Mvf8rl github.com/aws/aws-sdk-go-v2/service/bedrockagent v1.8.0/go.mod h1:6CwV+GE3wrFqkrU2LB8cajHMWJn7jFFhRtxBQiOZ5kw= github.com/aws/aws-sdk-go-v2/service/budgets v1.22.4 h1:sVv+p2Wo+sUXa8dC1pCMJ/+9ncOriq8EiRWvAkOuaLY= github.com/aws/aws-sdk-go-v2/service/budgets v1.22.4/go.mod h1:JFS3MaNoisHXHQm5/xRQjj1tICixIgT8Vv32D0lV5NE= +github.com/aws/aws-sdk-go-v2/service/chatbot v1.1.5 h1:ZP/RF+wQiit1QP3DAqaJLgCJDXpJXu2xvdsgrh5ds+s= +github.com/aws/aws-sdk-go-v2/service/chatbot v1.1.5/go.mod h1:Lc//jOTNN9f39SHfFxtRSzfy1Do4GSz+1jZHT2hKdMs= github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines v1.15.5 h1:FgeK3aPbB/ARkhxUXfSn9d2ibb4Q9kUhHl/dWwqIy8Y= github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines v1.15.5/go.mod h1:yPGCqtEO6NNwd6kebco4VSvyHkKbjjwd7K6g49Ze/Uw= github.com/aws/aws-sdk-go-v2/service/chimesdkvoice v1.14.4 h1:rea/sazWAyaUXPcbSCBDGKM1Kb6YiU25xvNnN0p7AyM= diff --git a/infrastructure/repository/labels-service.tf b/infrastructure/repository/labels-service.tf index 604b2fd22df2..743344f466ab 100644 --- a/infrastructure/repository/labels-service.tf +++ b/infrastructure/repository/labels-service.tf @@ -39,6 +39,7 @@ variable "service_labels" { "braket", "budgets", "ce", + "chatbot", "chime", "chimesdkidentity", "chimesdkmediapipelines", diff --git a/internal/conns/awsclient_gen.go b/internal/conns/awsclient_gen.go index e0291226cbf6..834bc1cfe63d 100644 --- a/internal/conns/awsclient_gen.go +++ b/internal/conns/awsclient_gen.go @@ -26,6 +26,7 @@ import ( bedrock_sdkv2 "github.com/aws/aws-sdk-go-v2/service/bedrock" bedrockagent_sdkv2 "github.com/aws/aws-sdk-go-v2/service/bedrockagent" budgets_sdkv2 "github.com/aws/aws-sdk-go-v2/service/budgets" + chatbot_sdkv2 "github.com/aws/aws-sdk-go-v2/service/chatbot" chimesdkmediapipelines_sdkv2 "github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines" chimesdkvoice_sdkv2 "github.com/aws/aws-sdk-go-v2/service/chimesdkvoice" cleanrooms_sdkv2 "github.com/aws/aws-sdk-go-v2/service/cleanrooms" @@ -378,6 +379,10 @@ func (c *AWSClient) CURClient(ctx context.Context) *costandusagereportservice_sd return errs.Must(client[*costandusagereportservice_sdkv2.Client](ctx, c, names.CUR, make(map[string]any))) } +func (c *AWSClient) ChatbotClient(ctx context.Context) *chatbot_sdkv2.Client { + return errs.Must(client[*chatbot_sdkv2.Client](ctx, c, names.Chatbot, make(map[string]any))) +} + func (c *AWSClient) ChimeConn(ctx context.Context) *chime_sdkv1.Chime { return errs.Must(conn[*chime_sdkv1.Chime](ctx, c, names.Chime, make(map[string]any))) } diff --git a/internal/provider/service_packages_gen.go b/internal/provider/service_packages_gen.go index d81f0c820ab6..c5e9850820ca 100644 --- a/internal/provider/service_packages_gen.go +++ b/internal/provider/service_packages_gen.go @@ -36,6 +36,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/service/bedrockagent" "github.com/hashicorp/terraform-provider-aws/internal/service/budgets" "github.com/hashicorp/terraform-provider-aws/internal/service/ce" + "github.com/hashicorp/terraform-provider-aws/internal/service/chatbot" "github.com/hashicorp/terraform-provider-aws/internal/service/chime" "github.com/hashicorp/terraform-provider-aws/internal/service/chimesdkmediapipelines" "github.com/hashicorp/terraform-provider-aws/internal/service/chimesdkvoice" @@ -273,6 +274,7 @@ func servicePackages(ctx context.Context) []conns.ServicePackage { bedrockagent.ServicePackage(ctx), budgets.ServicePackage(ctx), ce.ServicePackage(ctx), + chatbot.ServicePackage(ctx), chime.ServicePackage(ctx), chimesdkmediapipelines.ServicePackage(ctx), chimesdkvoice.ServicePackage(ctx), diff --git a/internal/service/chatbot/generate.go b/internal/service/chatbot/generate.go new file mode 100644 index 000000000000..27d9a5d31b33 --- /dev/null +++ b/internal/service/chatbot/generate.go @@ -0,0 +1,7 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +//go:generate go run ../../generate/servicepackage/main.go +// ONLY generate directives and package declaration! Do not add anything else to this file. + +package chatbot diff --git a/internal/service/chatbot/service_endpoints_gen_test.go b/internal/service/chatbot/service_endpoints_gen_test.go new file mode 100644 index 000000000000..10f4fd6b2ef1 --- /dev/null +++ b/internal/service/chatbot/service_endpoints_gen_test.go @@ -0,0 +1,496 @@ +// Code generated by internal/generate/serviceendpointtests/main.go; DO NOT EDIT. + +package chatbot_test + +import ( + "context" + "errors" + "fmt" + "maps" + "os" + "path/filepath" + "reflect" + "strings" + "testing" + + aws_sdkv2 "github.com/aws/aws-sdk-go-v2/aws" + chatbot_sdkv2 "github.com/aws/aws-sdk-go-v2/service/chatbot" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" + "github.com/google/go-cmp/cmp" + "github.com/hashicorp/aws-sdk-go-base/v2/servicemocks" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + terraformsdk "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs" + "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" + "github.com/hashicorp/terraform-provider-aws/internal/provider" +) + +type endpointTestCase struct { + with []setupFunc + expected caseExpectations +} + +type caseSetup struct { + config map[string]any + configFile configFile + environmentVariables map[string]string +} + +type configFile struct { + baseUrl string + serviceUrl string +} + +type caseExpectations struct { + diags diag.Diagnostics + endpoint string +} + +type setupFunc func(setup *caseSetup) + +type callFunc func(ctx context.Context, t *testing.T, meta *conns.AWSClient) string + +const ( + packageNameConfigEndpoint = "https://packagename-config.endpoint.test/" + awsServiceEnvvarEndpoint = "https://service-envvar.endpoint.test/" + baseEnvvarEndpoint = "https://base-envvar.endpoint.test/" + serviceConfigFileEndpoint = "https://service-configfile.endpoint.test/" + baseConfigFileEndpoint = "https://base-configfile.endpoint.test/" +) + +const ( + packageName = "chatbot" + awsEnvVar = "AWS_ENDPOINT_URL_CHATBOT" + baseEnvVar = "AWS_ENDPOINT_URL" + configParam = "chatbot" +) + +func TestEndpointConfiguration(t *testing.T) { //nolint:paralleltest // uses t.Setenv + const region = "us-west-2" //lintignore:AWSAT003 + + testcases := map[string]endpointTestCase{ + "no config": { + with: []setupFunc{withNoConfig}, + expected: expectDefaultEndpoint(region), + }, + + // Package name endpoint on Config + + "package name endpoint config": { + with: []setupFunc{ + withPackageNameEndpointInConfig, + }, + expected: expectPackageNameConfigEndpoint(), + }, + + "package name endpoint config overrides aws service envvar": { + with: []setupFunc{ + withPackageNameEndpointInConfig, + withAwsEnvVar, + }, + expected: expectPackageNameConfigEndpoint(), + }, + + "package name endpoint config overrides base envvar": { + with: []setupFunc{ + withPackageNameEndpointInConfig, + withBaseEnvVar, + }, + expected: expectPackageNameConfigEndpoint(), + }, + + "package name endpoint config overrides service config file": { + with: []setupFunc{ + withPackageNameEndpointInConfig, + withServiceEndpointInConfigFile, + }, + expected: expectPackageNameConfigEndpoint(), + }, + + "package name endpoint config overrides base config file": { + with: []setupFunc{ + withPackageNameEndpointInConfig, + withBaseEndpointInConfigFile, + }, + expected: expectPackageNameConfigEndpoint(), + }, + + // Service endpoint in AWS envvar + + "service aws envvar": { + with: []setupFunc{ + withAwsEnvVar, + }, + expected: expectAwsEnvVarEndpoint(), + }, + + "service aws envvar overrides base envvar": { + with: []setupFunc{ + withAwsEnvVar, + withBaseEnvVar, + }, + expected: expectAwsEnvVarEndpoint(), + }, + + "service aws envvar overrides service config file": { + with: []setupFunc{ + withAwsEnvVar, + withServiceEndpointInConfigFile, + }, + expected: expectAwsEnvVarEndpoint(), + }, + + "service aws envvar overrides base config file": { + with: []setupFunc{ + withAwsEnvVar, + withBaseEndpointInConfigFile, + }, + expected: expectAwsEnvVarEndpoint(), + }, + + // Base endpoint in envvar + + "base endpoint envvar": { + with: []setupFunc{ + withBaseEnvVar, + }, + expected: expectBaseEnvVarEndpoint(), + }, + + "base endpoint envvar overrides service config file": { + with: []setupFunc{ + withBaseEnvVar, + withServiceEndpointInConfigFile, + }, + expected: expectBaseEnvVarEndpoint(), + }, + + "base endpoint envvar overrides base config file": { + with: []setupFunc{ + withBaseEnvVar, + withBaseEndpointInConfigFile, + }, + expected: expectBaseEnvVarEndpoint(), + }, + + // Service endpoint in config file + + "service config file": { + with: []setupFunc{ + withServiceEndpointInConfigFile, + }, + expected: expectServiceConfigFileEndpoint(), + }, + + "service config file overrides base config file": { + with: []setupFunc{ + withServiceEndpointInConfigFile, + withBaseEndpointInConfigFile, + }, + expected: expectServiceConfigFileEndpoint(), + }, + + // Base endpoint in config file + + "base endpoint config file": { + with: []setupFunc{ + withBaseEndpointInConfigFile, + }, + expected: expectBaseConfigFileEndpoint(), + }, + } + + for name, testcase := range testcases { //nolint:paralleltest // uses t.Setenv + testcase := testcase + + t.Run(name, func(t *testing.T) { + testEndpointCase(t, region, testcase, callService) + }) + } +} + +func defaultEndpoint(region string) string { + r := chatbot_sdkv2.NewDefaultEndpointResolverV2() + + ep, err := r.ResolveEndpoint(context.Background(), chatbot_sdkv2.EndpointParameters{ + Region: aws_sdkv2.String(region), + }) + if err != nil { + return err.Error() + } + + if ep.URI.Path == "" { + ep.URI.Path = "/" + } + + return ep.URI.String() +} + +func callService(ctx context.Context, t *testing.T, meta *conns.AWSClient) string { + t.Helper() + + var endpoint string + + client := meta.ChatbotClient(ctx) + + _, err := client.GetAccountPreferences(ctx, &chatbot_sdkv2.GetAccountPreferencesInput{}, + func(opts *chatbot_sdkv2.Options) { + opts.APIOptions = append(opts.APIOptions, + addRetrieveEndpointURLMiddleware(t, &endpoint), + addCancelRequestMiddleware(), + ) + }, + ) + if err == nil { + t.Fatal("Expected an error, got none") + } else if !errors.Is(err, errCancelOperation) { + t.Fatalf("Unexpected error: %s", err) + } + + return endpoint +} + +func withNoConfig(_ *caseSetup) { + // no-op +} + +func withPackageNameEndpointInConfig(setup *caseSetup) { + if _, ok := setup.config["endpoints"]; !ok { + setup.config["endpoints"] = []any{ + map[string]any{}, + } + } + endpoints := setup.config["endpoints"].([]any)[0].(map[string]any) + endpoints[packageName] = packageNameConfigEndpoint +} + +func withAwsEnvVar(setup *caseSetup) { + setup.environmentVariables[awsEnvVar] = awsServiceEnvvarEndpoint +} + +func withBaseEnvVar(setup *caseSetup) { + setup.environmentVariables[baseEnvVar] = baseEnvvarEndpoint +} + +func withServiceEndpointInConfigFile(setup *caseSetup) { + setup.configFile.serviceUrl = serviceConfigFileEndpoint +} + +func withBaseEndpointInConfigFile(setup *caseSetup) { + setup.configFile.baseUrl = baseConfigFileEndpoint +} + +func expectDefaultEndpoint(region string) caseExpectations { + return caseExpectations{ + endpoint: defaultEndpoint(region), + } +} + +func expectPackageNameConfigEndpoint() caseExpectations { + return caseExpectations{ + endpoint: packageNameConfigEndpoint, + } +} + +func expectAwsEnvVarEndpoint() caseExpectations { + return caseExpectations{ + endpoint: awsServiceEnvvarEndpoint, + } +} + +func expectBaseEnvVarEndpoint() caseExpectations { + return caseExpectations{ + endpoint: baseEnvvarEndpoint, + } +} + +func expectServiceConfigFileEndpoint() caseExpectations { + return caseExpectations{ + endpoint: serviceConfigFileEndpoint, + } +} + +func expectBaseConfigFileEndpoint() caseExpectations { + return caseExpectations{ + endpoint: baseConfigFileEndpoint, + } +} + +func testEndpointCase(t *testing.T, region string, testcase endpointTestCase, callF callFunc) { + t.Helper() + + ctx := context.Background() + + setup := caseSetup{ + config: map[string]any{}, + environmentVariables: map[string]string{}, + } + + for _, f := range testcase.with { + f(&setup) + } + + config := map[string]any{ + "access_key": servicemocks.MockStaticAccessKey, + "secret_key": servicemocks.MockStaticSecretKey, + "region": region, + "skip_credentials_validation": true, + "skip_requesting_account_id": true, + } + + maps.Copy(config, setup.config) + + if setup.configFile.baseUrl != "" || setup.configFile.serviceUrl != "" { + config["profile"] = "default" + tempDir := t.TempDir() + writeSharedConfigFile(t, &config, tempDir, generateSharedConfigFile(setup.configFile)) + } + + for k, v := range setup.environmentVariables { + t.Setenv(k, v) + } + + p, err := provider.New(ctx) + if err != nil { + t.Fatal(err) + } + + expectedDiags := testcase.expected.diags + expectedDiags = append( + expectedDiags, + errs.NewWarningDiagnostic( + "AWS account ID not found for provider", + "See https://registry.terraform.io/providers/hashicorp/aws/latest/docs#skip_requesting_account_id for implications.", + ), + ) + + diags := p.Configure(ctx, terraformsdk.NewResourceConfigRaw(config)) + + if diff := cmp.Diff(diags, expectedDiags, cmp.Comparer(sdkdiag.Comparer)); diff != "" { + t.Errorf("unexpected diagnostics difference: %s", diff) + } + + if diags.HasError() { + return + } + + meta := p.Meta().(*conns.AWSClient) + + endpoint := callF(ctx, t, meta) + + if endpoint != testcase.expected.endpoint { + t.Errorf("expected endpoint %q, got %q", testcase.expected.endpoint, endpoint) + } +} + +func addRetrieveEndpointURLMiddleware(t *testing.T, endpoint *string) func(*middleware.Stack) error { + return func(stack *middleware.Stack) error { + return stack.Finalize.Add( + retrieveEndpointURLMiddleware(t, endpoint), + middleware.After, + ) + } +} + +func retrieveEndpointURLMiddleware(t *testing.T, endpoint *string) middleware.FinalizeMiddleware { + return middleware.FinalizeMiddlewareFunc( + "Test: Retrieve Endpoint", + func(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (middleware.FinalizeOutput, middleware.Metadata, error) { + t.Helper() + + request, ok := in.Request.(*smithyhttp.Request) + if !ok { + t.Fatalf("Expected *github.com/aws/smithy-go/transport/http.Request, got %s", fullTypeName(in.Request)) + } + + url := request.URL + url.RawQuery = "" + url.Path = "/" + + *endpoint = url.String() + + return next.HandleFinalize(ctx, in) + }) +} + +var errCancelOperation = fmt.Errorf("Test: Cancelling request") + +func addCancelRequestMiddleware() func(*middleware.Stack) error { + return func(stack *middleware.Stack) error { + return stack.Finalize.Add( + cancelRequestMiddleware(), + middleware.After, + ) + } +} + +// cancelRequestMiddleware creates a Smithy middleware that intercepts the request before sending and cancels it +func cancelRequestMiddleware() middleware.FinalizeMiddleware { + return middleware.FinalizeMiddlewareFunc( + "Test: Cancel Requests", + func(_ context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (middleware.FinalizeOutput, middleware.Metadata, error) { + return middleware.FinalizeOutput{}, middleware.Metadata{}, errCancelOperation + }) +} + +func fullTypeName(i interface{}) string { + return fullValueTypeName(reflect.ValueOf(i)) +} + +func fullValueTypeName(v reflect.Value) string { + if v.Kind() == reflect.Ptr { + return "*" + fullValueTypeName(reflect.Indirect(v)) + } + + requestType := v.Type() + return fmt.Sprintf("%s.%s", requestType.PkgPath(), requestType.Name()) +} + +func generateSharedConfigFile(config configFile) string { + var buf strings.Builder + + buf.WriteString(` +[default] +aws_access_key_id = DefaultSharedCredentialsAccessKey +aws_secret_access_key = DefaultSharedCredentialsSecretKey +`) + if config.baseUrl != "" { + buf.WriteString(fmt.Sprintf("endpoint_url = %s\n", config.baseUrl)) + } + + if config.serviceUrl != "" { + buf.WriteString(fmt.Sprintf(` +services = endpoint-test + +[services endpoint-test] +%[1]s = + endpoint_url = %[2]s +`, configParam, serviceConfigFileEndpoint)) + } + + return buf.String() +} + +func writeSharedConfigFile(t *testing.T, config *map[string]any, tempDir, content string) string { + t.Helper() + + file, err := os.Create(filepath.Join(tempDir, "aws-sdk-go-base-shared-configuration-file")) + if err != nil { + t.Fatalf("creating shared configuration file: %s", err) + } + + _, err = file.WriteString(content) + if err != nil { + t.Fatalf(" writing shared configuration file: %s", err) + } + + if v, ok := (*config)["shared_config_files"]; !ok { + (*config)["shared_config_files"] = []any{file.Name()} + } else { + (*config)["shared_config_files"] = append(v.([]any), file.Name()) + } + + return file.Name() +} diff --git a/internal/service/chatbot/service_package.go b/internal/service/chatbot/service_package.go new file mode 100644 index 000000000000..c58dd9b36904 --- /dev/null +++ b/internal/service/chatbot/service_package.go @@ -0,0 +1,32 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package chatbot + +import ( + "context" + "slices" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/chatbot" + "github.com/hashicorp/terraform-provider-aws/names" +) + +// NewClient returns a new AWS SDK for Go v2 client for this service package's AWS API. +func (p *servicePackage) NewClient(ctx context.Context, config map[string]any) (*chatbot.Client, error) { + cfg := *(config["aws_sdkv2_config"].(*aws.Config)) + + return chatbot.NewFromConfig(cfg, func(o *chatbot.Options) { + if endpoint := config["endpoint"].(string); endpoint != "" { + o.BaseEndpoint = aws.String(endpoint) + } else if config["partition"].(string) == names.StandardPartitionID { + // Chatbot endpoint is available only in the 4 regions us-east-2, us-west-2, eu-west-1, and ap-southeast-1. + // If the region from the context is one of those four, then use that region. If not default to us-west-2 + if slices.Contains([]string{names.USEast2RegionID, names.USWest2RegionID, names.EUWest1RegionID, names.APSoutheast1RegionID}, cfg.Region) { + o.Region = cfg.Region + } else { + o.Region = names.USWest2RegionID + } + } + }), nil +} diff --git a/internal/service/chatbot/service_package_gen.go b/internal/service/chatbot/service_package_gen.go new file mode 100644 index 000000000000..7b8d9756cecf --- /dev/null +++ b/internal/service/chatbot/service_package_gen.go @@ -0,0 +1,37 @@ +// Code generated by internal/generate/servicepackages/main.go; DO NOT EDIT. + +package chatbot + +import ( + "context" + + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/types" + "github.com/hashicorp/terraform-provider-aws/names" +) + +type servicePackage struct{} + +func (p *servicePackage) FrameworkDataSources(ctx context.Context) []*types.ServicePackageFrameworkDataSource { + return []*types.ServicePackageFrameworkDataSource{} +} + +func (p *servicePackage) FrameworkResources(ctx context.Context) []*types.ServicePackageFrameworkResource { + return []*types.ServicePackageFrameworkResource{} +} + +func (p *servicePackage) SDKDataSources(ctx context.Context) []*types.ServicePackageSDKDataSource { + return []*types.ServicePackageSDKDataSource{} +} + +func (p *servicePackage) SDKResources(ctx context.Context) []*types.ServicePackageSDKResource { + return []*types.ServicePackageSDKResource{} +} + +func (p *servicePackage) ServicePackageName() string { + return names.Chatbot +} + +func ServicePackage(ctx context.Context) conns.ServicePackage { + return &servicePackage{} +} diff --git a/internal/sweep/service_packages_gen_test.go b/internal/sweep/service_packages_gen_test.go index 275ef2957bca..4fdc0af1c516 100644 --- a/internal/sweep/service_packages_gen_test.go +++ b/internal/sweep/service_packages_gen_test.go @@ -36,6 +36,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/service/bedrockagent" "github.com/hashicorp/terraform-provider-aws/internal/service/budgets" "github.com/hashicorp/terraform-provider-aws/internal/service/ce" + "github.com/hashicorp/terraform-provider-aws/internal/service/chatbot" "github.com/hashicorp/terraform-provider-aws/internal/service/chime" "github.com/hashicorp/terraform-provider-aws/internal/service/chimesdkmediapipelines" "github.com/hashicorp/terraform-provider-aws/internal/service/chimesdkvoice" @@ -273,6 +274,7 @@ func servicePackages(ctx context.Context) []conns.ServicePackage { bedrockagent.ServicePackage(ctx), budgets.ServicePackage(ctx), ce.ServicePackage(ctx), + chatbot.ServicePackage(ctx), chime.ServicePackage(ctx), chimesdkmediapipelines.ServicePackage(ctx), chimesdkvoice.ServicePackage(ctx), diff --git a/names/consts_gen.go b/names/consts_gen.go index 1eb470f5a846..56cd88f60795 100644 --- a/names/consts_gen.go +++ b/names/consts_gen.go @@ -32,6 +32,7 @@ const ( Budgets = "budgets" CE = "ce" CUR = "cur" + Chatbot = "chatbot" Chime = "chime" ChimeSDKMediaPipelines = "chimesdkmediapipelines" ChimeSDKVoice = "chimesdkvoice" @@ -269,6 +270,7 @@ const ( BudgetsServiceID = "Budgets" CEServiceID = "Cost Explorer" CURServiceID = "Cost and Usage Report Service" + ChatbotServiceID = "Chatbot" ChimeServiceID = "Chime" ChimeSDKMediaPipelinesServiceID = "Chime SDK Media Pipelines" ChimeSDKVoiceServiceID = "Chime SDK Voice" diff --git a/names/data/names_data.csv b/names/data/names_data.csv index 69f4a6c221e7..c3eb45e54b62 100644 --- a/names/data/names_data.csv +++ b/names/data/names_data.csv @@ -41,7 +41,7 @@ bcmdataexports,bcmdataexports,bcmdataexports,bcmdataexports,,bcmdataexports,,,BC billingconductor,billingconductor,billingconductor,,,billingconductor,,,BillingConductor,BillingConductor,,1,,,aws_billingconductor_,,billingconductor_,Billing Conductor,AWS,,x,,,,,billingconductor,,, braket,braket,braket,braket,,braket,,,Braket,Braket,,1,,,aws_braket_,,braket_,Braket,Amazon,,x,,,,,Braket,,, ce,ce,costexplorer,costexplorer,,ce,,costexplorer,CE,CostExplorer,,,2,,aws_ce_,,ce_,CE (Cost Explorer),AWS,,,,,,,Cost Explorer,ListCostCategoryDefinitions,, -,,,,,,,,,,,,,,,,,Chatbot,AWS,x,,,,,,,,,No SDK support +chatbot,chatbot,chatbot,chatbot,,chatbot,,,Chatbot,,x,,2,,aws_chatbot_,,chatbot_,Chatbot,AWS,,,,,,,Chatbot,GetAccountPreferences,, chime,chime,chime,chime,,chime,,,Chime,Chime,,1,,,aws_chime_,,chime_,Chime,Amazon,,,,,,,Chime,ListAccounts,, chime-sdk-identity,chimesdkidentity,chimesdkidentity,chimesdkidentity,,chimesdkidentity,,,ChimeSDKIdentity,ChimeSDKIdentity,,1,,,aws_chimesdkidentity_,,chimesdkidentity_,Chime SDK Identity,Amazon,,x,,,,,Chime SDK Identity,,, chime-sdk-mediapipelines,chimesdkmediapipelines,chimesdkmediapipelines,chimesdkmediapipelines,,chimesdkmediapipelines,,,ChimeSDKMediaPipelines,ChimeSDKMediaPipelines,,,2,,aws_chimesdkmediapipelines_,,chimesdkmediapipelines_,Chime SDK Media Pipelines,Amazon,,,,,,,Chime SDK Media Pipelines,ListMediaPipelines,, diff --git a/tools/tfsdk2fw/go.mod b/tools/tfsdk2fw/go.mod index e619f843d4cb..1bcdf6e97a01 100644 --- a/tools/tfsdk2fw/go.mod +++ b/tools/tfsdk2fw/go.mod @@ -18,7 +18,7 @@ require ( github.com/agext/levenshtein v1.2.3 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/armon/go-radix v1.0.0 // indirect - github.com/aws/aws-sdk-go v1.51.28 // indirect + github.com/aws/aws-sdk-go v1.51.29 // indirect github.com/aws/aws-sdk-go-v2 v1.26.1 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.11 // indirect @@ -51,6 +51,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/bedrock v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/bedrockagent v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/budgets v1.22.4 // indirect + github.com/aws/aws-sdk-go-v2/service/chatbot v1.1.5 // indirect github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines v1.15.5 // indirect github.com/aws/aws-sdk-go-v2/service/chimesdkvoice v1.14.4 // indirect github.com/aws/aws-sdk-go-v2/service/cleanrooms v1.12.0 // indirect @@ -105,7 +106,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/finspace v1.24.1 // indirect github.com/aws/aws-sdk-go-v2/service/firehose v1.28.6 // indirect github.com/aws/aws-sdk-go-v2/service/fis v1.24.2 // indirect - github.com/aws/aws-sdk-go-v2/service/fms v1.31.4 // indirect + github.com/aws/aws-sdk-go-v2/service/fms v1.32.0 // indirect github.com/aws/aws-sdk-go-v2/service/glacier v1.22.4 // indirect github.com/aws/aws-sdk-go-v2/service/globalaccelerator v1.23.1 // indirect github.com/aws/aws-sdk-go-v2/service/groundstation v1.27.0 // indirect @@ -151,7 +152,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/qbusiness v1.5.0 // indirect github.com/aws/aws-sdk-go-v2/service/qldb v1.21.4 // indirect github.com/aws/aws-sdk-go-v2/service/rbin v1.16.4 // indirect - github.com/aws/aws-sdk-go-v2/service/rds v1.77.2 // indirect + github.com/aws/aws-sdk-go-v2/service/rds v1.77.3 // indirect github.com/aws/aws-sdk-go-v2/service/redshift v1.44.0 // indirect github.com/aws/aws-sdk-go-v2/service/redshiftdata v1.25.4 // indirect github.com/aws/aws-sdk-go-v2/service/redshiftserverless v1.17.5 // indirect @@ -170,7 +171,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/securitylake v1.13.3 // indirect github.com/aws/aws-sdk-go-v2/service/servicecatalogappregistry v1.26.4 // indirect github.com/aws/aws-sdk-go-v2/service/servicequotas v1.21.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sesv2 v1.27.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sesv2 v1.27.4 // indirect github.com/aws/aws-sdk-go-v2/service/shield v1.25.4 // indirect github.com/aws/aws-sdk-go-v2/service/signer v1.22.6 // indirect github.com/aws/aws-sdk-go-v2/service/sns v1.29.4 // indirect diff --git a/tools/tfsdk2fw/go.sum b/tools/tfsdk2fw/go.sum index fa7c3290f2ab..0789cd24ac50 100644 --- a/tools/tfsdk2fw/go.sum +++ b/tools/tfsdk2fw/go.sum @@ -22,8 +22,8 @@ github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.51.28 h1:x3CV5xjnL4EbVLaPXulBOxqiq2dkc9o6+50xxT3tvXY= -github.com/aws/aws-sdk-go v1.51.28/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/aws/aws-sdk-go v1.51.29 h1:18I5kjEcbyJOH4l2EjQyJJG6v3uPjrzwG0uiSD3vJEM= +github.com/aws/aws-sdk-go v1.51.29/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= @@ -88,6 +88,8 @@ github.com/aws/aws-sdk-go-v2/service/bedrockagent v1.8.0 h1:CWprual/fBYNa9Mvf8rl github.com/aws/aws-sdk-go-v2/service/bedrockagent v1.8.0/go.mod h1:6CwV+GE3wrFqkrU2LB8cajHMWJn7jFFhRtxBQiOZ5kw= github.com/aws/aws-sdk-go-v2/service/budgets v1.22.4 h1:sVv+p2Wo+sUXa8dC1pCMJ/+9ncOriq8EiRWvAkOuaLY= github.com/aws/aws-sdk-go-v2/service/budgets v1.22.4/go.mod h1:JFS3MaNoisHXHQm5/xRQjj1tICixIgT8Vv32D0lV5NE= +github.com/aws/aws-sdk-go-v2/service/chatbot v1.1.5 h1:ZP/RF+wQiit1QP3DAqaJLgCJDXpJXu2xvdsgrh5ds+s= +github.com/aws/aws-sdk-go-v2/service/chatbot v1.1.5/go.mod h1:Lc//jOTNN9f39SHfFxtRSzfy1Do4GSz+1jZHT2hKdMs= github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines v1.15.5 h1:FgeK3aPbB/ARkhxUXfSn9d2ibb4Q9kUhHl/dWwqIy8Y= github.com/aws/aws-sdk-go-v2/service/chimesdkmediapipelines v1.15.5/go.mod h1:yPGCqtEO6NNwd6kebco4VSvyHkKbjjwd7K6g49Ze/Uw= github.com/aws/aws-sdk-go-v2/service/chimesdkvoice v1.14.4 h1:rea/sazWAyaUXPcbSCBDGKM1Kb6YiU25xvNnN0p7AyM= @@ -196,8 +198,8 @@ github.com/aws/aws-sdk-go-v2/service/firehose v1.28.6 h1:CRmkhpMI1lamkPYyg64imP7 github.com/aws/aws-sdk-go-v2/service/firehose v1.28.6/go.mod h1:78F+4pVJf6Qlg7a34oR2I2SpM/v0EUSAL/htTZ9trg4= github.com/aws/aws-sdk-go-v2/service/fis v1.24.2 h1:1QesvhdcRDCJYFCuUcQ8XbBEZXRZQXrAlkPdWov07dc= github.com/aws/aws-sdk-go-v2/service/fis v1.24.2/go.mod h1:ISG70NA5WILagob8et1PhuyC+4lWLflITLzWWPFLXoE= -github.com/aws/aws-sdk-go-v2/service/fms v1.31.4 h1:gY+Dp2QdphY6m5IVkETmsNauYztd62piL9az5B6rVtQ= -github.com/aws/aws-sdk-go-v2/service/fms v1.31.4/go.mod h1:X4DjA4sm8cobhR9DtHn947+dLYxU1oWq3zwRZUmFSLo= +github.com/aws/aws-sdk-go-v2/service/fms v1.32.0 h1:I16KtX4iigW3hrkW7zw4jXVqsoXZuOMhGd924KXJjo8= +github.com/aws/aws-sdk-go-v2/service/fms v1.32.0/go.mod h1:X4DjA4sm8cobhR9DtHn947+dLYxU1oWq3zwRZUmFSLo= github.com/aws/aws-sdk-go-v2/service/glacier v1.22.4 h1:y0/RN8LwIbyDTPe/dnDBdsCw89ko8ZNFPW4vStye4aE= github.com/aws/aws-sdk-go-v2/service/glacier v1.22.4/go.mod h1:8ofkOuh1SZLKR5EdfxPhQ1UgaQuCBAZzUwbeIBmeKIM= github.com/aws/aws-sdk-go-v2/service/globalaccelerator v1.23.1 h1:E48tPAIKptyIb8OFOAsZ3xSzjwou8A63f40ao1H3tVU= @@ -288,8 +290,8 @@ github.com/aws/aws-sdk-go-v2/service/qldb v1.21.4 h1:h/Jmsgx2BVIBzN3CvEmU37bQ1y4 github.com/aws/aws-sdk-go-v2/service/qldb v1.21.4/go.mod h1:T789CzkMLwKq1b5MxcUfQeoUisJ6jJhciaZTtAQtUOU= github.com/aws/aws-sdk-go-v2/service/rbin v1.16.4 h1:f5RY4vrfqBG5nmgSiEejpFOeWfzkCXd+EpOsRdL4W+I= github.com/aws/aws-sdk-go-v2/service/rbin v1.16.4/go.mod h1:BUtbswz07qEjzGypmeUdtP53noKx1PBKAnX9Fe0Mul4= -github.com/aws/aws-sdk-go-v2/service/rds v1.77.2 h1:d9GrRZEoi11Aa6az++UC6JsauTN7CscLDuNb/fxcttU= -github.com/aws/aws-sdk-go-v2/service/rds v1.77.2/go.mod h1:Rw15qGaGWu3jO0dOz7JyvdOEjgae//YrJxVWLYGynvg= +github.com/aws/aws-sdk-go-v2/service/rds v1.77.3 h1:c5TjKZ2vPbvH4kMxT/vJGEQI2p96n+613qodYUggL4E= +github.com/aws/aws-sdk-go-v2/service/rds v1.77.3/go.mod h1:Rw15qGaGWu3jO0dOz7JyvdOEjgae//YrJxVWLYGynvg= github.com/aws/aws-sdk-go-v2/service/redshift v1.44.0 h1:j18lTPPqe+qlapn1R8//+ujvXdplku8V41xzBNNLtn0= github.com/aws/aws-sdk-go-v2/service/redshift v1.44.0/go.mod h1:8ldsMsikORLj0GZUozSvbQdctrumAPYhizmj/3AAATI= github.com/aws/aws-sdk-go-v2/service/redshiftdata v1.25.4 h1:Rnz5skILimGue5zJ8txb5Mr9JLjznYJFKgK0r/n3AI0= @@ -326,8 +328,8 @@ github.com/aws/aws-sdk-go-v2/service/servicecatalogappregistry v1.26.4 h1:LKjHBV github.com/aws/aws-sdk-go-v2/service/servicecatalogappregistry v1.26.4/go.mod h1:t343bjk9DYrn8Y7+xRS55VQ45hoicK+mPO/4W/qVfDM= github.com/aws/aws-sdk-go-v2/service/servicequotas v1.21.4 h1:SSDkZRAO8Ok5SoQ4BJ0onDeb0ga8JBOCkUmNEpRChcw= github.com/aws/aws-sdk-go-v2/service/servicequotas v1.21.4/go.mod h1:plXue/Zg49kU3uU6WwfCWgRR5SRINNiJf03Y/UhYOhU= -github.com/aws/aws-sdk-go-v2/service/sesv2 v1.27.3 h1:8KP71cUPALMQxs8lhGiWcwdtqv1wsogigS7StDHq0IE= -github.com/aws/aws-sdk-go-v2/service/sesv2 v1.27.3/go.mod h1:WIpmp3q5Iw1AEhotd5OL03OFc0kOUoLPcqKFzcAOImU= +github.com/aws/aws-sdk-go-v2/service/sesv2 v1.27.4 h1:l3EQdfqEnoSUtFp2SIcSy4NIg4/I55vBq6NuHLyGnTI= +github.com/aws/aws-sdk-go-v2/service/sesv2 v1.27.4/go.mod h1:WIpmp3q5Iw1AEhotd5OL03OFc0kOUoLPcqKFzcAOImU= github.com/aws/aws-sdk-go-v2/service/shield v1.25.4 h1:YgXvfrcJipAAlMJYg1Iyen4pZI9DoFENQp2FtrJF+HY= github.com/aws/aws-sdk-go-v2/service/shield v1.25.4/go.mod h1:KizNr+ORjXFVELwvx3ubt49LMeTeBXm9EbhUcDXvHa8= github.com/aws/aws-sdk-go-v2/service/signer v1.22.6 h1:qwUj3Ic2mKUWW7r+za9g3K/877srDKBhpU0L1u5slhM= diff --git a/website/allowed-subcategories.txt b/website/allowed-subcategories.txt index 1c6c8c92a1fb..7d4ccda4a3fa 100644 --- a/website/allowed-subcategories.txt +++ b/website/allowed-subcategories.txt @@ -26,6 +26,7 @@ BCM Data Exports Backup Batch CE (Cost Explorer) +Chatbot Chime Chime SDK Media Pipelines Chime SDK Voice diff --git a/website/docs/guides/custom-service-endpoints.html.markdown b/website/docs/guides/custom-service-endpoints.html.markdown index 78b92bf82df0..6eb238884c62 100644 --- a/website/docs/guides/custom-service-endpoints.html.markdown +++ b/website/docs/guides/custom-service-endpoints.html.markdown @@ -99,6 +99,7 @@ provider "aws" {
  • bedrockagent
  • budgets
  • ce (or costexplorer)
  • +
  • chatbot
  • chime
  • chimesdkmediapipelines
  • chimesdkvoice