From a40cccb609b98c29074e834e352a527147c56ec6 Mon Sep 17 00:00:00 2001 From: Dogers Date: Sat, 22 Feb 2020 22:09:54 +0000 Subject: [PATCH 1/4] Add aws_imagebuilder_infrastructureconfiguration --- ...agebuilder_infrastructure_configuration.go | 335 ++++++++++++++++++ 1 file changed, 335 insertions(+) create mode 100644 aws/resource_aws_imagebuilder_infrastructure_configuration.go diff --git a/aws/resource_aws_imagebuilder_infrastructure_configuration.go b/aws/resource_aws_imagebuilder_infrastructure_configuration.go new file mode 100644 index 00000000000..53557a329ca --- /dev/null +++ b/aws/resource_aws_imagebuilder_infrastructure_configuration.go @@ -0,0 +1,335 @@ +package aws + +import ( + "fmt" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/backup" + "github.com/aws/aws-sdk-go/service/imagebuilder" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "log" +) + +func resourceAwsImageBuilderInfrastructureConfiguration() *schema.Resource { + return &schema.Resource{ + Create: resourceAwsImageBuilderInfrastructureConfigurationCreate, + Read: resourceAwsImageBuilderInfrastructureConfigurationRead, + Update: resourceAwsImageBuilderInfrastructureConfigurationUpdate, + Delete: resourceAwsImageBuilderInfrastructureConfigurationDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + + Schema: map[string]*schema.Schema{ + "arn": { + Type: schema.TypeString, + Computed: true, + }, + "datecreated": { + Type: schema.TypeString, + Computed: true, + }, + "dateupdated": { + Type: schema.TypeString, + Computed: true, + }, + "description": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 1024), + }, + "instance_profile_name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringLenBetween(1, 1024), + }, + "instance_types": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + }, + "key_pair": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 1024), + }, + "logging": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "s3_logs": { + Type: schema.TypeList, + Required: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "s3_bucket_name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringLenBetween(1, 1024), + }, + "s3_key_prefix": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 1024), + Default: "/", + }, + }, + }, + }, + }, + }, + }, + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + }, + "security_group_ids": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + }, + "sns_topic_arn": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 1024), + }, + "subnet_id": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringLenBetween(1, 1024), + }, + "terminate_instance_on_failure": { + Type: schema.TypeBool, + Optional: true, + }, + "tags": tagsSchema(), + }, + } +} + +func resourceAwsImageBuilderInfrastructureConfigurationCreate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).imagebuilderconn + + securityIdSet := d.Get("security_group_ids").(*schema.Set) + securityIds := expandStringList(securityIdSet.List()) + instanceIdSet := d.Get("instance_types").(*schema.Set) + instanceIds := expandStringList(instanceIdSet.List()) + + input := &imagebuilder.CreateInfrastructureConfigurationInput{ + ClientToken: aws.String(resource.UniqueId()), + Name: aws.String(d.Get("name").(string)), + InstanceProfileName: aws.String(d.Get("instance_profile_name").(string)), + SecurityGroupIds: securityIds, + InstanceTypes: instanceIds, + } + + if v, ok := d.GetOk("description"); ok { + input.SetDescription(v.(string)) + } + if v, ok := d.GetOk("key_pair"); ok { + input.SetKeyPair(v.(string)) + } + if v, ok := d.GetOk("logging"); ok { + input.SetLogging(v.(*imagebuilder.Logging)) + } + if v, ok := d.GetOk("sns_topic_arn"); ok { + input.SetSnsTopicArn(v.(string)) + } + if v, ok := d.GetOk("subnet_id"); ok { + input.SetSubnetId(v.(string)) + } + if v, ok := d.GetOk("tags"); ok { + input.SetTags(keyvaluetags.New(v.(map[string]interface{})).IgnoreAws().ImagebuilderTags()) + } + + log.Printf("[DEBUG] Creating Infrastructure Configuration: %#v", input) + + resp, err := conn.CreateInfrastructureConfiguration(input) + if err != nil { + return fmt.Errorf("error creating Component: %s", err) + } + + d.SetId(aws.StringValue(resp.InfrastructureConfigurationArn)) + + return resourceAwsImageBuilderInfrastructureConfigurationRead(d, meta) +} + +func resourceAwsImageBuilderInfrastructureConfigurationRead(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).imagebuilderconn + + resp, err := conn.GetInfrastructureConfiguration(&imagebuilder.GetInfrastructureConfigurationInput{ + InfrastructureConfigurationArn: aws.String(d.Id()), + }) + + if isAWSErr(err, backup.ErrCodeResourceNotFoundException, "") { + log.Printf("[WARN] Infrastructure Configuration (%s) not found, removing from state", d.Id()) + d.SetId("") + return nil + } + + if err != nil { + return fmt.Errorf("error reading Infrastructure Configuration (%s): %s", d.Id(), err) + } + + d.Set("arn", resp.InfrastructureConfiguration.Arn) + d.Set("datecreated", resp.InfrastructureConfiguration.DateCreated) + d.Set("dateupdated", resp.InfrastructureConfiguration.DateUpdated) + d.Set("description", resp.InfrastructureConfiguration.Description) + d.Set("instance_profile_name", resp.InfrastructureConfiguration.InstanceProfileName) + d.Set("instance_types", resp.InfrastructureConfiguration.InstanceTypes) + d.Set("key_pair", resp.InfrastructureConfiguration.KeyPair) + d.Set("logging", flattenAwsImageBuilderLogsConfig(resp.InfrastructureConfiguration.Logging)) + d.Set("name", resp.InfrastructureConfiguration.Name) + d.Set("security_group_ids", resp.InfrastructureConfiguration.SecurityGroupIds) + d.Set("sns_topic_arn", resp.InfrastructureConfiguration.SnsTopicArn) + d.Set("subnet_id", resp.InfrastructureConfiguration.SubnetId) + d.Set("terminate_instance_on_failure", resp.InfrastructureConfiguration.TerminateInstanceOnFailure) + + tags, err := keyvaluetags.ImagebuilderListTags(conn, d.Get("arn").(string)) + if err != nil { + return fmt.Errorf("error listing tags for Infrastructure Configuration (%s): %s", d.Id(), err) + } + if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) + } + + return nil +} + +func resourceAwsImageBuilderInfrastructureConfigurationUpdate(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).imagebuilderconn + + // Despite not being required by the API, if it's not sent then certain things get wiped to null + upd := imagebuilder.UpdateInfrastructureConfigurationInput{ + InfrastructureConfigurationArn: aws.String(d.Id()), + InstanceProfileName: aws.String(d.Get("instance_profile_name").(string)), + Description: aws.String(d.Get("description").(string)), + KeyPair: aws.String(d.Get("key_pair").(string)), + SubnetId: aws.String(d.Get("subnet_id").(string)), + Logging: expandAwsImageBuilderLogsConfig(d), + } + + if d.HasChange("instance_types") { + if attr := d.Get("instance_types").(*schema.Set); attr.Len() > 0 { + upd.InstanceTypes = expandStringList(attr.List()) + } + } + if d.HasChange("instance_profile_name") { + upd.InstanceProfileName = aws.String(d.Get("instance_profile_name").(string)) + } + if v, ok := d.GetOk("security_group_ids"); ok { + if attr := v.(*schema.Set); attr.Len() > 0 { + upd.SecurityGroupIds = expandStringList(attr.List()) + } + } + if d.HasChange("sns_topic_arn") { + upd.SnsTopicArn = aws.String(d.Get("sns_topic_arn").(string)) + } + if d.HasChange("terminate_instance_on_failure") { + upd.TerminateInstanceOnFailure = aws.Bool(d.Get("terminate_instance_on_failure").(bool)) + } + + if d.HasChange("security_group_ids") { + if attr := d.Get("security_group_ids").(*schema.Set); attr.Len() > 0 { + upd.SecurityGroupIds = expandStringList(attr.List()) + } + } + + if d.HasChange("tags") { + o, n := d.GetChange("tags") + if err := keyvaluetags.ImagebuilderUpdateTags(conn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating tags for Infrastructure Configuration (%s): %s", d.Id(), err) + } + } + + _, err := conn.UpdateInfrastructureConfiguration(&upd) + if err != nil { + return fmt.Errorf("error updating Infrastructure Configuration (%s): %s", d.Id(), err) + } + + return resourceAwsImageBuilderInfrastructureConfigurationRead(d, meta) +} + +func resourceAwsImageBuilderInfrastructureConfigurationDelete(d *schema.ResourceData, meta interface{}) error { + conn := meta.(*AWSClient).imagebuilderconn + + _, err := conn.DeleteInfrastructureConfiguration(&imagebuilder.DeleteInfrastructureConfigurationInput{ + InfrastructureConfigurationArn: aws.String(d.Id()), + }) + + if isAWSErr(err, imagebuilder.ErrCodeResourceNotFoundException, "") { + return nil + } + + if err != nil { + return fmt.Errorf("error deleting Infrastructure Configuration (%s): %s", d.Id(), err) + } + + return nil +} + +func flattenAwsImageBuilderLogsConfig(logsConfig *imagebuilder.Logging) []interface{} { + if logsConfig == nil { + return []interface{}{} + } + + values := map[string]interface{}{} + + // If more logging options are added, add more ifs! + if v := logsConfig.S3Logs; v != nil { + values["s3_logs"] = flattenAwsImageBuilderS3Logs(v) + } + + return []interface{}{values} +} + +func flattenAwsImageBuilderS3Logs(s3LogsConfig *imagebuilder.S3Logs) []interface{} { + values := map[string]interface{}{} + + values["s3_key_prefix"] = aws.StringValue(s3LogsConfig.S3KeyPrefix) + values["s3_bucket_name"] = aws.StringValue(s3LogsConfig.S3BucketName) + + return []interface{}{values} +} + +func expandAwsImageBuilderLogsConfig(d *schema.ResourceData) *imagebuilder.Logging { + logsConfig := &imagebuilder.Logging{} + + if v, ok := d.GetOk("logging"); ok && len(v.([]interface{})) > 0 && v.([]interface{})[0] != nil { + configList := v.([]interface{}) + data := configList[0].(map[string]interface{}) + + if v, ok := data["s3_logs"]; ok { + logsConfig.S3Logs = expandAwsImageBuilderS3LogsConfig(v.([]interface{})) + } + } + + return logsConfig +} + +func expandAwsImageBuilderS3LogsConfig(configList []interface{}) *imagebuilder.S3Logs { + if len(configList) == 0 || configList[0] == nil { + return nil + } + + data := configList[0].(map[string]interface{}) + + s3LogsConfig := &imagebuilder.S3Logs{} + + if v, ok := data["s3_bucket_name"]; ok { + s3LogsConfig.S3BucketName = aws.String(v.(string)) + } + if v, ok := data["s3_key_prefix"]; ok { + s3LogsConfig.S3KeyPrefix = aws.String(v.(string)) + } + + return s3LogsConfig +} From e66817672f663a785013bb4c988c15a76f981344 Mon Sep 17 00:00:00 2001 From: Dogers Date: Mon, 25 May 2020 19:58:57 +0100 Subject: [PATCH 2/4] Fix issue with infraconfig logging --- aws/resource_aws_imagebuilder_infrastructure_configuration.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/aws/resource_aws_imagebuilder_infrastructure_configuration.go b/aws/resource_aws_imagebuilder_infrastructure_configuration.go index 53557a329ca..f70edd34c55 100644 --- a/aws/resource_aws_imagebuilder_infrastructure_configuration.go +++ b/aws/resource_aws_imagebuilder_infrastructure_configuration.go @@ -129,6 +129,7 @@ func resourceAwsImageBuilderInfrastructureConfigurationCreate(d *schema.Resource InstanceProfileName: aws.String(d.Get("instance_profile_name").(string)), SecurityGroupIds: securityIds, InstanceTypes: instanceIds, + Logging: expandAwsImageBuilderLogsConfig(d), } if v, ok := d.GetOk("description"); ok { @@ -137,9 +138,6 @@ func resourceAwsImageBuilderInfrastructureConfigurationCreate(d *schema.Resource if v, ok := d.GetOk("key_pair"); ok { input.SetKeyPair(v.(string)) } - if v, ok := d.GetOk("logging"); ok { - input.SetLogging(v.(*imagebuilder.Logging)) - } if v, ok := d.GetOk("sns_topic_arn"); ok { input.SetSnsTopicArn(v.(string)) } From ade62ae389377507c83ac1a3ed0028de164f7353 Mon Sep 17 00:00:00 2001 From: Jakub Kania Date: Mon, 13 Jul 2020 00:51:25 +0200 Subject: [PATCH 3/4] [#11084] Fix the imagebuilder resource, add test and docs --- aws/provider.go | 1 + ...agebuilder_infrastructure_configuration.go | 51 ++- ...ilder_infrastructure_configuration_test.go | 355 ++++++++++++++++++ website/allowed-subcategories.txt | 1 + website/aws.erb | 14 + ...infrastructure_configuration.html.markdown | 77 ++++ 6 files changed, 479 insertions(+), 20 deletions(-) create mode 100644 aws/resource_aws_imagebuilder_infrastructure_configuration_test.go create mode 100644 website/docs/r/imagebuilder_infrastructure_configuration.html.markdown diff --git a/aws/provider.go b/aws/provider.go index 955f26f447c..1ce62f124df 100644 --- a/aws/provider.go +++ b/aws/provider.go @@ -654,6 +654,7 @@ func Provider() terraform.ResourceProvider { "aws_iam_user_ssh_key": resourceAwsIamUserSshKey(), "aws_iam_user": resourceAwsIamUser(), "aws_iam_user_login_profile": resourceAwsIamUserLoginProfile(), + "aws_imagebuilder_infrastructure_configuration": resourceAwsImageBuilderInfrastructureConfiguration(), "aws_inspector_assessment_target": resourceAWSInspectorAssessmentTarget(), "aws_inspector_assessment_template": resourceAWSInspectorAssessmentTemplate(), "aws_inspector_resource_group": resourceAWSInspectorResourceGroup(), diff --git a/aws/resource_aws_imagebuilder_infrastructure_configuration.go b/aws/resource_aws_imagebuilder_infrastructure_configuration.go index f70edd34c55..5eed4f1c8a8 100644 --- a/aws/resource_aws_imagebuilder_infrastructure_configuration.go +++ b/aws/resource_aws_imagebuilder_infrastructure_configuration.go @@ -27,11 +27,11 @@ func resourceAwsImageBuilderInfrastructureConfiguration() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "datecreated": { + "date_created": { Type: schema.TypeString, Computed: true, }, - "dateupdated": { + "date_updated": { Type: schema.TypeString, Computed: true, }, @@ -109,6 +109,7 @@ func resourceAwsImageBuilderInfrastructureConfiguration() *schema.Resource { "terminate_instance_on_failure": { Type: schema.TypeBool, Optional: true, + Default: false, }, "tags": tagsSchema(), }, @@ -162,6 +163,7 @@ func resourceAwsImageBuilderInfrastructureConfigurationCreate(d *schema.Resource func resourceAwsImageBuilderInfrastructureConfigurationRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).imagebuilderconn + ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig resp, err := conn.GetInfrastructureConfiguration(&imagebuilder.GetInfrastructureConfigurationInput{ InfrastructureConfigurationArn: aws.String(d.Id()), @@ -178,8 +180,8 @@ func resourceAwsImageBuilderInfrastructureConfigurationRead(d *schema.ResourceDa } d.Set("arn", resp.InfrastructureConfiguration.Arn) - d.Set("datecreated", resp.InfrastructureConfiguration.DateCreated) - d.Set("dateupdated", resp.InfrastructureConfiguration.DateUpdated) + d.Set("date_created", resp.InfrastructureConfiguration.DateCreated) + d.Set("date_updated", resp.InfrastructureConfiguration.DateUpdated) d.Set("description", resp.InfrastructureConfiguration.Description) d.Set("instance_profile_name", resp.InfrastructureConfiguration.InstanceProfileName) d.Set("instance_types", resp.InfrastructureConfiguration.InstanceTypes) @@ -195,7 +197,7 @@ func resourceAwsImageBuilderInfrastructureConfigurationRead(d *schema.ResourceDa if err != nil { return fmt.Errorf("error listing tags for Infrastructure Configuration (%s): %s", d.Id(), err) } - if err := d.Set("tags", tags.IgnoreAws().Map()); err != nil { + if err := d.Set("tags", tags.IgnoreAws().IgnoreConfig(ignoreTagsConfig).Map()); err != nil { return fmt.Errorf("error setting tags: %s", err) } @@ -209,30 +211,41 @@ func resourceAwsImageBuilderInfrastructureConfigurationUpdate(d *schema.Resource upd := imagebuilder.UpdateInfrastructureConfigurationInput{ InfrastructureConfigurationArn: aws.String(d.Id()), InstanceProfileName: aws.String(d.Get("instance_profile_name").(string)), - Description: aws.String(d.Get("description").(string)), - KeyPair: aws.String(d.Get("key_pair").(string)), - SubnetId: aws.String(d.Get("subnet_id").(string)), Logging: expandAwsImageBuilderLogsConfig(d), } - if d.HasChange("instance_types") { - if attr := d.Get("instance_types").(*schema.Set); attr.Len() > 0 { - upd.InstanceTypes = expandStringList(attr.List()) - } + if description, ok := d.GetOk("description"); ok { + upd.Description = aws.String(description.(string)) + } + + if key_pair, ok := d.GetOk("key_pair"); ok { + upd.KeyPair = aws.String(key_pair.(string)) + } + + if subnet_id, ok := d.GetOk("subnet_id"); ok { + upd.SubnetId = aws.String(subnet_id.(string)) + } + + if attr := d.Get("instance_types").(*schema.Set); attr.Len() > 0 { + upd.InstanceTypes = expandStringList(attr.List()) } + if d.HasChange("instance_profile_name") { upd.InstanceProfileName = aws.String(d.Get("instance_profile_name").(string)) } + if v, ok := d.GetOk("security_group_ids"); ok { if attr := v.(*schema.Set); attr.Len() > 0 { upd.SecurityGroupIds = expandStringList(attr.List()) } } - if d.HasChange("sns_topic_arn") { - upd.SnsTopicArn = aws.String(d.Get("sns_topic_arn").(string)) + + if sns_topic_arn, ok := d.GetOk("sns_topic_arn"); ok { + upd.SnsTopicArn = aws.String(sns_topic_arn.(string)) } - if d.HasChange("terminate_instance_on_failure") { - upd.TerminateInstanceOnFailure = aws.Bool(d.Get("terminate_instance_on_failure").(bool)) + + if terminate_instance_on_failure, ok := d.GetOk("terminate_instance_on_failure"); ok { + upd.TerminateInstanceOnFailure = aws.Bool(terminate_instance_on_failure.(bool)) } if d.HasChange("security_group_ids") { @@ -275,16 +288,14 @@ func resourceAwsImageBuilderInfrastructureConfigurationDelete(d *schema.Resource } func flattenAwsImageBuilderLogsConfig(logsConfig *imagebuilder.Logging) []interface{} { - if logsConfig == nil { + if logsConfig == nil || logsConfig.S3Logs == nil { return []interface{}{} } values := map[string]interface{}{} // If more logging options are added, add more ifs! - if v := logsConfig.S3Logs; v != nil { - values["s3_logs"] = flattenAwsImageBuilderS3Logs(v) - } + values["s3_logs"] = flattenAwsImageBuilderS3Logs(logsConfig.S3Logs) return []interface{}{values} } diff --git a/aws/resource_aws_imagebuilder_infrastructure_configuration_test.go b/aws/resource_aws_imagebuilder_infrastructure_configuration_test.go new file mode 100644 index 00000000000..2d9958b9fa1 --- /dev/null +++ b/aws/resource_aws_imagebuilder_infrastructure_configuration_test.go @@ -0,0 +1,355 @@ +package aws + +import ( + "errors" + "fmt" + "github.com/aws/aws-sdk-go/aws/awserr" + "testing" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/imagebuilder" + "github.com/hashicorp/terraform-plugin-sdk/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" +) + +//Check the minimal configuration +func TestAccAWSImageBuilderInfrastructureConfiguration_basic(t *testing.T) { + var conf imagebuilder.InfrastructureConfiguration + RandomString := fmt.Sprintf("tf-test-%d", acctest.RandInt()) + resourceName := "aws_imagebuilder_infrastructure_configuration.test" + resource.ParallelTest(t, resource.TestCase{ + IDRefreshName: resourceName, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSImageBuilderInfrastructureConfigurationDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSImageBuilderInfrastructureConfiguration_basic(RandomString), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckAWSImageBuilderInfrastructureConfigurationExist(resourceName, &conf), + resource.TestCheckResourceAttrSet(resourceName, "instance_profile_name"), + resource.TestCheckResourceAttrSet(resourceName, "name"), + ), + }, + }, + }) +} + +//Check the configuration with everything +func TestAccAWSImageBuilderInfrastructureConfiguration_advanced(t *testing.T) { + var conf imagebuilder.InfrastructureConfiguration + RandomString := fmt.Sprintf("tf-test-%d", acctest.RandInt()) + resourceName := "aws_imagebuilder_infrastructure_configuration.test" + + resource.ParallelTest(t, resource.TestCase{ + IDRefreshName: resourceName, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSImageBuilderInfrastructureConfigurationDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSImageBuilderInfrastructureConfiguration_advanced(RandomString), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckAWSImageBuilderInfrastructureConfigurationExist(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "instance_profile_name", RandomString), + resource.TestCheckResourceAttr(resourceName, "name", RandomString), + resource.TestCheckResourceAttr(resourceName, "description", "example desc"), + resource.TestCheckResourceAttr(resourceName, "key_pair", RandomString), + resource.TestCheckResourceAttrSet(resourceName, "sns_topic_arn"), + resource.TestCheckResourceAttrSet(resourceName, "subnet_id"), + resource.TestCheckResourceAttr(resourceName, "terminate_instance_on_failure", "false"), + resource.TestCheckResourceAttr(resourceName, "security_group_ids.#", "1"), + resource.TestCheckResourceAttr(resourceName, "instance_types.#", "1"), + resource.TestCheckResourceAttr(resourceName, "logging.0.s3_logs.0.s3_bucket_name", RandomString), + resource.TestCheckResourceAttr(resourceName, "logging.0.s3_logs.0.s3_key_prefix", "logs"), + ), + }, + }, + }) +} + +//Test the tags work +func TestAccAWSImageBuilderInfrastructureConfiguration_tags(t *testing.T) { + var conf imagebuilder.InfrastructureConfiguration + RandomString := fmt.Sprintf("tf-test-%d", acctest.RandInt()) + resourceName := "aws_imagebuilder_infrastructure_configuration.test" + + resource.ParallelTest(t, resource.TestCase{ + IDRefreshName: resourceName, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSImageBuilderInfrastructureConfigurationDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSImageBuilderInfrastructureConfiguration_tags1(RandomString), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckAWSImageBuilderInfrastructureConfigurationExist(resourceName, &conf), + resource.TestCheckResourceAttrSet(resourceName, "instance_profile_name"), + resource.TestCheckResourceAttrSet(resourceName, "name"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + ), + }, + { + Config: testAccAWSImageBuilderInfrastructureConfiguration_tags2(RandomString), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckAWSImageBuilderInfrastructureConfigurationExist(resourceName, &conf), + resource.TestCheckResourceAttrSet(resourceName, "instance_profile_name"), + resource.TestCheckResourceAttrSet(resourceName, "name"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + ), + }, + }, + }) +} + +func testAccCheckAWSImageBuilderInfrastructureConfigurationExist(n string, res *imagebuilder.InfrastructureConfiguration) resource.TestCheckFunc { + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return errors.New("No ImageBuilderInfrastructureConfiguration ID is set") + } + + conn := testAccProvider.Meta().(*AWSClient).imagebuilderconn + + resp, err := conn.GetInfrastructureConfiguration(&imagebuilder.GetInfrastructureConfigurationInput{ + InfrastructureConfigurationArn: aws.String(rs.Primary.Attributes["arn"]), + }) + + if err != nil { + return err + } + + if resp == nil || resp.InfrastructureConfiguration == nil { + return fmt.Errorf("Infrastructure configuration (%s) not found", rs.Primary.Attributes["name"]) + } + *res = *resp.InfrastructureConfiguration + return nil + } +} + +func testAccCheckAWSImageBuilderInfrastructureConfigurationDestroy(s *terraform.State) error { + + for _, rs := range s.RootModule().Resources { + if rs.Type != "aws_imagebuilder_infrastructure_configuration" { + continue + } + + conn := testAccProvider.Meta().(*AWSClient).imagebuilderconn + + resp, err := conn.GetInfrastructureConfiguration(&imagebuilder.GetInfrastructureConfigurationInput{ + InfrastructureConfigurationArn: aws.String(rs.Primary.Attributes["arn"]), + }) + + if err == nil { + if resp.InfrastructureConfiguration != nil { + return fmt.Errorf("ImageBuilderInfrastructureConfiguration %q still exists", rs.Primary.ID) + } + } + + // Verify the error + if awsErr, ok := err.(awserr.Error); ok { + if awsErr.Code() == "ResourceNotFoundException" { + return nil + } + } + return err + } + + return nil +} + +func testAccAWSImageBuilderInfrastructureConfiguration_basic(ConfigurationName string) string { + return fmt.Sprintf(` + +resource "aws_imagebuilder_infrastructure_configuration" "test" { + instance_profile_name = aws_iam_instance_profile.test_profile.name + name = "%[1]s" +} + +resource "aws_iam_instance_profile" "test_profile" { + name = "%[1]s" + role = aws_iam_role.role.name +} + +resource "aws_iam_role" "role" { + name = "%[1]s" + path = "/" + + assume_role_policy = < +
  • + Image Builder + +
  • +
  • IoT