Added missing update support for new aws_db_parameter_group resource
This commit is contained in:
parent
de16b10555
commit
3b54001a1b
|
@ -1,10 +1,12 @@
|
||||||
package aws
|
package aws
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/hashicorp/terraform/helper/hashcode"
|
||||||
"github.com/hashicorp/terraform/helper/resource"
|
"github.com/hashicorp/terraform/helper/resource"
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
"github.com/mitchellh/goamz/rds"
|
"github.com/mitchellh/goamz/rds"
|
||||||
|
@ -14,7 +16,7 @@ func resourceAwsDbParameterGroup() *schema.Resource {
|
||||||
return &schema.Resource{
|
return &schema.Resource{
|
||||||
Create: resourceAwsDbParameterGroupCreate,
|
Create: resourceAwsDbParameterGroupCreate,
|
||||||
Read: resourceAwsDbParameterGroupRead,
|
Read: resourceAwsDbParameterGroupRead,
|
||||||
Update: nil,
|
Update: resourceAwsDbParameterGroupUpdate,
|
||||||
Delete: resourceAwsDbParameterGroupDelete,
|
Delete: resourceAwsDbParameterGroupDelete,
|
||||||
Schema: map[string]*schema.Schema{
|
Schema: map[string]*schema.Schema{
|
||||||
"name": &schema.Schema{
|
"name": &schema.Schema{
|
||||||
|
@ -33,7 +35,7 @@ func resourceAwsDbParameterGroup() *schema.Resource {
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
},
|
},
|
||||||
"parameter": &schema.Schema{
|
"parameter": &schema.Schema{
|
||||||
Type: schema.TypeList,
|
Type: schema.TypeSet,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Elem: &schema.Resource{
|
Elem: &schema.Resource{
|
||||||
|
@ -52,11 +54,21 @@ func resourceAwsDbParameterGroup() *schema.Resource {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Set: resourceAwsDbParameterHash,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func resourceAwsDbParameterHash(v interface{}) int {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
m := v.(map[string]interface{})
|
||||||
|
buf.WriteString(fmt.Sprintf("%s-", m["name"].(string)))
|
||||||
|
buf.WriteString(fmt.Sprintf("%s-", m["value"].(string)))
|
||||||
|
|
||||||
|
return hashcode.String(buf.String())
|
||||||
|
}
|
||||||
|
|
||||||
func resourceAwsDbParameterGroupCreate(d *schema.ResourceData, meta interface{}) error {
|
func resourceAwsDbParameterGroupCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
p := meta.(*ResourceProvider)
|
p := meta.(*ResourceProvider)
|
||||||
rdsconn := p.rdsconn
|
rdsconn := p.rdsconn
|
||||||
|
@ -76,26 +88,46 @@ func resourceAwsDbParameterGroupCreate(d *schema.ResourceData, meta interface{})
|
||||||
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())
|
||||||
|
|
||||||
if d.Get("parameter") != "" {
|
return resourceAwsDbParameterGroupUpdate(d, meta)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
p := meta.(*ResourceProvider)
|
||||||
|
rdsconn := p.rdsconn
|
||||||
|
|
||||||
|
if d.HasChange("parameter") {
|
||||||
|
o, n := d.GetChange("parameter")
|
||||||
|
if o == nil {
|
||||||
|
o = new(schema.Set)
|
||||||
|
}
|
||||||
|
if n == nil {
|
||||||
|
n = new(schema.Set)
|
||||||
|
}
|
||||||
|
|
||||||
|
os := o.(*schema.Set)
|
||||||
|
ns := n.(*schema.Set)
|
||||||
|
|
||||||
// Expand the "parameter" set to goamz compat []rds.Parameter
|
// Expand the "parameter" set to goamz compat []rds.Parameter
|
||||||
parameters, err := expandParameters(d.Get("parameter").([]interface{}))
|
parameters, err := expandParameters(ns.Difference(os).List())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
modifyOpts := rds.ModifyDBParameterGroup{
|
if len(parameters) > 0 {
|
||||||
DBParameterGroupName: d.Get("name").(string),
|
modifyOpts := rds.ModifyDBParameterGroup{
|
||||||
Parameters: parameters,
|
DBParameterGroupName: d.Get("name").(string),
|
||||||
}
|
Parameters: parameters,
|
||||||
|
}
|
||||||
|
|
||||||
log.Printf("[DEBUG] Modify DB Parameter Group: %#v", modifyOpts)
|
log.Printf("[DEBUG] Modify DB Parameter Group: %#v", modifyOpts)
|
||||||
_, err = rdsconn.ModifyDBParameterGroup(&modifyOpts)
|
_, err = rdsconn.ModifyDBParameterGroup(&modifyOpts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Error modifying DB Parameter Group: %s", err)
|
return fmt.Errorf("Error modifying DB Parameter Group: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resourceAwsDbParameterGroupRead(d, meta)
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) error {
|
func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
|
|
@ -29,9 +29,9 @@ func TestAccAWSDBParameterGroup(t *testing.T) {
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "description", "Test parameter group for terraform"),
|
"aws_db_parameter_group.bar", "description", "Test parameter group for terraform"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.0.name", "character_set_client"),
|
"aws_db_parameter_group.bar", "parameter.0.name", "collation_connection"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.0.value", "utf8"),
|
"aws_db_parameter_group.bar", "parameter.0.value", "utf8_unicode_ci"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.0.apply_method", "immediate"),
|
"aws_db_parameter_group.bar", "parameter.0.apply_method", "immediate"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
|
@ -47,15 +47,15 @@ func TestAccAWSDBParameterGroup(t *testing.T) {
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.2.apply_method", "immediate"),
|
"aws_db_parameter_group.bar", "parameter.2.apply_method", "immediate"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.3.name", "collation_connection"),
|
"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(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.3.apply_method", "immediate"),
|
"aws_db_parameter_group.bar", "parameter.3.apply_method", "immediate"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.4.name", "collation_server"),
|
"aws_db_parameter_group.bar", "parameter.4.name", "character_set_client"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.4.value", "utf8_unicode_ci"),
|
"aws_db_parameter_group.bar", "parameter.4.value", "utf8"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
"aws_db_parameter_group.bar", "parameter.4.apply_method", "immediate"),
|
"aws_db_parameter_group.bar", "parameter.4.apply_method", "immediate"),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package aws
|
package aws
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sort"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/hashicorp/terraform/helper/schema"
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
|
@ -186,9 +185,8 @@ func flattenListeners(list []elb.Listener) []map[string]interface{} {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
// Flattens and sorts by name an array of Parameters into a []map[string]interface{}
|
// Flattens an array of Parameters into a []map[string]interface{}
|
||||||
func flattenParameters(list []rds.Parameter) []map[string]interface{} {
|
func flattenParameters(list []rds.Parameter) []map[string]interface{} {
|
||||||
sort.Sort(ByParameterName(list))
|
|
||||||
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{}{
|
||||||
|
@ -208,8 +206,3 @@ func expandStringList(configured []interface{}) []string {
|
||||||
}
|
}
|
||||||
return vs
|
return vs
|
||||||
}
|
}
|
||||||
|
|
||||||
type ByParameterName []rds.Parameter
|
|
||||||
func (a ByParameterName) Len() int { return len(a) }
|
|
||||||
func (a ByParameterName) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
||||||
func (a ByParameterName) Less(i, j int) bool { return a[i].ParameterName < a[j].ParameterName }
|
|
||||||
|
|
|
@ -294,16 +294,8 @@ func Test_flattenParameters(t *testing.T) {
|
||||||
ParameterName: "character_set_client",
|
ParameterName: "character_set_client",
|
||||||
ParameterValue: "utf8",
|
ParameterValue: "utf8",
|
||||||
},
|
},
|
||||||
rds.Parameter{
|
|
||||||
ParameterName: "character_set_aaaclient",
|
|
||||||
ParameterValue: "utf8",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
Output: []map[string]interface{}{
|
Output: []map[string]interface{}{
|
||||||
map[string]interface{}{
|
|
||||||
"name": "character_set_aaaclient",
|
|
||||||
"value": "utf8",
|
|
||||||
},
|
|
||||||
map[string]interface{}{
|
map[string]interface{}{
|
||||||
"name": "character_set_client",
|
"name": "character_set_client",
|
||||||
"value": "utf8",
|
"value": "utf8",
|
||||||
|
|
Loading…
Reference in New Issue