github.com/lamielle/terraform@v0.3.2-0.20141121070651-81f008ba53d5/builtin/providers/aws/resource_aws_db_parameter_group.go (about) 1 package aws 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 "time" 8 9 "github.com/hashicorp/terraform/helper/hashcode" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/helper/schema" 12 "github.com/mitchellh/goamz/rds" 13 ) 14 15 func resourceAwsDbParameterGroup() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsDbParameterGroupCreate, 18 Read: resourceAwsDbParameterGroupRead, 19 Update: resourceAwsDbParameterGroupUpdate, 20 Delete: resourceAwsDbParameterGroupDelete, 21 Schema: map[string]*schema.Schema{ 22 "name": &schema.Schema{ 23 Type: schema.TypeString, 24 ForceNew: true, 25 Required: true, 26 }, 27 "family": &schema.Schema{ 28 Type: schema.TypeString, 29 Required: true, 30 ForceNew: true, 31 }, 32 "description": &schema.Schema{ 33 Type: schema.TypeString, 34 Required: true, 35 ForceNew: true, 36 }, 37 "parameter": &schema.Schema{ 38 Type: schema.TypeSet, 39 Optional: true, 40 ForceNew: false, 41 Elem: &schema.Resource{ 42 Schema: map[string]*schema.Schema{ 43 "name": &schema.Schema{ 44 Type: schema.TypeString, 45 Required: true, 46 }, 47 "value": &schema.Schema{ 48 Type: schema.TypeString, 49 Required: true, 50 }, 51 }, 52 }, 53 Set: resourceAwsDbParameterHash, 54 }, 55 }, 56 } 57 } 58 59 func resourceAwsDbParameterHash(v interface{}) int { 60 var buf bytes.Buffer 61 m := v.(map[string]interface{}) 62 buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) 63 buf.WriteString(fmt.Sprintf("%s-", m["value"].(string))) 64 65 return hashcode.String(buf.String()) 66 } 67 68 func resourceAwsDbParameterGroupCreate(d *schema.ResourceData, meta interface{}) error { 69 p := meta.(*ResourceProvider) 70 rdsconn := p.rdsconn 71 72 createOpts := rds.CreateDBParameterGroup{ 73 DBParameterGroupName: d.Get("name").(string), 74 DBParameterGroupFamily: d.Get("family").(string), 75 Description: d.Get("description").(string), 76 } 77 78 log.Printf("[DEBUG] Create DB Parameter Group: %#v", createOpts) 79 _, err := rdsconn.CreateDBParameterGroup(&createOpts) 80 if err != nil { 81 return fmt.Errorf("Error creating DB Parameter Group: %s", err) 82 } 83 84 d.Partial(true) 85 d.SetPartial("name") 86 d.SetPartial("family") 87 d.SetPartial("description") 88 d.Partial(false) 89 90 d.SetId(createOpts.DBParameterGroupName) 91 log.Printf("[INFO] DB Parameter Group ID: %s", d.Id()) 92 93 return resourceAwsDbParameterGroupUpdate(d, meta) 94 } 95 96 func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{}) error { 97 p := meta.(*ResourceProvider) 98 rdsconn := p.rdsconn 99 100 d.Partial(true) 101 102 if d.HasChange("parameter") { 103 o, n := d.GetChange("parameter") 104 if o == nil { 105 o = new(schema.Set) 106 } 107 if n == nil { 108 n = new(schema.Set) 109 } 110 111 os := o.(*schema.Set) 112 ns := n.(*schema.Set) 113 114 // Expand the "parameter" set to goamz compat []rds.Parameter 115 parameters, err := expandParameters(ns.Difference(os).List()) 116 if err != nil { 117 return err 118 } 119 120 if len(parameters) > 0 { 121 modifyOpts := rds.ModifyDBParameterGroup{ 122 DBParameterGroupName: d.Get("name").(string), 123 Parameters: parameters, 124 } 125 126 log.Printf("[DEBUG] Modify DB Parameter Group: %#v", modifyOpts) 127 _, err = rdsconn.ModifyDBParameterGroup(&modifyOpts) 128 if err != nil { 129 return fmt.Errorf("Error modifying DB Parameter Group: %s", err) 130 } 131 } 132 d.SetPartial("parameter") 133 } 134 135 d.Partial(false) 136 137 return resourceAwsDbParameterGroupRead(d, meta) 138 } 139 140 func resourceAwsDbParameterGroupDelete(d *schema.ResourceData, meta interface{}) error { 141 stateConf := &resource.StateChangeConf{ 142 Pending: []string{"pending"}, 143 Target: "destroyed", 144 Refresh: resourceDbParameterGroupDeleteRefreshFunc(d, meta), 145 Timeout: 3 * time.Minute, 146 MinTimeout: 1 * time.Second, 147 } 148 _, err := stateConf.WaitForState() 149 return err 150 } 151 152 func resourceAwsDbParameterGroupRead(d *schema.ResourceData, meta interface{}) error { 153 p := meta.(*ResourceProvider) 154 rdsconn := p.rdsconn 155 156 describeOpts := rds.DescribeDBParameterGroups{ 157 DBParameterGroupName: d.Id(), 158 } 159 160 describeResp, err := rdsconn.DescribeDBParameterGroups(&describeOpts) 161 if err != nil { 162 return err 163 } 164 165 if len(describeResp.DBParameterGroups) != 1 || 166 describeResp.DBParameterGroups[0].DBParameterGroupName != d.Id() { 167 return fmt.Errorf("Unable to find Parameter Group: %#v", describeResp.DBParameterGroups) 168 } 169 170 d.Set("name", describeResp.DBParameterGroups[0].DBParameterGroupName) 171 d.Set("family", describeResp.DBParameterGroups[0].DBParameterGroupFamily) 172 d.Set("description", describeResp.DBParameterGroups[0].Description) 173 174 // Only include user customized parameters as there's hundreds of system/default ones 175 describeParametersOpts := rds.DescribeDBParameters{ 176 DBParameterGroupName: d.Id(), 177 Source: "user", 178 } 179 180 describeParametersResp, err := rdsconn.DescribeDBParameters(&describeParametersOpts) 181 if err != nil { 182 return err 183 } 184 185 d.Set("parameter", flattenParameters(describeParametersResp.Parameters)) 186 187 return nil 188 } 189 190 func resourceDbParameterGroupDeleteRefreshFunc( 191 d *schema.ResourceData, 192 meta interface{}) resource.StateRefreshFunc { 193 p := meta.(*ResourceProvider) 194 rdsconn := p.rdsconn 195 196 return func() (interface{}, string, error) { 197 198 deleteOpts := rds.DeleteDBParameterGroup{ 199 DBParameterGroupName: d.Id(), 200 } 201 202 if _, err := rdsconn.DeleteDBParameterGroup(&deleteOpts); err != nil { 203 rdserr, ok := err.(*rds.Error) 204 if !ok { 205 return d, "error", err 206 } 207 208 if rdserr.Code != "DBParameterGroupNotFoundFault" { 209 return d, "error", err 210 } 211 } 212 213 return d, "destroyed", nil 214 } 215 }