github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_db_parameter_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  	"github.com/aws/aws-sdk-go/aws/awserr"
    11  	"github.com/aws/aws-sdk-go/service/rds"
    12  	"github.com/hashicorp/terraform/helper/acctest"
    13  	"github.com/hashicorp/terraform/helper/resource"
    14  	"github.com/hashicorp/terraform/terraform"
    15  )
    16  
    17  func TestAccAWSDBParameterGroup_basic(t *testing.T) {
    18  	var v rds.DBParameterGroup
    19  
    20  	groupName := fmt.Sprintf("parameter-group-test-terraform-%d", acctest.RandInt())
    21  
    22  	resource.Test(t, resource.TestCase{
    23  		PreCheck:     func() { testAccPreCheck(t) },
    24  		Providers:    testAccProviders,
    25  		CheckDestroy: testAccCheckAWSDBParameterGroupDestroy,
    26  		Steps: []resource.TestStep{
    27  			resource.TestStep{
    28  				Config: testAccAWSDBParameterGroupConfig(groupName),
    29  				Check: resource.ComposeTestCheckFunc(
    30  					testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
    31  					testAccCheckAWSDBParameterGroupAttributes(&v, groupName),
    32  					resource.TestCheckResourceAttr(
    33  						"aws_db_parameter_group.bar", "name", groupName),
    34  					resource.TestCheckResourceAttr(
    35  						"aws_db_parameter_group.bar", "family", "mysql5.6"),
    36  					resource.TestCheckResourceAttr(
    37  						"aws_db_parameter_group.bar", "description", "Test parameter group for terraform"),
    38  					resource.TestCheckResourceAttr(
    39  						"aws_db_parameter_group.bar", "parameter.1708034931.name", "character_set_results"),
    40  					resource.TestCheckResourceAttr(
    41  						"aws_db_parameter_group.bar", "parameter.1708034931.value", "utf8"),
    42  					resource.TestCheckResourceAttr(
    43  						"aws_db_parameter_group.bar", "parameter.2421266705.name", "character_set_server"),
    44  					resource.TestCheckResourceAttr(
    45  						"aws_db_parameter_group.bar", "parameter.2421266705.value", "utf8"),
    46  					resource.TestCheckResourceAttr(
    47  						"aws_db_parameter_group.bar", "parameter.2478663599.name", "character_set_client"),
    48  					resource.TestCheckResourceAttr(
    49  						"aws_db_parameter_group.bar", "parameter.2478663599.value", "utf8"),
    50  					resource.TestCheckResourceAttr(
    51  						"aws_db_parameter_group.bar", "tags.#", "1"),
    52  				),
    53  			},
    54  			resource.TestStep{
    55  				Config: testAccAWSDBParameterGroupAddParametersConfig(groupName),
    56  				Check: resource.ComposeTestCheckFunc(
    57  					testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
    58  					testAccCheckAWSDBParameterGroupAttributes(&v, groupName),
    59  					resource.TestCheckResourceAttr(
    60  						"aws_db_parameter_group.bar", "name", groupName),
    61  					resource.TestCheckResourceAttr(
    62  						"aws_db_parameter_group.bar", "family", "mysql5.6"),
    63  					resource.TestCheckResourceAttr(
    64  						"aws_db_parameter_group.bar", "description", "Test parameter group for terraform"),
    65  					resource.TestCheckResourceAttr(
    66  						"aws_db_parameter_group.bar", "parameter.1706463059.name", "collation_connection"),
    67  					resource.TestCheckResourceAttr(
    68  						"aws_db_parameter_group.bar", "parameter.1706463059.value", "utf8_unicode_ci"),
    69  					resource.TestCheckResourceAttr(
    70  						"aws_db_parameter_group.bar", "parameter.1708034931.name", "character_set_results"),
    71  					resource.TestCheckResourceAttr(
    72  						"aws_db_parameter_group.bar", "parameter.1708034931.value", "utf8"),
    73  					resource.TestCheckResourceAttr(
    74  						"aws_db_parameter_group.bar", "parameter.2421266705.name", "character_set_server"),
    75  					resource.TestCheckResourceAttr(
    76  						"aws_db_parameter_group.bar", "parameter.2421266705.value", "utf8"),
    77  					resource.TestCheckResourceAttr(
    78  						"aws_db_parameter_group.bar", "parameter.2475805061.name", "collation_server"),
    79  					resource.TestCheckResourceAttr(
    80  						"aws_db_parameter_group.bar", "parameter.2475805061.value", "utf8_unicode_ci"),
    81  					resource.TestCheckResourceAttr(
    82  						"aws_db_parameter_group.bar", "parameter.2478663599.name", "character_set_client"),
    83  					resource.TestCheckResourceAttr(
    84  						"aws_db_parameter_group.bar", "parameter.2478663599.value", "utf8"),
    85  					resource.TestCheckResourceAttr(
    86  						"aws_db_parameter_group.bar", "tags.#", "2"),
    87  				),
    88  			},
    89  		},
    90  	})
    91  }
    92  
    93  func TestAccAWSDBParameterGroup_Only(t *testing.T) {
    94  	var v rds.DBParameterGroup
    95  
    96  	groupName := fmt.Sprintf("parameter-group-test-terraform-%d", acctest.RandInt())
    97  	resource.Test(t, resource.TestCase{
    98  		PreCheck:     func() { testAccPreCheck(t) },
    99  		Providers:    testAccProviders,
   100  		CheckDestroy: testAccCheckAWSDBParameterGroupDestroy,
   101  		Steps: []resource.TestStep{
   102  			resource.TestStep{
   103  				Config: testAccAWSDBParameterGroupOnlyConfig(groupName),
   104  				Check: resource.ComposeTestCheckFunc(
   105  					testAccCheckAWSDBParameterGroupExists("aws_db_parameter_group.bar", &v),
   106  					testAccCheckAWSDBParameterGroupAttributes(&v, groupName),
   107  					resource.TestCheckResourceAttr(
   108  						"aws_db_parameter_group.bar", "name", groupName),
   109  					resource.TestCheckResourceAttr(
   110  						"aws_db_parameter_group.bar", "family", "mysql5.6"),
   111  					resource.TestCheckResourceAttr(
   112  						"aws_db_parameter_group.bar", "description", "Test parameter group for terraform"),
   113  				),
   114  			},
   115  		},
   116  	})
   117  }
   118  
   119  func TestResourceAWSDBParameterGroupName_validation(t *testing.T) {
   120  	cases := []struct {
   121  		Value    string
   122  		ErrCount int
   123  	}{
   124  		{
   125  			Value:    "tEsting123",
   126  			ErrCount: 1,
   127  		},
   128  		{
   129  			Value:    "testing123!",
   130  			ErrCount: 1,
   131  		},
   132  		{
   133  			Value:    "1testing123",
   134  			ErrCount: 1,
   135  		},
   136  		{
   137  			Value:    "testing--123",
   138  			ErrCount: 1,
   139  		},
   140  		{
   141  			Value:    "testing123-",
   142  			ErrCount: 1,
   143  		},
   144  		{
   145  			Value:    randomString(256),
   146  			ErrCount: 1,
   147  		},
   148  	}
   149  
   150  	for _, tc := range cases {
   151  		_, errors := validateDbParamGroupName(tc.Value, "aws_db_parameter_group_name")
   152  
   153  		if len(errors) != tc.ErrCount {
   154  			t.Fatalf("Expected the DB Parameter Group Name to trigger a validation error")
   155  		}
   156  	}
   157  }
   158  
   159  func testAccCheckAWSDBParameterGroupDestroy(s *terraform.State) error {
   160  	conn := testAccProvider.Meta().(*AWSClient).rdsconn
   161  
   162  	for _, rs := range s.RootModule().Resources {
   163  		if rs.Type != "aws_db_parameter_group" {
   164  			continue
   165  		}
   166  
   167  		// Try to find the Group
   168  		resp, err := conn.DescribeDBParameterGroups(
   169  			&rds.DescribeDBParameterGroupsInput{
   170  				DBParameterGroupName: aws.String(rs.Primary.ID),
   171  			})
   172  
   173  		if err == nil {
   174  			if len(resp.DBParameterGroups) != 0 &&
   175  				*resp.DBParameterGroups[0].DBParameterGroupName == rs.Primary.ID {
   176  				return fmt.Errorf("DB Parameter Group still exists")
   177  			}
   178  		}
   179  
   180  		// Verify the error
   181  		newerr, ok := err.(awserr.Error)
   182  		if !ok {
   183  			return err
   184  		}
   185  		if newerr.Code() != "DBParameterGroupNotFound" {
   186  			return err
   187  		}
   188  	}
   189  
   190  	return nil
   191  }
   192  
   193  func testAccCheckAWSDBParameterGroupAttributes(v *rds.DBParameterGroup, name string) resource.TestCheckFunc {
   194  	return func(s *terraform.State) error {
   195  
   196  		if *v.DBParameterGroupName != name {
   197  			return fmt.Errorf("Bad Parameter Group name, expected (%s), got (%s)", name, *v.DBParameterGroupName)
   198  		}
   199  
   200  		if *v.DBParameterGroupFamily != "mysql5.6" {
   201  			return fmt.Errorf("bad family: %#v", v.DBParameterGroupFamily)
   202  		}
   203  
   204  		if *v.Description != "Test parameter group for terraform" {
   205  			return fmt.Errorf("bad description: %#v", v.Description)
   206  		}
   207  
   208  		return nil
   209  	}
   210  }
   211  
   212  func testAccCheckAWSDBParameterGroupExists(n string, v *rds.DBParameterGroup) resource.TestCheckFunc {
   213  	return func(s *terraform.State) error {
   214  		rs, ok := s.RootModule().Resources[n]
   215  		if !ok {
   216  			return fmt.Errorf("Not found: %s", n)
   217  		}
   218  
   219  		if rs.Primary.ID == "" {
   220  			return fmt.Errorf("No DB Parameter Group ID is set")
   221  		}
   222  
   223  		conn := testAccProvider.Meta().(*AWSClient).rdsconn
   224  
   225  		opts := rds.DescribeDBParameterGroupsInput{
   226  			DBParameterGroupName: aws.String(rs.Primary.ID),
   227  		}
   228  
   229  		resp, err := conn.DescribeDBParameterGroups(&opts)
   230  
   231  		if err != nil {
   232  			return err
   233  		}
   234  
   235  		if len(resp.DBParameterGroups) != 1 ||
   236  			*resp.DBParameterGroups[0].DBParameterGroupName != rs.Primary.ID {
   237  			return fmt.Errorf("DB Parameter Group not found")
   238  		}
   239  
   240  		*v = *resp.DBParameterGroups[0]
   241  
   242  		return nil
   243  	}
   244  }
   245  
   246  func randomString(strlen int) string {
   247  	rand.Seed(time.Now().UTC().UnixNano())
   248  	const chars = "abcdefghijklmnopqrstuvwxyz"
   249  	result := make([]byte, strlen)
   250  	for i := 0; i < strlen; i++ {
   251  		result[i] = chars[rand.Intn(len(chars))]
   252  	}
   253  	return string(result)
   254  }
   255  
   256  func testAccAWSDBParameterGroupConfig(n string) string {
   257  	return fmt.Sprintf(`
   258  resource "aws_db_parameter_group" "bar" {
   259  	name = "%s"
   260  	family = "mysql5.6"
   261  	description = "Test parameter group for terraform"
   262  	parameter {
   263  	  name = "character_set_server"
   264  	  value = "utf8"
   265  	}
   266  	parameter {
   267  	  name = "character_set_client"
   268  	  value = "utf8"
   269  	}
   270  	parameter{
   271  	  name = "character_set_results"
   272  	  value = "utf8"
   273  	}
   274  	tags {
   275  		foo = "bar"
   276  	}
   277  }`, n)
   278  }
   279  
   280  func testAccAWSDBParameterGroupAddParametersConfig(n string) string {
   281  	return fmt.Sprintf(`
   282  resource "aws_db_parameter_group" "bar" {
   283  	name = "%s"
   284  	family = "mysql5.6"
   285  	description = "Test parameter group for terraform"
   286  	parameter {
   287  	  name = "character_set_server"
   288  	  value = "utf8"
   289  	}
   290  	parameter {
   291  	  name = "character_set_client"
   292  	  value = "utf8"
   293  	}
   294  	parameter{
   295  	  name = "character_set_results"
   296  	  value = "utf8"
   297  	}
   298  	parameter {
   299  	  name = "collation_server"
   300  	  value = "utf8_unicode_ci"
   301  	}
   302  	parameter {
   303  	  name = "collation_connection"
   304  	  value = "utf8_unicode_ci"
   305  	}
   306  	tags {
   307  		foo = "bar"
   308  		baz = "foo"
   309  	}
   310  }`, n)
   311  }
   312  
   313  func testAccAWSDBParameterGroupOnlyConfig(n string) string {
   314  	return fmt.Sprintf(`
   315  resource "aws_db_parameter_group" "bar" {
   316  	name = "%s"
   317  	family = "mysql5.6"
   318  	description = "Test parameter group for terraform"
   319  }`, n)
   320  }