Skip to content

Commit a8e7f75

Browse files
authored
Merge pull request #17872 from hashicorp/b-neptune-parameter-group-update
r/neptune_cluster_parameter_group: update parameter field modification on create/update
2 parents 31580e3 + 63194a0 commit a8e7f75

3 files changed

Lines changed: 119 additions & 41 deletions

File tree

.changelog/17872.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
resource/aws_neptune_cluster_parameter_group: Correctly update resource by `id`
3+
```

aws/resource_aws_neptune_cluster_parameter_group.go

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/aws/aws-sdk-go/aws"
88
"github.com/aws/aws-sdk-go/service/neptune"
9+
"github.com/hashicorp/aws-sdk-go-base/tfawserr"
910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1011
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1112
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
@@ -107,18 +108,21 @@ func resourceAwsNeptuneClusterParameterGroupCreate(d *schema.ResourceData, meta
107108
Tags: tags,
108109
}
109110

110-
log.Printf("[DEBUG] Create Neptune Cluster Parameter Group: %#v", createOpts)
111-
resp, err := conn.CreateDBClusterParameterGroup(&createOpts)
111+
_, err := conn.CreateDBClusterParameterGroup(&createOpts)
112112
if err != nil {
113-
return fmt.Errorf("Error creating Neptune Cluster Parameter Group: %s", err)
113+
return fmt.Errorf("error creating Neptune Cluster Parameter Group (%s): %w", groupName, err)
114114
}
115115

116116
d.SetId(aws.StringValue(createOpts.DBClusterParameterGroupName))
117-
log.Printf("[INFO] Neptune Cluster Parameter Group ID: %s", d.Id())
118117

119-
d.Set("arn", resp.DBClusterParameterGroup.DBClusterParameterGroupArn)
118+
if v, ok := d.GetOk("parameter"); ok && v.(*schema.Set).Len() > 0 {
119+
err := modifyNeptuneClusterParameterGroupParameters(conn, d.Id(), expandNeptuneParameters(v.(*schema.Set).List()))
120+
if err != nil {
121+
return fmt.Errorf("error modifying Neptune Cluster Parameter Group (%s): %w", d.Id(), err)
122+
}
123+
}
120124

121-
return resourceAwsNeptuneClusterParameterGroupUpdate(d, meta)
125+
return resourceAwsNeptuneClusterParameterGroupRead(d, meta)
122126
}
123127

124128
func resourceAwsNeptuneClusterParameterGroupRead(d *schema.ResourceData, meta interface{}) error {
@@ -130,17 +134,21 @@ func resourceAwsNeptuneClusterParameterGroupRead(d *schema.ResourceData, meta in
130134
}
131135

132136
describeResp, err := conn.DescribeDBClusterParameterGroups(&describeOpts)
133-
if err != nil {
134-
if isAWSErr(err, neptune.ErrCodeDBParameterGroupNotFoundFault, "") {
135-
log.Printf("[WARN] Neptune Cluster Parameter Group (%s) not found, removing from state", d.Id())
136-
d.SetId("")
137-
return nil
138-
}
137+
if !d.IsNewResource() && tfawserr.ErrCodeEquals(err, neptune.ErrCodeDBParameterGroupNotFoundFault) {
138+
log.Printf("[WARN] Neptune Cluster Parameter Group (%s) not found, removing from state", d.Id())
139+
d.SetId("")
140+
return nil
141+
}
139142

140-
return err
143+
if err != nil {
144+
return fmt.Errorf("error reading Neptune Cluster Parameter Group (%s): %w", d.Id(), err)
141145
}
142146

143-
if len(describeResp.DBClusterParameterGroups) == 0 {
147+
if describeResp == nil || len(describeResp.DBClusterParameterGroups) == 0 {
148+
if d.IsNewResource() {
149+
return fmt.Errorf("error reading Neptune Cluster Parameter Group (%s): not found", d.Id())
150+
}
151+
144152
log.Printf("[WARN] Neptune Cluster Parameter Group (%s) not found, removing from state", d.Id())
145153
d.SetId("")
146154
return nil
@@ -164,17 +172,17 @@ func resourceAwsNeptuneClusterParameterGroupRead(d *schema.ResourceData, meta in
164172
}
165173

166174
if err := d.Set("parameter", flattenNeptuneParameters(describeParametersResp.Parameters)); err != nil {
167-
return fmt.Errorf("error setting neptune parameter: %s", err)
175+
return fmt.Errorf("error setting neptune parameter: %w", err)
168176
}
169177

170178
tags, err := keyvaluetags.NeptuneListTags(conn, d.Get("arn").(string))
171179

172180
if err != nil {
173-
return fmt.Errorf("error listing tags for Neptune Cluster Parameter Group (%s): %s", d.Get("arn").(string), err)
181+
return fmt.Errorf("error listing tags for Neptune Cluster Parameter Group (%s): %w", d.Id(), err)
174182
}
175183

176184
if err := d.Set("tags", tags.IgnoreAws().IgnoreConfig(ignoreTagsConfig).Map()); err != nil {
177-
return fmt.Errorf("error setting tags: %s", err)
185+
return fmt.Errorf("error setting tags: %w", err)
178186
}
179187

180188
return nil
@@ -198,26 +206,9 @@ func resourceAwsNeptuneClusterParameterGroupUpdate(d *schema.ResourceData, meta
198206
parameters := expandNeptuneParameters(ns.Difference(os).List())
199207

200208
if len(parameters) > 0 {
201-
// We can only modify 20 parameters at a time, so walk them until
202-
// we've got them all.
203-
for parameters != nil {
204-
var paramsToModify []*neptune.Parameter
205-
if len(parameters) <= neptuneClusterParameterGroupMaxParamsBulkEdit {
206-
paramsToModify, parameters = parameters[:], nil
207-
} else {
208-
paramsToModify, parameters = parameters[:neptuneClusterParameterGroupMaxParamsBulkEdit], parameters[neptuneClusterParameterGroupMaxParamsBulkEdit:]
209-
}
210-
parameterGroupName := d.Get("name").(string)
211-
modifyOpts := neptune.ModifyDBClusterParameterGroupInput{
212-
DBClusterParameterGroupName: aws.String(parameterGroupName),
213-
Parameters: paramsToModify,
214-
}
215-
216-
log.Printf("[DEBUG] Modify Neptune Cluster Parameter Group: %s", modifyOpts)
217-
_, err := conn.ModifyDBClusterParameterGroup(&modifyOpts)
218-
if err != nil {
219-
return fmt.Errorf("Error modifying Neptune Cluster Parameter Group: %s", err)
220-
}
209+
err := modifyNeptuneClusterParameterGroupParameters(conn, d.Id(), parameters)
210+
if err != nil {
211+
return fmt.Errorf("error updating Neptune Cluster Parameter Group (%s) parameter: %w", d.Id(), err)
221212
}
222213
}
223214
}
@@ -226,7 +217,7 @@ func resourceAwsNeptuneClusterParameterGroupUpdate(d *schema.ResourceData, meta
226217
o, n := d.GetChange("tags")
227218

228219
if err := keyvaluetags.NeptuneUpdateTags(conn, d.Get("arn").(string), o, n); err != nil {
229-
return fmt.Errorf("error updating Neptune Cluster Parameter Group (%s) tags: %s", d.Get("arn").(string), err)
220+
return fmt.Errorf("error updating Neptune Cluster Parameter Group (%s) tags: %w", d.Id(), err)
230221
}
231222
}
232223

@@ -240,13 +231,37 @@ func resourceAwsNeptuneClusterParameterGroupDelete(d *schema.ResourceData, meta
240231
DBClusterParameterGroupName: aws.String(d.Id()),
241232
}
242233

243-
log.Printf("[DEBUG] Deleting Neptune Cluster Parameter Group: %s", d.Id())
244234
_, err := conn.DeleteDBClusterParameterGroup(&input)
245235
if err != nil {
246-
if isAWSErr(err, neptune.ErrCodeDBParameterGroupNotFoundFault, "") {
236+
if tfawserr.ErrCodeEquals(err, neptune.ErrCodeDBParameterGroupNotFoundFault) {
247237
return nil
248238
}
249-
return fmt.Errorf("error deleting Neptune Cluster Parameter Group (%s): %s", d.Id(), err)
239+
return fmt.Errorf("error deleting Neptune Cluster Parameter Group (%s): %w", d.Id(), err)
240+
}
241+
242+
return nil
243+
}
244+
245+
func modifyNeptuneClusterParameterGroupParameters(conn *neptune.Neptune, name string, parameters []*neptune.Parameter) error {
246+
// We can only modify 20 parameters at a time, so walk them until
247+
// we've got them all.
248+
for parameters != nil {
249+
var paramsToModify []*neptune.Parameter
250+
if len(parameters) <= neptuneClusterParameterGroupMaxParamsBulkEdit {
251+
paramsToModify, parameters = parameters[:], nil
252+
} else {
253+
paramsToModify, parameters = parameters[:neptuneClusterParameterGroupMaxParamsBulkEdit], parameters[neptuneClusterParameterGroupMaxParamsBulkEdit:]
254+
}
255+
256+
modifyOpts := neptune.ModifyDBClusterParameterGroupInput{
257+
DBClusterParameterGroupName: aws.String(name),
258+
Parameters: paramsToModify,
259+
}
260+
261+
_, err := conn.ModifyDBClusterParameterGroup(&modifyOpts)
262+
if err != nil {
263+
return err
264+
}
250265
}
251266

252267
return nil

aws/resource_aws_neptune_cluster_parameter_group_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,52 @@ func TestAccAWSNeptuneClusterParameterGroup_Description(t *testing.T) {
128128
})
129129
}
130130

131+
// Reference: https://github.com/hashicorp/terraform-provider-aws/issues/17870
132+
func TestAccAWSNeptuneClusterParameterGroup_NamePrefix_Parameter(t *testing.T) {
133+
var v neptune.DBClusterParameterGroup
134+
135+
resourceName := "aws_neptune_cluster_parameter_group.test"
136+
prefix := "tf-acc-test"
137+
138+
resource.ParallelTest(t, resource.TestCase{
139+
PreCheck: func() { testAccPreCheck(t) },
140+
Providers: testAccProviders,
141+
CheckDestroy: testAccCheckAWSNeptuneClusterParameterGroupDestroy,
142+
Steps: []resource.TestStep{
143+
{
144+
Config: testAccAWSNeptuneClusterParameterGroupConfig_NamePrefix_Parameter(prefix, "neptune_enable_audit_log", "1"),
145+
Check: resource.ComposeTestCheckFunc(
146+
testAccCheckAWSNeptuneClusterParameterGroupExists(resourceName, &v),
147+
resource.TestCheckResourceAttr(resourceName, "parameter.#", "1"),
148+
resource.TestCheckTypeSetElemNestedAttrs(resourceName, "parameter.*", map[string]string{
149+
"apply_method": "pending-reboot",
150+
"name": "neptune_enable_audit_log",
151+
"value": "1",
152+
}),
153+
),
154+
},
155+
{
156+
ResourceName: resourceName,
157+
ImportState: true,
158+
ImportStateVerify: true,
159+
ImportStateVerifyIgnore: []string{"name_prefix"},
160+
},
161+
{
162+
Config: testAccAWSNeptuneClusterParameterGroupConfig_NamePrefix_Parameter(prefix, "neptune_enable_audit_log", "0"),
163+
Check: resource.ComposeTestCheckFunc(
164+
testAccCheckAWSNeptuneClusterParameterGroupExists(resourceName, &v),
165+
resource.TestCheckResourceAttr(resourceName, "parameter.#", "1"),
166+
resource.TestCheckTypeSetElemNestedAttrs(resourceName, "parameter.*", map[string]string{
167+
"apply_method": "pending-reboot",
168+
"name": "neptune_enable_audit_log",
169+
"value": "0",
170+
}),
171+
),
172+
},
173+
},
174+
})
175+
}
176+
131177
func TestAccAWSNeptuneClusterParameterGroup_Parameter(t *testing.T) {
132178
var v neptune.DBClusterParameterGroup
133179

@@ -326,6 +372,20 @@ resource "aws_neptune_cluster_parameter_group" "test" {
326372
`, name, pName, pValue)
327373
}
328374

375+
func testAccAWSNeptuneClusterParameterGroupConfig_NamePrefix_Parameter(namePrefix, pName, pValue string) string {
376+
return fmt.Sprintf(`
377+
resource "aws_neptune_cluster_parameter_group" "test" {
378+
family = "neptune1"
379+
name_prefix = %q
380+
381+
parameter {
382+
name = %q
383+
value = %q
384+
}
385+
}
386+
`, namePrefix, pName, pValue)
387+
}
388+
329389
func testAccAWSNeptuneClusterParameterGroupConfig_Tags(name, tKey, tValue string) string {
330390
return fmt.Sprintf(`
331391
resource "aws_neptune_cluster_parameter_group" "test" {

0 commit comments

Comments
 (0)