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