Skip to content

Commit

Permalink
Merge pull request #26785 from bschaatsbergen/b/fix-overwrite-on-ssm-…
Browse files Browse the repository at this point in the history
…parameter

Regression issue: Allow SSM parameter overwrite upon creation
  • Loading branch information
ewbankkit committed Sep 27, 2022
2 parents a2ee3af + c746068 commit e8e229c
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .changelog/26785.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/aws_ssm_parameter: Allow parameter overwrite on create
```
17 changes: 16 additions & 1 deletion internal/service/ssm/parameter.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ func resourceParameterCreate(d *schema.ResourceData, meta interface{}) error {
Name: aws.String(name),
Type: aws.String(d.Get("type").(string)),
Value: aws.String(value),
Overwrite: aws.Bool(ShouldUpdateParameter(d)),
AllowedPattern: aws.String(d.Get("allowed_pattern").(string)),
}

Expand All @@ -169,7 +170,10 @@ func resourceParameterCreate(d *schema.ResourceData, meta interface{}) error {
paramInput.SetKeyId(keyID.(string))
}

if len(tags) > 0 {
// AWS SSM Service only supports PutParameter requests with Tags
// iff Overwrite is not provided or is false; in this resource's case,
// the Overwrite value is always set in the paramInput so we check for the value
if len(tags) > 0 && !aws.BoolValue(paramInput.Overwrite) {
paramInput.Tags = Tags(tags.IgnoreAWS())
}

Expand All @@ -185,6 +189,17 @@ func resourceParameterCreate(d *schema.ResourceData, meta interface{}) error {
return fmt.Errorf("error creating SSM Parameter (%s): %w", name, err)
}

// Since the AWS SSM Service does not support PutParameter requests with
// Tags and Overwrite set to true, we make an additional API call
// to Update the resource's tags if necessary
if d.HasChange("tags_all") && paramInput.Tags == nil {
o, n := d.GetChange("tags_all")

if err := UpdateTags(conn, name, ssm.ResourceTypeForTaggingParameter, o, n); err != nil {
return fmt.Errorf("error updating SSM Parameter (%s) tags: %w", name, err)
}
}

d.SetId(name)

return resourceParameterRead(d, meta)
Expand Down
25 changes: 23 additions & 2 deletions internal/service/ssm/parameter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -285,10 +285,31 @@ func TestAccSSMParameter_Overwrite_basic(t *testing.T) {
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
CheckDestroy: testAccCheckParameterDestroy,
Steps: []resource.TestStep{
{

PreConfig: func() {
conn := acctest.Provider.Meta().(*conns.AWSClient).SSMConn

input := &ssm.PutParameterInput{
Name: aws.String(fmt.Sprintf("%s-%s", "test_parameter", name)),
Type: aws.String(ssm.ParameterTypeString),
Value: aws.String("This value is set using the SDK"),
}

_, err := conn.PutParameter(input)
if err != nil {
t.Fatalf("creating SSM Parameter: (%s):, %s", name, err)
}
},
Config: testAccParameterConfig_basicOverwrite(name, "String", "This value is set using Terraform"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "version", "2"),
),
},
{
Config: testAccParameterConfig_basicOverwrite(name, "String", "test2"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "version", "1"),
resource.TestCheckResourceAttr(resourceName, "version", "3"),
),
},
{
Expand All @@ -303,7 +324,7 @@ func TestAccSSMParameter_Overwrite_basic(t *testing.T) {
testAccCheckParameterExists(resourceName, &param),
resource.TestCheckResourceAttr(resourceName, "value", "test3"),
resource.TestCheckResourceAttr(resourceName, "type", "String"),
resource.TestCheckResourceAttr(resourceName, "version", "2"),
resource.TestCheckResourceAttr(resourceName, "version", "4"),
),
},
},
Expand Down
2 changes: 2 additions & 0 deletions website/docs/r/ssm_parameter.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ description: |-

Provides an SSM Parameter resource.

~> **Note:** `overwrite` also makes it possible to overwrite an existing SSM Parameter that's not created by Terraform before.

## Example Usage

### Basic example
Expand Down

0 comments on commit e8e229c

Please sign in to comment.