Fixed incorrect ForcesNew settings for parameters and added better acceptance tests to ensure updates are working as expected
This commit is contained in:
parent
3b54001a1b
commit
0e3afa6d3d
|
@ -37,7 +37,7 @@ func resourceAwsDbParameterGroup() *schema.Resource {
|
||||||
"parameter": &schema.Schema{
|
"parameter": &schema.Schema{
|
||||||
Type: schema.TypeSet,
|
Type: schema.TypeSet,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: false,
|
||||||
Elem: &schema.Resource{
|
Elem: &schema.Resource{
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"apply_method": &schema.Schema{
|
"apply_method": &schema.Schema{
|
||||||
|
@ -85,6 +85,12 @@ func resourceAwsDbParameterGroupCreate(d *schema.ResourceData, meta interface{})
|
||||||
return fmt.Errorf("Error creating DB Parameter Group: %s", err)
|
return fmt.Errorf("Error creating DB Parameter Group: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
d.Partial(true)
|
||||||
|
d.SetPartial("name")
|
||||||
|
d.SetPartial("family")
|
||||||
|
d.SetPartial("description")
|
||||||
|
d.Partial(false)
|
||||||
|
|
||||||
d.SetId(createOpts.DBParameterGroupName)
|
d.SetId(createOpts.DBParameterGroupName)
|
||||||
log.Printf("[INFO] DB Parameter Group ID: %s", d.Id())
|
log.Printf("[INFO] DB Parameter Group ID: %s", d.Id())
|
||||||
|
|
||||||
|
@ -95,6 +101,8 @@ func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{})
|
||||||
p := meta.(*ResourceProvider)
|
p := meta.(*ResourceProvider)
|
||||||
rdsconn := p.rdsconn
|
rdsconn := p.rdsconn
|
||||||
|
|
||||||
|
d.Partial(true)
|
||||||
|
|
||||||
if d.HasChange("parameter") {
|
if d.HasChange("parameter") {
|
||||||
o, n := d.GetChange("parameter")
|
o, n := d.GetChange("parameter")
|
||||||
if o == nil {
|
if o == nil {
|
||||||
|
@ -125,9 +133,12 @@ func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{})
|
||||||
return fmt.Errorf("Error modifying DB Parameter Group: %s", err)
|
return fmt.Errorf("Error modifying DB Parameter Group: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
d.SetPartial("parameter")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
d.Partial(false)
|
||||||
|
|
||||||
|
return resourceAwsDbParameterGroupRead(d, meta)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) error {
|
func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
@ -175,6 +186,9 @@ func resourceAwsDbParameterGroupRead(d *schema.ResourceData, meta interface{}) e
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// apply_method is only relevant for creates and AWS does not maintain its state.
|
||||||
|
|
||||||
|
|
||||||
d.Set("parameter", flattenParameters(describeParametersResp.Parameters))
|
d.Set("parameter", flattenParameters(describeParametersResp.Parameters))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -19,6 +19,31 @@ func TestAccAWSDBParameterGroup(t *testing.T) {
|
||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
resource.TestStep{
|
resource.TestStep{
|
||||||
Config: testAccAWSDBParameterGroupConfig,
|
Config: testAccAWSDBParameterGroupConfig,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
|
||||||
|
testAccCheckAWSDBParameterGroupAttributes(&v),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "name", "parameter-group-test-terraform"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "family", "mysql5.6"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "description", "Test parameter group for terraform"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "parameter.0.name", "character_set_results"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "parameter.0.value", "utf8"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "parameter.1.name", "character_set_server"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "parameter.1.value", "utf8"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "parameter.2.name", "character_set_client"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_db_parameter_group.bar", "parameter.2.value", "utf8"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccAWSDBParameterGroupAddParametersConfig,
|
||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
|
testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
|
||||||
testAccCheckAWSDBParameterGroupAttributes(&v),
|
testAccCheckAWSDBParameterGroupAttributes(&v),
|
||||||
|
@ -32,32 +57,22 @@ func TestAccAWSDBParameterGroup(t *testing.T) {
|
||||||
"aws_db_parameter_group.bar", "parameter.0.name", "collation_connection"),
|
"aws_db_parameter_group.bar", "parameter.0.name", "collation_connection"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.0.value", "utf8_unicode_ci"),
|
"aws_db_parameter_group.bar", "parameter.0.value", "utf8_unicode_ci"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"aws_db_parameter_group.bar", "parameter.0.apply_method", "immediate"),
|
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.1.name", "character_set_results"),
|
"aws_db_parameter_group.bar", "parameter.1.name", "character_set_results"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.1.value", "utf8"),
|
"aws_db_parameter_group.bar", "parameter.1.value", "utf8"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"aws_db_parameter_group.bar", "parameter.1.apply_method", "immediate"),
|
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.2.name", "character_set_server"),
|
"aws_db_parameter_group.bar", "parameter.2.name", "character_set_server"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.2.value", "utf8"),
|
"aws_db_parameter_group.bar", "parameter.2.value", "utf8"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"aws_db_parameter_group.bar", "parameter.2.apply_method", "immediate"),
|
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.3.name", "collation_server"),
|
"aws_db_parameter_group.bar", "parameter.3.name", "collation_server"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.3.value", "utf8_unicode_ci"),
|
"aws_db_parameter_group.bar", "parameter.3.value", "utf8_unicode_ci"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"aws_db_parameter_group.bar", "parameter.3.apply_method", "immediate"),
|
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.4.name", "character_set_client"),
|
"aws_db_parameter_group.bar", "parameter.4.name", "character_set_client"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.4.value", "utf8"),
|
"aws_db_parameter_group.bar", "parameter.4.value", "utf8"),
|
||||||
resource.TestCheckResourceAttr(
|
|
||||||
"aws_db_parameter_group.bar", "parameter.4.apply_method", "immediate"),
|
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -65,14 +80,14 @@ func TestAccAWSDBParameterGroup(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAccAWSDBParameterGroupOnly(t *testing.T) {
|
func TestAccAWSDBParameterGroupOnly(t *testing.T) {
|
||||||
var v rds.DBParameterGroup
|
var v rds.DBParameterGroup
|
||||||
|
|
||||||
resource.Test(t, resource.TestCase{
|
resource.Test(t, resource.TestCase{
|
||||||
PreCheck: func() { testAccPreCheck(t) },
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
Providers: testAccProviders,
|
Providers: testAccProviders,
|
||||||
CheckDestroy: testAccCheckAWSDBParameterGroupDestroy,
|
CheckDestroy: testAccCheckAWSDBParameterGroupDestroy,
|
||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
resource.TestStep{
|
resource.TestStep{
|
||||||
Config: testAccAWSDBParameterGroupOnlyConfig,
|
Config: testAccAWSDBParameterGroupOnlyConfig,
|
||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeTestCheckFunc(
|
||||||
testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
|
testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
|
||||||
|
@ -177,6 +192,29 @@ func testAccCheckAWSDBParameterGroupExists(n string, v *rds.DBParameterGroup) re
|
||||||
}
|
}
|
||||||
|
|
||||||
const testAccAWSDBParameterGroupConfig = `
|
const testAccAWSDBParameterGroupConfig = `
|
||||||
|
resource "aws_db_parameter_group" "bar" {
|
||||||
|
name = "parameter-group-test-terraform"
|
||||||
|
family = "mysql5.6"
|
||||||
|
description = "Test parameter group for terraform"
|
||||||
|
parameter {
|
||||||
|
name = "character_set_server"
|
||||||
|
value = "utf8"
|
||||||
|
apply_method = "immediate"
|
||||||
|
}
|
||||||
|
parameter {
|
||||||
|
name = "character_set_client"
|
||||||
|
value = "utf8"
|
||||||
|
apply_method = "immediate"
|
||||||
|
}
|
||||||
|
parameter{
|
||||||
|
name = "character_set_results"
|
||||||
|
value = "utf8"
|
||||||
|
apply_method = "immediate"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
const testAccAWSDBParameterGroupAddParametersConfig = `
|
||||||
resource "aws_db_parameter_group" "bar" {
|
resource "aws_db_parameter_group" "bar" {
|
||||||
name = "parameter-group-test-terraform"
|
name = "parameter-group-test-terraform"
|
||||||
family = "mysql5.6"
|
family = "mysql5.6"
|
||||||
|
|
|
@ -190,8 +190,11 @@ func flattenParameters(list []rds.Parameter) []map[string]interface{} {
|
||||||
result := make([]map[string]interface{}, 0, len(list))
|
result := make([]map[string]interface{}, 0, len(list))
|
||||||
for _, i := range list {
|
for _, i := range list {
|
||||||
result = append(result, map[string]interface{}{
|
result = append(result, map[string]interface{}{
|
||||||
"name": strings.ToLower(i.ParameterName),
|
"name": strings.ToLower(i.ParameterName),
|
||||||
"value": strings.ToLower(i.ParameterValue),
|
"value": strings.ToLower(i.ParameterValue),
|
||||||
|
// apply_method is only used on create/modify and is not returned when reading from AWS.
|
||||||
|
// This is a dummy value to print out as it's not used when doing the state diff for updating
|
||||||
|
"apply_method": "applied",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|
|
@ -297,8 +297,9 @@ func Test_flattenParameters(t *testing.T) {
|
||||||
},
|
},
|
||||||
Output: []map[string]interface{}{
|
Output: []map[string]interface{}{
|
||||||
map[string]interface{}{
|
map[string]interface{}{
|
||||||
"name": "character_set_client",
|
"name": "character_set_client",
|
||||||
"value": "utf8",
|
"value": "utf8",
|
||||||
|
"apply_method": "applied",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue