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  }