From 3b54001a1ba2db4633a0f0e42ccd7f8ef7e418b4 Mon Sep 17 00:00:00 2001 From: Rob Costanzo Date: Wed, 22 Oct 2014 17:03:57 -0700 Subject: [PATCH] Added missing update support for new aws_db_parameter_group resource --- .../aws/resource_aws_db_parameter_group.go | 58 ++++++++++++++----- .../resource_aws_db_parameter_group_test.go | 10 ++-- builtin/providers/aws/structure.go | 9 +-- builtin/providers/aws/structure_test.go | 8 --- 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/builtin/providers/aws/resource_aws_db_parameter_group.go b/builtin/providers/aws/resource_aws_db_parameter_group.go index bb2588c98..984e36ba9 100644 --- a/builtin/providers/aws/resource_aws_db_parameter_group.go +++ b/builtin/providers/aws/resource_aws_db_parameter_group.go @@ -1,10 +1,12 @@ package aws import ( + "bytes" "fmt" "log" "time" + "github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/mitchellh/goamz/rds" @@ -14,7 +16,7 @@ func resourceAwsDbParameterGroup() *schema.Resource { return &schema.Resource{ Create: resourceAwsDbParameterGroupCreate, Read: resourceAwsDbParameterGroupRead, - Update: nil, + Update: resourceAwsDbParameterGroupUpdate, Delete: resourceAwsDbParameterGroupDelete, Schema: map[string]*schema.Schema{ "name": &schema.Schema{ @@ -33,7 +35,7 @@ func resourceAwsDbParameterGroup() *schema.Resource { ForceNew: true, }, "parameter": &schema.Schema{ - Type: schema.TypeList, + Type: schema.TypeSet, Optional: true, ForceNew: true, 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 { p := meta.(*ResourceProvider) rdsconn := p.rdsconn @@ -76,26 +88,46 @@ func resourceAwsDbParameterGroupCreate(d *schema.ResourceData, meta interface{}) d.SetId(createOpts.DBParameterGroupName) 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 - parameters, err := expandParameters(d.Get("parameter").([]interface{})) + parameters, err := expandParameters(ns.Difference(os).List()) if err != nil { return err } - modifyOpts := rds.ModifyDBParameterGroup{ - DBParameterGroupName: d.Get("name").(string), - Parameters: parameters, - } + if len(parameters) > 0 { + modifyOpts := rds.ModifyDBParameterGroup{ + DBParameterGroupName: d.Get("name").(string), + Parameters: parameters, + } - log.Printf("[DEBUG] Modify DB Parameter Group: %#v", modifyOpts) - _, err = rdsconn.ModifyDBParameterGroup(&modifyOpts) - if err != nil { - return fmt.Errorf("Error modifying DB Parameter Group: %s", err) + log.Printf("[DEBUG] Modify DB Parameter Group: %#v", modifyOpts) + _, err = rdsconn.ModifyDBParameterGroup(&modifyOpts) + if err != nil { + return fmt.Errorf("Error modifying DB Parameter Group: %s", err) + } } } - return resourceAwsDbParameterGroupRead(d, meta) + return nil } func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) error { diff --git a/builtin/providers/aws/resource_aws_db_parameter_group_test.go b/builtin/providers/aws/resource_aws_db_parameter_group_test.go index a5f58fdd2..4a6b25e8e 100644 --- a/builtin/providers/aws/resource_aws_db_parameter_group_test.go +++ b/builtin/providers/aws/resource_aws_db_parameter_group_test.go @@ -29,9 +29,9 @@ func TestAccAWSDBParameterGroup(t *testing.T) { 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_client"), + "aws_db_parameter_group.bar", "parameter.0.name", "collation_connection"), resource.TestCheckResourceAttr( - "aws_db_parameter_group.bar", "parameter.0.value", "utf8"), + "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( @@ -47,15 +47,15 @@ func TestAccAWSDBParameterGroup(t *testing.T) { resource.TestCheckResourceAttr( "aws_db_parameter_group.bar", "parameter.2.apply_method", "immediate"), resource.TestCheckResourceAttr( - "aws_db_parameter_group.bar", "parameter.3.name", "collation_connection"), + "aws_db_parameter_group.bar", "parameter.3.name", "collation_server"), resource.TestCheckResourceAttr( "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( - "aws_db_parameter_group.bar", "parameter.4.name", "collation_server"), + "aws_db_parameter_group.bar", "parameter.4.name", "character_set_client"), resource.TestCheckResourceAttr( - "aws_db_parameter_group.bar", "parameter.4.value", "utf8_unicode_ci"), + "aws_db_parameter_group.bar", "parameter.4.value", "utf8"), resource.TestCheckResourceAttr( "aws_db_parameter_group.bar", "parameter.4.apply_method", "immediate"), ), diff --git a/builtin/providers/aws/structure.go b/builtin/providers/aws/structure.go index 49858992e..288e9d46c 100644 --- a/builtin/providers/aws/structure.go +++ b/builtin/providers/aws/structure.go @@ -1,7 +1,6 @@ package aws import ( - "sort" "strings" "github.com/hashicorp/terraform/helper/schema" @@ -186,9 +185,8 @@ func flattenListeners(list []elb.Listener) []map[string]interface{} { 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{} { - sort.Sort(ByParameterName(list)) result := make([]map[string]interface{}, 0, len(list)) for _, i := range list { result = append(result, map[string]interface{}{ @@ -208,8 +206,3 @@ func expandStringList(configured []interface{}) []string { } 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 } diff --git a/builtin/providers/aws/structure_test.go b/builtin/providers/aws/structure_test.go index 860e7f2f0..46d013ef3 100644 --- a/builtin/providers/aws/structure_test.go +++ b/builtin/providers/aws/structure_test.go @@ -294,16 +294,8 @@ func Test_flattenParameters(t *testing.T) { ParameterName: "character_set_client", ParameterValue: "utf8", }, - rds.Parameter{ - ParameterName: "character_set_aaaclient", - ParameterValue: "utf8", - }, }, Output: []map[string]interface{}{ - map[string]interface{}{ - "name": "character_set_aaaclient", - "value": "utf8", - }, map[string]interface{}{ "name": "character_set_client", "value": "utf8",