From 533eceb571d565b633b81d0f3b675c941180a4a3 Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 21:26:32 +0200 Subject: [PATCH 01/10] emr studio session mapping --- internal/provider/provider.go | 1 + internal/service/emr/find.go | 32 +++ internal/service/emr/id.go | 14 + .../service/emr/studio_session_mapping.go | 162 ++++++++++++ .../emr/studio_session_mapping_test.go | 242 ++++++++++++++++++ 5 files changed, 451 insertions(+) create mode 100644 internal/service/emr/id.go create mode 100644 internal/service/emr/studio_session_mapping.go create mode 100644 internal/service/emr/studio_session_mapping_test.go diff --git a/internal/provider/provider.go b/internal/provider/provider.go index cf90a91b7e7c..ed0ffe266e28 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -1195,6 +1195,7 @@ func Provider() *schema.Provider { "aws_emr_managed_scaling_policy": emr.ResourceManagedScalingPolicy(), "aws_emr_security_configuration": emr.ResourceSecurityConfiguration(), "aws_emr_studio": emr.ResourceStudio(), + "aws_emr_studio_session_mapping": emr.ResourceStudioSessionMapping(), "aws_kinesis_firehose_delivery_stream": firehose.ResourceDeliveryStream(), diff --git a/internal/service/emr/find.go b/internal/service/emr/find.go index 9c169e232cef..6fdae469bd35 100644 --- a/internal/service/emr/find.go +++ b/internal/service/emr/find.go @@ -74,3 +74,35 @@ func FindStudioByID(conn *emr.EMR, id string) (*emr.Studio, error) { return output.Studio, nil } + +func FindStudioSessionMappingByID(conn *emr.EMR, id string) (*emr.SessionMappingDetail, error) { + studioId, identityType, identityId, err := readStudioSessionMapping(id) + if err != nil { + return nil, err + } + + input := &emr.GetStudioSessionMappingInput{ + StudioId: aws.String(studioId), + IdentityType: aws.String(identityType), + IdentityId: aws.String(identityId), + } + + output, err := conn.GetStudioSessionMapping(input) + + if tfawserr.ErrMessageContains(err, emr.ErrCodeInvalidRequestException, "Studio session mapping does not exist.") { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || output.SessionMapping == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + return output.SessionMapping, nil +} diff --git a/internal/service/emr/id.go b/internal/service/emr/id.go new file mode 100644 index 000000000000..a2789f382f9e --- /dev/null +++ b/internal/service/emr/id.go @@ -0,0 +1,14 @@ +package emr + +import ( + "fmt" + "strings" +) + +func readStudioSessionMapping(id string) (studioId, identityType, identityId string, err error) { + idParts := strings.Split(id, ":") + if len(idParts) != 3 { + return "", "", "", fmt.Errorf("expected ID in format studio-id:identity-type:identity-id, received: %s", id) + } + return idParts[0], idParts[1], idParts[2], nil +} diff --git a/internal/service/emr/studio_session_mapping.go b/internal/service/emr/studio_session_mapping.go new file mode 100644 index 000000000000..146563a5e20c --- /dev/null +++ b/internal/service/emr/studio_session_mapping.go @@ -0,0 +1,162 @@ +package emr + +import ( + "fmt" + "log" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/emr" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" + "github.com/hashicorp/terraform-provider-aws/internal/verify" +) + +func ResourceStudioSessionMapping() *schema.Resource { + return &schema.Resource{ + Create: resourceStudioSessionMappingCreate, + Read: resourceStudioSessionMappingRead, + Update: resourceStudioSessionMappingUpdate, + Delete: resourceStudioSessionMappingDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Schema: map[string]*schema.Schema{ + "identity_id": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + }, + "identity_name": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + }, + "identity_type": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + ValidateFunc: validation.StringInSlice(emr.IdentityType_Values(), false), + }, + "session_policy_arn": { + Type: schema.TypeString, + Required: true, + ValidateFunc: verify.ValidARN, + }, + "studio_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + }, + } +} + +func resourceStudioSessionMappingCreate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).EMRConn + + var id string + studioId := d.Get("studio_id").(string) + indetityType := d.Get("identity_type").(string) + input := &emr.CreateStudioSessionMappingInput{ + IdentityType: aws.String(indetityType), + SessionPolicyArn: aws.String(d.Get("session_policy_arn").(string)), + StudioId: aws.String(studioId), + } + + if v, ok := d.GetOk("identity_id"); ok { + input.IdentityId = aws.String(v.(string)) + id = v.(string) + } + + if v, ok := d.GetOk("identity_name"); ok { + input.IdentityName = aws.String(v.(string)) + id = v.(string) + } + + _, err := conn.CreateStudioSessionMapping(input) + if err != nil { + return fmt.Errorf("error creating EMR Studio Session Mapping: %w", err) + } + + d.SetId(fmt.Sprintf("%s:%s:%s", studioId, indetityType, id)) + + return resourceStudioSessionMappingRead(d, meta) +} + +func resourceStudioSessionMappingUpdate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).EMRConn + + studioId, identityType, identityId, err := readStudioSessionMapping(d.Id()) + if err != nil { + return err + } + + input := &emr.UpdateStudioSessionMappingInput{ + SessionPolicyArn: aws.String(d.Get("session_policy_arn").(string)), + IdentityType: aws.String(identityType), + StudioId: aws.String(studioId), + IdentityId: aws.String(identityId), + } + + _, err = conn.UpdateStudioSessionMapping(input) + if err != nil { + return fmt.Errorf("error updating EMR Studio Session Mapping: %w", err) + } + + return resourceStudioSessionMappingRead(d, meta) +} + +func resourceStudioSessionMappingRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).EMRConn + + mapping, err := FindStudioSessionMappingByID(conn, d.Id()) + if !d.IsNewResource() && tfresource.NotFound(err) { + log.Printf("[WARN] EMR Studio Session Mapping (%s) not found, removing from state", d.Id()) + d.SetId("") + return nil + } + + if err != nil { + return fmt.Errorf("error reading EMR Studio Session Mapping (%s): %w", d.Id(), err) + } + + d.Set("identity_type", mapping.IdentityType) + d.Set("identity_id", mapping.IdentityId) + d.Set("identity_name", mapping.IdentityName) + d.Set("studio_id", mapping.StudioId) + d.Set("session_policy_arn", mapping.SessionPolicyArn) + + return nil +} + +func resourceStudioSessionMappingDelete(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*conns.AWSClient).EMRConn + studioId, identityType, identityId, err := readStudioSessionMapping(d.Id()) + if err != nil { + return err + } + + input := &emr.DeleteStudioSessionMappingInput{ + IdentityType: aws.String(identityType), + StudioId: aws.String(studioId), + IdentityId: aws.String(identityId), + } + + log.Printf("[INFO] Deleting EMR Studio Session Mapping: %s", d.Id()) + _, err = conn.DeleteStudioSessionMapping(input) + + if err != nil { + if tfawserr.ErrMessageContains(err, emr.ErrCodeInvalidRequestException, "Studio session mapping does not exist.") { + return nil + } + return fmt.Errorf("error deleting EMR Studio Session Mapping (%s): %w", d.Id(), err) + } + + return nil +} diff --git a/internal/service/emr/studio_session_mapping_test.go b/internal/service/emr/studio_session_mapping_test.go new file mode 100644 index 000000000000..b961825e178a --- /dev/null +++ b/internal/service/emr/studio_session_mapping_test.go @@ -0,0 +1,242 @@ +package emr_test + +import ( + "fmt" + "os" + "testing" + + "github.com/aws/aws-sdk-go/service/emr" + sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + tfemr "github.com/hashicorp/terraform-provider-aws/internal/service/emr" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" +) + +func TestAccEMRStudioSessionMapping_basic(t *testing.T) { + var studio emr.SessionMappingDetail + resourceName := "aws_emr_studio_session_mapping.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + uName := os.Getenv("AWS_IDENTITY_STORE_USER_ID") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { + acctest.PreCheck(t) + testAccPreCheckUserID(t) + }, + ErrorCheck: acctest.ErrorCheck(t, emr.EndpointsID), + Providers: acctest.Providers, + CheckDestroy: testAccCheckEmrStudioSessionMappingDestroy, + Steps: []resource.TestStep{ + { + Config: testAccEMRStudioSessionMappingConfigBasic(rName, uName), + Check: resource.ComposeTestCheckFunc( + testAccCheckEmrStudioSessionMappingExists(resourceName, &studio), + resource.TestCheckResourceAttr(resourceName, "identity_id", uName), + resource.TestCheckResourceAttr(resourceName, "identity_type", "USER"), + resource.TestCheckResourceAttrPair(resourceName, "studio_id", "aws_emr_studio.test", "id"), + resource.TestCheckResourceAttrPair(resourceName, "session_policy_arn", "aws_iam_policy.test", "arn"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccEMRStudioSessionMapping_disappears(t *testing.T) { + var studio emr.SessionMappingDetail + resourceName := "aws_emr_studio_session_mapping.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + uName := os.Getenv("AWS_IDENTITY_STORE_USER_ID") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { + acctest.PreCheck(t) + testAccPreCheckUserID(t) + }, + ErrorCheck: acctest.ErrorCheck(t, emr.EndpointsID), + Providers: acctest.Providers, + CheckDestroy: testAccCheckEmrStudioSessionMappingDestroy, + Steps: []resource.TestStep{ + { + Config: testAccEMRStudioSessionMappingConfigBasic(rName, uName), + Check: resource.ComposeTestCheckFunc( + testAccCheckEmrStudioSessionMappingExists(resourceName, &studio), + acctest.CheckResourceDisappears(acctest.Provider, tfemr.ResourceStudioSessionMapping(), resourceName), + acctest.CheckResourceDisappears(acctest.Provider, tfemr.ResourceStudioSessionMapping(), resourceName), + ), + ExpectNonEmptyPlan: true, + }, + }, + }) +} + +func testAccCheckEmrStudioSessionMappingExists(resourceName string, studio *emr.SessionMappingDetail) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Not found: %s", resourceName) + } + + conn := acctest.Provider.Meta().(*conns.AWSClient).EMRConn + + output, err := tfemr.FindStudioSessionMappingByID(conn, rs.Primary.ID) + if err != nil { + return err + } + + if output == nil { + return fmt.Errorf("EMR Studio (%s) not found", rs.Primary.ID) + } + + *studio = *output + + return nil + } +} + +func testAccCheckEmrStudioSessionMappingDestroy(s *terraform.State) error { + conn := acctest.Provider.Meta().(*conns.AWSClient).EMRConn + + for _, rs := range s.RootModule().Resources { + if rs.Type != "aws_emr_studio_session_mapping" { + continue + } + + _, err := tfemr.FindStudioSessionMappingByID(conn, rs.Primary.ID) + if tfresource.NotFound(err) { + continue + } + + if err != nil { + return err + } + + return fmt.Errorf("EMR Studio %s still exists", rs.Primary.ID) + } + return nil +} + +func testAccPreCheckUserID(t *testing.T) { + if os.Getenv("AWS_IDENTITY_STORE_USER_ID") == "" { + t.Skip("AWS_IDENTITY_STORE_USER_ID env var must be set for AWS Identity Store User acceptance test. " + + "This is required until ListUsers API returns results without filtering by name.") + } +} + +func testAccEMRStudioSessionMappingConfigBasic(rName, uName string) string { + return acctest.ConfigCompose(acctest.ConfigAvailableAZsNoOptIn(), fmt.Sprintf(` +provider "aws" { + region = "us-east-1" +} + +data "aws_partition" "current" {} + +resource "aws_vpc" "test" { + cidr_block = "10.0.0.0/16" +} + +resource "aws_subnet" "test" { + vpc_id = aws_vpc.test.id + cidr_block = "10.0.1.0/24" + availability_zone = data.aws_availability_zones.available.names[0] +} + +resource "aws_s3_bucket" "test" { + bucket = %[1]q + acl = "private" + force_destroy = true +} + +resource "aws_iam_role" "test" { + name = %[1]q + path = "/" + assume_role_policy = data.aws_iam_policy_document.assume_role.json +} + +data "aws_iam_policy_document" "assume_role" { + statement { + actions = ["sts:AssumeRole"] + effect = "Allow" + + principals { + type = "Service" + identifiers = ["elasticmapreduce.${data.aws_partition.current.dns_suffix}"] + } + } +} + +resource "aws_iam_role_policy" "test" { + name = %[1]q + role = aws_iam_role.test.id + policy = < Date: Thu, 9 Dec 2021 21:34:18 +0200 Subject: [PATCH 02/10] docs --- .../emr_studio_session_mapping.html.markdown | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 website/docs/r/emr_studio_session_mapping.html.markdown diff --git a/website/docs/r/emr_studio_session_mapping.html.markdown b/website/docs/r/emr_studio_session_mapping.html.markdown new file mode 100644 index 000000000000..b823a23758e6 --- /dev/null +++ b/website/docs/r/emr_studio_session_mapping.html.markdown @@ -0,0 +1,47 @@ +--- +subcategory: "Elastic Map Reduce (EMR)" +layout: "aws" +page_title: "AWS: aws_emr_studio_session_mapping" +description: |- + Provides an Elastic MapReduce Studio +--- + +# Resource: aws_emr_studio_session_mapping + +Provides an Elastic MapReduce Studio Session Mapping. + +## Example Usage + +```terraform +resource "aws_emr_studio_session_mapping" "example" { + studio_id = aws_emr_studio.example.id + identity_type = "USER" + identity_id = "example" + session_policy_arn = aws_iam_policy.example.arn +} +``` + + +## Argument Reference + +The following arguments are required: + +* `identity_id`- (Optional) The globally unique identifier (GUID) of the user or group from the Amazon Web Services SSO Identity Store. +* `identity_name` - (Optional) The name of the user or group from the Amazon Web Services SSO Identity Store. +* `identity_type` - (Required) Specifies whether the identity to map to the Amazon EMR Studio is a `USER` or a `GROUP`. +* `session_policy_arn` - (Required) The Amazon Resource Name (ARN) for the session policy that will be applied to the user or group. You should specify the ARN for the session policy that you want to apply, not the ARN of your user role. +* `studio_id` - (Required) The ID of the Amazon EMR Studio to which the user or group will be mapped. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id`- The id of the Elastic MapReduce Studio Session Mapping. + +## Import + +EMR studio session mappings can be imported using the `id`, e.g., `studio-id:identity-type:identity-id` + +``` +$ terraform import aws_emr_studio_session_mapping.example es-xxxxx:USER:xxxxx-xxx-xxx +``` From 738b1bee5bde3353a49e3ad6c6b92cb25fe9713e Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 21:46:04 +0200 Subject: [PATCH 03/10] update test --- .../emr/studio_session_mapping_test.go | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/internal/service/emr/studio_session_mapping_test.go b/internal/service/emr/studio_session_mapping_test.go index b961825e178a..e4fca5655635 100644 --- a/internal/service/emr/studio_session_mapping_test.go +++ b/internal/service/emr/studio_session_mapping_test.go @@ -19,6 +19,7 @@ func TestAccEMRStudioSessionMapping_basic(t *testing.T) { var studio emr.SessionMappingDetail resourceName := "aws_emr_studio_session_mapping.test" rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + updatedName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) uName := os.Getenv("AWS_IDENTITY_STORE_USER_ID") resource.ParallelTest(t, resource.TestCase{ @@ -45,6 +46,16 @@ func TestAccEMRStudioSessionMapping_basic(t *testing.T) { ImportState: true, ImportStateVerify: true, }, + { + Config: testAccEMRStudioSessionMappingConfigUpdated(rName, uName, updatedName), + Check: resource.ComposeTestCheckFunc( + testAccCheckEmrStudioSessionMappingExists(resourceName, &studio), + resource.TestCheckResourceAttr(resourceName, "identity_id", uName), + resource.TestCheckResourceAttr(resourceName, "identity_type", "USER"), + resource.TestCheckResourceAttrPair(resourceName, "studio_id", "aws_emr_studio.test", "id"), + resource.TestCheckResourceAttrPair(resourceName, "session_policy_arn", "aws_iam_policy.test2", "arn"), + ), + }, }, }) } @@ -130,7 +141,7 @@ func testAccPreCheckUserID(t *testing.T) { } } -func testAccEMRStudioSessionMappingConfigBasic(rName, uName string) string { +func testAccEMRStudioSessionMappingConfigBase(rName string) string { return acctest.ConfigCompose(acctest.ConfigAvailableAZsNoOptIn(), fmt.Sprintf(` provider "aws" { region = "us-east-1" @@ -231,12 +242,48 @@ resource "aws_iam_policy" "test" { } EOF } +`, rName)) +} +func testAccEMRStudioSessionMappingConfigBasic(rName, uName string) string { + return acctest.ConfigCompose(testAccEMRStudioSessionMappingConfigBase(rName), fmt.Sprintf(` resource "aws_emr_studio_session_mapping" "test" { studio_id = aws_emr_studio.test.id identity_type = "USER" - identity_id = %[2]q + identity_id = %[1]q session_policy_arn = aws_iam_policy.test.arn } -`, rName, uName)) +`, uName)) +} + +func testAccEMRStudioSessionMappingConfigUpdated(rName, uName, updatedName string) string { + return acctest.ConfigCompose(testAccEMRStudioSessionMappingConfigBase(rName), fmt.Sprintf(` +resource "aws_iam_policy" "test2" { + name = %[2]q + policy = < Date: Thu, 9 Dec 2021 21:48:55 +0200 Subject: [PATCH 04/10] changelog --- .changelog/22140.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/22140.txt diff --git a/.changelog/22140.txt b/.changelog/22140.txt new file mode 100644 index 000000000000..02403db6d697 --- /dev/null +++ b/.changelog/22140.txt @@ -0,0 +1,3 @@ +```release-note:new-resource +aws_emr_studio_session_mapping +``` From 4a919235db7c11ea7be42fecc981f27df4066acf Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 21:51:00 +0200 Subject: [PATCH 05/10] fix find --- internal/service/emr/find.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/service/emr/find.go b/internal/service/emr/find.go index 6fdae469bd35..76d4e780ce2d 100644 --- a/internal/service/emr/find.go +++ b/internal/service/emr/find.go @@ -89,7 +89,8 @@ func FindStudioSessionMappingByID(conn *emr.EMR, id string) (*emr.SessionMapping output, err := conn.GetStudioSessionMapping(input) - if tfawserr.ErrMessageContains(err, emr.ErrCodeInvalidRequestException, "Studio session mapping does not exist.") { + if tfawserr.ErrMessageContains(err, emr.ErrCodeInvalidRequestException, "Studio session mapping does not exist") || + tfawserr.ErrMessageContains(err, emr.ErrCodeInvalidRequestException, "Studio does not exist") { return nil, &resource.NotFoundError{ LastError: err, LastRequest: input, From 8cb24b464aa8797f6665a782971e9b8d13c4b225 Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 22:03:11 +0200 Subject: [PATCH 06/10] fix studio sweeper --- internal/service/emr/sweep.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/service/emr/sweep.go b/internal/service/emr/sweep.go index 1d671a658fcb..eda518d05e98 100644 --- a/internal/service/emr/sweep.go +++ b/internal/service/emr/sweep.go @@ -9,7 +9,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/emr" - "github.com/hashicorp/go-multierror" + multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/sweep" @@ -121,5 +121,10 @@ func sweepStudios(region string) error { sweeperErrs = multierror.Append(sweeperErrs, fmt.Errorf("error sweeping EMR Studios for %s: %w", region, err)) } + if sweep.SkipSweepError(err) { + log.Printf("[WARN] Skipping EMR Studios sweep for %s: %s", region, sweeperErrs) + return nil + } + return sweeperErrs.ErrorOrNil() } From 466d0cea8b9333f59c16f81f265440567650c1bf Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 22:05:38 +0200 Subject: [PATCH 07/10] typo --- internal/service/emr/studio_session_mapping.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/service/emr/studio_session_mapping.go b/internal/service/emr/studio_session_mapping.go index 146563a5e20c..d2738713bf63 100644 --- a/internal/service/emr/studio_session_mapping.go +++ b/internal/service/emr/studio_session_mapping.go @@ -62,9 +62,9 @@ func resourceStudioSessionMappingCreate(d *schema.ResourceData, meta interface{} var id string studioId := d.Get("studio_id").(string) - indetityType := d.Get("identity_type").(string) + identityType := d.Get("identity_type").(string) input := &emr.CreateStudioSessionMappingInput{ - IdentityType: aws.String(indetityType), + IdentityType: aws.String(identityType), SessionPolicyArn: aws.String(d.Get("session_policy_arn").(string)), StudioId: aws.String(studioId), } @@ -84,7 +84,7 @@ func resourceStudioSessionMappingCreate(d *schema.ResourceData, meta interface{} return fmt.Errorf("error creating EMR Studio Session Mapping: %w", err) } - d.SetId(fmt.Sprintf("%s:%s:%s", studioId, indetityType, id)) + d.SetId(fmt.Sprintf("%s:%s:%s", studioId, identityType, id)) return resourceStudioSessionMappingRead(d, meta) } From aa11a11c5ba7eaa4d1456b40c968ae90a2c37fad Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 22:12:36 +0200 Subject: [PATCH 08/10] exactly one --- internal/service/emr/studio_session_mapping.go | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/internal/service/emr/studio_session_mapping.go b/internal/service/emr/studio_session_mapping.go index d2738713bf63..a71397e2d44b 100644 --- a/internal/service/emr/studio_session_mapping.go +++ b/internal/service/emr/studio_session_mapping.go @@ -26,16 +26,18 @@ func ResourceStudioSessionMapping() *schema.Resource { Schema: map[string]*schema.Schema{ "identity_id": { - Type: schema.TypeString, - Optional: true, - ForceNew: true, - Computed: true, + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + ExactlyOneOf: []string{"identity_id", "identity_name"}, }, "identity_name": { - Type: schema.TypeString, - Optional: true, - ForceNew: true, - Computed: true, + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + ExactlyOneOf: []string{"identity_id", "identity_name"}, }, "identity_type": { Type: schema.TypeString, From 1097f28137f8109a110970317052c077ccbf3e95 Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 22:14:52 +0200 Subject: [PATCH 09/10] revert sweep --- internal/service/emr/sweep.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/internal/service/emr/sweep.go b/internal/service/emr/sweep.go index eda518d05e98..1d671a658fcb 100644 --- a/internal/service/emr/sweep.go +++ b/internal/service/emr/sweep.go @@ -9,7 +9,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/emr" - multierror "github.com/hashicorp/go-multierror" + "github.com/hashicorp/go-multierror" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/sweep" @@ -121,10 +121,5 @@ func sweepStudios(region string) error { sweeperErrs = multierror.Append(sweeperErrs, fmt.Errorf("error sweeping EMR Studios for %s: %w", region, err)) } - if sweep.SkipSweepError(err) { - log.Printf("[WARN] Skipping EMR Studios sweep for %s: %s", region, sweeperErrs) - return nil - } - return sweeperErrs.ErrorOrNil() } From b1d716dff35f7f8dd2a6bf61980699c9717b594a Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Thu, 9 Dec 2021 22:15:41 +0200 Subject: [PATCH 10/10] remvoed provider --- internal/service/emr/studio_session_mapping_test.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/internal/service/emr/studio_session_mapping_test.go b/internal/service/emr/studio_session_mapping_test.go index e4fca5655635..72985a5e1206 100644 --- a/internal/service/emr/studio_session_mapping_test.go +++ b/internal/service/emr/studio_session_mapping_test.go @@ -143,10 +143,6 @@ func testAccPreCheckUserID(t *testing.T) { func testAccEMRStudioSessionMappingConfigBase(rName string) string { return acctest.ConfigCompose(acctest.ConfigAvailableAZsNoOptIn(), fmt.Sprintf(` -provider "aws" { - region = "us-east-1" -} - data "aws_partition" "current" {} resource "aws_vpc" "test" {