From f4e1ee23ba05ce75d2b750adc67ec6e1c1841618 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 01:11:44 +0100 Subject: [PATCH 01/11] Add user_data_base64 attribute to image recipe data source --- .../service/imagebuilder/image_recipe_data_source.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internal/service/imagebuilder/image_recipe_data_source.go b/internal/service/imagebuilder/image_recipe_data_source.go index b9d675d7afd0..f5aa0d957014 100644 --- a/internal/service/imagebuilder/image_recipe_data_source.go +++ b/internal/service/imagebuilder/image_recipe_data_source.go @@ -114,6 +114,10 @@ func DataSourceImageRecipe() *schema.Resource { Computed: true, }, "tags": tftags.TagsSchema(), + "user_data_base64": { + Type: schema.TypeString, + Computed: true, + }, "version": { Type: schema.TypeString, Computed: true, @@ -159,6 +163,11 @@ func dataSourceImageRecipeRead(d *schema.ResourceData, meta interface{}) error { d.Set("parent_image", imageRecipe.ParentImage) d.Set("platform", imageRecipe.Platform) d.Set("tags", KeyValueTags(imageRecipe.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()) + + if imageRecipe.AdditionalInstanceConfiguration != nil { + d.Set("user_data_base64", imageRecipe.AdditionalInstanceConfiguration.UserDataOverride) + } + d.Set("version", imageRecipe.Version) d.Set("working_directory", imageRecipe.WorkingDirectory) From 2357741c439a10944a9a478ee590d5d5d5fa2da0 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 13:43:27 +0100 Subject: [PATCH 02/11] Add user_data_base64 attribute to image recipe resource --- internal/service/imagebuilder/image_recipe.go | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/internal/service/imagebuilder/image_recipe.go b/internal/service/imagebuilder/image_recipe.go index 4a4f60689ae6..b1cca180e5bf 100644 --- a/internal/service/imagebuilder/image_recipe.go +++ b/internal/service/imagebuilder/image_recipe.go @@ -168,6 +168,24 @@ func ResourceImageRecipe() *schema.Resource { }, "tags": tftags.TagsSchema(), "tags_all": tftags.TagsSchemaComputed(), + "user_data_base64": { + Type: schema.TypeString, + Optional: true, + ForceNew: true, + Computed: true, + ValidateFunc: validation.All( + validation.StringLenBetween(1, 21847), + func(v interface{}, name string) (warns []string, errs []error) { + s := v.(string) + if !verify.IsBase64Encoded([]byte(s)) { + errs = append(errs, fmt.Errorf( + "%s: must be base64-encoded", name, + )) + } + return + }, + ), + }, "version": { Type: schema.TypeString, Required: true, @@ -219,6 +237,12 @@ func resourceImageRecipeCreate(d *schema.ResourceData, meta interface{}) error { input.Tags = Tags(tags.IgnoreAWS()) } + if v, ok := d.GetOk("user_data_base64"); ok { + input.AdditionalInstanceConfiguration = &imagebuilder.AdditionalInstanceConfiguration{ + UserDataOverride: aws.String(v.(string)), + } + } + if v, ok := d.GetOk("version"); ok { input.SemanticVersion = aws.String(v.(string)) } @@ -287,6 +311,11 @@ func resourceImageRecipeRead(d *schema.ResourceData, meta interface{}) error { if err := d.Set("tags_all", tags.Map()); err != nil { return fmt.Errorf("error setting tags_all: %w", err) } + + if imageRecipe.AdditionalInstanceConfiguration != nil { + d.Set("user_data_base64", imageRecipe.AdditionalInstanceConfiguration.UserDataOverride) + } + d.Set("version", imageRecipe.Version) d.Set("working_directory", imageRecipe.WorkingDirectory) From 59b20d1fc40627f76c9615dfdd880a8d55c1ed80 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 13:59:29 +0100 Subject: [PATCH 03/11] Add acceptance test for image recipe resource user data attribute --- .../service/imagebuilder/image_recipe_test.go | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/internal/service/imagebuilder/image_recipe_test.go b/internal/service/imagebuilder/image_recipe_test.go index 6ba7d75816dc..59f6cec17009 100644 --- a/internal/service/imagebuilder/image_recipe_test.go +++ b/internal/service/imagebuilder/image_recipe_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/acctest" "github.com/hashicorp/terraform-provider-aws/internal/conns" tfimagebuilder "github.com/hashicorp/terraform-provider-aws/internal/service/imagebuilder" + "github.com/hashicorp/terraform-provider-aws/internal/verify" ) func TestAccImageBuilderImageRecipe_basic(t *testing.T) { @@ -516,6 +517,32 @@ func TestAccImageBuilderImageRecipe_workingDirectory(t *testing.T) { }) } +func TestAccImageBuilderImageRecipe_userDataBase64(t *testing.T) { + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + resourceName := "aws_imagebuilder_image_recipe.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + ErrorCheck: acctest.ErrorCheck(t, imagebuilder.EndpointsID), + Providers: acctest.Providers, + CheckDestroy: testAccCheckImageRecipeDestroy, + Steps: []resource.TestStep{ + { + Config: testAccImageRecipeUserDataBase64Config(rName), + Check: resource.ComposeTestCheckFunc( + testAccCheckImageRecipeExists(resourceName), + resource.TestCheckResourceAttr(resourceName, "user_data_base64", verify.Base64Encode([]byte("hello world"))), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + func testAccCheckImageRecipeDestroy(s *terraform.State) error { conn := acctest.Provider.Meta().(*conns.AWSClient).ImageBuilderConn @@ -947,3 +974,20 @@ resource "aws_imagebuilder_image_recipe" "test" { } `, rName, workingDirectory)) } + +func testAccImageRecipeUserDataBase64Config(rName string) string { + return acctest.ConfigCompose( + testAccImageRecipeBaseConfig(rName), + fmt.Sprintf(` +resource "aws_imagebuilder_image_recipe" "test" { + component { + component_arn = aws_imagebuilder_component.test.arn + } + + name = %[1]q + parent_image = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:image/amazon-linux-2-x86/x.x.x" + version = "1.0.0" + user_data_base64 = base64encode("hello world") + } +`, rName)) +} From 9e7729c6a7b76b2a643cb12bc287e4e8717b7aab Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 14:07:38 +0100 Subject: [PATCH 04/11] Add acceptance test for data source --- internal/service/imagebuilder/image_recipe_data_source_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/service/imagebuilder/image_recipe_data_source_test.go b/internal/service/imagebuilder/image_recipe_data_source_test.go index f6a8fc26c20d..b171e81b66e2 100644 --- a/internal/service/imagebuilder/image_recipe_data_source_test.go +++ b/internal/service/imagebuilder/image_recipe_data_source_test.go @@ -34,6 +34,7 @@ func TestAccImageBuilderImageRecipeDataSource_arn(t *testing.T) { resource.TestCheckResourceAttrPair(dataSourceName, "parent_image", resourceName, "parent_image"), resource.TestCheckResourceAttrPair(dataSourceName, "platform", resourceName, "platform"), resource.TestCheckResourceAttrPair(dataSourceName, "tags.%", resourceName, "tags.%"), + resource.TestCheckResourceAttrPair(dataSourceName, "user_data_base64", resourceName, "user_data_base64"), resource.TestCheckResourceAttrPair(dataSourceName, "version", resourceName, "version"), resource.TestCheckResourceAttrPair(dataSourceName, "working_directory", resourceName, "working_directory"), ), @@ -76,6 +77,7 @@ resource "aws_imagebuilder_image_recipe" "test" { name = %[1]q parent_image = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:image/amazon-linux-2-x86/x.x.x" version = "1.0.0" + user_data_base64 = base64encode("helloworld") } data "aws_imagebuilder_image_recipe" "test" { From 7160e32fac87ed596f46215fa22476406d129f77 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 14:18:18 +0100 Subject: [PATCH 05/11] Fix acceptance test linting --- .../image_recipe_data_source_test.go | 6 +++--- .../service/imagebuilder/image_recipe_test.go | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/service/imagebuilder/image_recipe_data_source_test.go b/internal/service/imagebuilder/image_recipe_data_source_test.go index b171e81b66e2..3090979bf487 100644 --- a/internal/service/imagebuilder/image_recipe_data_source_test.go +++ b/internal/service/imagebuilder/image_recipe_data_source_test.go @@ -74,9 +74,9 @@ resource "aws_imagebuilder_image_recipe" "test" { component_arn = aws_imagebuilder_component.test.arn } - name = %[1]q - parent_image = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:image/amazon-linux-2-x86/x.x.x" - version = "1.0.0" + name = %[1]q + parent_image = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:image/amazon-linux-2-x86/x.x.x" + version = "1.0.0" user_data_base64 = base64encode("helloworld") } diff --git a/internal/service/imagebuilder/image_recipe_test.go b/internal/service/imagebuilder/image_recipe_test.go index 59f6cec17009..b6668cddc239 100644 --- a/internal/service/imagebuilder/image_recipe_test.go +++ b/internal/service/imagebuilder/image_recipe_test.go @@ -980,14 +980,14 @@ func testAccImageRecipeUserDataBase64Config(rName string) string { testAccImageRecipeBaseConfig(rName), fmt.Sprintf(` resource "aws_imagebuilder_image_recipe" "test" { - component { - component_arn = aws_imagebuilder_component.test.arn - } - - name = %[1]q - parent_image = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:image/amazon-linux-2-x86/x.x.x" - version = "1.0.0" - user_data_base64 = base64encode("hello world") - } + component { + component_arn = aws_imagebuilder_component.test.arn + } + + name = %[1]q + parent_image = "arn:${data.aws_partition.current.partition}:imagebuilder:${data.aws_region.current.name}:aws:image/amazon-linux-2-x86/x.x.x" + version = "1.0.0" + user_data_base64 = base64encode("hello world") +} `, rName)) } From a543798d78966a5e99de8918726aaf4ae5057e11 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 14:56:33 +0100 Subject: [PATCH 06/11] Update data source docs --- website/docs/d/imagebuilder_image_recipe.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/d/imagebuilder_image_recipe.html.markdown b/website/docs/d/imagebuilder_image_recipe.html.markdown index dbd0ef093422..d8384be100fa 100644 --- a/website/docs/d/imagebuilder_image_recipe.html.markdown +++ b/website/docs/d/imagebuilder_image_recipe.html.markdown @@ -49,5 +49,6 @@ In addition to all arguments above, the following attributes are exported: * `parent_image` - Platform of the image recipe. * `platform` - Platform of the image recipe. * `tags` - Key-value map of resource tags for the image recipe. +* `user_data_base64` - Base64 encoded contents of user data. Commands or a command script to run when build instance is launched. * `version` - Version of the image recipe. * `working_directory` - The working directory used during build and test workflows. From 0697574aec415eb53351c8e6dc83b41e07b903e9 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 14:56:42 +0100 Subject: [PATCH 07/11] Update resource docs --- website/docs/r/imagebuilder_image_recipe.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/r/imagebuilder_image_recipe.html.markdown b/website/docs/r/imagebuilder_image_recipe.html.markdown index 83d791a5adfd..38e4f7dccf93 100644 --- a/website/docs/r/imagebuilder_image_recipe.html.markdown +++ b/website/docs/r/imagebuilder_image_recipe.html.markdown @@ -48,6 +48,7 @@ The following attributes are optional: * `block_device_mapping` - (Optional) Configuration block(s) with block device mappings for the the image recipe. Detailed below. * `description` - (Optional) Description of the image recipe. * `tags` - (Optional) Key-value map of resource tags for the image recipe. If configured with a provider [`default_tags` configuration block](/docs/providers/aws/index.html#default_tags-configuration-block) present, tags with matching keys will overwrite those defined at the provider-level. +* `user_data_base64` (Optional) Based64 encoded user data. Use this to provide commands or a command script to run when you launch your build instance. * `working_directory` - (Optional) The working directory to be used during build and test workflows. ### block_device_mapping From 3d15d4e9bb3dc073b439ff7f39d837f76a1f9573 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Sat, 13 Nov 2021 15:08:50 +0100 Subject: [PATCH 08/11] Add changelog --- .changelog/21763.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changelog/21763.txt diff --git a/.changelog/21763.txt b/.changelog/21763.txt new file mode 100644 index 000000000000..36e94c10488e --- /dev/null +++ b/.changelog/21763.txt @@ -0,0 +1,6 @@ +```release-note:enhancement +resource/aws_imagebuilder_image_recipe - add support for user data +``` +```release-note:enhancement +data-source/aws_imagebuilder_image_recipe - add support for user data +``` \ No newline at end of file From 1e31ac379eefb2454e084ba6d493ef08671ae1e5 Mon Sep 17 00:00:00 2001 From: Kamil Turek Date: Thu, 13 Jan 2022 23:38:06 +0100 Subject: [PATCH 09/11] Fix typo --- website/docs/r/imagebuilder_image_recipe.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/r/imagebuilder_image_recipe.html.markdown b/website/docs/r/imagebuilder_image_recipe.html.markdown index 38e4f7dccf93..69b852903dcc 100644 --- a/website/docs/r/imagebuilder_image_recipe.html.markdown +++ b/website/docs/r/imagebuilder_image_recipe.html.markdown @@ -48,7 +48,7 @@ The following attributes are optional: * `block_device_mapping` - (Optional) Configuration block(s) with block device mappings for the the image recipe. Detailed below. * `description` - (Optional) Description of the image recipe. * `tags` - (Optional) Key-value map of resource tags for the image recipe. If configured with a provider [`default_tags` configuration block](/docs/providers/aws/index.html#default_tags-configuration-block) present, tags with matching keys will overwrite those defined at the provider-level. -* `user_data_base64` (Optional) Based64 encoded user data. Use this to provide commands or a command script to run when you launch your build instance. +* `user_data_base64` (Optional) Base64 encoded user data. Use this to provide commands or a command script to run when you launch your build instance. * `working_directory` - (Optional) The working directory to be used during build and test workflows. ### block_device_mapping From aa5a97205265915850be2408244a73e214b6a28d Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 18 Jan 2022 11:58:44 -0500 Subject: [PATCH 10/11] Tweak CHANGELOG entries. --- .changelog/21763.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.changelog/21763.txt b/.changelog/21763.txt index 36e94c10488e..c77dc1e90a51 100644 --- a/.changelog/21763.txt +++ b/.changelog/21763.txt @@ -1,6 +1,6 @@ ```release-note:enhancement -resource/aws_imagebuilder_image_recipe - add support for user data +resource/aws_imagebuilder_image_recipe: Add `user_data_base64` argument ``` ```release-note:enhancement -data-source/aws_imagebuilder_image_recipe - add support for user data +data-source/aws_imagebuilder_image_recipe: Add `user_data_base64` attribute ``` \ No newline at end of file From b467fde58aff2a91e98835509fc54a17ba297a03 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Tue, 18 Jan 2022 11:59:51 -0500 Subject: [PATCH 11/11] Fix compilation error. --- internal/service/imagebuilder/image_recipe_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/service/imagebuilder/image_recipe_test.go b/internal/service/imagebuilder/image_recipe_test.go index ffff0974b57f..97e64a4654d7 100644 --- a/internal/service/imagebuilder/image_recipe_test.go +++ b/internal/service/imagebuilder/image_recipe_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/acctest" "github.com/hashicorp/terraform-provider-aws/internal/conns" tfimagebuilder "github.com/hashicorp/terraform-provider-aws/internal/service/imagebuilder" + "github.com/hashicorp/terraform-provider-aws/internal/verify" ) func TestAccImageBuilderImageRecipe_basic(t *testing.T) {