From e0fcb24419a7bcd24e50896bf4068fe281e4c4f8 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 14:55:59 -0400 Subject: [PATCH 01/19] drs: Fix replication configuration template --- .../drs/replication_configuration_template.go | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/internal/service/drs/replication_configuration_template.go b/internal/service/drs/replication_configuration_template.go index 500e1a1947d7..7404bbcaecb3 100644 --- a/internal/service/drs/replication_configuration_template.go +++ b/internal/service/drs/replication_configuration_template.go @@ -15,6 +15,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework-validators/listvalidator" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/boolplanmodifier" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/schema/validator" "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" @@ -22,6 +24,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/errs" "github.com/hashicorp/terraform-provider-aws/internal/errs/fwdiag" "github.com/hashicorp/terraform-provider-aws/internal/framework" + "github.com/hashicorp/terraform-provider-aws/internal/framework/flex" fwflex "github.com/hashicorp/terraform-provider-aws/internal/framework/flex" fwtypes "github.com/hashicorp/terraform-provider-aws/internal/framework/types" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" @@ -61,7 +64,11 @@ func (r *replicationConfigurationTemplateResource) Schema(ctx context.Context, r Required: true, }, "auto_replicate_new_disks": schema.BoolAttribute{ + Computed: true, Optional: true, + PlanModifiers: []planmodifier.Bool{ + boolplanmodifier.UseStateForUnknown(), + }, }, "bandwidth_throttling": schema.Int64Attribute{ Required: true, @@ -152,7 +159,7 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r conn := r.Meta().DRSClient(ctx) input := &drs.CreateReplicationConfigurationTemplateInput{} - response.Diagnostics.Append(fwflex.Expand(ctx, data, input)...) + response.Diagnostics.Append(fwflex.Expand(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), data, input)...) if response.Diagnostics.HasError() { return } @@ -174,7 +181,7 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r return } - response.Diagnostics.Append(fwflex.Flatten(ctx, output, &data)...) + response.Diagnostics.Append(fwflex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &data)...) if response.Diagnostics.HasError() { return } @@ -206,7 +213,7 @@ func (r *replicationConfigurationTemplateResource) Read(ctx context.Context, req return } - response.Diagnostics.Append(fwflex.Flatten(ctx, output, &data)...) + response.Diagnostics.Append(fwflex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &data)...) if response.Diagnostics.HasError() { return } @@ -230,7 +237,7 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r if replicationConfigurationTemplateHasChanges(ctx, new, old) { input := &drs.UpdateReplicationConfigurationTemplateInput{} - response.Diagnostics.Append(fwflex.Expand(ctx, new, input)...) + response.Diagnostics.Append(fwflex.Expand(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), new, input)...) if response.Diagnostics.HasError() { return } @@ -256,7 +263,7 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r return } - response.Diagnostics.Append(fwflex.Flatten(ctx, output, &new)...) + response.Diagnostics.Append(fwflex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &new)...) if response.Diagnostics.HasError() { return } @@ -341,9 +348,7 @@ func findReplicationConfigurationTemplates(ctx context.Context, conn *drs.Client } func findReplicationConfigurationTemplateByID(ctx context.Context, conn *drs.Client, id string) (*awstypes.ReplicationConfigurationTemplate, error) { - input := &drs.DescribeReplicationConfigurationTemplatesInput{ - ReplicationConfigurationTemplateIDs: []string{id}, - } + input := &drs.DescribeReplicationConfigurationTemplatesInput{} return findReplicationConfigurationTemplate(ctx, conn, input) } From a98a6fc498dcbdb98081f845b3c1380de213d4ee Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 14:58:29 -0400 Subject: [PATCH 02/19] Add changelog --- .changelog/38143.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/38143.txt diff --git a/.changelog/38143.txt b/.changelog/38143.txt new file mode 100644 index 000000000000..49e60f8c3b3e --- /dev/null +++ b/.changelog/38143.txt @@ -0,0 +1,3 @@ +```release-note:bug +resource/aws_drs_replication_configuration_template: Fix issues preventing creation and deletion +``` \ No newline at end of file From 0630324854a115aff94d5fc5d51079ed42cd9313 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 14:58:48 -0400 Subject: [PATCH 03/19] drs: Add consts --- internal/service/drs/consts.go | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 internal/service/drs/consts.go diff --git a/internal/service/drs/consts.go b/internal/service/drs/consts.go new file mode 100644 index 000000000000..f9c32fcac45a --- /dev/null +++ b/internal/service/drs/consts.go @@ -0,0 +1,10 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package drs + +// Exports for use in tests only. +const ( + ResNameReplicationConfigurationTemplate = "Replication Configuration Template" + ResPrefixReplicationConfigurationTemplate = "ReplicationConfigurationTemplate" +) From eca3f42e1cb2fcf01a73fffa4e158732448a20ab Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 15:32:05 -0400 Subject: [PATCH 04/19] errs: Add AddError convenience --- internal/create/errors.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/create/errors.go b/internal/create/errors.go index 41dfd1961d35..914f746a1389 100644 --- a/internal/create/errors.go +++ b/internal/create/errors.go @@ -53,6 +53,13 @@ func ProblemStandardMessage(service, action, resource, id string, gotError error return fmt.Sprintf("%s %s %s (%s): %s", action, hf, resource, id, gotError) } +func AddError(d fwdiag.Diagnostics, service, action, resource, id string, gotError error) { + d.AddError( + ProblemStandardMessage(service, action, resource, id, nil), + gotError.Error(), + ) +} + // Error returns an errors.Error with a standardized error message func Error(service, action, resource, id string, gotError error) error { return errors.New(ProblemStandardMessage(service, action, resource, id, gotError)) From e0e635f654ce8a9612fa5d001cbfd0b70fbb8919 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 15:32:34 -0400 Subject: [PATCH 05/19] drs: Exports for testing --- internal/service/drs/exports_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/service/drs/exports_test.go b/internal/service/drs/exports_test.go index 432b2c2a6c2a..810adaafe6cb 100644 --- a/internal/service/drs/exports_test.go +++ b/internal/service/drs/exports_test.go @@ -5,5 +5,7 @@ package drs // Exports for use in tests only. var ( + ResourceReplicationConfigurationTemplate = newReplicationConfigurationTemplateResource + FindReplicationConfigurationTemplateByID = findReplicationConfigurationTemplateByID ) From 0dc542f65a4a27b4147bcc33f1ba69746fd4a76c Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 15:33:03 -0400 Subject: [PATCH 06/19] drs/rep_con_templ: Use AddError --- .../drs/replication_configuration_template.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/internal/service/drs/replication_configuration_template.go b/internal/service/drs/replication_configuration_template.go index 7404bbcaecb3..0d50fee4d9e0 100644 --- a/internal/service/drs/replication_configuration_template.go +++ b/internal/service/drs/replication_configuration_template.go @@ -5,7 +5,6 @@ package drs import ( "context" - "fmt" "time" "github.com/aws/aws-sdk-go-v2/aws" @@ -21,6 +20,7 @@ import ( "github.com/hashicorp/terraform-plugin-framework/types" "github.com/hashicorp/terraform-plugin-log/tflog" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" + "github.com/hashicorp/terraform-provider-aws/internal/create" "github.com/hashicorp/terraform-provider-aws/internal/errs" "github.com/hashicorp/terraform-provider-aws/internal/errs/fwdiag" "github.com/hashicorp/terraform-provider-aws/internal/framework" @@ -168,7 +168,7 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r _, err := conn.CreateReplicationConfigurationTemplate(ctx, input) if err != nil { - response.Diagnostics.AddError("creating DRS Replication Configuration Template", err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionCreating, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } @@ -176,7 +176,7 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r output, err := waitReplicationConfigurationTemplateAvailable(ctx, conn, data.ID.ValueString(), r.CreateTimeout(ctx, data.Timeouts)) if err != nil { - response.Diagnostics.AddError(fmt.Sprintf("waiting for DRS Replication Configuration Template (%s) create", data.ID.ValueString()), err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionWaitingForCreation, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } @@ -208,7 +208,7 @@ func (r *replicationConfigurationTemplateResource) Read(ctx context.Context, req } if err != nil { - response.Diagnostics.AddError(fmt.Sprintf("reading Replication Configuration Template (%s)", data.ID.ValueString()), err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionReading, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } @@ -244,13 +244,13 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r _, err := conn.UpdateReplicationConfigurationTemplate(ctx, input) if err != nil { - response.Diagnostics.AddError(fmt.Sprintf("updating DRS Replication Configuration Template (%s)", new.ID.ValueString()), err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionUpdating, ResNameReplicationConfigurationTemplate, new.ID.ValueString(), err) return } if _, err := waitReplicationConfigurationTemplateAvailable(ctx, conn, old.ID.ValueString(), r.UpdateTimeout(ctx, new.Timeouts)); err != nil { - response.Diagnostics.AddError(fmt.Sprintf("waiting for DRS Replication Configuration Template (%s) update", new.ID.ValueString()), err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionWaitingForUpdate, ResNameReplicationConfigurationTemplate, new.ID.ValueString(), err) return } @@ -258,7 +258,7 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r output, err := findReplicationConfigurationTemplateByID(ctx, conn, old.ID.ValueString()) if err != nil { - response.Diagnostics.AddError(fmt.Sprintf("reading DRS Replication Configuration Template (%s)", old.ID.ValueString()), err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionUpdating, ResNameReplicationConfigurationTemplate, old.ID.ValueString(), err) return } @@ -297,13 +297,13 @@ func (r *replicationConfigurationTemplateResource) Delete(ctx context.Context, r } if err != nil { - response.Diagnostics.AddError(fmt.Sprintf("deleting DRS Replication Configuration Template (%s)", data.ID.ValueString()), err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionDeleting, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } if _, err := waitReplicationConfigurationTemplateDeleted(ctx, conn, data.ID.ValueString(), r.DeleteTimeout(ctx, data.Timeouts)); err != nil { - response.Diagnostics.AddError(fmt.Sprintf("waiting for DRS Replication Configuration Template (%s) delete", data.ID.ValueString()), err.Error()) + create.AddError(response.Diagnostics, names.DRS, create.ErrActionWaitingForDeletion, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } From 6a7cc13c7800d1b712b1ad29a4609cb6961de0c9 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 15:33:24 -0400 Subject: [PATCH 07/19] drs/rep_conf_templ: Fix tests --- ...replication_configuration_template_test.go | 93 ++++++++++++++++--- 1 file changed, 80 insertions(+), 13 deletions(-) diff --git a/internal/service/drs/replication_configuration_template_test.go b/internal/service/drs/replication_configuration_template_test.go index 28a213c75de3..a3347d13b340 100644 --- a/internal/service/drs/replication_configuration_template_test.go +++ b/internal/service/drs/replication_configuration_template_test.go @@ -7,9 +7,9 @@ import ( "context" "fmt" "testing" + "time" awstypes "github.com/aws/aws-sdk-go-v2/service/drs/types" - "github.com/aws/aws-sdk-go/aws" sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" @@ -20,13 +20,26 @@ import ( "github.com/hashicorp/terraform-provider-aws/names" ) -func TestAccDRSReplicationConfigurationTemplate_basic(t *testing.T) { +// TestAccDRSReplicationConfigurationTemplate_serial serializes the tests +// since the account limit tends to be 1. +func TestAccDRSReplicationConfigurationTemplate_serial(t *testing.T) { + t.Parallel() + + testCases := map[string]func(t *testing.T){ + acctest.CtBasic: testAccReplicationConfigurationTemplate_basic, + acctest.CtDisappears: testAccReplicationConfigurationTemplate_disappears, + } + + acctest.RunSerialTests1Level(t, testCases, 5*time.Second) +} + +func testAccReplicationConfigurationTemplate_basic(t *testing.T) { ctx := acctest.Context(t) rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) resourceName := "aws_drs_replication_configuration_template.test" var rct awstypes.ReplicationConfigurationTemplate - resource.ParallelTest(t, resource.TestCase{ + resource.Test(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(ctx, t) }, ErrorCheck: acctest.ErrorCheck(t, names.DRSServiceID), ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, @@ -48,14 +61,28 @@ func TestAccDRSReplicationConfigurationTemplate_basic(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "use_dedicated_replication_server", acctest.CtFalse), resource.TestCheckResourceAttr(resourceName, "replication_server_instance_type", "t3.small"), resource.TestCheckResourceAttr(resourceName, "replication_servers_security_groups_ids.#", acctest.Ct1), - resource.TestCheckResourceAttr(resourceName, "staging_area_subnet_id", aws.StringValue(rct.StagingAreaSubnetId)), - resource.TestCheckTypeSetElemNestedAttrs(resourceName, "pit_policy", map[string]string{ - names.AttrEnabled: acctest.CtFalse, - names.AttrInterval: "14", - "retention_duration": "21", - "units": "DAY", + resource.TestCheckResourceAttrPair(resourceName, "staging_area_subnet_id", "aws_subnet.test.0", "id"), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "pit_policy.*", map[string]string{ + names.AttrEnabled: acctest.CtTrue, + names.AttrInterval: "10", + "retention_duration": "60", + "units": "MINUTE", "rule_id": acctest.Ct1, }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "pit_policy.*", map[string]string{ + names.AttrEnabled: acctest.CtTrue, + names.AttrInterval: "1", + "retention_duration": "24", + "units": "HOUR", + "rule_id": acctest.Ct2, + }), + resource.TestCheckTypeSetElemNestedAttrs(resourceName, "pit_policy.*", map[string]string{ + names.AttrEnabled: acctest.CtTrue, + names.AttrInterval: "1", + "retention_duration": "3", + "units": "DAY", + "rule_id": acctest.Ct3, + }), resource.TestCheckResourceAttr(resourceName, "staging_area_tags.%", acctest.Ct1), resource.TestCheckResourceAttr(resourceName, "staging_area_tags.Name", rName), ), @@ -69,6 +96,30 @@ func TestAccDRSReplicationConfigurationTemplate_basic(t *testing.T) { }) } +func testAccReplicationConfigurationTemplate_disappears(t *testing.T) { + ctx := acctest.Context(t) + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + resourceName := "aws_drs_replication_configuration_template.test" + var rct awstypes.ReplicationConfigurationTemplate + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, names.DRSServiceID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckReplicationConfigurationTemplateDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccReplicationConfigurationTemplateConfig_basic(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckReplicationConfigurationTemplateExists(ctx, resourceName, &rct), + acctest.CheckFrameworkResourceDisappears(ctx, acctest.Provider, tfdrs.ResourceReplicationConfigurationTemplate, resourceName), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) +} + func testAccCheckReplicationConfigurationTemplateExists(ctx context.Context, n string, v *awstypes.ReplicationConfigurationTemplate) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] @@ -145,13 +196,29 @@ resource "aws_drs_replication_configuration_template" "test" { staging_area_subnet_id = aws_subnet.test[0].id pit_policy { - enabled = false - interval = 14 - retention_duration = 21 - units = "DAY" + enabled = true + interval = 10 + retention_duration = 60 + units = "MINUTE" rule_id = 1 } + pit_policy { + enabled = true + interval = 1 + retention_duration = 24 + units = "HOUR" + rule_id = 2 + } + + pit_policy { + enabled = true + interval = 1 + retention_duration = 3 + units = "DAY" + rule_id = 3 + } + staging_area_tags = { Name = %[1]q } From 28a26350ab04e16228a6eeeaec87c4476b00b8f6 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 15:33:36 -0400 Subject: [PATCH 08/19] drs: Update docs --- ...ation_configuration_template.html.markdown | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/website/docs/r/drs_replication_configuration_template.html.markdown b/website/docs/r/drs_replication_configuration_template.html.markdown index e3b91516c6c1..91748c3eefc0 100644 --- a/website/docs/r/drs_replication_configuration_template.html.markdown +++ b/website/docs/r/drs_replication_configuration_template.html.markdown @@ -10,7 +10,7 @@ description: |- Provides an Elastic Disaster Recovery replication configuration template resource. -~> **NOTE:** This resource is provided on a best-effort basis and may not function as intended. Due to challenges with DRS permissions, it has not been fully tested. We are collaborating with AWS to enhance its functionality and [welcome your feedback](https://github.com/hashicorp/terraform-provider-aws/issues/new/choose). +~> **NOTE:** Your configuration must use the PIT policy shown in the [basic configuration](#basic-configuration) due to AWS rules. The only value that you can change is the `retention_duration` of `rule_id` 3. ## Example Usage @@ -30,11 +30,28 @@ resource "aws_drs_replication_configuration_template" "example" { staging_area_subnet_id = aws_subnet.example.id use_dedicated_replication_server = false + pit_policy { + enabled = true + interval = 10 + retention_duration = 60 + units = "MINUTE" + rule_id = 1 + } + + pit_policy { + enabled = true + interval = 1 + retention_duration = 24 + units = "HOUR" + rule_id = 2 + } + pit_policy { enabled = true interval = 1 - retention_duration = 1 + retention_duration = 3 units = "DAY" + rule_id = 3 } } ``` @@ -64,6 +81,8 @@ The following arguments are optional: ### `pit_policy` +The PIT policies _must_ be specified as shown in the [basic configuration example](#basic-configuration) above. The only value that you can change is the `retention_duration` of `rule_id` 3. + * `enabled` - (Optional) Whether this rule is enabled or not. * `interval` - (Required) How often, in the chosen units, a snapshot should be taken. * `retention_duration` - (Required) Duration to retain a snapshot for, in the chosen `units`. From b0ecbff347cc2d570c487d110fd5d28c501936fa Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:29:12 -0400 Subject: [PATCH 09/19] create/errs: Need by ref --- internal/create/errors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/create/errors.go b/internal/create/errors.go index 914f746a1389..d739ba9154c7 100644 --- a/internal/create/errors.go +++ b/internal/create/errors.go @@ -53,7 +53,7 @@ func ProblemStandardMessage(service, action, resource, id string, gotError error return fmt.Sprintf("%s %s %s (%s): %s", action, hf, resource, id, gotError) } -func AddError(d fwdiag.Diagnostics, service, action, resource, id string, gotError error) { +func AddError(d *fwdiag.Diagnostics, service, action, resource, id string, gotError error) { d.AddError( ProblemStandardMessage(service, action, resource, id, nil), gotError.Error(), From c05120fdd2cfff15a9cb9d14a8292799204ffa78 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:29:30 -0400 Subject: [PATCH 10/19] drs: Add helpful info --- .../docs/r/drs_replication_configuration_template.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/r/drs_replication_configuration_template.html.markdown b/website/docs/r/drs_replication_configuration_template.html.markdown index 91748c3eefc0..a0b4a7408e4b 100644 --- a/website/docs/r/drs_replication_configuration_template.html.markdown +++ b/website/docs/r/drs_replication_configuration_template.html.markdown @@ -8,7 +8,7 @@ description: |- # Resource: aws_drs_replication_configuration_template -Provides an Elastic Disaster Recovery replication configuration template resource. +Provides an Elastic Disaster Recovery replication configuration template resource. Before using DRS, your account must be [initialized](https://docs.aws.amazon.com/drs/latest/userguide/getting-started-initializing.html). ~> **NOTE:** Your configuration must use the PIT policy shown in the [basic configuration](#basic-configuration) due to AWS rules. The only value that you can change is the `retention_duration` of `rule_id` 3. From a6edce496395e966df25177cf17271e9b542257c Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:29:55 -0400 Subject: [PATCH 11/19] drs/rep_conf_templ: Fix error issues --- .../drs/replication_configuration_template.go | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/internal/service/drs/replication_configuration_template.go b/internal/service/drs/replication_configuration_template.go index 0d50fee4d9e0..04021b55d4cb 100644 --- a/internal/service/drs/replication_configuration_template.go +++ b/internal/service/drs/replication_configuration_template.go @@ -168,7 +168,7 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r _, err := conn.CreateReplicationConfigurationTemplate(ctx, input) if err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionCreating, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionCreating, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } @@ -176,11 +176,12 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r output, err := waitReplicationConfigurationTemplateAvailable(ctx, conn, data.ID.ValueString(), r.CreateTimeout(ctx, data.Timeouts)) if err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionWaitingForCreation, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionWaitingForCreation, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } + //data.ID = fwflex.StringToFramework(ctx, output.ReplicationConfigurationTemplateID) response.Diagnostics.Append(fwflex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &data)...) if response.Diagnostics.HasError() { return @@ -208,7 +209,7 @@ func (r *replicationConfigurationTemplateResource) Read(ctx context.Context, req } if err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionReading, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionReading, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } @@ -244,13 +245,13 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r _, err := conn.UpdateReplicationConfigurationTemplate(ctx, input) if err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionUpdating, ResNameReplicationConfigurationTemplate, new.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionUpdating, ResNameReplicationConfigurationTemplate, new.ID.ValueString(), err) return } if _, err := waitReplicationConfigurationTemplateAvailable(ctx, conn, old.ID.ValueString(), r.UpdateTimeout(ctx, new.Timeouts)); err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionWaitingForUpdate, ResNameReplicationConfigurationTemplate, new.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionWaitingForUpdate, ResNameReplicationConfigurationTemplate, new.ID.ValueString(), err) return } @@ -258,7 +259,7 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r output, err := findReplicationConfigurationTemplateByID(ctx, conn, old.ID.ValueString()) if err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionUpdating, ResNameReplicationConfigurationTemplate, old.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionUpdating, ResNameReplicationConfigurationTemplate, old.ID.ValueString(), err) return } @@ -297,13 +298,13 @@ func (r *replicationConfigurationTemplateResource) Delete(ctx context.Context, r } if err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionDeleting, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionDeleting, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } if _, err := waitReplicationConfigurationTemplateDeleted(ctx, conn, data.ID.ValueString(), r.DeleteTimeout(ctx, data.Timeouts)); err != nil { - create.AddError(response.Diagnostics, names.DRS, create.ErrActionWaitingForDeletion, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) + create.AddError(&response.Diagnostics, names.DRS, create.ErrActionWaitingForDeletion, ResNameReplicationConfigurationTemplate, data.ID.ValueString(), err) return } @@ -348,7 +349,9 @@ func findReplicationConfigurationTemplates(ctx context.Context, conn *drs.Client } func findReplicationConfigurationTemplateByID(ctx context.Context, conn *drs.Client, id string) (*awstypes.ReplicationConfigurationTemplate, error) { - input := &drs.DescribeReplicationConfigurationTemplatesInput{} + input := &drs.DescribeReplicationConfigurationTemplatesInput{ + //ReplicationConfigurationTemplateIDs: []string{id}, + } return findReplicationConfigurationTemplate(ctx, conn, input) } From 4c4dfa31f32b611f5fbda196f82437941cb418bc Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:42:33 -0400 Subject: [PATCH 12/19] drs: Fix find --- internal/service/drs/replication_configuration_template.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/service/drs/replication_configuration_template.go b/internal/service/drs/replication_configuration_template.go index 04021b55d4cb..160dce8ce697 100644 --- a/internal/service/drs/replication_configuration_template.go +++ b/internal/service/drs/replication_configuration_template.go @@ -350,7 +350,7 @@ func findReplicationConfigurationTemplates(ctx context.Context, conn *drs.Client func findReplicationConfigurationTemplateByID(ctx context.Context, conn *drs.Client, id string) (*awstypes.ReplicationConfigurationTemplate, error) { input := &drs.DescribeReplicationConfigurationTemplatesInput{ - //ReplicationConfigurationTemplateIDs: []string{id}, + //ReplicationConfigurationTemplateIDs: []string{id}, // Uncomment when SDK supports this, currently MAX of 1 so you find it anyway } return findReplicationConfigurationTemplate(ctx, conn, input) From cd7ef5bae0fb5580f1e77ef7c6b725538ab13153 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:43:01 -0400 Subject: [PATCH 13/19] drs: Add example of initializing DRS --- examples/drs-initialize/README.md | 9 + examples/drs-initialize/main.tf | 284 ++++++++++++++++++++++++++++++ 2 files changed, 293 insertions(+) create mode 100644 examples/drs-initialize/README.md create mode 100644 examples/drs-initialize/main.tf diff --git a/examples/drs-initialize/README.md b/examples/drs-initialize/README.md new file mode 100644 index 000000000000..a33d5abc60c7 --- /dev/null +++ b/examples/drs-initialize/README.md @@ -0,0 +1,9 @@ +# DRS Initialize Example + +This is an example of using the Terraform AWS Provider to manually initializing your account to use DRS. For more information see the [AWS instructions](https://docs.aws.amazon.com/drs/latest/userguide/getting-started-initializing.html). + +Running the example: + +1. Run `terraform apply` +2. Assume the `AWSElasticDisasterRecoveryInitializerRole` role +3. Use the AWS CLI to initialize: `aws drs initialize-service` diff --git a/examples/drs-initialize/main.tf b/examples/drs-initialize/main.tf new file mode 100644 index 000000000000..c068eccf5d2d --- /dev/null +++ b/examples/drs-initialize/main.tf @@ -0,0 +1,284 @@ +data "aws_caller_identity" "current" {} + +resource "aws_iam_role" "AWSElasticDisasterRecoveryAgentRole" { + name = "AWSElasticDisasterRecoveryAgentRole" + path = "/service-role/" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "drs.amazonaws.com" + } + Action = [ + "sts:AssumeRole", + "sts:SetSourceIdentity" + ] + Condition = { + StringLike = { + "sts:SourceIdentity" = "s-*", + "aws:SourceAccount" = data.aws_caller_identity.current.account_id + } + } + } + ] + }) +} + +resource "aws_iam_role" "AWSElasticDisasterRecoveryFailbackRole" { + name = "AWSElasticDisasterRecoveryFailbackRole" + path = "/service-role/" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "drs.amazonaws.com" + } + Action = [ + "sts:AssumeRole", + "sts:SetSourceIdentity" + ] + Condition = { + StringLike = { + "sts:SourceIdentity" = "i-*", + "aws:SourceAccount" = data.aws_caller_identity.current.account_id + } + } + } + ] + }) +} + +resource "aws_iam_role" "AWSElasticDisasterRecoveryConversionServerRole" { + name = "AWSElasticDisasterRecoveryConversionServerRole" + path = "/service-role/" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "ec2.amazonaws.com" + } + Action = "sts:AssumeRole" + } + ] + }) +} + +resource "aws_iam_role" "AWSElasticDisasterRecoveryRecoveryInstanceRole" { + name = "AWSElasticDisasterRecoveryRecoveryInstanceRole" + path = "/service-role/" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "ec2.amazonaws.com" + } + Action = "sts:AssumeRole" + } + ] + }) +} + +resource "aws_iam_role" "AWSElasticDisasterRecoveryReplicationServerRole" { + name = "AWSElasticDisasterRecoveryReplicationServerRole" + path = "/service-role/" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "ec2.amazonaws.com" + } + Action = "sts:AssumeRole" + } + ] + }) +} + +resource "aws_iam_role" "AWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole" { + name = "AWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole" + path = "/service-role/" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "ec2.amazonaws.com" + } + Action = "sts:AssumeRole" + } + ] + }) +} + +data "aws_iam_policy" "AWSElasticDisasterRecoveryAgentPolicy" { + name = "AWSElasticDisasterRecoveryAgentPolicy" +} + +data "aws_iam_policy" "AWSElasticDisasterRecoveryFailbackPolicy" { + name = "AWSElasticDisasterRecoveryFailbackPolicy" +} + +data "aws_iam_policy" "AWSElasticDisasterRecoveryConversionServerPolicy" { + name = "AWSElasticDisasterRecoveryConversionServerPolicy" +} + +data "aws_iam_policy" "AWSElasticDisasterRecoveryRecoveryInstancePolicy" { + name = "AWSElasticDisasterRecoveryRecoveryInstancePolicy" +} + +data "aws_iam_policy" "AWSElasticDisasterRecoveryReplicationServerPolicy" { + name = "AWSElasticDisasterRecoveryReplicationServerPolicy" +} + +data "aws_iam_policy" "AmazonSSMManagedInstanceCore" { + name = "AmazonSSMManagedInstanceCore" +} + +resource "aws_iam_role_policy_attachment" "AWSElasticDisasterRecoveryAgentRole" { + role = aws_iam_role.AWSElasticDisasterRecoveryAgentRole.name + policy_arn = data.aws_iam_policy.AWSElasticDisasterRecoveryAgentPolicy.arn +} + +resource "aws_iam_role_policy_attachment" "AWSElasticDisasterRecoveryFailbackRole" { + role = aws_iam_role.AWSElasticDisasterRecoveryFailbackRole.name + policy_arn = data.aws_iam_policy.AWSElasticDisasterRecoveryFailbackPolicy.arn +} + +resource "aws_iam_role_policy_attachment" "AWSElasticDisasterRecoveryConversionServerRole" { + role = aws_iam_role.AWSElasticDisasterRecoveryConversionServerRole.name + policy_arn = data.aws_iam_policy.AWSElasticDisasterRecoveryConversionServerPolicy.arn +} + +resource "aws_iam_role_policy_attachment" "AWSElasticDisasterRecoveryRecoveryInstanceRole" { + role = aws_iam_role.AWSElasticDisasterRecoveryRecoveryInstanceRole.name + policy_arn = data.aws_iam_policy.AWSElasticDisasterRecoveryRecoveryInstancePolicy.arn +} + +resource "aws_iam_role_policy_attachment" "AWSElasticDisasterRecoveryReplicationServerRole" { + role = aws_iam_role.AWSElasticDisasterRecoveryReplicationServerRole.name + policy_arn = data.aws_iam_policy.AWSElasticDisasterRecoveryReplicationServerPolicy.arn +} + +resource "aws_iam_role_policy_attachment" "AWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole1" { + role = aws_iam_role.AWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole.name + policy_arn = data.aws_iam_policy.AWSElasticDisasterRecoveryRecoveryInstancePolicy.arn +} + +resource "aws_iam_role_policy_attachment" "AWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole2" { + role = aws_iam_role.AWSElasticDisasterRecoveryRecoveryInstanceWithLaunchActionsRole.name + policy_arn = data.aws_iam_policy.AmazonSSMManagedInstanceCore.arn +} + + +resource "aws_iam_role" "AWSElasticDisasterRecoveryInitializerRole" { + name = "AWSElasticDisasterRecoveryInitializerRole" + path = "/" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + AWS = data.aws_caller_identity.current.user_id + } + Action = "sts:AssumeRole" + } + ] + }) +} + +resource "aws_iam_policy" "InitializePolicy" { + name = "InitializePolicy" + description = "Policy for initializing the AWS Elastic Disaster Recovery service" + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Action = "iam:AttachRolePolicy" + Resource = "*" + Condition = { + "ForAnyValue:ArnEquals" = { + "iam:PolicyARN" = [ + data.aws_iam_policy.AWSElasticDisasterRecoveryAgentPolicy.arn, + data.aws_iam_policy.AWSElasticDisasterRecoveryFailbackPolicy.arn, + data.aws_iam_policy.AWSElasticDisasterRecoveryConversionServerPolicy.arn, + data.aws_iam_policy.AWSElasticDisasterRecoveryRecoveryInstancePolicy.arn, + data.aws_iam_policy.AWSElasticDisasterRecoveryReplicationServerPolicy.arn + ] + } + } + }, + { + Effect = "Allow" + Action = "iam:PassRole" + Resource = "arn:aws:iam::*:role/*" + Condition = { + "ForAnyValue:StringLike" = { + "iam:PassedToService" = [ + "ec2.amazonaws.com", + "drs.amazonaws.com" + ] + } + } + }, + { + Effect = "Allow" + Action = [ + "drs:InitializeService", + "drs:ListTagsForResource", + "drs:GetReplicationConfiguration", + "drs:CreateLaunchConfigurationTemplate", + "drs:GetLaunchConfiguration", + "drs:CreateReplicationConfigurationTemplate", + "drs:*ReplicationConfigurationTemplate*", + "iam:TagRole", + "iam:CreateRole", + "iam:GetServiceLinkedRoleDeletionStatus", + "iam:ListAttachedRolePolicies", + "iam:ListRolePolicies", + "iam:GetRole", + "iam:DeleteRole", + "iam:DeleteServiceLinkedRole", + "ec2:*", + "sts:DecodeAuthorizationMessage", + ] + Resource = "*" + }, + { + Effect = "Allow" + Action = "iam:CreateServiceLinkedRole" + Resource = "arn:aws:iam::*:role/aws-service-role/drs.amazonaws.com/AWSServiceRoleForElasticDisasterRecovery" + }, + { + Effect = "Allow" + Action = [ + "iam:CreateInstanceProfile", + "iam:ListInstanceProfilesForRole", + "iam:GetInstanceProfile", + "iam:ListInstanceProfiles", + "iam:AddRoleToInstanceProfile" + ] + Resource = [ + "arn:aws:iam::*:instance-profile/*", + "arn:aws:iam::*:role/*" + ] + } + ] + }) +} + +resource "aws_iam_role_policy_attachment" "Initializer" { + role = aws_iam_role.AWSElasticDisasterRecoveryInitializerRole.name + policy_arn = aws_iam_policy.InitializePolicy.arn +} From 5cf7142b7402ecafd460173d0a8650156c642b42 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:48:04 -0400 Subject: [PATCH 14/19] Copyright fix --- examples/drs-initialize/main.tf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/drs-initialize/main.tf b/examples/drs-initialize/main.tf index c068eccf5d2d..a9f3e751ad90 100644 --- a/examples/drs-initialize/main.tf +++ b/examples/drs-initialize/main.tf @@ -1,3 +1,6 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: MPL-2.0 + data "aws_caller_identity" "current" {} resource "aws_iam_role" "AWSElasticDisasterRecoveryAgentRole" { From e529dbc78754d092359365aa7bb364baa7bae427 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:48:15 -0400 Subject: [PATCH 15/19] Use consts --- .../drs/replication_configuration_template_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/service/drs/replication_configuration_template_test.go b/internal/service/drs/replication_configuration_template_test.go index a3347d13b340..1a9ea805a498 100644 --- a/internal/service/drs/replication_configuration_template_test.go +++ b/internal/service/drs/replication_configuration_template_test.go @@ -61,25 +61,25 @@ func testAccReplicationConfigurationTemplate_basic(t *testing.T) { resource.TestCheckResourceAttr(resourceName, "use_dedicated_replication_server", acctest.CtFalse), resource.TestCheckResourceAttr(resourceName, "replication_server_instance_type", "t3.small"), resource.TestCheckResourceAttr(resourceName, "replication_servers_security_groups_ids.#", acctest.Ct1), - resource.TestCheckResourceAttrPair(resourceName, "staging_area_subnet_id", "aws_subnet.test.0", "id"), + resource.TestCheckResourceAttrPair(resourceName, "staging_area_subnet_id", "aws_subnet.test.0", names.AttrID), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "pit_policy.*", map[string]string{ names.AttrEnabled: acctest.CtTrue, - names.AttrInterval: "10", + names.AttrInterval: acctest.Ct10, "retention_duration": "60", "units": "MINUTE", "rule_id": acctest.Ct1, }), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "pit_policy.*", map[string]string{ names.AttrEnabled: acctest.CtTrue, - names.AttrInterval: "1", + names.AttrInterval: acctest.Ct1, "retention_duration": "24", "units": "HOUR", "rule_id": acctest.Ct2, }), resource.TestCheckTypeSetElemNestedAttrs(resourceName, "pit_policy.*", map[string]string{ names.AttrEnabled: acctest.CtTrue, - names.AttrInterval: "1", - "retention_duration": "3", + names.AttrInterval: acctest.Ct1, + "retention_duration": acctest.Ct3, "units": "DAY", "rule_id": acctest.Ct3, }), From 15c2818a4569d547466cb1e2010a1c029e637c33 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:52:59 -0400 Subject: [PATCH 16/19] Add required version --- examples/drs-initialize/main.tf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/drs-initialize/main.tf b/examples/drs-initialize/main.tf index a9f3e751ad90..07873f422794 100644 --- a/examples/drs-initialize/main.tf +++ b/examples/drs-initialize/main.tf @@ -1,6 +1,10 @@ # Copyright (c) HashiCorp, Inc. # SPDX-License-Identifier: MPL-2.0 +terraform { + required_version = ">= 1.0" +} + data "aws_caller_identity" "current" {} resource "aws_iam_role" "AWSElasticDisasterRecoveryAgentRole" { From 17029303ffb56f5a349f3ed4c829c203924e8201 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:57:33 -0400 Subject: [PATCH 17/19] Fix version --- examples/drs-initialize/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/drs-initialize/main.tf b/examples/drs-initialize/main.tf index 07873f422794..8b56ff3d4db0 100644 --- a/examples/drs-initialize/main.tf +++ b/examples/drs-initialize/main.tf @@ -2,7 +2,7 @@ # SPDX-License-Identifier: MPL-2.0 terraform { - required_version = ">= 1.0" + required_version = ">= 0.12" } data "aws_caller_identity" "current" {} From fb4e46cf633ab7ca5811e70ca9433303e55e7790 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 26 Jun 2024 16:58:58 -0400 Subject: [PATCH 18/19] Fix English --- examples/drs-initialize/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/drs-initialize/README.md b/examples/drs-initialize/README.md index a33d5abc60c7..88be993caed7 100644 --- a/examples/drs-initialize/README.md +++ b/examples/drs-initialize/README.md @@ -1,6 +1,6 @@ # DRS Initialize Example -This is an example of using the Terraform AWS Provider to manually initializing your account to use DRS. For more information see the [AWS instructions](https://docs.aws.amazon.com/drs/latest/userguide/getting-started-initializing.html). +This is an example of using the Terraform AWS Provider to manually initialize your account to use DRS. For more information see the [AWS instructions](https://docs.aws.amazon.com/drs/latest/userguide/getting-started-initializing.html). Running the example: From c13c1bf77fb331bf3611ae75ff57a50129e928fa Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Thu, 27 Jun 2024 10:20:41 -0400 Subject: [PATCH 19/19] drs: Fix import --- .../drs/replication_configuration_template.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/internal/service/drs/replication_configuration_template.go b/internal/service/drs/replication_configuration_template.go index 160dce8ce697..2a6101467022 100644 --- a/internal/service/drs/replication_configuration_template.go +++ b/internal/service/drs/replication_configuration_template.go @@ -25,7 +25,6 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/errs/fwdiag" "github.com/hashicorp/terraform-provider-aws/internal/framework" "github.com/hashicorp/terraform-provider-aws/internal/framework/flex" - fwflex "github.com/hashicorp/terraform-provider-aws/internal/framework/flex" fwtypes "github.com/hashicorp/terraform-provider-aws/internal/framework/types" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" "github.com/hashicorp/terraform-provider-aws/internal/tfresource" @@ -159,7 +158,7 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r conn := r.Meta().DRSClient(ctx) input := &drs.CreateReplicationConfigurationTemplateInput{} - response.Diagnostics.Append(fwflex.Expand(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), data, input)...) + response.Diagnostics.Append(flex.Expand(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), data, input)...) if response.Diagnostics.HasError() { return } @@ -181,8 +180,7 @@ func (r *replicationConfigurationTemplateResource) Create(ctx context.Context, r return } - //data.ID = fwflex.StringToFramework(ctx, output.ReplicationConfigurationTemplateID) - response.Diagnostics.Append(fwflex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &data)...) + response.Diagnostics.Append(flex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &data)...) if response.Diagnostics.HasError() { return } @@ -214,7 +212,7 @@ func (r *replicationConfigurationTemplateResource) Read(ctx context.Context, req return } - response.Diagnostics.Append(fwflex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &data)...) + response.Diagnostics.Append(flex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &data)...) if response.Diagnostics.HasError() { return } @@ -238,7 +236,7 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r if replicationConfigurationTemplateHasChanges(ctx, new, old) { input := &drs.UpdateReplicationConfigurationTemplateInput{} - response.Diagnostics.Append(fwflex.Expand(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), new, input)...) + response.Diagnostics.Append(flex.Expand(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), new, input)...) if response.Diagnostics.HasError() { return } @@ -264,7 +262,7 @@ func (r *replicationConfigurationTemplateResource) Update(ctx context.Context, r return } - response.Diagnostics.Append(fwflex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &new)...) + response.Diagnostics.Append(flex.Flatten(context.WithValue(ctx, flex.ResourcePrefix, ResPrefixReplicationConfigurationTemplate), output, &new)...) if response.Diagnostics.HasError() { return }