github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_db_option_group_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/aws/awserr"
     9  	"github.com/aws/aws-sdk-go/service/rds"
    10  	"github.com/hashicorp/terraform/helper/acctest"
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestAccAWSDBOptionGroup_basic(t *testing.T) {
    16  	var v rds.OptionGroup
    17  	rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5))
    18  
    19  	resource.Test(t, resource.TestCase{
    20  		PreCheck:     func() { testAccPreCheck(t) },
    21  		Providers:    testAccProviders,
    22  		CheckDestroy: testAccCheckAWSDBOptionGroupDestroy,
    23  		Steps: []resource.TestStep{
    24  			resource.TestStep{
    25  				Config: testAccAWSDBOptionGroupBasicConfig(rName),
    26  				Check: resource.ComposeTestCheckFunc(
    27  					testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v),
    28  					testAccCheckAWSDBOptionGroupAttributes(&v),
    29  					resource.TestCheckResourceAttr(
    30  						"aws_db_option_group.bar", "name", rName),
    31  				),
    32  			},
    33  		},
    34  	})
    35  }
    36  
    37  func TestAccAWSDBOptionGroup_basicDestroyWithInstance(t *testing.T) {
    38  	rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5))
    39  
    40  	resource.Test(t, resource.TestCase{
    41  		PreCheck:     func() { testAccPreCheck(t) },
    42  		Providers:    testAccProviders,
    43  		CheckDestroy: testAccCheckAWSDBOptionGroupDestroy,
    44  		Steps: []resource.TestStep{
    45  			resource.TestStep{
    46  				Config: testAccAWSDBOptionGroupBasicDestroyConfig(rName),
    47  			},
    48  		},
    49  	})
    50  }
    51  
    52  func TestAccAWSDBOptionGroup_OptionSettings(t *testing.T) {
    53  	var v rds.OptionGroup
    54  	rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5))
    55  
    56  	resource.Test(t, resource.TestCase{
    57  		PreCheck:     func() { testAccPreCheck(t) },
    58  		Providers:    testAccProviders,
    59  		CheckDestroy: testAccCheckAWSDBOptionGroupDestroy,
    60  		Steps: []resource.TestStep{
    61  			resource.TestStep{
    62  				Config: testAccAWSDBOptionGroupOptionSettings(rName),
    63  				Check: resource.ComposeTestCheckFunc(
    64  					testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v),
    65  					resource.TestCheckResourceAttr(
    66  						"aws_db_option_group.bar", "name", rName),
    67  					resource.TestCheckResourceAttr(
    68  						"aws_db_option_group.bar", "option.#", "1"),
    69  					resource.TestCheckResourceAttr(
    70  						"aws_db_option_group.bar", "option.961211605.option_settings.129825347.value", "UTC"),
    71  				),
    72  			},
    73  			resource.TestStep{
    74  				Config: testAccAWSDBOptionGroupOptionSettings_update(rName),
    75  				Check: resource.ComposeTestCheckFunc(
    76  					testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v),
    77  					resource.TestCheckResourceAttr(
    78  						"aws_db_option_group.bar", "name", rName),
    79  					resource.TestCheckResourceAttr(
    80  						"aws_db_option_group.bar", "option.#", "1"),
    81  					resource.TestCheckResourceAttr(
    82  						"aws_db_option_group.bar", "option.2422743510.option_settings.1350509764.value", "US/Pacific"),
    83  				),
    84  			},
    85  		},
    86  	})
    87  }
    88  
    89  func TestAccAWSDBOptionGroup_sqlServerOptionsUpdate(t *testing.T) {
    90  	var v rds.OptionGroup
    91  	rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5))
    92  
    93  	resource.Test(t, resource.TestCase{
    94  		PreCheck:     func() { testAccPreCheck(t) },
    95  		Providers:    testAccProviders,
    96  		CheckDestroy: testAccCheckAWSDBOptionGroupDestroy,
    97  		Steps: []resource.TestStep{
    98  			resource.TestStep{
    99  				Config: testAccAWSDBOptionGroupSqlServerEEOptions(rName),
   100  				Check: resource.ComposeTestCheckFunc(
   101  					testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v),
   102  					resource.TestCheckResourceAttr(
   103  						"aws_db_option_group.bar", "name", rName),
   104  				),
   105  			},
   106  
   107  			resource.TestStep{
   108  				Config: testAccAWSDBOptionGroupSqlServerEEOptions_update(rName),
   109  				Check: resource.ComposeTestCheckFunc(
   110  					testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v),
   111  					resource.TestCheckResourceAttr(
   112  						"aws_db_option_group.bar", "name", rName),
   113  					resource.TestCheckResourceAttr(
   114  						"aws_db_option_group.bar", "option.#", "1"),
   115  				),
   116  			},
   117  		},
   118  	})
   119  }
   120  
   121  func TestAccAWSDBOptionGroup_multipleOptions(t *testing.T) {
   122  	var v rds.OptionGroup
   123  	rName := fmt.Sprintf("option-group-test-terraform-%s", acctest.RandString(5))
   124  
   125  	resource.Test(t, resource.TestCase{
   126  		PreCheck:     func() { testAccPreCheck(t) },
   127  		Providers:    testAccProviders,
   128  		CheckDestroy: testAccCheckAWSDBOptionGroupDestroy,
   129  		Steps: []resource.TestStep{
   130  			resource.TestStep{
   131  				Config: testAccAWSDBOptionGroupMultipleOptions(rName),
   132  				Check: resource.ComposeTestCheckFunc(
   133  					testAccCheckAWSDBOptionGroupExists("aws_db_option_group.bar", &v),
   134  					resource.TestCheckResourceAttr(
   135  						"aws_db_option_group.bar", "name", rName),
   136  					resource.TestCheckResourceAttr(
   137  						"aws_db_option_group.bar", "option.#", "2"),
   138  				),
   139  			},
   140  		},
   141  	})
   142  }
   143  
   144  func testAccCheckAWSDBOptionGroupAttributes(v *rds.OptionGroup) resource.TestCheckFunc {
   145  	return func(s *terraform.State) error {
   146  
   147  		if *v.EngineName != "mysql" {
   148  			return fmt.Errorf("bad engine_name: %#v", *v.EngineName)
   149  		}
   150  
   151  		if *v.MajorEngineVersion != "5.6" {
   152  			return fmt.Errorf("bad major_engine_version: %#v", *v.MajorEngineVersion)
   153  		}
   154  
   155  		if *v.OptionGroupDescription != "Test option group for terraform" {
   156  			return fmt.Errorf("bad option_group_description: %#v", *v.OptionGroupDescription)
   157  		}
   158  
   159  		return nil
   160  	}
   161  }
   162  
   163  func TestResourceAWSDBOptionGroupName_validation(t *testing.T) {
   164  	cases := []struct {
   165  		Value    string
   166  		ErrCount int
   167  	}{
   168  		{
   169  			Value:    "testing123!",
   170  			ErrCount: 1,
   171  		},
   172  		{
   173  			Value:    "1testing123",
   174  			ErrCount: 1,
   175  		},
   176  		{
   177  			Value:    "testing--123",
   178  			ErrCount: 1,
   179  		},
   180  		{
   181  			Value:    "testing123-",
   182  			ErrCount: 1,
   183  		},
   184  		{
   185  			Value:    randomString(256),
   186  			ErrCount: 1,
   187  		},
   188  	}
   189  
   190  	for _, tc := range cases {
   191  		_, errors := validateDbOptionGroupName(tc.Value, "aws_db_option_group_name")
   192  
   193  		if len(errors) != tc.ErrCount {
   194  			t.Fatalf("Expected the DB Option Group Name to trigger a validation error")
   195  		}
   196  	}
   197  }
   198  
   199  func testAccCheckAWSDBOptionGroupExists(n string, v *rds.OptionGroup) resource.TestCheckFunc {
   200  	return func(s *terraform.State) error {
   201  		rs, ok := s.RootModule().Resources[n]
   202  		if !ok {
   203  			return fmt.Errorf("Not found: %s", n)
   204  		}
   205  
   206  		if rs.Primary.ID == "" {
   207  			return fmt.Errorf("No DB Option Group Name is set")
   208  		}
   209  
   210  		conn := testAccProvider.Meta().(*AWSClient).rdsconn
   211  
   212  		opts := rds.DescribeOptionGroupsInput{
   213  			OptionGroupName: aws.String(rs.Primary.ID),
   214  		}
   215  
   216  		resp, err := conn.DescribeOptionGroups(&opts)
   217  
   218  		if err != nil {
   219  			return err
   220  		}
   221  
   222  		if len(resp.OptionGroupsList) != 1 ||
   223  			*resp.OptionGroupsList[0].OptionGroupName != rs.Primary.ID {
   224  			return fmt.Errorf("DB Option Group not found")
   225  		}
   226  
   227  		*v = *resp.OptionGroupsList[0]
   228  
   229  		return nil
   230  	}
   231  }
   232  
   233  func testAccCheckAWSDBOptionGroupDestroy(s *terraform.State) error {
   234  	conn := testAccProvider.Meta().(*AWSClient).rdsconn
   235  
   236  	for _, rs := range s.RootModule().Resources {
   237  		if rs.Type != "aws_db_option_group" {
   238  			continue
   239  		}
   240  
   241  		resp, err := conn.DescribeOptionGroups(
   242  			&rds.DescribeOptionGroupsInput{
   243  				OptionGroupName: aws.String(rs.Primary.ID),
   244  			})
   245  
   246  		if err == nil {
   247  			if len(resp.OptionGroupsList) != 0 &&
   248  				*resp.OptionGroupsList[0].OptionGroupName == rs.Primary.ID {
   249  				return fmt.Errorf("DB Option Group still exists")
   250  			}
   251  		}
   252  
   253  		// Verify the error
   254  		newerr, ok := err.(awserr.Error)
   255  		if !ok {
   256  			return err
   257  		}
   258  		if newerr.Code() != "OptionGroupNotFoundFault" {
   259  			return err
   260  		}
   261  	}
   262  
   263  	return nil
   264  }
   265  
   266  func testAccAWSDBOptionGroupBasicConfig(r string) string {
   267  	return fmt.Sprintf(`
   268  resource "aws_db_option_group" "bar" {
   269    name                     = "%s"
   270    option_group_description = "Test option group for terraform"
   271    engine_name              = "mysql"
   272    major_engine_version     = "5.6"
   273  }
   274  `, r)
   275  }
   276  
   277  func testAccAWSDBOptionGroupBasicDestroyConfig(r string) string {
   278  	return fmt.Sprintf(`
   279  resource "aws_db_instance" "bar" {
   280  	allocated_storage = 10
   281  	engine = "MySQL"
   282  	engine_version = "5.6.21"
   283  	instance_class = "db.t2.micro"
   284  	name = "baz"
   285  	password = "barbarbarbar"
   286  	username = "foo"
   287  
   288  
   289  	# Maintenance Window is stored in lower case in the API, though not strictly
   290  	# documented. Terraform will downcase this to match (as opposed to throw a
   291  	# validation error).
   292  	maintenance_window = "Fri:09:00-Fri:09:30"
   293  
   294  	backup_retention_period = 0
   295  
   296  	option_group_name = "${aws_db_option_group.bar.name}"
   297  }
   298  
   299  resource "aws_db_option_group" "bar" {
   300    name                     = "%s"
   301    option_group_description = "Test option group for terraform"
   302    engine_name              = "mysql"
   303    major_engine_version     = "5.6"
   304  }
   305  `, r)
   306  }
   307  
   308  func testAccAWSDBOptionGroupOptionSettings(r string) string {
   309  	return fmt.Sprintf(`
   310  resource "aws_db_option_group" "bar" {
   311    name                     = "%s"
   312    option_group_description = "Test option group for terraform"
   313    engine_name              = "oracle-ee"
   314    major_engine_version     = "11.2"
   315  
   316    option {
   317      option_name = "Timezone"
   318      option_settings {
   319        name = "TIME_ZONE"
   320        value = "UTC"
   321      }
   322    }
   323  }
   324  `, r)
   325  }
   326  
   327  func testAccAWSDBOptionGroupOptionSettings_update(r string) string {
   328  	return fmt.Sprintf(`
   329  resource "aws_db_option_group" "bar" {
   330    name                     = "%s"
   331    option_group_description = "Test option group for terraform"
   332    engine_name              = "oracle-ee"
   333    major_engine_version     = "11.2"
   334  
   335    option {
   336      option_name = "Timezone"
   337      option_settings {
   338        name = "TIME_ZONE"
   339        value = "US/Pacific"
   340      }
   341    }
   342  }
   343  `, r)
   344  }
   345  
   346  func testAccAWSDBOptionGroupSqlServerEEOptions(r string) string {
   347  	return fmt.Sprintf(`
   348  resource "aws_db_option_group" "bar" {
   349    name                     = "%s"
   350    option_group_description = "Test option group for terraform"
   351    engine_name              = "sqlserver-ee"
   352    major_engine_version     = "11.00"
   353  }
   354  `, r)
   355  }
   356  
   357  func testAccAWSDBOptionGroupSqlServerEEOptions_update(r string) string {
   358  	return fmt.Sprintf(`
   359  resource "aws_db_option_group" "bar" {
   360    name                     = "%s"
   361    option_group_description = "Test option group for terraform"
   362    engine_name              = "sqlserver-ee"
   363    major_engine_version     = "11.00"
   364  
   365    option {
   366      option_name = "Mirroring"
   367    }
   368  }
   369  `, r)
   370  }
   371  
   372  func testAccAWSDBOptionGroupMultipleOptions(r string) string {
   373  	return fmt.Sprintf(`
   374  resource "aws_db_option_group" "bar" {
   375    name                     = "%s"
   376    option_group_description = "Test option group for terraform"
   377    engine_name              = "oracle-se"
   378    major_engine_version     = "11.2"
   379  
   380    option {
   381      option_name = "STATSPACK"
   382    }
   383  
   384    option {
   385      option_name = "XMLDB"
   386    }
   387  }
   388  `, r)
   389  }