diff --git a/aws/resource_aws_greengrass_resource_definition.go b/aws/resource_aws_greengrass_resource_definition.go index 3d011be940b..311648681eb 100644 --- a/aws/resource_aws_greengrass_resource_definition.go +++ b/aws/resource_aws_greengrass_resource_definition.go @@ -152,63 +152,54 @@ func resourceAwsGreengrassResourceDefinition() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "resource_definition_version": { + "resource": { Type: schema.TypeSet, Optional: true, - MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ - "resource": { - Type: schema.TypeSet, - Optional: true, + "id": { + Type: schema.TypeString, + Required: true, + }, + "name": { + Type: schema.TypeString, + Required: true, + }, + "data_container": { + Type: schema.TypeList, + Required: true, + MaxItems: 1, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ - "id": { - Type: schema.TypeString, - Required: true, + "local_device_resource_data": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: generateLocalDeviceResourceDataSchema(), }, - "name": { - Type: schema.TypeString, - Required: true, + "local_volume_resource_data": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: generateLocalVolumeResourceDataSchema(), + }, + "s3_machine_learning_model_resource_data": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: generateS3MachineLearningModelResourceDataSchema(), }, - "data_container": { + "sagemaker_machine_learning_model_resource_data": { Type: schema.TypeList, - Required: true, + Optional: true, MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "local_device_resource_data": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: generateLocalDeviceResourceDataSchema(), - }, - "local_volume_resource_data": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: generateLocalVolumeResourceDataSchema(), - }, - "s3_machine_learning_model_resource_data": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: generateS3MachineLearningModelResourceDataSchema(), - }, - "sagemaker_machine_learning_model_resource_data": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: generateSageMakerMachineLearningModelResourceDataSchema(), - }, - "secrets_manager_secret_resource_data": { - Type: schema.TypeList, - Optional: true, - MaxItems: 1, - Elem: generateSecretsManagerSecretResourceDataSchema(), - }, - }, - }, + Elem: generateSageMakerMachineLearningModelResourceDataSchema(), + }, + "secrets_manager_secret_resource_data": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: generateSecretsManagerSecretResourceDataSchema(), }, }, }, @@ -331,11 +322,9 @@ func parseResourceDataContainer(rawData map[string]interface{}) *greengrass.Reso } func createResourceDefinitionVersion(d *schema.ResourceData, conn *greengrass.Greengrass) error { - var rawData map[string]interface{} - if v := d.Get("resource_definition_version").(*schema.Set).List(); len(v) == 0 { + var rawData []interface{} + if rawData = d.Get("resource").(*schema.Set).List(); len(rawData) == 0 { return nil - } else { - rawData = v[0].(map[string]interface{}) } params := &greengrass.CreateResourceDefinitionVersionInput{ @@ -347,7 +336,7 @@ func createResourceDefinitionVersion(d *schema.ResourceData, conn *greengrass.Gr } resources := make([]*greengrass.Resource, 0) - for _, resourceToCast := range rawData["resource"].(*schema.Set).List() { + for _, resourceToCast := range rawData { rawResource := resourceToCast.(map[string]interface{}) resource := &greengrass.Resource{ Id: aws.String(rawResource["id"].(string)), @@ -521,7 +510,6 @@ func setResourceDefinitionVersion(latestVersion string, d *schema.ResourceData, return err } - rawVersion := make(map[string]interface{}) d.Set("latest_definition_version_arn", *out.Arn) rawResourceList := make([]map[string]interface{}, 0) @@ -533,9 +521,7 @@ func setResourceDefinitionVersion(latestVersion string, d *schema.ResourceData, rawResourceList = append(rawResourceList, rawResource) } - rawVersion["resource"] = rawResourceList - - d.Set("resource_definition_version", []map[string]interface{}{rawVersion}) + d.Set("resource", rawResourceList) return nil } @@ -592,7 +578,7 @@ func resourceAwsGreengrassResourceDefinitionUpdate(d *schema.ResourceData, meta return err } - if d.HasChange("resource_definition_version") { + if d.HasChange("resource") { err = createResourceDefinitionVersion(d, conn) if err != nil { return err diff --git a/aws/resource_aws_greengrass_resource_definition_test.go b/aws/resource_aws_greengrass_resource_definition_test.go index ede5a32c9e1..d607469c4a2 100644 --- a/aws/resource_aws_greengrass_resource_definition_test.go +++ b/aws/resource_aws_greengrass_resource_definition_test.go @@ -37,6 +37,84 @@ func TestAccAWSGreengrassResourceDefinition_basic(t *testing.T) { }) } +func TestAccAWSGreengrassResourceDefinition_versionNoop(t *testing.T) { + rString := acctest.RandString(8) + resourceName := "aws_greengrass_resource_definition.test" + + var resource_version_arn_a string + var resource_version_arn_b string + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSGreengrassResourceDefinitionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSGreengrassResourceDefinitionConfig_LocalDevice(rString), + Check: testAccAWSGreengrassResourceDefinitionCheckAndGetResourceVersion(resourceName, &resource_version_arn_a), + }, + { + Config: testAccAWSGreengrassResourceDefinitionConfig_LocalDevice(rString), + Check: resource.ComposeTestCheckFunc( + testAccAWSGreengrassResourceDefinitionCheckAndGetResourceVersion(resourceName, &resource_version_arn_b), + func() resource.TestCheckFunc { + return func(s *terraform.State) error { + if resource_version_arn_a != resource_version_arn_b { + return fmt.Errorf("Resource version ARN %s has changed to %s", resource_version_arn_a, resource_version_arn_b) + } + return nil + } + }(), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func TestAccAWSGreengrassResourceDefinition_versionDiff(t *testing.T) { + rString := acctest.RandString(8) + resourceName := "aws_greengrass_resource_definition.test" + + var resource_version_arn_a string + var resource_version_arn_b string + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSGreengrassResourceDefinitionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSGreengrassResourceDefinitionConfig_LocalDevice(rString), + Check: testAccAWSGreengrassResourceDefinitionCheckAndGetResourceVersion(resourceName, &resource_version_arn_a), + }, + { + Config: testAccAWSGreengrassResourceDefinitionConfig_LocalVolume(rString), + Check: resource.ComposeTestCheckFunc( + testAccAWSGreengrassResourceDefinitionCheckAndGetResourceVersion(resourceName, &resource_version_arn_b), + func() resource.TestCheckFunc { + return func(s *terraform.State) error { + if resource_version_arn_a == resource_version_arn_b { + return fmt.Errorf("Resource version ARN %s has not changed", resource_version_arn_b) + } + return nil + } + }(), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func TestAccAWSGreengrassResourceDefinition_LocalDevice(t *testing.T) { rString := acctest.RandString(8) resourceName := "aws_greengrass_resource_definition.test" @@ -187,6 +265,24 @@ func testAccCheckAWSGreengrassResourceDefinitionDestroy(s *terraform.State) erro return nil } +func testAccAWSGreengrassResourceDefinitionCheckAndGetResourceVersion(resourceName string, resource_version_arn *string) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[resourceName] + if !ok { + return fmt.Errorf("Resource not found: %s", resourceName) + } + + latest_definition_version_arn, ok := rs.Primary.Attributes["latest_definition_version_arn"] + if !ok { + return fmt.Errorf("Latest definition version ARN does not exist for %s", resourceName) + } + + *resource_version_arn = latest_definition_version_arn + + return nil + } +} + func testAccAWSGreengrassResourceDefinitionConfig_basic(rString string) string { return fmt.Sprintf(` resource "aws_greengrass_resource_definition" "test" { @@ -203,21 +299,19 @@ func testAccAWSGreengrassResourceDefinitionConfig_LocalDevice(rString string) st return fmt.Sprintf(` resource "aws_greengrass_resource_definition" "test" { name = "resource_definition_%[1]s" - resource_definition_version { - resource { - id = "test_id" - name = "test_name" - data_container { - local_device_resource_data { - source_path = "/dev/source" - - group_owner_setting { - auto_add_group_owner = false - group_owner = "user" - } - } - } - } + resource { + id = "test_id" + name = "test_name" + data_container { + local_device_resource_data { + source_path = "/dev/source" + + group_owner_setting { + auto_add_group_owner = false + group_owner = "user" + } + } + } } } `, rString) @@ -227,23 +321,21 @@ func testAccAWSGreengrassResourceDefinitionConfig_LocalVolume(rString string) st return fmt.Sprintf(` resource "aws_greengrass_resource_definition" "test" { name = "resource_definition_%[1]s" - resource_definition_version { - resource { - id = "test_id" - name = "test_name" - data_container { - - local_volume_resource_data { - source_path = "/dev/source" - destination_path = "/destination" - - group_owner_setting { - auto_add_group_owner = false - group_owner = "user" - } - } - } - } + resource { + id = "test_id" + name = "test_name" + data_container { + + local_volume_resource_data { + source_path = "/dev/source" + destination_path = "/destination" + + group_owner_setting { + auto_add_group_owner = false + group_owner = "user" + } + } + } } } `, rString) @@ -253,17 +345,15 @@ func testAccAWSGreengrassResourceDefinitionConfig_S3MachineLearningModel(rString return fmt.Sprintf(` resource "aws_greengrass_resource_definition" "test" { name = "resource_definition_%[1]s" - resource_definition_version { - resource { - id = "test_id" - name = "test_name" - data_container { - s3_machine_learning_model_resource_data { - s3_uri = "s3://bucket/key.zip" - destination_path = "/destination" - } - } - } + resource { + id = "test_id" + name = "test_name" + data_container { + s3_machine_learning_model_resource_data { + s3_uri = "s3://bucket/key.zip" + destination_path = "/destination" + } + } } } `, rString) @@ -275,18 +365,16 @@ data "aws_caller_identity" "current" {} resource "aws_greengrass_resource_definition" "test" { name = "resource_definition_%[1]s" - resource_definition_version { - resource { - id = "test_id" - name = "test_name" - data_container { - sagemaker_machine_learning_model_resource_data { - sagemaker_job_arn = "arn:aws:sagemaker:us-west-2:${data.aws_caller_identity.current.account_id}:training-job/xgboost-2018-06-05-17-19-32-703" - destination_path = "/destination" - } - } - } - } + resource { + id = "test_id" + name = "test_name" + data_container { + sagemaker_machine_learning_model_resource_data { + sagemaker_job_arn = "arn:aws:sagemaker:us-west-2:${data.aws_caller_identity.current.account_id}:training-job/xgboost-2018-06-05-17-19-32-703" + destination_path = "/destination" + } + } + } } `, rString) } @@ -295,20 +383,18 @@ func testAccAWSGreengrassResourceDefinitionConfig_SecretsManagerSecret(rString s return fmt.Sprintf(` resource "aws_greengrass_resource_definition" "test" { name = "resource_definition_%[1]s" - resource_definition_version { - resource { - id = "test_id" - name = "test_name" - data_container { - secrets_manager_secret_resource_data { - secret_arn = "arn:aws:secretsmanager:us-west-2:123456789012:secret:greengrass-TwilioAuthToken-ntSlp6" - additional_staging_labels_to_download = [ - "label1", - "label2", - ] - } - } - } + resource { + id = "test_id" + name = "test_name" + data_container { + secrets_manager_secret_resource_data { + secret_arn = "arn:aws:secretsmanager:us-west-2:123456789012:secret:greengrass-TwilioAuthToken-ntSlp6" + additional_staging_labels_to_download = [ + "label1", + "label2", + ] + } + } } } `, rString) diff --git a/website/docs/r/greengrass_resource_definition.html.markdown b/website/docs/r/greengrass_resource_definition.html.markdown index ea7626d21c9..4ee8d4f4cd3 100644 --- a/website/docs/r/greengrass_resource_definition.html.markdown +++ b/website/docs/r/greengrass_resource_definition.html.markdown @@ -13,21 +13,19 @@ description: |- ```hcl resource "aws_greengrass_resource_definition" "test" { name = "resource_definition" - resource_definition_version { - resource { - id = "test_id" - name = "test_name" - data_container { - local_device_resource_data { - source_path = "/dev/source" - - group_owner_setting { - auto_add_group_owner = false - group_owner = "user" - } - } - } - } + resource { + id = "test_id" + name = "test_name" + data_container { + local_device_resource_data { + source_path = "/dev/source" + + group_owner_setting { + auto_add_group_owner = false + group_owner = "user" + } + } + } } } ``` @@ -35,10 +33,7 @@ resource "aws_greengrass_resource_definition" "test" { ## Argument Reference * `name` - (Required) The name of the resource definition. * `tags` - (Optional) Map. Map of tags. Metadata that can be used to manage the resource definition. -* `resource_definition_version` - (Optional) Object. Information about a resource definition version. - -The `resource_definition_version` object has such arguments. -* `resource` - (Optional) List. Component of resource definition. +* `resource` - (Optional) Object. Information about a resource definition. The `resource` object has such arguments: * `id` - (Required) String. The resource ID, used to refer to a resource in the Lambda function configuration. Max length is 128 characters with pattern ''[a-zA-Z0-9:_-]+''. This must be unique within a Greengrass group. @@ -90,4 +85,4 @@ If you use `resource_definition_version` object you should set `AMZN_CLIENT_TOKE IoT Greengrass Logger Definition can be imported using the `id`, e.g. ``` $ terraform import aws_greengrass_resource_definition.definition -``` \ No newline at end of file +```