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 }