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