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  }