github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/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", "Managed by 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  				),
   112  			},
   113  		},
   114  	})
   115  }
   116  
   117  func TestResourceAWSDBParameterGroupName_validation(t *testing.T) {
   118  	cases := []struct {
   119  		Value    string
   120  		ErrCount int
   121  	}{
   122  		{
   123  			Value:    "tEsting123",
   124  			ErrCount: 1,
   125  		},
   126  		{
   127  			Value:    "testing123!",
   128  			ErrCount: 1,
   129  		},
   130  		{
   131  			Value:    "1testing123",
   132  			ErrCount: 1,
   133  		},
   134  		{
   135  			Value:    "testing--123",
   136  			ErrCount: 1,
   137  		},
   138  		{
   139  			Value:    "testing123-",
   140  			ErrCount: 1,
   141  		},
   142  		{
   143  			Value:    randomString(256),
   144  			ErrCount: 1,
   145  		},
   146  	}
   147  
   148  	for _, tc := range cases {
   149  		_, errors := validateDbParamGroupName(tc.Value, "aws_db_parameter_group_name")
   150  
   151  		if len(errors) != tc.ErrCount {
   152  			t.Fatalf("Expected the DB Parameter Group Name to trigger a validation error")
   153  		}
   154  	}
   155  }
   156  
   157  func testAccCheckAWSDBParameterGroupDestroy(s *terraform.State) error {
   158  	conn := testAccProvider.Meta().(*AWSClient).rdsconn
   159  
   160  	for _, rs := range s.RootModule().Resources {
   161  		if rs.Type != "aws_db_parameter_group" {
   162  			continue
   163  		}
   164  
   165  		// Try to find the Group
   166  		resp, err := conn.DescribeDBParameterGroups(
   167  			&rds.DescribeDBParameterGroupsInput{
   168  				DBParameterGroupName: aws.String(rs.Primary.ID),
   169  			})
   170  
   171  		if err == nil {
   172  			if len(resp.DBParameterGroups) != 0 &&
   173  				*resp.DBParameterGroups[0].DBParameterGroupName == rs.Primary.ID {
   174  				return fmt.Errorf("DB Parameter Group still exists")
   175  			}
   176  		}
   177  
   178  		// Verify the error
   179  		newerr, ok := err.(awserr.Error)
   180  		if !ok {
   181  			return err
   182  		}
   183  		if newerr.Code() != "DBParameterGroupNotFound" {
   184  			return err
   185  		}
   186  	}
   187  
   188  	return nil
   189  }
   190  
   191  func testAccCheckAWSDBParameterGroupAttributes(v *rds.DBParameterGroup, name string) resource.TestCheckFunc {
   192  	return func(s *terraform.State) error {
   193  
   194  		if *v.DBParameterGroupName != name {
   195  			return fmt.Errorf("Bad Parameter Group name, expected (%s), got (%s)", name, *v.DBParameterGroupName)
   196  		}
   197  
   198  		if *v.DBParameterGroupFamily != "mysql5.6" {
   199  			return fmt.Errorf("bad family: %#v", v.DBParameterGroupFamily)
   200  		}
   201  
   202  		return nil
   203  	}
   204  }
   205  
   206  func testAccCheckAWSDBParameterGroupExists(n string, v *rds.DBParameterGroup) resource.TestCheckFunc {
   207  	return func(s *terraform.State) error {
   208  		rs, ok := s.RootModule().Resources[n]
   209  		if !ok {
   210  			return fmt.Errorf("Not found: %s", n)
   211  		}
   212  
   213  		if rs.Primary.ID == "" {
   214  			return fmt.Errorf("No DB Parameter Group ID is set")
   215  		}
   216  
   217  		conn := testAccProvider.Meta().(*AWSClient).rdsconn
   218  
   219  		opts := rds.DescribeDBParameterGroupsInput{
   220  			DBParameterGroupName: aws.String(rs.Primary.ID),
   221  		}
   222  
   223  		resp, err := conn.DescribeDBParameterGroups(&opts)
   224  
   225  		if err != nil {
   226  			return err
   227  		}
   228  
   229  		if len(resp.DBParameterGroups) != 1 ||
   230  			*resp.DBParameterGroups[0].DBParameterGroupName != rs.Primary.ID {
   231  			return fmt.Errorf("DB Parameter Group not found")
   232  		}
   233  
   234  		*v = *resp.DBParameterGroups[0]
   235  
   236  		return nil
   237  	}
   238  }
   239  
   240  func randomString(strlen int) string {
   241  	rand.Seed(time.Now().UTC().UnixNano())
   242  	const chars = "abcdefghijklmnopqrstuvwxyz"
   243  	result := make([]byte, strlen)
   244  	for i := 0; i < strlen; i++ {
   245  		result[i] = chars[rand.Intn(len(chars))]
   246  	}
   247  	return string(result)
   248  }
   249  
   250  func testAccAWSDBParameterGroupConfig(n string) string {
   251  	return fmt.Sprintf(`
   252  resource "aws_db_parameter_group" "bar" {
   253  	name = "%s"
   254  	family = "mysql5.6"
   255  	parameter {
   256  	  name = "character_set_server"
   257  	  value = "utf8"
   258  	}
   259  	parameter {
   260  	  name = "character_set_client"
   261  	  value = "utf8"
   262  	}
   263  	parameter{
   264  	  name = "character_set_results"
   265  	  value = "utf8"
   266  	}
   267  	tags {
   268  		foo = "bar"
   269  	}
   270  }`, n)
   271  }
   272  
   273  func testAccAWSDBParameterGroupAddParametersConfig(n string) string {
   274  	return fmt.Sprintf(`
   275  resource "aws_db_parameter_group" "bar" {
   276  	name = "%s"
   277  	family = "mysql5.6"
   278  	description = "Test parameter group for terraform"
   279  	parameter {
   280  	  name = "character_set_server"
   281  	  value = "utf8"
   282  	}
   283  	parameter {
   284  	  name = "character_set_client"
   285  	  value = "utf8"
   286  	}
   287  	parameter{
   288  	  name = "character_set_results"
   289  	  value = "utf8"
   290  	}
   291  	parameter {
   292  	  name = "collation_server"
   293  	  value = "utf8_unicode_ci"
   294  	}
   295  	parameter {
   296  	  name = "collation_connection"
   297  	  value = "utf8_unicode_ci"
   298  	}
   299  	tags {
   300  		foo = "bar"
   301  		baz = "foo"
   302  	}
   303  }`, n)
   304  }
   305  
   306  func testAccAWSDBParameterGroupOnlyConfig(n string) string {
   307  	return fmt.Sprintf(`
   308  resource "aws_db_parameter_group" "bar" {
   309  	name = "%s"
   310  	family = "mysql5.6"
   311  	description = "Test parameter group for terraform"
   312  }`, n)
   313  }