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 }