github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/aws/resource_aws_db_option_group_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "regexp" 7 "strings" 8 "testing" 9 "time" 10 11 "github.com/aws/aws-sdk-go/aws" 12 "github.com/aws/aws-sdk-go/aws/awserr" 13 "github.com/aws/aws-sdk-go/service/rds" 14 "github.com/hashicorp/terraform/helper/acctest" 15 "github.com/hashicorp/terraform/helper/resource" 16 "github.com/hashicorp/terraform/terraform" 17 ) 18 19 func init() { 20 resource.AddTestSweepers("aws_db_option_group", &resource.Sweeper{ 21 Name: "aws_db_option_group", 22 F: testSweepDbOptionGroups, 23 }) 24 } 25 26 func testSweepDbOptionGroups(region string) error { 27 client, err := sharedClientForRegion(region) 28 if err != nil { 29 return fmt.Errorf("error getting client: %s", err) 30 } 31 32 conn := client.(*AWSClient).rdsconn 33 34 opts := rds.DescribeOptionGroupsInput{} 35 resp, err := conn.DescribeOptionGroups(&opts) 36 if err != nil { 37 return fmt.Errorf("error describing DB Option Groups in Sweeper: %s", err) 38 } 39 40 for _, og := range resp.OptionGroupsList { 41 var testOptGroup bool 42 for _, testName := range []string{"option-group-test-terraform-", "tf-test"} { 43 if strings.HasPrefix(*og.OptionGroupName, testName) { 44 testOptGroup = true 45 } 46 } 47 48 if !testOptGroup { 49 continue 50 } 51 52 deleteOpts := &rds.DeleteOptionGroupInput{ 53 OptionGroupName: og.OptionGroupName, 54 } 55 56 ret := resource.Retry(1*time.Minute, func() *resource.RetryError { 57 _, err := conn.DeleteOptionGroup(deleteOpts) 58 if err != nil { 59 if awsErr, ok := err.(awserr.Error); ok { 60 if awsErr.Code() == "InvalidOptionGroupStateFault" { 61 log.Printf("[DEBUG] AWS believes the RDS Option Group is still in use, retrying") 62 return resource.RetryableError(awsErr) 63 } 64 } 65 return resource.NonRetryableError(err) 66 } 67 return nil 68 }) 69 if ret != nil { 70 return fmt.Errorf("Error Deleting DB Option Group (%s) in Sweeper: %s", *og.OptionGroupName, ret) 71 } 72 } 73 74 return nil 75 } 76 77 func TestAccAWSDBOptionGroup_basic(t *testing.T) { 78 var v rds.OptionGroup 79 rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5)) 80 81 resource.Test(t, resource.TestCase{ 82 PreCheck: func() { testAccPreCheck(t) }, 83 Providers: testAccProviders, 84 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 85 Steps: []resource.TestStep{ 86 { 87 Config: testAccAWSDBOptionGroupBasicConfig(rName), 88 Check: resource.ComposeTestCheckFunc( 89 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v), 90 testAccCheckAWSDBOptionGroupAttributes(&v), 91 resource.TestCheckResourceAttr( 92 "aws_db_option_group.bar", "name", rName), 93 ), 94 }, 95 }, 96 }) 97 } 98 99 func TestAccAWSDBOptionGroup_timeoutBlock(t *testing.T) { 100 var v rds.OptionGroup 101 rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5)) 102 103 resource.Test(t, resource.TestCase{ 104 PreCheck: func() { testAccPreCheck(t) }, 105 Providers: testAccProviders, 106 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 107 Steps: []resource.TestStep{ 108 { 109 Config: testAccAWSDBOptionGroupBasicConfigTimeoutBlock(rName), 110 Check: resource.ComposeTestCheckFunc( 111 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v), 112 testAccCheckAWSDBOptionGroupAttributes(&v), 113 resource.TestCheckResourceAttr( 114 "aws_db_option_group.bar", "name", rName), 115 ), 116 }, 117 }, 118 }) 119 } 120 121 func TestAccAWSDBOptionGroup_namePrefix(t *testing.T) { 122 var v rds.OptionGroup 123 124 resource.Test(t, resource.TestCase{ 125 PreCheck: func() { testAccPreCheck(t) }, 126 Providers: testAccProviders, 127 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 128 Steps: []resource.TestStep{ 129 { 130 Config: testAccAWSDBOptionGroup_namePrefix, 131 Check: resource.ComposeTestCheckFunc( 132 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.test", &v), 133 testAccCheckAWSDBOptionGroupAttributes(&v), 134 resource.TestMatchResourceAttr( 135 "aws_db_option_group.test", "name", regexp.MustCompile("^tf-test-")), 136 ), 137 }, 138 }, 139 }) 140 } 141 142 func TestAccAWSDBOptionGroup_generatedName(t *testing.T) { 143 var v rds.OptionGroup 144 145 resource.Test(t, resource.TestCase{ 146 PreCheck: func() { testAccPreCheck(t) }, 147 Providers: testAccProviders, 148 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 149 Steps: []resource.TestStep{ 150 { 151 Config: testAccAWSDBOptionGroup_generatedName, 152 Check: resource.ComposeTestCheckFunc( 153 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.test", &v), 154 testAccCheckAWSDBOptionGroupAttributes(&v), 155 ), 156 }, 157 }, 158 }) 159 } 160 161 func TestAccAWSDBOptionGroup_defaultDescription(t *testing.T) { 162 var v rds.OptionGroup 163 164 resource.Test(t, resource.TestCase{ 165 PreCheck: func() { testAccPreCheck(t) }, 166 Providers: testAccProviders, 167 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 168 Steps: []resource.TestStep{ 169 { 170 Config: testAccAWSDBOptionGroup_defaultDescription(acctest.RandInt()), 171 Check: resource.ComposeTestCheckFunc( 172 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.test", &v), 173 resource.TestCheckResourceAttr( 174 "aws_db_option_group.test", "option_group_description", "Managed by Terraform"), 175 ), 176 }, 177 }, 178 }) 179 } 180 181 func TestAccAWSDBOptionGroup_basicDestroyWithInstance(t *testing.T) { 182 rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5)) 183 184 resource.Test(t, resource.TestCase{ 185 PreCheck: func() { testAccPreCheck(t) }, 186 Providers: testAccProviders, 187 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 188 Steps: []resource.TestStep{ 189 { 190 Config: testAccAWSDBOptionGroupBasicDestroyConfig(rName), 191 }, 192 }, 193 }) 194 } 195 196 func TestAccAWSDBOptionGroup_OptionSettings(t *testing.T) { 197 var v rds.OptionGroup 198 rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5)) 199 200 resource.Test(t, resource.TestCase{ 201 PreCheck: func() { testAccPreCheck(t) }, 202 Providers: testAccProviders, 203 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 204 Steps: []resource.TestStep{ 205 { 206 Config: testAccAWSDBOptionGroupOptionSettings(rName), 207 Check: resource.ComposeTestCheckFunc( 208 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v), 209 resource.TestCheckResourceAttr( 210 "aws_db_option_group.bar", "name", rName), 211 resource.TestCheckResourceAttr( 212 "aws_db_option_group.bar", "option.#", "1"), 213 resource.TestCheckResourceAttr( 214 "aws_db_option_group.bar", "option.961211605.option_settings.129825347.value", "UTC"), 215 ), 216 }, 217 { 218 Config: testAccAWSDBOptionGroupOptionSettings_update(rName), 219 Check: resource.ComposeTestCheckFunc( 220 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v), 221 resource.TestCheckResourceAttr( 222 "aws_db_option_group.bar", "name", rName), 223 resource.TestCheckResourceAttr( 224 "aws_db_option_group.bar", "option.#", "1"), 225 resource.TestCheckResourceAttr( 226 "aws_db_option_group.bar", "option.2422743510.option_settings.1350509764.value", "US/Pacific"), 227 ), 228 }, 229 }, 230 }) 231 } 232 233 func TestAccAWSDBOptionGroup_sqlServerOptionsUpdate(t *testing.T) { 234 var v rds.OptionGroup 235 rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5)) 236 237 resource.Test(t, resource.TestCase{ 238 PreCheck: func() { testAccPreCheck(t) }, 239 Providers: testAccProviders, 240 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 241 Steps: []resource.TestStep{ 242 { 243 Config: testAccAWSDBOptionGroupSqlServerEEOptions(rName), 244 Check: resource.ComposeTestCheckFunc( 245 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v), 246 resource.TestCheckResourceAttr( 247 "aws_db_option_group.bar", "name", rName), 248 ), 249 }, 250 251 { 252 Config: testAccAWSDBOptionGroupSqlServerEEOptions_update(rName), 253 Check: resource.ComposeTestCheckFunc( 254 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v), 255 resource.TestCheckResourceAttr( 256 "aws_db_option_group.bar", "name", rName), 257 resource.TestCheckResourceAttr( 258 "aws_db_option_group.bar", "option.#", "1"), 259 ), 260 }, 261 }, 262 }) 263 } 264 265 func TestAccAWSDBOptionGroup_multipleOptions(t *testing.T) { 266 var v rds.OptionGroup 267 rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5)) 268 269 resource.Test(t, resource.TestCase{ 270 PreCheck: func() { testAccPreCheck(t) }, 271 Providers: testAccProviders, 272 CheckDestroy: testAccCheckAWSDBOptionGroupDestroy, 273 Steps: []resource.TestStep{ 274 { 275 Config: testAccAWSDBOptionGroupMultipleOptions(rName), 276 Check: resource.ComposeTestCheckFunc( 277 testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v), 278 resource.TestCheckResourceAttr( 279 "aws_db_option_group.bar", "name", rName), 280 resource.TestCheckResourceAttr( 281 "aws_db_option_group.bar", "option.#", "2"), 282 ), 283 }, 284 }, 285 }) 286 } 287 288 func testAccCheckAWSDBOptionGroupAttributes(v *rds.OptionGroup) resource.TestCheckFunc { 289 return func(s *terraform.State) error { 290 291 if *v.EngineName != "mysql" { 292 return fmt.Errorf("bad engine_name: %#v", *v.EngineName) 293 } 294 295 if *v.MajorEngineVersion != "5.6" { 296 return fmt.Errorf("bad major_engine_version: %#v", *v.MajorEngineVersion) 297 } 298 299 if *v.OptionGroupDescription != "Test option group for terraform" { 300 return fmt.Errorf("bad option_group_description: %#v", *v.OptionGroupDescription) 301 } 302 303 return nil 304 } 305 } 306 307 func testAccCheckAWSDBOptionGroupExists(n string, v *rds.OptionGroup) resource.TestCheckFunc { 308 return func(s *terraform.State) error { 309 rs, ok := s.RootModule().Resources[n] 310 if !ok { 311 return fmt.Errorf("Not found: %s", n) 312 } 313 314 if rs.Primary.ID == "" { 315 return fmt.Errorf("No DB Option Group Name is set") 316 } 317 318 conn := testAccProvider.Meta().(*AWSClient).rdsconn 319 320 opts := rds.DescribeOptionGroupsInput{ 321 OptionGroupName: aws.String(rs.Primary.ID), 322 } 323 324 resp, err := conn.DescribeOptionGroups(&opts) 325 326 if err != nil { 327 return err 328 } 329 330 if len(resp.OptionGroupsList) != 1 || 331 *resp.OptionGroupsList[0].OptionGroupName != rs.Primary.ID { 332 return fmt.Errorf("DB Option Group not found") 333 } 334 335 *v = *resp.OptionGroupsList[0] 336 337 return nil 338 } 339 } 340 341 func testAccCheckAWSDBOptionGroupDestroy(s *terraform.State) error { 342 conn := testAccProvider.Meta().(*AWSClient).rdsconn 343 344 for _, rs := range s.RootModule().Resources { 345 if rs.Type != "aws_db_option_group" { 346 continue 347 } 348 349 resp, err := conn.DescribeOptionGroups( 350 &rds.DescribeOptionGroupsInput{ 351 OptionGroupName: aws.String(rs.Primary.ID), 352 }) 353 354 if err == nil { 355 if len(resp.OptionGroupsList) != 0 && 356 *resp.OptionGroupsList[0].OptionGroupName == rs.Primary.ID { 357 return fmt.Errorf("DB Option Group still exists") 358 } 359 } 360 361 // Verify the error 362 newerr, ok := err.(awserr.Error) 363 if !ok { 364 return err 365 } 366 if newerr.Code() != "OptionGroupNotFoundFault" { 367 return err 368 } 369 } 370 371 return nil 372 } 373 374 func testAccAWSDBOptionGroupBasicConfigTimeoutBlock(r string) string { 375 return fmt.Sprintf(` 376 resource "aws_db_option_group" "bar" { 377 name = "%s" 378 option_group_description = "Test option group for terraform" 379 engine_name = "mysql" 380 major_engine_version = "5.6" 381 382 timeouts { 383 delete = "10m" 384 } 385 } 386 `, r) 387 } 388 389 func testAccAWSDBOptionGroupBasicConfig(r string) string { 390 return fmt.Sprintf(` 391 resource "aws_db_option_group" "bar" { 392 name = "%s" 393 option_group_description = "Test option group for terraform" 394 engine_name = "mysql" 395 major_engine_version = "5.6" 396 } 397 `, r) 398 } 399 400 func testAccAWSDBOptionGroupBasicDestroyConfig(r string) string { 401 return fmt.Sprintf(` 402 resource "aws_db_instance" "bar" { 403 allocated_storage = 10 404 engine = "MySQL" 405 engine_version = "5.6.21" 406 instance_class = "db.t2.micro" 407 name = "baz" 408 password = "barbarbarbar" 409 username = "foo" 410 411 412 # Maintenance Window is stored in lower case in the API, though not strictly 413 # documented. Terraform will downcase this to match (as opposed to throw a 414 # validation error). 415 maintenance_window = "Fri:09:00-Fri:09:30" 416 417 backup_retention_period = 0 418 skip_final_snapshot = true 419 420 option_group_name = "${aws_db_option_group.bar.name}" 421 } 422 423 resource "aws_db_option_group" "bar" { 424 name = "%s" 425 option_group_description = "Test option group for terraform" 426 engine_name = "mysql" 427 major_engine_version = "5.6" 428 } 429 `, r) 430 } 431 432 func testAccAWSDBOptionGroupOptionSettings(r string) string { 433 return fmt.Sprintf(` 434 resource "aws_db_option_group" "bar" { 435 name = "%s" 436 option_group_description = "Test option group for terraform" 437 engine_name = "oracle-ee" 438 major_engine_version = "11.2" 439 440 option { 441 option_name = "Timezone" 442 option_settings { 443 name = "TIME_ZONE" 444 value = "UTC" 445 } 446 } 447 } 448 `, r) 449 } 450 451 func testAccAWSDBOptionGroupOptionSettings_update(r string) string { 452 return fmt.Sprintf(` 453 resource "aws_db_option_group" "bar" { 454 name = "%s" 455 option_group_description = "Test option group for terraform" 456 engine_name = "oracle-ee" 457 major_engine_version = "11.2" 458 459 option { 460 option_name = "Timezone" 461 option_settings { 462 name = "TIME_ZONE" 463 value = "US/Pacific" 464 } 465 } 466 } 467 `, r) 468 } 469 470 func testAccAWSDBOptionGroupSqlServerEEOptions(r string) string { 471 return fmt.Sprintf(` 472 resource "aws_db_option_group" "bar" { 473 name = "%s" 474 option_group_description = "Test option group for terraform" 475 engine_name = "sqlserver-ee" 476 major_engine_version = "11.00" 477 } 478 `, r) 479 } 480 481 func testAccAWSDBOptionGroupSqlServerEEOptions_update(r string) string { 482 return fmt.Sprintf(` 483 resource "aws_db_option_group" "bar" { 484 name = "%s" 485 option_group_description = "Test option group for terraform" 486 engine_name = "sqlserver-ee" 487 major_engine_version = "11.00" 488 489 option { 490 option_name = "Mirroring" 491 } 492 } 493 `, r) 494 } 495 496 func testAccAWSDBOptionGroupMultipleOptions(r string) string { 497 return fmt.Sprintf(` 498 resource "aws_db_option_group" "bar" { 499 name = "%s" 500 option_group_description = "Test option group for terraform" 501 engine_name = "oracle-se" 502 major_engine_version = "11.2" 503 504 option { 505 option_name = "STATSPACK" 506 } 507 508 option { 509 option_name = "XMLDB" 510 } 511 } 512 `, r) 513 } 514 515 const testAccAWSDBOptionGroup_namePrefix = ` 516 resource "aws_db_option_group" "test" { 517 name_prefix = "tf-test-" 518 option_group_description = "Test option group for terraform" 519 engine_name = "mysql" 520 major_engine_version = "5.6" 521 } 522 ` 523 524 const testAccAWSDBOptionGroup_generatedName = ` 525 resource "aws_db_option_group" "test" { 526 option_group_description = "Test option group for terraform" 527 engine_name = "mysql" 528 major_engine_version = "5.6" 529 } 530 ` 531 532 func testAccAWSDBOptionGroup_defaultDescription(n int) string { 533 return fmt.Sprintf(` 534 resource "aws_db_option_group" "test" { 535 name = "tf-test-%d" 536 engine_name = "mysql" 537 major_engine_version = "5.6" 538 } 539 `, n) 540 }