From bf4df5d94e4d2c1d351893b0a41edb48ec1920e5 Mon Sep 17 00:00:00 2001 From: Sherzod Karimov Date: Fri, 8 Dec 2023 14:50:59 -0500 Subject: [PATCH 01/23] run generation --- datadog/fwprovider/framework_provider.go | 1 + ...ce_datadog_integration_aws_event_bridge.go | 206 ++++++++++++++++++ ...tadog_integration_aws_event_bridge_test.go | 104 +++++++++ .../import.sh | 1 + .../resource.tf | 10 + 5 files changed, 322 insertions(+) create mode 100644 datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go create mode 100644 datadog/tests/resource_datadog_integration_aws_event_bridge_test.go create mode 100644 examples/resources/datadog_integration_aws_event_bridge/import.sh create mode 100644 examples/resources/datadog_integration_aws_event_bridge/resource.tf diff --git a/datadog/fwprovider/framework_provider.go b/datadog/fwprovider/framework_provider.go index b09517da93..f984305507 100644 --- a/datadog/fwprovider/framework_provider.go +++ b/datadog/fwprovider/framework_provider.go @@ -38,6 +38,7 @@ var Resources = []func() resource.Resource{ NewApmRetentionFiltersOrderResource, NewDowntimeScheduleResource, NewIntegrationAzureResource, + NewIntegrationAwsEventBridgeResource, NewIntegrationCloudflareAccountResource, NewIntegrationConfluentAccountResource, NewIntegrationConfluentResourceResource, diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go new file mode 100644 index 0000000000..12c9203156 --- /dev/null +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -0,0 +1,206 @@ +package fwprovider + +import ( + "context" + + "github.com/DataDog/datadog-api-client-go/v2/api/datadogV1" + "github.com/hashicorp/terraform-plugin-framework/diag" + frameworkPath "github.com/hashicorp/terraform-plugin-framework/path" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/types" + + "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils" +) + +var ( + _ resource.ResourceWithConfigure = &integrationAwsEventBridgeResource{} + _ resource.ResourceWithImportState = &integrationAwsEventBridgeResource{} +) + +type integrationAwsEventBridgeResource struct { + Api *datadogV1.AWSIntegrationApi + Auth context.Context +} + +type integrationAwsEventBridgeModel struct { + ID types.String `tfsdk:"id"` + AccountId types.String `tfsdk:"account_id"` + CreateEventBus types.Bool `tfsdk:"create_event_bus"` + EventGeneratorName types.String `tfsdk:"event_generator_name"` + Region types.String `tfsdk:"region"` +} + +func NewIntegrationAwsEventBridgeResource() resource.Resource { + return &integrationAwsEventBridgeResource{} +} + +func (r *integrationAwsEventBridgeResource) Configure(_ context.Context, request resource.ConfigureRequest, response *resource.ConfigureResponse) { + providerData, _ := request.ProviderData.(*FrameworkProvider) + r.Api = providerData.DatadogApiInstances.GetAWSIntegrationApiV1() + r.Auth = providerData.Auth +} + +func (r *integrationAwsEventBridgeResource) Metadata(_ context.Context, request resource.MetadataRequest, response *resource.MetadataResponse) { + response.TypeName = "integration_aws_event_bridge" +} + +func (r *integrationAwsEventBridgeResource) Schema(_ context.Context, _ resource.SchemaRequest, response *resource.SchemaResponse) { + response.Schema = schema.Schema{ + Description: "Provides a Datadog IntegrationAwsEventBridge resource. This can be used to create and manage Datadog integration_aws_event_bridge.", + Attributes: map[string]schema.Attribute{ + "account_id": schema.StringAttribute{ + Optional: true, + Description: "Your AWS Account ID without dashes.", + }, + "create_event_bus": schema.BoolAttribute{ + Optional: true, + Description: "True if Datadog should create the event bus in addition to the event source. Requires the `events:CreateEventBus` permission.", + }, + "event_generator_name": schema.StringAttribute{ + Optional: true, + Description: "The given part of the event source name, which is then combined with an assigned suffix to form the full name.", + }, + "region": schema.StringAttribute{ + Optional: true, + Description: "The event source's [AWS region](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints).", + }, + "id": utils.ResourceIDAttribute(), + }, + } +} + +func (r *integrationAwsEventBridgeResource) ImportState(ctx context.Context, request resource.ImportStateRequest, response *resource.ImportStateResponse) { + resource.ImportStatePassthroughID(ctx, frameworkPath.Root("id"), request, response) +} + +func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request resource.ReadRequest, response *resource.ReadResponse) { + var state integrationAwsEventBridgeModel + response.Diagnostics.Append(request.State.Get(ctx, &state)...) + if response.Diagnostics.HasError() { + return + } + resp, httpResp, err := r.Api.ListAWSEventBridgeSources(r.Auth) + if err != nil { + if httpResp != nil && httpResp.StatusCode == 404 { + response.State.RemoveResource(ctx) + return + } + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving IntegrationAwsEventBridge")) + return + } + if err := utils.CheckForUnparsed(resp); err != nil { + response.Diagnostics.AddError("response contains unparsedObject", err.Error()) + return + } + + r.updateState(ctx, &state, &resp) + + // Save data into Terraform state + response.Diagnostics.Append(response.State.Set(ctx, &state)...) +} + +func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request resource.CreateRequest, response *resource.CreateResponse) { + var state integrationAwsEventBridgeModel + response.Diagnostics.Append(request.Plan.Get(ctx, &state)...) + if response.Diagnostics.HasError() { + return + } + + body, diags := r.buildIntegrationAwsEventBridgeRequestBody(ctx, &state) + response.Diagnostics.Append(diags...) + if response.Diagnostics.HasError() { + return + } + + resp, _, err := r.Api.CreateAWSEventBridgeSource(r.Auth, *body) + if err != nil { + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving IntegrationAwsEventBridge")) + return + } + if err := utils.CheckForUnparsed(resp); err != nil { + response.Diagnostics.AddError("response contains unparsedObject", err.Error()) + return + } + r.updateState(ctx, &state, &resp) + + // Save data into Terraform state + response.Diagnostics.Append(response.State.Set(ctx, &state)...) +} + +func (r *integrationAwsEventBridgeResource) Update(ctx context.Context, request resource.UpdateRequest, response *resource.UpdateResponse) { +} + +func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request resource.DeleteRequest, response *resource.DeleteResponse) { + var state integrationAwsEventBridgeModel + response.Diagnostics.Append(request.State.Get(ctx, &state)...) + if response.Diagnostics.HasError() { + return + } + body := datadogV1.NewAWSEventBridgeDeleteRequestWithDefaults() + + _, httpResp, err := r.Api.DeleteAWSEventBridgeSource(r.Auth, body) + if err != nil { + if httpResp != nil && httpResp.StatusCode == 404 { + return + } + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error deleting integration_aws_event_bridge")) + return + } +} + +func (r *integrationAwsEventBridgeResource) updateState(ctx context.Context, state *integrationAwsEventBridgeModel, resp *datadogV1.AWSEventBridgeListResponse) { + state.ID = types.StringValue(resp.GetUpdateMe()) + + if isInstalled, ok := resp.GetIsInstalledOk(); ok { + state.IsInstalled = types.BoolValue(*isInstalled) + } + + if accounts, ok := resp.GetAccountsOk(); ok && len(*accounts) > 0 { + state.Accounts = []*accountsModel{} + for _, accountsDd := range *accounts { + accountsTfItem := accountsModel{} + if accountId, ok := accountsDd.GetAccountIdOk(); ok { + accountsTfItem.AccountId = types.StringValue(*accountId) + } + if eventHubs, ok := accountsDd.GetEventHubsOk(); ok && len(*eventHubs) > 0 { + accountsTfItem.EventHubs = []*eventHubsModel{} + for _, eventHubsDd := range *eventHubs { + eventHubsTfItem := eventHubsModel{} + if name, ok := eventHubsDd.GetNameOk(); ok { + eventHubsTfItem.Name = types.StringValue(*name) + } + if region, ok := eventHubsDd.GetRegionOk(); ok { + eventHubsTfItem.Region = types.StringValue(*region) + } + + accountsTfItem.EventHubs = append(accountsTfItem.EventHubs, &eventHubsTfItem) + } + } + if tags, ok := accountsDd.GetTagsOk(); ok && len(*tags) > 0 { + accountsTfItem.Tags, _ = types.ListValueFrom(ctx, types.StringType, *tags) + } + + state.Accounts = append(state.Accounts, &accountsTfItem) + } + } +} + +func (r *integrationAwsEventBridgeResource) buildIntegrationAwsEventBridgeRequestBody(ctx context.Context, state *integrationAwsEventBridgeModel) (*datadogV1.AWSEventBridgeCreateRequest, diag.Diagnostics) { + diags := diag.Diagnostics{} + + if !state.AccountId.IsNull() { + req.SetAccountId(state.AccountId.ValueString()) + } + if !state.CreateEventBus.IsNull() { + req.SetCreateEventBus(state.CreateEventBus.ValueBool()) + } + if !state.EventGeneratorName.IsNull() { + req.SetEventGeneratorName(state.EventGeneratorName.ValueString()) + } + if !state.Region.IsNull() { + req.SetRegion(state.Region.ValueString()) + } + + return req, diags +} diff --git a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go new file mode 100644 index 0000000000..f076b1434f --- /dev/null +++ b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go @@ -0,0 +1,104 @@ +package test + +import ( + "context" + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/terraform" + + "github.com/terraform-providers/terraform-provider-datadog/datadog" + "github.com/terraform-providers/terraform-provider-datadog/datadog/fwprovider" + "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils" +) + +func TestAccIntegrationAwsEventBridgeBasic(t *testing.T) { + t.Parallel() + ctx, providers, accProviders := testAccFrameworkMuxProviders(context.Background(), t) + uniq := uniqueEntityName(ctx, t) + + resource.Test(t, resource.TestCase{ + ProtoV5ProviderFactories: accProviders, + CheckDestroy: testAccCheckDatadogIntegrationAwsEventBridgeDestroy(providers.frameworkProvider), + Steps: []resource.TestStep{ + { + Config: testAccCheckDatadogIntegrationAwsEventBridge(uniq), + Check: resource.ComposeTestCheckFunc( + testAccCheckDatadogIntegrationAwsEventBridgeExists(providers.frameworkProvider), + ), + }, + }, + }) +} + +func testAccCheckDatadogIntegrationAwsEventBridge(uniq string) string { + // Update me to make use of the unique value + return fmt.Sprintf(`resource "datadog_integration_aws_event_bridge" "foo" { + body { + account_id = "123456789012" + create_event_bus = True + event_generator_name = "app-alerts" + region = "us-east-1" + } +}`, uniq) +} + +func testAccCheckDatadogIntegrationAwsEventBridgeDestroy(accProvider *fwprovider.FrameworkProvider) func(*terraform.State) error { + return func(s *terraform.State) error { + apiInstances := accProvider.DatadogApiInstances + auth := accProvider.Auth + + if err := IntegrationAwsEventBridgeDestroyHelper(auth, s, apiInstances); err != nil { + return err + } + return nil + } +} + +func IntegrationAwsEventBridgeDestroyHelper(auth context.Context, s *terraform.State, apiInstances *utils.ApiInstances) error { + err := utils.Retry(2, 10, func() error { + for _, r := range s.RootModule().Resources { + if r.Type != "resource_datadog_integration_aws_event_bridge" { + continue + } + + _, httpResp, err := apiInstances.GetAWSIntegrationApiV1().ListAWSEventBridgeSources(auth) + if err != nil { + if httpResp != nil && httpResp.StatusCode == 404 { + return nil + } + return &utils.RetryableError{Prob: fmt.Sprintf("received an error retrieving IntegrationAwsEventBridge %s", err)} + } + return &utils.RetryableError{Prob: "IntegrationAwsEventBridge still exists"} + } + return nil + }) + return err +} + +func testAccCheckDatadogIntegrationAwsEventBridgeExists(accProvider *fwprovider.FrameworkProvider) resource.TestCheckFunc { + return func(s *terraform.State) error { + apiInstances := accProvider.DatadogApiInstances + auth := accProvider.Auth + + if err := integrationAwsEventBridgeExistsHelper(auth, s, apiInstances); err != nil { + return err + } + return nil + } +} + +func integrationAwsEventBridgeExistsHelper(auth context.Context, s *terraform.State, apiInstances *utils.ApiInstances) error { + for _, r := range s.RootModule().Resources { + if r.Type != "resource_datadog_integration_aws_event_bridge" { + continue + } + + _, httpResp, err := apiInstances.GetAWSIntegrationApiV1().ListAWSEventBridgeSources(auth) + if err != nil { + return utils.TranslateClientError(err, httpResp, "error retrieving IntegrationAwsEventBridge") + } + } + return nil +} diff --git a/examples/resources/datadog_integration_aws_event_bridge/import.sh b/examples/resources/datadog_integration_aws_event_bridge/import.sh new file mode 100644 index 0000000000..a3c2e34a06 --- /dev/null +++ b/examples/resources/datadog_integration_aws_event_bridge/import.sh @@ -0,0 +1 @@ +terraform import datadog_integration_aws_event_bridge.new_list "UPDATE_ME" \ No newline at end of file diff --git a/examples/resources/datadog_integration_aws_event_bridge/resource.tf b/examples/resources/datadog_integration_aws_event_bridge/resource.tf new file mode 100644 index 0000000000..81a8bd6629 --- /dev/null +++ b/examples/resources/datadog_integration_aws_event_bridge/resource.tf @@ -0,0 +1,10 @@ +# Create new integration_aws_event_bridge resource + +resource "datadog_integration_aws_event_bridge" "foo" { + body { + account_id = "123456789012" + create_event_bus = True + event_generator_name = "app-alerts" + region = "us-east-1" + } +} \ No newline at end of file From 9055325dec9d60173c7521d4367c5f7e1e48d890 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Mon, 18 Dec 2023 14:55:40 -0500 Subject: [PATCH 02/23] WIP - Update to handle eventbridge api request and response data --- ...ce_datadog_integration_aws_event_bridge.go | 66 ++++++++----------- ...tadog_integration_aws_event_bridge_test.go | 1 - 2 files changed, 27 insertions(+), 40 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index 12c9203156..9b939abd61 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -94,7 +94,7 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re return } - r.updateState(ctx, &state, &resp) + r.updateStateAfterRead(ctx, &state, &resp) // Save data into Terraform state response.Diagnostics.Append(response.State.Set(ctx, &state)...) @@ -122,7 +122,7 @@ func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request response.Diagnostics.AddError("response contains unparsedObject", err.Error()) return } - r.updateState(ctx, &state, &resp) + r.updateStateAfterWrite(ctx, &state, &resp) // Save data into Terraform state response.Diagnostics.Append(response.State.Set(ctx, &state)...) @@ -139,7 +139,7 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request } body := datadogV1.NewAWSEventBridgeDeleteRequestWithDefaults() - _, httpResp, err := r.Api.DeleteAWSEventBridgeSource(r.Auth, body) + _, httpResp, err := r.Api.DeleteAWSEventBridgeSource(r.Auth, *body) if err != nil { if httpResp != nil && httpResp.StatusCode == 404 { return @@ -148,46 +148,34 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request return } } +func (r *integrationAwsEventBridgeResource) updateStateAfterRead(ctx context.Context, state *integrationAwsEventBridgeModel, resp *datadogV1.AWSEventBridgeListResponse) { -func (r *integrationAwsEventBridgeResource) updateState(ctx context.Context, state *integrationAwsEventBridgeModel, resp *datadogV1.AWSEventBridgeListResponse) { - state.ID = types.StringValue(resp.GetUpdateMe()) - - if isInstalled, ok := resp.GetIsInstalledOk(); ok { - state.IsInstalled = types.BoolValue(*isInstalled) - } - - if accounts, ok := resp.GetAccountsOk(); ok && len(*accounts) > 0 { - state.Accounts = []*accountsModel{} - for _, accountsDd := range *accounts { - accountsTfItem := accountsModel{} - if accountId, ok := accountsDd.GetAccountIdOk(); ok { - accountsTfItem.AccountId = types.StringValue(*accountId) - } - if eventHubs, ok := accountsDd.GetEventHubsOk(); ok && len(*eventHubs) > 0 { - accountsTfItem.EventHubs = []*eventHubsModel{} - for _, eventHubsDd := range *eventHubs { - eventHubsTfItem := eventHubsModel{} - if name, ok := eventHubsDd.GetNameOk(); ok { - eventHubsTfItem.Name = types.StringValue(*name) - } - if region, ok := eventHubsDd.GetRegionOk(); ok { - eventHubsTfItem.Region = types.StringValue(*region) - } - - accountsTfItem.EventHubs = append(accountsTfItem.EventHubs, &eventHubsTfItem) - } - } - if tags, ok := accountsDd.GetTagsOk(); ok && len(*tags) > 0 { - accountsTfItem.Tags, _ = types.ListValueFrom(ctx, types.StringType, *tags) - } - - state.Accounts = append(state.Accounts, &accountsTfItem) + /* + if isInstalled, ok := resp.GetIsInstalledOk(); ok { + state.IsInstalled = types.BoolValue(*isInstalled) } + */ +} + +func (r *integrationAwsEventBridgeResource) updateStateAfterWrite(ctx context.Context, state *integrationAwsEventBridgeModel, resp *datadogV1.AWSEventBridgeCreateResponse) { + + if createEventBus, ok := resp.GetHasBusOk(); ok { + state.CreateEventBus = types.BoolValue(*createEventBus) + } + + if eventSourceName, ok := resp.GetEventSourceNameOk(); ok { + // Use EventSourceName as ID + state.ID = types.StringValue(*eventSourceName) + } + + if region, ok := resp.GetRegionOk(); ok { + state.Region = types.StringValue(*region) } } func (r *integrationAwsEventBridgeResource) buildIntegrationAwsEventBridgeRequestBody(ctx context.Context, state *integrationAwsEventBridgeModel) (*datadogV1.AWSEventBridgeCreateRequest, diag.Diagnostics) { diags := diag.Diagnostics{} + req := datadogV1.NewAWSEventBridgeCreateRequestWithDefaults() if !state.AccountId.IsNull() { req.SetAccountId(state.AccountId.ValueString()) @@ -195,12 +183,12 @@ func (r *integrationAwsEventBridgeResource) buildIntegrationAwsEventBridgeReques if !state.CreateEventBus.IsNull() { req.SetCreateEventBus(state.CreateEventBus.ValueBool()) } - if !state.EventGeneratorName.IsNull() { - req.SetEventGeneratorName(state.EventGeneratorName.ValueString()) - } if !state.Region.IsNull() { req.SetRegion(state.Region.ValueString()) } + if !state.EventGeneratorName.IsNull() { + req.SetEventGeneratorName(state.EventGeneratorName.ValueString()) + } return req, diags } diff --git a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go index f076b1434f..6ad14fe3ce 100644 --- a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go +++ b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go @@ -8,7 +8,6 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - "github.com/terraform-providers/terraform-provider-datadog/datadog" "github.com/terraform-providers/terraform-provider-datadog/datadog/fwprovider" "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils" ) From 411d3842117a38fef9d91a4592a02599dd6ec696 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Mon, 18 Dec 2023 17:01:37 -0500 Subject: [PATCH 03/23] Update tests --- datadog/tests/provider_test.go | 1 + .../resource_datadog_integration_aws_event_bridge_test.go | 7 ++----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/datadog/tests/provider_test.go b/datadog/tests/provider_test.go index 4ca0d65cf4..1ae6f4e789 100644 --- a/datadog/tests/provider_test.go +++ b/datadog/tests/provider_test.go @@ -173,6 +173,7 @@ var testFiles2EndpointTags = map[string]string{ "tests/resource_datadog_integration_aws_log_collection_test": "integration-aws", "tests/resource_datadog_integration_aws_tag_filter_test": "integration-aws", "tests/resource_datadog_integration_aws_test": "integration-aws", + "tests/resource_datadog_integration_aws_event_bridge_test": "integration-aws", "tests/resource_datadog_integration_azure_test": "integration-azure", "tests/resource_datadog_integration_cloudflare_account_test": "integration-cloudflare", "tests/resource_datadog_integration_confluent_account_test": "integration-confluend-account", diff --git a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go index 6ad14fe3ce..37bb60f20d 100644 --- a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go +++ b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go @@ -32,14 +32,11 @@ func TestAccIntegrationAwsEventBridgeBasic(t *testing.T) { } func testAccCheckDatadogIntegrationAwsEventBridge(uniq string) string { - // Update me to make use of the unique value return fmt.Sprintf(`resource "datadog_integration_aws_event_bridge" "foo" { - body { account_id = "123456789012" - create_event_bus = True + create_event_bus = true event_generator_name = "app-alerts" - region = "us-east-1" - } + region = %s }`, uniq) } From 5f6f5235170dc82043b3c0c8ee0b94a8e78d60b5 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 19 Dec 2023 12:20:35 -0500 Subject: [PATCH 04/23] Update error message --- .../resource_datadog_integration_aws_event_bridge.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index 9b939abd61..5ee50c9be5 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -86,7 +86,7 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re response.State.RemoveResource(ctx) return } - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving IntegrationAwsEventBridge")) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error listing AWS Event Bridge Sources")) return } if err := utils.CheckForUnparsed(resp); err != nil { @@ -115,7 +115,7 @@ func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request resp, _, err := r.Api.CreateAWSEventBridgeSource(r.Auth, *body) if err != nil { - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error retrieving IntegrationAwsEventBridge")) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error creating AWS Event Bridge Source")) return } if err := utils.CheckForUnparsed(resp); err != nil { @@ -144,7 +144,7 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request if httpResp != nil && httpResp.StatusCode == 404 { return } - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "error deleting integration_aws_event_bridge")) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error deleting AWS Event Bridge Source")) return } } From 571533f82f8791168fe1ae61fc9aca720a92d736 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 19 Dec 2023 13:14:38 -0500 Subject: [PATCH 05/23] Fix delete request --- ...urce_datadog_integration_aws_event_bridge.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index 5ee50c9be5..81d17a2b9c 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -84,6 +84,7 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re if err != nil { if httpResp != nil && httpResp.StatusCode == 404 { response.State.RemoveResource(ctx) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Event Bridge Source not found")) return } response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error listing AWS Event Bridge Sources")) @@ -137,17 +138,29 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request if response.Diagnostics.HasError() { return } - body := datadogV1.NewAWSEventBridgeDeleteRequestWithDefaults() + req := datadogV1.NewAWSEventBridgeDeleteRequestWithDefaults() - _, httpResp, err := r.Api.DeleteAWSEventBridgeSource(r.Auth, *body) + if !state.AccountId.IsNull() { + req.SetAccountId(state.AccountId.ValueString()) + } + if !state.Region.IsNull() { + req.SetRegion(state.Region.ValueString()) + } + if !state.EventGeneratorName.IsNull() { + req.SetEventGeneratorName(state.EventGeneratorName.ValueString()) + } + + _, httpResp, err := r.Api.DeleteAWSEventBridgeSource(r.Auth, *req) if err != nil { if httpResp != nil && httpResp.StatusCode == 404 { + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "AWS Event Bridge Source not found")) return } response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error deleting AWS Event Bridge Source")) return } } + func (r *integrationAwsEventBridgeResource) updateStateAfterRead(ctx context.Context, state *integrationAwsEventBridgeModel, resp *datadogV1.AWSEventBridgeListResponse) { /* From 2e7a6429ed2a1ce44418eb8c9c534d60997d6352 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 19 Dec 2023 13:38:11 -0500 Subject: [PATCH 06/23] Fix example --- .../datadog_integration_aws_event_bridge/resource.tf | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/examples/resources/datadog_integration_aws_event_bridge/resource.tf b/examples/resources/datadog_integration_aws_event_bridge/resource.tf index 81a8bd6629..a8e891a4b2 100644 --- a/examples/resources/datadog_integration_aws_event_bridge/resource.tf +++ b/examples/resources/datadog_integration_aws_event_bridge/resource.tf @@ -1,10 +1,8 @@ # Create new integration_aws_event_bridge resource resource "datadog_integration_aws_event_bridge" "foo" { - body { - account_id = "123456789012" - create_event_bus = True - event_generator_name = "app-alerts" - region = "us-east-1" - } -} \ No newline at end of file + account_id = "123456789012" + create_event_bus = true + event_generator_name = "app-alerts" + region = "us-east-1" +} From 19cfc39d38983394b806309b3dc74fb2d1b966ec Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Wed, 20 Dec 2023 16:14:57 -0500 Subject: [PATCH 07/23] Fix delete request to use constructed ID instead of user supplied name --- .../resource_datadog_integration_aws_event_bridge.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index 81d17a2b9c..b68fc789b7 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -147,7 +147,8 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request req.SetRegion(state.Region.ValueString()) } if !state.EventGeneratorName.IsNull() { - req.SetEventGeneratorName(state.EventGeneratorName.ValueString()) + // EventGeneratorName in DeleteRequest is the constructed full name, stored as ID in state + req.SetEventGeneratorName(state.ID.ValueString()) } _, httpResp, err := r.Api.DeleteAWSEventBridgeSource(r.Auth, *req) From 45a6862a89ba2c0c727ae640274db92882a1a351 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Thu, 21 Dec 2023 16:46:55 -0500 Subject: [PATCH 08/23] Delete and import are working --- ...ce_datadog_integration_aws_event_bridge.go | 62 ++++++++++++++----- ...tadog_integration_aws_event_bridge_test.go | 19 ++++-- 2 files changed, 60 insertions(+), 21 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index b68fc789b7..f906ee8708 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -8,6 +8,7 @@ import ( frameworkPath "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils" @@ -47,23 +48,25 @@ func (r *integrationAwsEventBridgeResource) Metadata(_ context.Context, request func (r *integrationAwsEventBridgeResource) Schema(_ context.Context, _ resource.SchemaRequest, response *resource.SchemaResponse) { response.Schema = schema.Schema{ - Description: "Provides a Datadog IntegrationAwsEventBridge resource. This can be used to create and manage Datadog integration_aws_event_bridge.", + Description: "Provides a datadog_integration_aws_event_bridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account.", Attributes: map[string]schema.Attribute{ "account_id": schema.StringAttribute{ - Optional: true, Description: "Your AWS Account ID without dashes.", + Required: true, }, "create_event_bus": schema.BoolAttribute{ - Optional: true, + Computed: true, + Default: booldefault.StaticBool(false), Description: "True if Datadog should create the event bus in addition to the event source. Requires the `events:CreateEventBus` permission.", + Optional: true, }, "event_generator_name": schema.StringAttribute{ - Optional: true, Description: "The given part of the event source name, which is then combined with an assigned suffix to form the full name.", + Required: true, }, "region": schema.StringAttribute{ - Optional: true, Description: "The event source's [AWS region](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints).", + Required: true, }, "id": utils.ResourceIDAttribute(), }, @@ -84,7 +87,6 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re if err != nil { if httpResp != nil && httpResp.StatusCode == 404 { response.State.RemoveResource(ctx) - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Event Bridge Source not found")) return } response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error listing AWS Event Bridge Sources")) @@ -95,8 +97,40 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re return } - r.updateStateAfterRead(ctx, &state, &resp) + id := state.ID.ValueString() + + found := false + matchedEventHub := integrationAwsEventBridgeModel{} + + if accounts, ok := resp.GetAccountsOk(); ok && len(*accounts) > 0 { + for _, account := range *accounts { + response.Diagnostics.AddWarning("account", account.GetAccountId()) + if found { + break + } + if eventhubs, ok := account.GetEventHubsOk(); ok && len(*eventhubs) > 0 { + for _, eventhub := range *eventhubs { + response.Diagnostics.AddWarning("name", *eventhub.Name) + if *eventhub.Name == id { + matchedEventHub.ID = types.StringValue(*eventhub.Name) + matchedEventHub.AccountId = types.StringValue(account.GetAccountId()) + matchedEventHub.Region = types.StringValue(eventhub.GetRegion()) + matchedEventHub.EventGeneratorName = types.StringValue(eventhub.GetName()) + found = true + break + } + } + } + } + } + if !found { + response.State.RemoveResource(ctx) + response.Diagnostics.AddError("Import error", "No matching Event Source found") + return + } + + r.updateStateAfterRead(ctx, &state, &matchedEventHub) // Save data into Terraform state response.Diagnostics.Append(response.State.Set(ctx, &state)...) } @@ -146,7 +180,7 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request if !state.Region.IsNull() { req.SetRegion(state.Region.ValueString()) } - if !state.EventGeneratorName.IsNull() { + if !state.ID.IsNull() { // EventGeneratorName in DeleteRequest is the constructed full name, stored as ID in state req.SetEventGeneratorName(state.ID.ValueString()) } @@ -162,13 +196,11 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request } } -func (r *integrationAwsEventBridgeResource) updateStateAfterRead(ctx context.Context, state *integrationAwsEventBridgeModel, resp *datadogV1.AWSEventBridgeListResponse) { - - /* - if isInstalled, ok := resp.GetIsInstalledOk(); ok { - state.IsInstalled = types.BoolValue(*isInstalled) - } - */ +func (r *integrationAwsEventBridgeResource) updateStateAfterRead(ctx context.Context, state *integrationAwsEventBridgeModel, resp *integrationAwsEventBridgeModel) { + state.ID = resp.ID + state.AccountId = resp.AccountId + state.CreateEventBus = types.BoolValue(false) + state.Region = resp.Region } func (r *integrationAwsEventBridgeResource) updateStateAfterWrite(ctx context.Context, state *integrationAwsEventBridgeModel, resp *datadogV1.AWSEventBridgeCreateResponse) { diff --git a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go index 37bb60f20d..c72beba3f9 100644 --- a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go +++ b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go @@ -32,12 +32,19 @@ func TestAccIntegrationAwsEventBridgeBasic(t *testing.T) { } func testAccCheckDatadogIntegrationAwsEventBridge(uniq string) string { - return fmt.Sprintf(`resource "datadog_integration_aws_event_bridge" "foo" { - account_id = "123456789012" - create_event_bus = true - event_generator_name = "app-alerts" - region = %s -}`, uniq) + return fmt.Sprintf(` + resource "datadog_integration_aws" "account" { + account_id = "%s" + role_name = "testacc-datadog-integration-role" + } + + resource "datadog_integration_aws_event_bridge" "foo" { + account_id = "%s" + create_event_bus = true + event_generator_name = "test" + region = "us-east-1" + depends_on = [datadog_integration_aws.account] + }`, uniq, uniq) } func testAccCheckDatadogIntegrationAwsEventBridgeDestroy(accProvider *fwprovider.FrameworkProvider) func(*terraform.State) error { From 168b8322881978b8b486008e5deb04f22dae9afc Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Thu, 21 Dec 2023 17:02:48 -0500 Subject: [PATCH 09/23] Remove debug logs and add error message for Update not allowed --- .../resource_datadog_integration_aws_event_bridge.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index f906ee8708..50225893f7 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -104,13 +104,11 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re if accounts, ok := resp.GetAccountsOk(); ok && len(*accounts) > 0 { for _, account := range *accounts { - response.Diagnostics.AddWarning("account", account.GetAccountId()) if found { break } if eventhubs, ok := account.GetEventHubsOk(); ok && len(*eventhubs) > 0 { for _, eventhub := range *eventhubs { - response.Diagnostics.AddWarning("name", *eventhub.Name) if *eventhub.Name == id { matchedEventHub.ID = types.StringValue(*eventhub.Name) matchedEventHub.AccountId = types.StringValue(account.GetAccountId()) @@ -164,6 +162,7 @@ func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request } func (r *integrationAwsEventBridgeResource) Update(ctx context.Context, request resource.UpdateRequest, response *resource.UpdateResponse) { + response.Diagnostics.AddError("Update not supported", "AWS Event Bridge Sources cannot be updated") } func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request resource.DeleteRequest, response *resource.DeleteResponse) { From 360891db80549bef588e3c4cece5d75c38032479 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Thu, 21 Dec 2023 17:07:27 -0500 Subject: [PATCH 10/23] Add mutex --- .../resource_datadog_integration_aws_event_bridge.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index 50225893f7..015dab1c54 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -2,6 +2,7 @@ package fwprovider import ( "context" + "sync" "github.com/DataDog/datadog-api-client-go/v2/api/datadogV1" "github.com/hashicorp/terraform-plugin-framework/diag" @@ -19,6 +20,8 @@ var ( _ resource.ResourceWithImportState = &integrationAwsEventBridgeResource{} ) +var integrationAWSEventBridgeMutex = sync.Mutex{} + type integrationAwsEventBridgeResource struct { Api *datadogV1.AWSIntegrationApi Auth context.Context @@ -140,6 +143,9 @@ func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request return } + integrationAWSEventBridgeMutex.Lock() + defer integrationAWSEventBridgeMutex.Unlock() + body, diags := r.buildIntegrationAwsEventBridgeRequestBody(ctx, &state) response.Diagnostics.Append(diags...) if response.Diagnostics.HasError() { @@ -171,6 +177,10 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request if response.Diagnostics.HasError() { return } + + integrationAWSEventBridgeMutex.Lock() + defer integrationAWSEventBridgeMutex.Unlock() + req := datadogV1.NewAWSEventBridgeDeleteRequestWithDefaults() if !state.AccountId.IsNull() { From 6eacfc08627c682f61d88ddcfc16481719d1aad8 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Thu, 21 Dec 2023 17:29:07 -0500 Subject: [PATCH 11/23] Acceptance test working, everything working except create_event_bus=true --- ...stAccIntegrationAwsEventBridgeBasic.freeze | 1 + ...TestAccIntegrationAwsEventBridgeBasic.yaml | 134 ++++++++++++++++++ ...tadog_integration_aws_event_bridge_test.go | 10 +- 3 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze create mode 100644 datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml diff --git a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze new file mode 100644 index 0000000000..c7119e49b6 --- /dev/null +++ b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze @@ -0,0 +1 @@ +2023-12-21T17:27:46.404681-05:00 \ No newline at end of file diff --git a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml new file mode 100644 index 0000000000..33fd34a0a9 --- /dev/null +++ b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml @@ -0,0 +1,134 @@ +--- +version: 1 +interactions: +- request: + body: | + {"account_id":"569948102559","account_specific_namespace_rules":{},"cspm_resource_collection_enabled":false,"excluded_regions":[],"filter_tags":[],"host_tags":[],"metrics_collection_enabled":true,"resource_collection_enabled":false,"role_name":"testacc-datadog-integration-role"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: POST + response: + body: | + {"external_id":"c9ca7ac0443b46ecbe381ad684878f6b"} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: "" +- request: + body: "" + form: {} + headers: + Accept: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: GET + response: + body: | + {"accounts":[{"account_id":"569948102559","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"601427279990","role_name":"datadog-aws-integration-role","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"lambda":false,"vpn":false,"iot":false,"mwaa":false,"dynamodb":false,"ebs":false,"dms":false,"route53resolver":false,"firehose":false,"sagemakerendpoints":false,"certificatemanager":false,"ses":false,"kinesis_analytics":false,"ecr":false,"elasticbeanstalk":false,"workspaces":false,"inspector":false,"gamelift":false,"polly":false,"dynamodbaccelerator":false,"translate":false,"directconnect":false,"kinesis":false,"documentdb":false,"bedrock":false,"textract":false,"codewhisperer":false,"sagemakerworkteam":false,"privatelinkservices":false,"cloudfront":false,"backup":false,"rdsproxy":false,"privatelinkendpoints":false,"sagemakertransformjobs":false,"lex":false,"trusted_advisor":false,"shield":false,"ml":false,"sagemaker":false,"swf":false,"athena":false,"redshift":false,"wafv2":false,"efs":false,"sagemakerprocessingjobs":false,"connect":false,"ec2spot":false,"elb":false,"cognito":false,"sagemakertrainingjobs":false,"glue":false,"elastictranscoder":false,"mediaconvert":false,"mq":false,"route53":false,"network_elb":false,"sagemakerlabelingjobs":false,"ecs":false,"budgeting":false,"service_quotas":false,"s3":false,"apprunner":false,"cloudwatch_events":false,"codebuild":false,"mediapackage":false,"ec2":false,"appsync":false,"fsx":false,"medialive":false,"waf":false,"usage":false,"application_elb":false,"cloudhsm":false,"mediaconnect":false,"msk":false,"sns":false,"neptune":false,"storage_gateway":false,"transitgateway":false,"billing":false,"mediatailor":false,"auto_scaling":false,"networkfirewall":false,"opsworks":false,"appstream":false,"api_gateway":false,"nat_gateway":false,"elasticinference":false,"es":false,"xray":false,"ec2api":false,"rekognition":false,"elasticache":false,"cloudwatch_logs":false,"sagemakermodelbuildingpipeline":false,"keyspaces":false,"s3storagelens":false,"cloudsearch":false,"mediastore":false,"kms":false,"rds":false,"step_functions":false},"excluded_regions":["us-east-1","us-west-2"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: "" +- request: + body: | + {"account_id":"569948102559","create_event_bus":false,"event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666","region":"us-east-1"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge + method: POST + response: + body: | + {"event_source_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666-qfx7ahy3","status":"created","region":"us-east-1","has_bus":false} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: "" +- request: + body: "" + form: {} + headers: + Accept: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: GET + response: + body: | + {"accounts":[{"account_id":"569948102559","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"601427279990","role_name":"datadog-aws-integration-role","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"codebuild":false,"privatelinkendpoints":false,"cloudwatch_logs":false,"shield":false,"dynamodbaccelerator":false,"codewhisperer":false,"privatelinkservices":false,"backup":false,"sagemakerprocessingjobs":false,"sagemakerendpoints":false,"msk":false,"inspector":false,"polly":false,"mediastore":false,"dynamodb":false,"documentdb":false,"lex":false,"ec2api":false,"appsync":false,"sagemakerworkteam":false,"nat_gateway":false,"bedrock":false,"glue":false,"efs":false,"workspaces":false,"lambda":false,"neptune":false,"networkfirewall":false,"cloudfront":false,"sagemakerlabelingjobs":false,"ecs":false,"step_functions":false,"connect":false,"kms":false,"sagemakertransformjobs":false,"dms":false,"rdsproxy":false,"mediaconnect":false,"keyspaces":false,"cloudwatch_events":false,"network_elb":false,"redshift":false,"kinesis":false,"directconnect":false,"sagemakermodelbuildingpipeline":false,"opsworks":false,"s3":false,"billing":false,"budgeting":false,"mediatailor":false,"xray":false,"usage":false,"apprunner":false,"textract":false,"cloudsearch":false,"sagemakertrainingjobs":false,"api_gateway":false,"service_quotas":false,"rds":false,"elasticache":false,"sagemaker":false,"elb":false,"storage_gateway":false,"cognito":false,"gamelift":false,"application_elb":false,"s3storagelens":false,"firehose":false,"ecr":false,"iot":false,"kinesis_analytics":false,"mwaa":false,"elasticbeanstalk":false,"sns":false,"ml":false,"mediapackage":false,"route53":false,"ec2spot":false,"mq":false,"cloudhsm":false,"medialive":false,"elasticinference":false,"vpn":false,"waf":false,"es":false,"auto_scaling":false,"certificatemanager":false,"rekognition":false,"wafv2":false,"mediaconvert":false,"swf":false,"elastictranscoder":false,"translate":false,"fsx":false,"ses":false,"ebs":false,"transitgateway":false,"ec2":false,"route53resolver":false,"appstream":false,"trusted_advisor":false,"athena":false},"excluded_regions":["us-east-1","us-west-2"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: "" +- request: + body: "" + form: {} + headers: + Accept: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge + method: GET + response: + body: | + {"accounts":[{"accountId":"569948102559","tags":[],"eventHubs":[{"name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666-qfx7ahy3","region":"us-east-1"}]},{"accountId":"601427279990","tags":["key:value","key2:value2"],"eventHubs":[{"name":"testadsfadsf-katie-tv2bxh6b","region":"us-east-1"},{"name":"terraform-test-12-tv2bxh6b","region":"us-east-1"}]}],"isInstalled":true} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: "" +- request: + body: | + {"account_id":"569948102559","event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666-qfx7ahy3","region":"us-east-1"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge + method: DELETE + response: + body: | + {"status":"empty"} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: "" +- request: + body: | + {"account_id":"569948102559","role_name":"testacc-datadog-integration-role"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: DELETE + response: + body: | + {} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: "" diff --git a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go index c72beba3f9..3617f1445e 100644 --- a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go +++ b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go @@ -15,6 +15,7 @@ import ( func TestAccIntegrationAwsEventBridgeBasic(t *testing.T) { t.Parallel() ctx, providers, accProviders := testAccFrameworkMuxProviders(context.Background(), t) + accountID := uniqueAWSAccountID(ctx, t) uniq := uniqueEntityName(ctx, t) resource.Test(t, resource.TestCase{ @@ -22,7 +23,7 @@ func TestAccIntegrationAwsEventBridgeBasic(t *testing.T) { CheckDestroy: testAccCheckDatadogIntegrationAwsEventBridgeDestroy(providers.frameworkProvider), Steps: []resource.TestStep{ { - Config: testAccCheckDatadogIntegrationAwsEventBridge(uniq), + Config: testAccCheckDatadogIntegrationAwsEventBridge(accountID, uniq), Check: resource.ComposeTestCheckFunc( testAccCheckDatadogIntegrationAwsEventBridgeExists(providers.frameworkProvider), ), @@ -31,7 +32,7 @@ func TestAccIntegrationAwsEventBridgeBasic(t *testing.T) { }) } -func testAccCheckDatadogIntegrationAwsEventBridge(uniq string) string { +func testAccCheckDatadogIntegrationAwsEventBridge(accountID string, uniq string) string { return fmt.Sprintf(` resource "datadog_integration_aws" "account" { account_id = "%s" @@ -40,11 +41,10 @@ func testAccCheckDatadogIntegrationAwsEventBridge(uniq string) string { resource "datadog_integration_aws_event_bridge" "foo" { account_id = "%s" - create_event_bus = true - event_generator_name = "test" + event_generator_name = "%s" region = "us-east-1" depends_on = [datadog_integration_aws.account] - }`, uniq, uniq) + }`, accountID, accountID, uniq) } func testAccCheckDatadogIntegrationAwsEventBridgeDestroy(accProvider *fwprovider.FrameworkProvider) func(*terraform.State) error { From b5bf579aa40eff401f4583d757801715b90b2ae0 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Fri, 22 Dec 2023 13:51:31 -0500 Subject: [PATCH 12/23] Fix create event bus import and remove unneeded var --- ...rce_datadog_integration_aws_event_bridge.go | 5 +---- ...estAccIntegrationAwsEventBridgeBasic.freeze | 2 +- .../TestAccIntegrationAwsEventBridgeBasic.yaml | 18 +++++++++--------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index 015dab1c54..b9d2c6bf4e 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -100,8 +100,6 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re return } - id := state.ID.ValueString() - found := false matchedEventHub := integrationAwsEventBridgeModel{} @@ -112,7 +110,7 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re } if eventhubs, ok := account.GetEventHubsOk(); ok && len(*eventhubs) > 0 { for _, eventhub := range *eventhubs { - if *eventhub.Name == id { + if *eventhub.Name == state.ID.ValueString() { matchedEventHub.ID = types.StringValue(*eventhub.Name) matchedEventHub.AccountId = types.StringValue(account.GetAccountId()) matchedEventHub.Region = types.StringValue(eventhub.GetRegion()) @@ -208,7 +206,6 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request func (r *integrationAwsEventBridgeResource) updateStateAfterRead(ctx context.Context, state *integrationAwsEventBridgeModel, resp *integrationAwsEventBridgeModel) { state.ID = resp.ID state.AccountId = resp.AccountId - state.CreateEventBus = types.BoolValue(false) state.Region = resp.Region } diff --git a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze index c7119e49b6..b1d3bf5a67 100644 --- a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze +++ b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze @@ -1 +1 @@ -2023-12-21T17:27:46.404681-05:00 \ No newline at end of file +2023-12-22T13:50:09.052404-05:00 \ No newline at end of file diff --git a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml index 33fd34a0a9..f5fd0349a3 100644 --- a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml +++ b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml @@ -3,7 +3,7 @@ version: 1 interactions: - request: body: | - {"account_id":"569948102559","account_specific_namespace_rules":{},"cspm_resource_collection_enabled":false,"excluded_regions":[],"filter_tags":[],"host_tags":[],"metrics_collection_enabled":true,"resource_collection_enabled":false,"role_name":"testacc-datadog-integration-role"} + {"account_id":"529951579857","account_specific_namespace_rules":{},"cspm_resource_collection_enabled":false,"excluded_regions":[],"filter_tags":[],"host_tags":[],"metrics_collection_enabled":true,"resource_collection_enabled":false,"role_name":"testacc-datadog-integration-role"} form: {} headers: Accept: @@ -14,7 +14,7 @@ interactions: method: POST response: body: | - {"external_id":"c9ca7ac0443b46ecbe381ad684878f6b"} + {"external_id":"ce12a5a342a244ebbfdfbd889c0cf00d"} headers: Content-Type: - application/json @@ -31,7 +31,7 @@ interactions: method: GET response: body: | - {"accounts":[{"account_id":"569948102559","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"601427279990","role_name":"datadog-aws-integration-role","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"lambda":false,"vpn":false,"iot":false,"mwaa":false,"dynamodb":false,"ebs":false,"dms":false,"route53resolver":false,"firehose":false,"sagemakerendpoints":false,"certificatemanager":false,"ses":false,"kinesis_analytics":false,"ecr":false,"elasticbeanstalk":false,"workspaces":false,"inspector":false,"gamelift":false,"polly":false,"dynamodbaccelerator":false,"translate":false,"directconnect":false,"kinesis":false,"documentdb":false,"bedrock":false,"textract":false,"codewhisperer":false,"sagemakerworkteam":false,"privatelinkservices":false,"cloudfront":false,"backup":false,"rdsproxy":false,"privatelinkendpoints":false,"sagemakertransformjobs":false,"lex":false,"trusted_advisor":false,"shield":false,"ml":false,"sagemaker":false,"swf":false,"athena":false,"redshift":false,"wafv2":false,"efs":false,"sagemakerprocessingjobs":false,"connect":false,"ec2spot":false,"elb":false,"cognito":false,"sagemakertrainingjobs":false,"glue":false,"elastictranscoder":false,"mediaconvert":false,"mq":false,"route53":false,"network_elb":false,"sagemakerlabelingjobs":false,"ecs":false,"budgeting":false,"service_quotas":false,"s3":false,"apprunner":false,"cloudwatch_events":false,"codebuild":false,"mediapackage":false,"ec2":false,"appsync":false,"fsx":false,"medialive":false,"waf":false,"usage":false,"application_elb":false,"cloudhsm":false,"mediaconnect":false,"msk":false,"sns":false,"neptune":false,"storage_gateway":false,"transitgateway":false,"billing":false,"mediatailor":false,"auto_scaling":false,"networkfirewall":false,"opsworks":false,"appstream":false,"api_gateway":false,"nat_gateway":false,"elasticinference":false,"es":false,"xray":false,"ec2api":false,"rekognition":false,"elasticache":false,"cloudwatch_logs":false,"sagemakermodelbuildingpipeline":false,"keyspaces":false,"s3storagelens":false,"cloudsearch":false,"mediastore":false,"kms":false,"rds":false,"step_functions":false},"excluded_regions":["us-east-1","us-west-2"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} + {"accounts":[{"account_id":"601427279990","role_name":"datadog-aws-integration-role-katie","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"route53resolver":false,"cloudwatch_events":false,"elastictranscoder":false,"billing":false,"workspaces":false,"sagemakerendpoints":false,"ec2":false,"codewhisperer":false,"elasticache":false,"inspector":false,"sagemakermodelbuildingpipeline":false,"sagemakertrainingjobs":false,"redshift":false,"transitgateway":false,"textract":false,"privatelinkendpoints":false,"vpn":false,"service_quotas":false,"nat_gateway":false,"shield":false,"lex":false,"cloudfront":false,"xray":false,"budgeting":false,"msk":false,"mediatailor":false,"storage_gateway":false,"rds":false,"ml":false,"rekognition":false,"application_elb":false,"es":false,"mwaa":false,"dynamodb":false,"step_functions":false,"elb":false,"network_elb":false,"rdsproxy":false,"glue":false,"cloudwatch_logs":false,"swf":false,"opsworks":false,"s3":false,"kinesis_analytics":false,"sagemakerlabelingjobs":false,"s3storagelens":false,"mediaconnect":false,"mediaconvert":false,"athena":false,"cloudhsm":false,"trusted_advisor":false,"connect":false,"keyspaces":false,"translate":false,"gamelift":false,"mq":false,"neptune":false,"certificatemanager":false,"directconnect":false,"cognito":false,"waf":false,"ec2api":false,"ec2spot":false,"appsync":false,"privatelinkservices":false,"fsx":false,"mediastore":false,"ecs":false,"backup":false,"sns":false,"cloudsearch":false,"ecr":false,"auto_scaling":false,"bedrock":false,"route53":false,"ebs":false,"api_gateway":false,"mediapackage":false,"sagemakerprocessingjobs":false,"firehose":false,"iot":false,"medialive":false,"elasticbeanstalk":false,"lambda":false,"appstream":false,"kms":false,"dynamodbaccelerator":false,"efs":false,"polly":false,"dms":false,"ses":false,"sagemakerworkteam":false,"wafv2":false,"sagemakertransformjobs":false,"sagemaker":false,"codebuild":false,"elasticinference":false,"kinesis":false,"documentdb":false,"networkfirewall":false,"usage":false,"apprunner":false},"excluded_regions":["us-east-2","us-west-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1","ap-southeast-2","ap-northeast-1","ap-northeast-2","ap-northeast-3","sa-east-1","ap-south-1","ca-central-1","eu-west-2","eu-west-3","eu-north-1","af-south-1","ap-east-1","ap-south-2","ap-southeast-3","ap-southeast-4","eu-central-2","eu-south-1","eu-south-2","il-central-1","me-central-1","me-south-1"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 13m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"529951579857","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} headers: Content-Type: - application/json @@ -40,7 +40,7 @@ interactions: duration: "" - request: body: | - {"account_id":"569948102559","create_event_bus":false,"event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666","region":"us-east-1"} + {"account_id":"529951579857","create_event_bus":false,"event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009","region":"us-east-1"} form: {} headers: Accept: @@ -51,7 +51,7 @@ interactions: method: POST response: body: | - {"event_source_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666-qfx7ahy3","status":"created","region":"us-east-1","has_bus":false} + {"status":"created","region":"us-east-1","event_source_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009-mptaqa41","has_bus":false} headers: Content-Type: - application/json @@ -68,7 +68,7 @@ interactions: method: GET response: body: | - {"accounts":[{"account_id":"569948102559","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"601427279990","role_name":"datadog-aws-integration-role","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"codebuild":false,"privatelinkendpoints":false,"cloudwatch_logs":false,"shield":false,"dynamodbaccelerator":false,"codewhisperer":false,"privatelinkservices":false,"backup":false,"sagemakerprocessingjobs":false,"sagemakerendpoints":false,"msk":false,"inspector":false,"polly":false,"mediastore":false,"dynamodb":false,"documentdb":false,"lex":false,"ec2api":false,"appsync":false,"sagemakerworkteam":false,"nat_gateway":false,"bedrock":false,"glue":false,"efs":false,"workspaces":false,"lambda":false,"neptune":false,"networkfirewall":false,"cloudfront":false,"sagemakerlabelingjobs":false,"ecs":false,"step_functions":false,"connect":false,"kms":false,"sagemakertransformjobs":false,"dms":false,"rdsproxy":false,"mediaconnect":false,"keyspaces":false,"cloudwatch_events":false,"network_elb":false,"redshift":false,"kinesis":false,"directconnect":false,"sagemakermodelbuildingpipeline":false,"opsworks":false,"s3":false,"billing":false,"budgeting":false,"mediatailor":false,"xray":false,"usage":false,"apprunner":false,"textract":false,"cloudsearch":false,"sagemakertrainingjobs":false,"api_gateway":false,"service_quotas":false,"rds":false,"elasticache":false,"sagemaker":false,"elb":false,"storage_gateway":false,"cognito":false,"gamelift":false,"application_elb":false,"s3storagelens":false,"firehose":false,"ecr":false,"iot":false,"kinesis_analytics":false,"mwaa":false,"elasticbeanstalk":false,"sns":false,"ml":false,"mediapackage":false,"route53":false,"ec2spot":false,"mq":false,"cloudhsm":false,"medialive":false,"elasticinference":false,"vpn":false,"waf":false,"es":false,"auto_scaling":false,"certificatemanager":false,"rekognition":false,"wafv2":false,"mediaconvert":false,"swf":false,"elastictranscoder":false,"translate":false,"fsx":false,"ses":false,"ebs":false,"transitgateway":false,"ec2":false,"route53resolver":false,"appstream":false,"trusted_advisor":false,"athena":false},"excluded_regions":["us-east-1","us-west-2"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} + {"accounts":[{"account_id":"601427279990","role_name":"datadog-aws-integration-role-katie","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"lex":false,"s3storagelens":false,"api_gateway":false,"mediaconvert":false,"appstream":false,"codebuild":false,"elb":false,"backup":false,"auto_scaling":false,"gamelift":false,"sagemakerendpoints":false,"documentdb":false,"translate":false,"cloudsearch":false,"cognito":false,"sagemakerprocessingjobs":false,"cloudhsm":false,"codewhisperer":false,"iot":false,"athena":false,"cloudwatch_logs":false,"ses":false,"billing":false,"networkfirewall":false,"rdsproxy":false,"storage_gateway":false,"s3":false,"xray":false,"lambda":false,"efs":false,"ml":false,"ec2api":false,"workspaces":false,"privatelinkservices":false,"ecr":false,"sns":false,"cloudwatch_events":false,"transitgateway":false,"sagemaker":false,"appsync":false,"step_functions":false,"keyspaces":false,"rds":false,"sagemakerlabelingjobs":false,"cloudfront":false,"elasticinference":false,"connect":false,"kms":false,"elasticache":false,"nat_gateway":false,"mwaa":false,"certificatemanager":false,"ec2":false,"privatelinkendpoints":false,"mq":false,"application_elb":false,"fsx":false,"mediastore":false,"rekognition":false,"glue":false,"route53resolver":false,"sagemakertransformjobs":false,"redshift":false,"neptune":false,"medialive":false,"msk":false,"ebs":false,"firehose":false,"waf":false,"mediatailor":false,"dynamodb":false,"sagemakermodelbuildingpipeline":false,"opsworks":false,"elasticbeanstalk":false,"bedrock":false,"network_elb":false,"trusted_advisor":false,"ec2spot":false,"textract":false,"sagemakerworkteam":false,"route53":false,"directconnect":false,"apprunner":false,"inspector":false,"wafv2":false,"es":false,"vpn":false,"mediapackage":false,"budgeting":false,"kinesis":false,"service_quotas":false,"kinesis_analytics":false,"elastictranscoder":false,"shield":false,"polly":false,"usage":false,"sagemakertrainingjobs":false,"dms":false,"swf":false,"dynamodbaccelerator":false,"ecs":false,"mediaconnect":false},"excluded_regions":["us-east-2","us-west-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1","ap-southeast-2","ap-northeast-1","ap-northeast-2","ap-northeast-3","sa-east-1","ap-south-1","ca-central-1","eu-west-2","eu-west-3","eu-north-1","af-south-1","ap-east-1","ap-south-2","ap-southeast-3","ap-southeast-4","eu-central-2","eu-south-1","eu-south-2","il-central-1","me-central-1","me-south-1"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 13m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"529951579857","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} headers: Content-Type: - application/json @@ -85,7 +85,7 @@ interactions: method: GET response: body: | - {"accounts":[{"accountId":"569948102559","tags":[],"eventHubs":[{"name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666-qfx7ahy3","region":"us-east-1"}]},{"accountId":"601427279990","tags":["key:value","key2:value2"],"eventHubs":[{"name":"testadsfadsf-katie-tv2bxh6b","region":"us-east-1"},{"name":"terraform-test-12-tv2bxh6b","region":"us-east-1"}]}],"isInstalled":true} + {"accounts":[{"accountId":"601427279990","tags":["key:value","key2:value2"],"eventHubs":[{"name":"ktmq7854598735-tv2bxh6b","region":"us-east-1"}]},{"accountId":"529951579857","tags":[],"eventHubs":[{"name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009-mptaqa41","region":"us-east-1"}]}],"isInstalled":true} headers: Content-Type: - application/json @@ -94,7 +94,7 @@ interactions: duration: "" - request: body: | - {"account_id":"569948102559","event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703197666-qfx7ahy3","region":"us-east-1"} + {"account_id":"529951579857","event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009-mptaqa41","region":"us-east-1"} form: {} headers: Accept: @@ -114,7 +114,7 @@ interactions: duration: "" - request: body: | - {"account_id":"569948102559","role_name":"testacc-datadog-integration-role"} + {"account_id":"529951579857","role_name":"testacc-datadog-integration-role"} form: {} headers: Accept: From a5d617354b656c872a87b5c425011f385129c70a Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Fri, 22 Dec 2023 13:59:55 -0500 Subject: [PATCH 13/23] Docs --- .../resources/integration_aws_event_bridge.md | 50 +++++++++++++++++++ .../import.sh | 3 +- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 docs/resources/integration_aws_event_bridge.md diff --git a/docs/resources/integration_aws_event_bridge.md b/docs/resources/integration_aws_event_bridge.md new file mode 100644 index 0000000000..9c46f94ffa --- /dev/null +++ b/docs/resources/integration_aws_event_bridge.md @@ -0,0 +1,50 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "datadog_integration_aws_event_bridge Resource - terraform-provider-datadog" +subcategory: "" +description: |- + Provides a datadogintegrationawseventbridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account. +--- + +# datadog_integration_aws_event_bridge (Resource) + +Provides a datadog_integration_aws_event_bridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account. + +## Example Usage + +```terraform +# Create new integration_aws_event_bridge resource + +resource "datadog_integration_aws_event_bridge" "foo" { + account_id = "123456789012" + create_event_bus = true + event_generator_name = "app-alerts" + region = "us-east-1" +} +``` + + +## Schema + +### Required + +- `account_id` (String) Your AWS Account ID without dashes. +- `event_generator_name` (String) The given part of the event source name, which is then combined with an assigned suffix to form the full name. +- `region` (String) The event source's [AWS region](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints). + +### Optional + +- `create_event_bus` (Boolean) True if Datadog should create the event bus in addition to the event source. Requires the `events:CreateEventBus` permission. Defaults to `false`. + +### Read-Only + +- `id` (String) The ID of this resource. + +## Import + +Import is supported using the following syntax: + +```shell +# Amazon Web Service EventBridge integrations are imported using the Event Source name as listed for an integrated AWS account in Datadog +terraform import datadog_integration_aws_event_bridge.foo event-source-name-abc12345 +``` diff --git a/examples/resources/datadog_integration_aws_event_bridge/import.sh b/examples/resources/datadog_integration_aws_event_bridge/import.sh index a3c2e34a06..f2e868ba59 100644 --- a/examples/resources/datadog_integration_aws_event_bridge/import.sh +++ b/examples/resources/datadog_integration_aws_event_bridge/import.sh @@ -1 +1,2 @@ -terraform import datadog_integration_aws_event_bridge.new_list "UPDATE_ME" \ No newline at end of file +# Amazon Web Service EventBridge integrations are imported using the Event Source name as listed for an integrated AWS account in Datadog +terraform import datadog_integration_aws_event_bridge.foo event-source-name-abc12345 From c4d350a6b7cb5d424287318e11e0450988edab81 Mon Sep 17 00:00:00 2001 From: Sherzod Karimov Date: Fri, 22 Dec 2023 14:41:04 -0500 Subject: [PATCH 14/23] re-record --- ...stAccIntegrationAwsEventBridgeBasic.freeze | 2 +- ...TestAccIntegrationAwsEventBridgeBasic.yaml | 388 ++++++++++++------ 2 files changed, 257 insertions(+), 133 deletions(-) diff --git a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze index b1d3bf5a67..d1e06aa528 100644 --- a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze +++ b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.freeze @@ -1 +1 @@ -2023-12-22T13:50:09.052404-05:00 \ No newline at end of file +2023-12-22T14:39:55.392655-05:00 \ No newline at end of file diff --git a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml index f5fd0349a3..25e6ed5e5e 100644 --- a/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml +++ b/datadog/tests/cassettes/TestAccIntegrationAwsEventBridgeBasic.yaml @@ -1,134 +1,258 @@ --- -version: 1 +version: 2 interactions: -- request: - body: | - {"account_id":"529951579857","account_specific_namespace_rules":{},"cspm_resource_collection_enabled":false,"excluded_regions":[],"filter_tags":[],"host_tags":[],"metrics_collection_enabled":true,"resource_collection_enabled":false,"role_name":"testacc-datadog-integration-role"} - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - url: https://api.datadoghq.com/api/v1/integration/aws - method: POST - response: - body: | - {"external_id":"ce12a5a342a244ebbfdfbd889c0cf00d"} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - url: https://api.datadoghq.com/api/v1/integration/aws - method: GET - response: - body: | - {"accounts":[{"account_id":"601427279990","role_name":"datadog-aws-integration-role-katie","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"route53resolver":false,"cloudwatch_events":false,"elastictranscoder":false,"billing":false,"workspaces":false,"sagemakerendpoints":false,"ec2":false,"codewhisperer":false,"elasticache":false,"inspector":false,"sagemakermodelbuildingpipeline":false,"sagemakertrainingjobs":false,"redshift":false,"transitgateway":false,"textract":false,"privatelinkendpoints":false,"vpn":false,"service_quotas":false,"nat_gateway":false,"shield":false,"lex":false,"cloudfront":false,"xray":false,"budgeting":false,"msk":false,"mediatailor":false,"storage_gateway":false,"rds":false,"ml":false,"rekognition":false,"application_elb":false,"es":false,"mwaa":false,"dynamodb":false,"step_functions":false,"elb":false,"network_elb":false,"rdsproxy":false,"glue":false,"cloudwatch_logs":false,"swf":false,"opsworks":false,"s3":false,"kinesis_analytics":false,"sagemakerlabelingjobs":false,"s3storagelens":false,"mediaconnect":false,"mediaconvert":false,"athena":false,"cloudhsm":false,"trusted_advisor":false,"connect":false,"keyspaces":false,"translate":false,"gamelift":false,"mq":false,"neptune":false,"certificatemanager":false,"directconnect":false,"cognito":false,"waf":false,"ec2api":false,"ec2spot":false,"appsync":false,"privatelinkservices":false,"fsx":false,"mediastore":false,"ecs":false,"backup":false,"sns":false,"cloudsearch":false,"ecr":false,"auto_scaling":false,"bedrock":false,"route53":false,"ebs":false,"api_gateway":false,"mediapackage":false,"sagemakerprocessingjobs":false,"firehose":false,"iot":false,"medialive":false,"elasticbeanstalk":false,"lambda":false,"appstream":false,"kms":false,"dynamodbaccelerator":false,"efs":false,"polly":false,"dms":false,"ses":false,"sagemakerworkteam":false,"wafv2":false,"sagemakertransformjobs":false,"sagemaker":false,"codebuild":false,"elasticinference":false,"kinesis":false,"documentdb":false,"networkfirewall":false,"usage":false,"apprunner":false},"excluded_regions":["us-east-2","us-west-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1","ap-southeast-2","ap-northeast-1","ap-northeast-2","ap-northeast-3","sa-east-1","ap-south-1","ca-central-1","eu-west-2","eu-west-3","eu-north-1","af-south-1","ap-east-1","ap-south-2","ap-southeast-3","ap-southeast-4","eu-central-2","eu-south-1","eu-south-2","il-central-1","me-central-1","me-south-1"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 13m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"529951579857","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: "" -- request: - body: | - {"account_id":"529951579857","create_event_bus":false,"event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009","region":"us-east-1"} - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge - method: POST - response: - body: | - {"status":"created","region":"us-east-1","event_source_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009-mptaqa41","has_bus":false} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - url: https://api.datadoghq.com/api/v1/integration/aws - method: GET - response: - body: | - {"accounts":[{"account_id":"601427279990","role_name":"datadog-aws-integration-role-katie","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"lex":false,"s3storagelens":false,"api_gateway":false,"mediaconvert":false,"appstream":false,"codebuild":false,"elb":false,"backup":false,"auto_scaling":false,"gamelift":false,"sagemakerendpoints":false,"documentdb":false,"translate":false,"cloudsearch":false,"cognito":false,"sagemakerprocessingjobs":false,"cloudhsm":false,"codewhisperer":false,"iot":false,"athena":false,"cloudwatch_logs":false,"ses":false,"billing":false,"networkfirewall":false,"rdsproxy":false,"storage_gateway":false,"s3":false,"xray":false,"lambda":false,"efs":false,"ml":false,"ec2api":false,"workspaces":false,"privatelinkservices":false,"ecr":false,"sns":false,"cloudwatch_events":false,"transitgateway":false,"sagemaker":false,"appsync":false,"step_functions":false,"keyspaces":false,"rds":false,"sagemakerlabelingjobs":false,"cloudfront":false,"elasticinference":false,"connect":false,"kms":false,"elasticache":false,"nat_gateway":false,"mwaa":false,"certificatemanager":false,"ec2":false,"privatelinkendpoints":false,"mq":false,"application_elb":false,"fsx":false,"mediastore":false,"rekognition":false,"glue":false,"route53resolver":false,"sagemakertransformjobs":false,"redshift":false,"neptune":false,"medialive":false,"msk":false,"ebs":false,"firehose":false,"waf":false,"mediatailor":false,"dynamodb":false,"sagemakermodelbuildingpipeline":false,"opsworks":false,"elasticbeanstalk":false,"bedrock":false,"network_elb":false,"trusted_advisor":false,"ec2spot":false,"textract":false,"sagemakerworkteam":false,"route53":false,"directconnect":false,"apprunner":false,"inspector":false,"wafv2":false,"es":false,"vpn":false,"mediapackage":false,"budgeting":false,"kinesis":false,"service_quotas":false,"kinesis_analytics":false,"elastictranscoder":false,"shield":false,"polly":false,"usage":false,"sagemakertrainingjobs":false,"dms":false,"swf":false,"dynamodbaccelerator":false,"ecs":false,"mediaconnect":false},"excluded_regions":["us-east-2","us-west-1","us-west-2","eu-west-1","eu-central-1","ap-southeast-1","ap-southeast-2","ap-northeast-1","ap-northeast-2","ap-northeast-3","sa-east-1","ap-south-1","ca-central-1","eu-west-2","eu-west-3","eu-north-1","af-south-1","ap-east-1","ap-south-2","ap-southeast-3","ap-southeast-4","eu-central-2","eu-south-1","eu-south-2","il-central-1","me-central-1","me-south-1"],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 601427279990\nRegions affected: every region\nError was last seen 13m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"529951579857","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: "" -- request: - body: "" - form: {} - headers: - Accept: - - application/json - url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge - method: GET - response: - body: | - {"accounts":[{"accountId":"601427279990","tags":["key:value","key2:value2"],"eventHubs":[{"name":"ktmq7854598735-tv2bxh6b","region":"us-east-1"}]},{"accountId":"529951579857","tags":[],"eventHubs":[{"name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009-mptaqa41","region":"us-east-1"}]}],"isInstalled":true} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: "" -- request: - body: | - {"account_id":"529951579857","event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703271009-mptaqa41","region":"us-east-1"} - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge - method: DELETE - response: - body: | - {"status":"empty"} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: "" -- request: - body: | - {"account_id":"529951579857","role_name":"testacc-datadog-integration-role"} - form: {} - headers: - Accept: - - application/json - Content-Type: - - application/json - url: https://api.datadoghq.com/api/v1/integration/aws - method: DELETE - response: - body: | - {} - headers: - Content-Type: - - application/json - status: 200 OK - code: 200 - duration: "" + - id: 0 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 280 + transfer_encoding: [] + trailer: {} + host: api.datadoghq.com + remote_addr: "" + request_uri: "" + body: | + {"account_id":"995450505148","account_specific_namespace_rules":{},"cspm_resource_collection_enabled":false,"excluded_regions":[],"filter_tags":[],"host_tags":[],"metrics_collection_enabled":true,"resource_collection_enabled":false,"role_name":"testacc-datadog-integration-role"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: POST + response: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + transfer_encoding: + - chunked + trailer: {} + content_length: -1 + uncompressed: true + body: | + {"external_id":"c5ccc77fb96347e28ca60c0cf4a7989e"} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: 877.402042ms + - id: 1 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: api.datadoghq.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: GET + response: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + transfer_encoding: + - chunked + trailer: {} + content_length: -1 + uncompressed: true + body: | + {"accounts":[{"account_id":"979910097554","role_name":"1234@testacc-datadog-integration-role","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"opsworks":true,"auto_scaling":false},"excluded_regions":["us-east-1","us-west-2"],"metrics_collection_enabled":false,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 979910097554\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":true,"extended_resource_collection_enabled":true,"resource_collection_enabled":true},{"account_id":"571021019953","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 571021019953\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"123456789188","role_name":"DatadogAWSAcctRoleName","filter_tags":["filter:thisTag"],"host_tags":["env:staging","account:123456"],"account_specific_namespace_rules":{"route53":false,"api_gateway":true},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 123456789188\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"661694029252","role_name":"DatadogAWSIntegrationRole","filter_tags":["testTag","test:Tag2"],"host_tags":["filter:one","filtertwo"],"account_specific_namespace_rules":{"opsworks":true},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 661694029252\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"995450505148","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"access_key_id":"4949579948531019","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action cloudwatch:ListMetrics \nAccount affected: 4949579948531019\nRegions affected: every region \nError was last seen 8m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"access_key_id":"1009898975398489","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action cloudwatch:ListMetrics \nAccount affected: 1009898975398489\nRegions affected: every region \nError was last seen 9m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"access_key_id":"9952495110098101","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action cloudwatch:ListMetrics \nAccount affected: 9952495110098101\nRegions affected: every region \nError was last seen 9m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: 123.5805ms + - id: 2 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 159 + transfer_encoding: [] + trailer: {} + host: api.datadoghq.com + remote_addr: "" + request_uri: "" + body: | + {"account_id":"995450505148","create_event_bus":false,"event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703273995","region":"us-east-1"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge + method: POST + response: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + transfer_encoding: + - chunked + trailer: {} + content_length: -1 + uncompressed: true + body: | + {"has_bus":false,"event_source_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703273995-q5m20d6s","status":"created","region":"us-east-1"} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: 624.529458ms + - id: 3 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: api.datadoghq.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: GET + response: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + transfer_encoding: + - chunked + trailer: {} + content_length: -1 + uncompressed: true + body: | + {"accounts":[{"account_id":"979910097554","role_name":"1234@testacc-datadog-integration-role","filter_tags":["key:value"],"host_tags":["key:value","key2:value2"],"account_specific_namespace_rules":{"auto_scaling":false,"opsworks":true},"excluded_regions":["us-east-1","us-west-2"],"metrics_collection_enabled":false,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 979910097554\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":true,"extended_resource_collection_enabled":true,"resource_collection_enabled":true},{"account_id":"571021019953","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 571021019953\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"123456789188","role_name":"DatadogAWSAcctRoleName","filter_tags":["filter:thisTag"],"host_tags":["env:staging","account:123456"],"account_specific_namespace_rules":{"api_gateway":true,"route53":false},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 123456789188\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"661694029252","role_name":"DatadogAWSIntegrationRole","filter_tags":["testTag","test:Tag2"],"host_tags":["filter:one","filtertwo"],"account_specific_namespace_rules":{"opsworks":true},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action sts:AssumeRole\nAccount affected: 661694029252\nRegions affected: every region\nError was last seen 1m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"account_id":"995450505148","role_name":"testacc-datadog-integration-role","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":[],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"access_key_id":"4949579948531019","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action cloudwatch:ListMetrics \nAccount affected: 4949579948531019\nRegions affected: every region \nError was last seen 8m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"access_key_id":"1009898975398489","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action cloudwatch:ListMetrics \nAccount affected: 1009898975398489\nRegions affected: every region \nError was last seen 9m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false},{"access_key_id":"9952495110098101","filter_tags":[],"host_tags":[],"account_specific_namespace_rules":{},"excluded_regions":[],"metrics_collection_enabled":true,"errors":["Datadog is not authorized to perform action cloudwatch:ListMetrics \nAccount affected: 9952495110098101\nRegions affected: every region \nError was last seen 9m ago"],"cspm_resource_collection_enabled":false,"extended_resource_collection_enabled":false,"resource_collection_enabled":false}]} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: 106.874458ms + - id: 4 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: api.datadoghq.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + Accept: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge + method: GET + response: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + transfer_encoding: + - chunked + trailer: {} + content_length: -1 + uncompressed: true + body: | + {"accounts":[{"accountId":"979910097554","tags":["key:value","key2:value2"],"eventHubs":[]},{"accountId":"571021019953","tags":[],"eventHubs":[]},{"accountId":"123456789188","tags":["env:staging","account:123456"],"eventHubs":[]},{"accountId":"661694029252","tags":["filter:one","filtertwo"],"eventHubs":[]},{"accountId":"995450505148","tags":[],"eventHubs":[{"name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703273995-q5m20d6s","region":"us-east-1"}]},{"accountId":"494957994853","tags":[],"eventHubs":[]},{"accountId":"100989897539","tags":[],"eventHubs":[]},{"accountId":"995249511009","tags":[],"eventHubs":[]}],"isInstalled":true} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: 69.196792ms + - id: 5 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 143 + transfer_encoding: [] + trailer: {} + host: api.datadoghq.com + remote_addr: "" + request_uri: "" + body: | + {"account_id":"995450505148","event_generator_name":"tf-TestAccIntegrationAwsEventBridgeBasic-local-1703273995-q5m20d6s","region":"us-east-1"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws/event_bridge + method: DELETE + response: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + transfer_encoding: [] + trailer: {} + content_length: 19 + uncompressed: false + body: | + {"status":"empty"} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: 599.64175ms + - id: 6 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 77 + transfer_encoding: [] + trailer: {} + host: api.datadoghq.com + remote_addr: "" + request_uri: "" + body: | + {"account_id":"995450505148","role_name":"testacc-datadog-integration-role"} + form: {} + headers: + Accept: + - application/json + Content-Type: + - application/json + url: https://api.datadoghq.com/api/v1/integration/aws + method: DELETE + response: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + transfer_encoding: [] + trailer: {} + content_length: 3 + uncompressed: false + body: | + {} + headers: + Content-Type: + - application/json + status: 200 OK + code: 200 + duration: 492.987208ms From 8ebb6d3f5a58b5f0563ae446bdb6e566f8163d56 Mon Sep 17 00:00:00 2001 From: Sherzod Karimov Date: Fri, 22 Dec 2023 15:01:18 -0500 Subject: [PATCH 15/23] shared mutex and add RequiresReplace --- ...ce_datadog_integration_aws_event_bridge.go | 26 ++++++++++++++----- datadog/internal/utils/utils.go | 4 +++ datadog/resource_datadog_integration_aws.go | 14 +++++----- ...urce_datadog_integration_aws_lambda_arn.go | 8 +++--- ..._datadog_integration_aws_log_collection.go | 12 ++++----- ...urce_datadog_integration_aws_tag_filter.go | 12 ++++----- 6 files changed, 45 insertions(+), 31 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index b9d2c6bf4e..b438707a79 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -2,7 +2,6 @@ package fwprovider import ( "context" - "sync" "github.com/DataDog/datadog-api-client-go/v2/api/datadogV1" "github.com/hashicorp/terraform-plugin-framework/diag" @@ -10,6 +9,9 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" "github.com/hashicorp/terraform-plugin-framework/resource/schema/booldefault" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/boolplanmodifier" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils" @@ -20,8 +22,6 @@ var ( _ resource.ResourceWithImportState = &integrationAwsEventBridgeResource{} ) -var integrationAWSEventBridgeMutex = sync.Mutex{} - type integrationAwsEventBridgeResource struct { Api *datadogV1.AWSIntegrationApi Auth context.Context @@ -56,20 +56,32 @@ func (r *integrationAwsEventBridgeResource) Schema(_ context.Context, _ resource "account_id": schema.StringAttribute{ Description: "Your AWS Account ID without dashes.", Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, }, "create_event_bus": schema.BoolAttribute{ Computed: true, Default: booldefault.StaticBool(false), Description: "True if Datadog should create the event bus in addition to the event source. Requires the `events:CreateEventBus` permission.", Optional: true, + PlanModifiers: []planmodifier.Bool{ + boolplanmodifier.RequiresReplace(), + }, }, "event_generator_name": schema.StringAttribute{ Description: "The given part of the event source name, which is then combined with an assigned suffix to form the full name.", Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, }, "region": schema.StringAttribute{ Description: "The event source's [AWS region](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints).", Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, }, "id": utils.ResourceIDAttribute(), }, @@ -141,8 +153,8 @@ func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request return } - integrationAWSEventBridgeMutex.Lock() - defer integrationAWSEventBridgeMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() body, diags := r.buildIntegrationAwsEventBridgeRequestBody(ctx, &state) response.Diagnostics.Append(diags...) @@ -176,8 +188,8 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request return } - integrationAWSEventBridgeMutex.Lock() - defer integrationAWSEventBridgeMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() req := datadogV1.NewAWSEventBridgeDeleteRequestWithDefaults() diff --git a/datadog/internal/utils/utils.go b/datadog/internal/utils/utils.go index f55fc58a4f..5267d47cc4 100644 --- a/datadog/internal/utils/utils.go +++ b/datadog/internal/utils/utils.go @@ -9,6 +9,7 @@ import ( "net/url" "os" "strings" + "sync" "github.com/DataDog/datadog-api-client-go/v2/api/datadog" frameworkDiag "github.com/hashicorp/terraform-plugin-framework/diag" @@ -70,6 +71,9 @@ var APIUrlEnvVars = []string{DDAPIUrlEnvName, DatadogAPIUrlEnvName} // DatadogProvider holds a reference to the provider var DatadogProvider *schema.Provider +// IntegrationAwsMutex mutex for AWS Integration resources +var IntegrationAwsMutex = sync.Mutex{} + // Resource minimal interface common to ResourceData and ResourceDiff type Resource interface { Get(string) interface{} diff --git a/datadog/resource_datadog_integration_aws.go b/datadog/resource_datadog_integration_aws.go index 68beb8c86c..1f88850655 100644 --- a/datadog/resource_datadog_integration_aws.go +++ b/datadog/resource_datadog_integration_aws.go @@ -6,7 +6,6 @@ import ( "os" "regexp" "strconv" - "sync" "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils" "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/validators" @@ -17,7 +16,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" ) -var integrationAwsMutex = sync.Mutex{} var accountAndRoleNameIDRegex = regexp.MustCompile("[\\d]+:.*") func resourceDatadogIntegrationAws() *schema.Resource { @@ -185,8 +183,8 @@ func resourceDatadogIntegrationAwsCreate(ctx context.Context, d *schema.Resource apiInstances := providerConf.DatadogApiInstances auth := providerConf.Auth - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() iaws := buildDatadogIntegrationAwsStruct(d) response, httpresp, err := apiInstances.GetAWSIntegrationApiV1().CreateAWSAccount(auth, *iaws) @@ -266,8 +264,8 @@ func resourceDatadogIntegrationAwsUpdate(ctx context.Context, d *schema.Resource providerConf := meta.(*ProviderConfiguration) apiInstances := providerConf.DatadogApiInstances auth := providerConf.Auth - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() iaws := buildDatadogIntegrationAwsStruct(d) @@ -323,8 +321,8 @@ func resourceDatadogIntegrationAwsDelete(ctx context.Context, d *schema.Resource providerConf := meta.(*ProviderConfiguration) apiInstances := providerConf.DatadogApiInstances auth := providerConf.Auth - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() iaws := buildDatadogIntegrationAwsDeleteStruct(d) diff --git a/datadog/resource_datadog_integration_aws_lambda_arn.go b/datadog/resource_datadog_integration_aws_lambda_arn.go index df61c4466d..903fc3d92b 100644 --- a/datadog/resource_datadog_integration_aws_lambda_arn.go +++ b/datadog/resource_datadog_integration_aws_lambda_arn.go @@ -56,8 +56,8 @@ func resourceDatadogIntegrationAwsLambdaArnCreate(ctx context.Context, d *schema auth := providerConf.Auth // shared with datadog_integration_aws resource - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() attachLambdaArnRequest := buildDatadogIntegrationAwsLambdaArnStruct(d) response, httpresp, err := apiInstances.GetAWSLogsIntegrationApiV1().CreateAWSLambdaARN(auth, *attachLambdaArnRequest) @@ -121,8 +121,8 @@ func resourceDatadogIntegrationAwsLambdaArnDelete(ctx context.Context, d *schema auth := providerConf.Auth // shared with datadog_integration_aws resource - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() accountID, lambdaArn, err := utils.AccountAndLambdaArnFromID(d.Id()) if err != nil { diff --git a/datadog/resource_datadog_integration_aws_log_collection.go b/datadog/resource_datadog_integration_aws_log_collection.go index 79f72a4dd8..b9f1febae6 100644 --- a/datadog/resource_datadog_integration_aws_log_collection.go +++ b/datadog/resource_datadog_integration_aws_log_collection.go @@ -63,8 +63,8 @@ func resourceDatadogIntegrationAwsLogCollectionCreate(ctx context.Context, d *sc auth := providerConf.Auth // shared with datadog_integration_aws resource - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() accountID := d.Get("account_id").(string) @@ -93,8 +93,8 @@ func resourceDatadogIntegrationAwsLogCollectionUpdate(ctx context.Context, d *sc auth := providerConf.Auth // shared with datadog_integration_aws resource - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() enableLogCollectionServices := buildDatadogIntegrationAwsLogCollectionStruct(d) _, httpresp, err := apiInstances.GetAWSLogsIntegrationApiV1().EnableAWSLogServices(auth, *enableLogCollectionServices) @@ -141,8 +141,8 @@ func resourceDatadogIntegrationAwsLogCollectionDelete(ctx context.Context, d *sc auth := providerConf.Auth // shared with datadog_integration_aws resource - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() accountID := d.Id() services := []string{} diff --git a/datadog/resource_datadog_integration_aws_tag_filter.go b/datadog/resource_datadog_integration_aws_tag_filter.go index 73a4d31bbc..85c5412313 100644 --- a/datadog/resource_datadog_integration_aws_tag_filter.go +++ b/datadog/resource_datadog_integration_aws_tag_filter.go @@ -69,8 +69,8 @@ func resourceDatadogIntegrationAwsTagFilterCreate(ctx context.Context, d *schema providerConf := meta.(*ProviderConfiguration) apiInstances := providerConf.DatadogApiInstances auth := providerConf.Auth - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() req := buildDatadogIntegrationAwsTagFilter(d) if _, httpresp, err := apiInstances.GetAWSIntegrationApiV1().CreateAWSTagFilter(auth, *req); err != nil { @@ -89,8 +89,8 @@ func resourceDatadogIntegrationAwsTagFilterUpdate(ctx context.Context, d *schema providerConf := meta.(*ProviderConfiguration) apiInstances := providerConf.DatadogApiInstances auth := providerConf.Auth - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() req := buildDatadogIntegrationAwsTagFilter(d) if _, httpresp, err := apiInstances.GetAWSIntegrationApiV1().CreateAWSTagFilter(auth, *req); err != nil { @@ -142,8 +142,8 @@ func resourceDatadogIntegrationAwsTagFilterDelete(ctx context.Context, d *schema providerConf := meta.(*ProviderConfiguration) apiInstances := providerConf.DatadogApiInstances auth := providerConf.Auth - integrationAwsMutex.Lock() - defer integrationAwsMutex.Unlock() + utils.IntegrationAwsMutex.Lock() + defer utils.IntegrationAwsMutex.Unlock() accountID, tfNamespace, err := utils.AccountAndNamespaceFromID(d.Id()) if err != nil { From 34ce8802dd91fbc3d93650a8419716399a5d5a46 Mon Sep 17 00:00:00 2001 From: Katie McKew <5915468+ktmq@users.noreply.github.com> Date: Tue, 26 Dec 2023 09:53:29 -0500 Subject: [PATCH 16/23] Update docs/resources/integration_aws_event_bridge.md Co-authored-by: Bryce Eadie --- docs/resources/integration_aws_event_bridge.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/resources/integration_aws_event_bridge.md b/docs/resources/integration_aws_event_bridge.md index 9c46f94ffa..13d88f1ed8 100644 --- a/docs/resources/integration_aws_event_bridge.md +++ b/docs/resources/integration_aws_event_bridge.md @@ -3,7 +3,7 @@ page_title: "datadog_integration_aws_event_bridge Resource - terraform-provider-datadog" subcategory: "" description: |- - Provides a datadogintegrationawseventbridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account. + Provides a Datadog - Amazon Web Services integration EventBridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account. --- # datadog_integration_aws_event_bridge (Resource) From dbfa557493c02ca1475b36147ab68829c311b2a4 Mon Sep 17 00:00:00 2001 From: Katie McKew <5915468+ktmq@users.noreply.github.com> Date: Tue, 26 Dec 2023 09:53:35 -0500 Subject: [PATCH 17/23] Update docs/resources/integration_aws_event_bridge.md Co-authored-by: Bryce Eadie --- docs/resources/integration_aws_event_bridge.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/resources/integration_aws_event_bridge.md b/docs/resources/integration_aws_event_bridge.md index 13d88f1ed8..4c9b0c71d8 100644 --- a/docs/resources/integration_aws_event_bridge.md +++ b/docs/resources/integration_aws_event_bridge.md @@ -8,7 +8,7 @@ description: |- # datadog_integration_aws_event_bridge (Resource) -Provides a datadog_integration_aws_event_bridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account. +Provides a datadog_integration_aws_event_bridge resource. This can be used to create and manage Event Sources for each Datadog-integrated AWS account. ## Example Usage From c401f81581ee77458e40e866a1d03fb2b210afbc Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 26 Dec 2023 10:20:36 -0500 Subject: [PATCH 18/23] Update docs for consistency --- .../resource_datadog_integration_aws_event_bridge.go | 12 ++++++------ docs/resources/integration_aws_event_bridge.md | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index b438707a79..3b492e2ff8 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -51,7 +51,7 @@ func (r *integrationAwsEventBridgeResource) Metadata(_ context.Context, request func (r *integrationAwsEventBridgeResource) Schema(_ context.Context, _ resource.SchemaRequest, response *resource.SchemaResponse) { response.Schema = schema.Schema{ - Description: "Provides a datadog_integration_aws_event_bridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account.", + Description: "Provides a Datadog - Amazon Web Services integration EventBridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account.", Attributes: map[string]schema.Attribute{ "account_id": schema.StringAttribute{ Description: "Your AWS Account ID without dashes.", @@ -104,7 +104,7 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re response.State.RemoveResource(ctx) return } - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error listing AWS Event Bridge Sources")) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error listing AWS EventBridge Event Sources")) return } if err := utils.CheckForUnparsed(resp); err != nil { @@ -164,7 +164,7 @@ func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request resp, _, err := r.Api.CreateAWSEventBridgeSource(r.Auth, *body) if err != nil { - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error creating AWS Event Bridge Source")) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error creating AWS EventBridge Event Source")) return } if err := utils.CheckForUnparsed(resp); err != nil { @@ -178,7 +178,7 @@ func (r *integrationAwsEventBridgeResource) Create(ctx context.Context, request } func (r *integrationAwsEventBridgeResource) Update(ctx context.Context, request resource.UpdateRequest, response *resource.UpdateResponse) { - response.Diagnostics.AddError("Update not supported", "AWS Event Bridge Sources cannot be updated") + response.Diagnostics.AddError("Update not supported", "AWS EventBridge Event Sources cannot be updated") } func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request resource.DeleteRequest, response *resource.DeleteResponse) { @@ -207,10 +207,10 @@ func (r *integrationAwsEventBridgeResource) Delete(ctx context.Context, request _, httpResp, err := r.Api.DeleteAWSEventBridgeSource(r.Auth, *req) if err != nil { if httpResp != nil && httpResp.StatusCode == 404 { - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "AWS Event Bridge Source not found")) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "AWS EventBridge Event Source not found")) return } - response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error deleting AWS Event Bridge Source")) + response.Diagnostics.Append(utils.FrameworkErrorDiag(err, "Error deleting AWS EventBridge Event Source")) return } } diff --git a/docs/resources/integration_aws_event_bridge.md b/docs/resources/integration_aws_event_bridge.md index 4c9b0c71d8..28c186bae4 100644 --- a/docs/resources/integration_aws_event_bridge.md +++ b/docs/resources/integration_aws_event_bridge.md @@ -8,7 +8,7 @@ description: |- # datadog_integration_aws_event_bridge (Resource) -Provides a datadog_integration_aws_event_bridge resource. This can be used to create and manage Event Sources for each Datadog-integrated AWS account. +Provides a Datadog - Amazon Web Services integration EventBridge resource. This can be used to create and manage Event Sources for each Datadog integrated AWS account. ## Example Usage From 65107bd174f487cb59522fa38a225f5608880a9c Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 2 Jan 2024 14:35:50 -0500 Subject: [PATCH 19/23] Default create_event_bus to true, remove redundant value and update test --- .../resource_datadog_integration_aws_event_bridge.go | 3 +-- .../resource_datadog_integration_aws_event_bridge_test.go | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index 3b492e2ff8..e3c37e6fd0 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -62,7 +62,7 @@ func (r *integrationAwsEventBridgeResource) Schema(_ context.Context, _ resource }, "create_event_bus": schema.BoolAttribute{ Computed: true, - Default: booldefault.StaticBool(false), + Default: booldefault.StaticBool(true), Description: "True if Datadog should create the event bus in addition to the event source. Requires the `events:CreateEventBus` permission.", Optional: true, PlanModifiers: []planmodifier.Bool{ @@ -126,7 +126,6 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re matchedEventHub.ID = types.StringValue(*eventhub.Name) matchedEventHub.AccountId = types.StringValue(account.GetAccountId()) matchedEventHub.Region = types.StringValue(eventhub.GetRegion()) - matchedEventHub.EventGeneratorName = types.StringValue(eventhub.GetName()) found = true break } diff --git a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go index 3617f1445e..8ddb25d741 100644 --- a/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go +++ b/datadog/tests/resource_datadog_integration_aws_event_bridge_test.go @@ -42,6 +42,7 @@ func testAccCheckDatadogIntegrationAwsEventBridge(accountID string, uniq string) resource "datadog_integration_aws_event_bridge" "foo" { account_id = "%s" event_generator_name = "%s" + create_event_bus = false region = "us-east-1" depends_on = [datadog_integration_aws.account] }`, accountID, accountID, uniq) From 796d2c051e9cb7a31df0a9d4142e567c7d10ecc8 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 2 Jan 2024 14:49:59 -0500 Subject: [PATCH 20/23] make docs --- docs/resources/integration_aws_event_bridge.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/resources/integration_aws_event_bridge.md b/docs/resources/integration_aws_event_bridge.md index 28c186bae4..621e7b168d 100644 --- a/docs/resources/integration_aws_event_bridge.md +++ b/docs/resources/integration_aws_event_bridge.md @@ -34,7 +34,7 @@ resource "datadog_integration_aws_event_bridge" "foo" { ### Optional -- `create_event_bus` (Boolean) True if Datadog should create the event bus in addition to the event source. Requires the `events:CreateEventBus` permission. Defaults to `false`. +- `create_event_bus` (Boolean) True if Datadog should create the event bus in addition to the event source. Requires the `events:CreateEventBus` permission. Defaults to `true`. ### Read-Only From ce5c01f430ed18a4bdc7f078dd0c543804370dae Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 2 Jan 2024 16:32:14 -0500 Subject: [PATCH 21/23] make fmt --- datadog/fwprovider/data_source_datadog_rum_application.go | 1 + examples/guides/watchdog_monitor.tf | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/datadog/fwprovider/data_source_datadog_rum_application.go b/datadog/fwprovider/data_source_datadog_rum_application.go index 801382b664..f48939e48f 100644 --- a/datadog/fwprovider/data_source_datadog_rum_application.go +++ b/datadog/fwprovider/data_source_datadog_rum_application.go @@ -10,6 +10,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/terraform-providers/terraform-provider-datadog/datadog/internal/utils" ) diff --git a/examples/guides/watchdog_monitor.tf b/examples/guides/watchdog_monitor.tf index fc8ef0ce07..32085e0c9e 100644 --- a/examples/guides/watchdog_monitor.tf +++ b/examples/guides/watchdog_monitor.tf @@ -1,7 +1,7 @@ resource "datadog_monitor" "watchdog_monitor" { - name = "Watchdog detected an anomaly: {{event.title}}" - type = "event-v2 alert" - message = "Watchdog monitor created from Terraform" + name = "Watchdog detected an anomaly: {{event.title}}" + type = "event-v2 alert" + message = "Watchdog monitor created from Terraform" query = "events(\"source:watchdog story_category:apm env:test_env\").rollup(\"count\").by(\"story_key,service,resource_name\").last(\"30m\") > 0" From 92bef0586771efbf07293cff6c784c99e06cc727 Mon Sep 17 00:00:00 2001 From: Katie McKew Date: Tue, 2 Jan 2024 16:34:35 -0500 Subject: [PATCH 22/23] make docs after make fmt --- docs/guides/monitors.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/monitors.md b/docs/guides/monitors.md index beae4248db..76f5be2eee 100644 --- a/docs/guides/monitors.md +++ b/docs/guides/monitors.md @@ -26,9 +26,9 @@ resource "datadog_monitor" "bar" { ```terraform resource "datadog_monitor" "watchdog_monitor" { - name = "Watchdog detected an anomaly: {{event.title}}" - type = "event-v2 alert" - message = "Watchdog monitor created from Terraform" + name = "Watchdog detected an anomaly: {{event.title}}" + type = "event-v2 alert" + message = "Watchdog monitor created from Terraform" query = "events(\"source:watchdog story_category:apm env:test_env\").rollup(\"count\").by(\"story_key,service,resource_name\").last(\"30m\") > 0" From 823d85db2f2ff64f79c78542b9b8d7454ab25597 Mon Sep 17 00:00:00 2001 From: Katie McKew <5915468+ktmq@users.noreply.github.com> Date: Wed, 3 Jan 2024 14:19:38 -0500 Subject: [PATCH 23/23] Update datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go Co-authored-by: Kevin Zou <17015060+nkzou@users.noreply.github.com> --- .../fwprovider/resource_datadog_integration_aws_event_bridge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go index e3c37e6fd0..ad52c645c5 100644 --- a/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go +++ b/datadog/fwprovider/resource_datadog_integration_aws_event_bridge.go @@ -136,7 +136,7 @@ func (r *integrationAwsEventBridgeResource) Read(ctx context.Context, request re if !found { response.State.RemoveResource(ctx) - response.Diagnostics.AddError("Import error", "No matching Event Source found") + response.Diagnostics.AddWarning("Read error", "No matching Event Source found.") return }