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 }