github.com/leeprovoost/terraform@v0.6.10-0.20160119085442-96f3f76118e7/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 `