github.com/pbthorste/terraform@v0.8.6-0.20170127005045-deb56bd93da2/builtin/providers/aws/resource_aws_db_instance_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"regexp"
     7  	"strings"
     8  
     9  	"math/rand"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/hashicorp/terraform/helper/acctest"
    14  	"github.com/hashicorp/terraform/helper/resource"
    15  	"github.com/hashicorp/terraform/terraform"
    16  
    17  	"github.com/aws/aws-sdk-go/aws"
    18  	"github.com/aws/aws-sdk-go/aws/awserr"
    19  	"github.com/aws/aws-sdk-go/service/rds"
    20  )
    21  
    22  func TestAccAWSDBInstance_basic(t *testing.T) {
    23  	var v rds.DBInstance
    24  
    25  	resource.Test(t, resource.TestCase{
    26  		PreCheck:     func() { testAccPreCheck(t) },
    27  		Providers:    testAccProviders,
    28  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
    29  		Steps: []resource.TestStep{
    30  			{
    31  				Config: testAccAWSDBInstanceConfig,
    32  				Check: resource.ComposeTestCheckFunc(
    33  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
    34  					testAccCheckAWSDBInstanceAttributes(&v),
    35  					resource.TestCheckResourceAttr(
    36  						"aws_db_instance.bar", "allocated_storage", "10"),
    37  					resource.TestCheckResourceAttr(
    38  						"aws_db_instance.bar", "engine", "mysql"),
    39  					resource.TestCheckResourceAttr(
    40  						"aws_db_instance.bar", "license_model", "general-public-license"),
    41  					resource.TestCheckResourceAttr(
    42  						"aws_db_instance.bar", "instance_class", "db.t1.micro"),
    43  					resource.TestCheckResourceAttr(
    44  						"aws_db_instance.bar", "name", "baz"),
    45  					resource.TestCheckResourceAttr(
    46  						"aws_db_instance.bar", "username", "foo"),
    47  					resource.TestCheckResourceAttr(
    48  						"aws_db_instance.bar", "parameter_group_name", "default.mysql5.6"),
    49  					resource.TestCheckResourceAttrSet("aws_db_instance.bar", "hosted_zone_id"),
    50  				),
    51  			},
    52  		},
    53  	})
    54  }
    55  
    56  func TestAccAWSDBInstance_kmsKey(t *testing.T) {
    57  	var v rds.DBInstance
    58  	keyRegex := regexp.MustCompile("^arn:aws:kms:")
    59  
    60  	ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int()
    61  	config := fmt.Sprintf(testAccAWSDBInstanceConfigKmsKeyId, ri)
    62  
    63  	resource.Test(t, resource.TestCase{
    64  		PreCheck:     func() { testAccPreCheck(t) },
    65  		Providers:    testAccProviders,
    66  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
    67  		Steps: []resource.TestStep{
    68  			{
    69  				Config: config,
    70  				Check: resource.ComposeTestCheckFunc(
    71  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
    72  					testAccCheckAWSDBInstanceAttributes(&v),
    73  					resource.TestMatchResourceAttr(
    74  						"aws_db_instance.bar", "kms_key_id", keyRegex),
    75  				),
    76  			},
    77  		},
    78  	})
    79  }
    80  
    81  func TestAccAWSDBInstance_subnetGroup(t *testing.T) {
    82  	var v rds.DBInstance
    83  	rName := acctest.RandString(10)
    84  
    85  	resource.Test(t, resource.TestCase{
    86  		PreCheck:     func() { testAccPreCheck(t) },
    87  		Providers:    testAccProviders,
    88  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
    89  		Steps: []resource.TestStep{
    90  			{
    91  				Config: testAccAWSDBInstanceConfigWithSubnetGroup(rName),
    92  				Check: resource.ComposeTestCheckFunc(
    93  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
    94  					resource.TestCheckResourceAttr(
    95  						"aws_db_instance.bar", "db_subnet_group_name", "foo"),
    96  				),
    97  			},
    98  			{
    99  				Config: testAccAWSDBInstanceConfigWithSubnetGroupUpdated(rName),
   100  				Check: resource.ComposeTestCheckFunc(
   101  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
   102  					resource.TestCheckResourceAttr(
   103  						"aws_db_instance.bar", "db_subnet_group_name", "bar"),
   104  				),
   105  			},
   106  		},
   107  	})
   108  }
   109  
   110  func TestAccAWSDBInstance_optionGroup(t *testing.T) {
   111  	var v rds.DBInstance
   112  
   113  	resource.Test(t, resource.TestCase{
   114  		PreCheck:     func() { testAccPreCheck(t) },
   115  		Providers:    testAccProviders,
   116  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
   117  		Steps: []resource.TestStep{
   118  			{
   119  				Config: testAccAWSDBInstanceConfigWithOptionGroup,
   120  				Check: resource.ComposeTestCheckFunc(
   121  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
   122  					testAccCheckAWSDBInstanceAttributes(&v),
   123  					resource.TestCheckResourceAttr(
   124  						"aws_db_instance.bar", "option_group_name", "option-group-test-terraform"),
   125  				),
   126  			},
   127  		},
   128  	})
   129  }
   130  
   131  func TestAccAWSDBInstanceReplica(t *testing.T) {
   132  	var s, r rds.DBInstance
   133  
   134  	resource.Test(t, resource.TestCase{
   135  		PreCheck:     func() { testAccPreCheck(t) },
   136  		Providers:    testAccProviders,
   137  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
   138  		Steps: []resource.TestStep{
   139  			{
   140  				Config: testAccReplicaInstanceConfig(rand.New(rand.NewSource(time.Now().UnixNano())).Int()),
   141  				Check: resource.ComposeTestCheckFunc(
   142  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &s),
   143  					testAccCheckAWSDBInstanceExists("aws_db_instance.replica", &r),
   144  					testAccCheckAWSDBInstanceReplicaAttributes(&s, &r),
   145  				),
   146  			},
   147  		},
   148  	})
   149  }
   150  
   151  func TestAccAWSDBInstanceSnapshot(t *testing.T) {
   152  	var snap rds.DBInstance
   153  
   154  	resource.Test(t, resource.TestCase{
   155  		PreCheck:  func() { testAccPreCheck(t) },
   156  		Providers: testAccProviders,
   157  		// testAccCheckAWSDBInstanceSnapshot verifies a database snapshot is
   158  		// created, and subequently deletes it
   159  		CheckDestroy: testAccCheckAWSDBInstanceSnapshot,
   160  		Steps: []resource.TestStep{
   161  			{
   162  				Config: testAccSnapshotInstanceConfig(),
   163  				Check: resource.ComposeTestCheckFunc(
   164  					testAccCheckAWSDBInstanceExists("aws_db_instance.snapshot", &snap),
   165  				),
   166  			},
   167  		},
   168  	})
   169  }
   170  
   171  func TestAccAWSDBInstanceNoSnapshot(t *testing.T) {
   172  	var nosnap rds.DBInstance
   173  
   174  	resource.Test(t, resource.TestCase{
   175  		PreCheck:     func() { testAccPreCheck(t) },
   176  		Providers:    testAccProviders,
   177  		CheckDestroy: testAccCheckAWSDBInstanceNoSnapshot,
   178  		Steps: []resource.TestStep{
   179  			{
   180  				Config: testAccNoSnapshotInstanceConfig(),
   181  				Check: resource.ComposeTestCheckFunc(
   182  					testAccCheckAWSDBInstanceExists("aws_db_instance.no_snapshot", &nosnap),
   183  				),
   184  			},
   185  		},
   186  	})
   187  }
   188  
   189  func TestAccAWSDBInstance_enhancedMonitoring(t *testing.T) {
   190  	var dbInstance rds.DBInstance
   191  	rName := acctest.RandString(5)
   192  
   193  	resource.Test(t, resource.TestCase{
   194  		PreCheck:     func() { testAccPreCheck(t) },
   195  		Providers:    testAccProviders,
   196  		CheckDestroy: testAccCheckAWSDBInstanceNoSnapshot,
   197  		Steps: []resource.TestStep{
   198  			{
   199  				Config: testAccSnapshotInstanceConfig_enhancedMonitoring(rName),
   200  				Check: resource.ComposeTestCheckFunc(
   201  					testAccCheckAWSDBInstanceExists("aws_db_instance.enhanced_monitoring", &dbInstance),
   202  					resource.TestCheckResourceAttr(
   203  						"aws_db_instance.enhanced_monitoring", "monitoring_interval", "5"),
   204  				),
   205  			},
   206  		},
   207  	})
   208  }
   209  
   210  // Regression test for https://github.com/hashicorp/terraform/issues/3760 .
   211  // We apply a plan, then change just the iops. If the apply succeeds, we
   212  // consider this a pass, as before in 3760 the request would fail
   213  func TestAccAWS_separate_DBInstance_iops_update(t *testing.T) {
   214  	var v rds.DBInstance
   215  
   216  	rName := acctest.RandString(5)
   217  
   218  	resource.Test(t, resource.TestCase{
   219  		PreCheck:     func() { testAccPreCheck(t) },
   220  		Providers:    testAccProviders,
   221  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
   222  		Steps: []resource.TestStep{
   223  			{
   224  				Config: testAccSnapshotInstanceConfig_iopsUpdate(rName, 1000),
   225  				Check: resource.ComposeTestCheckFunc(
   226  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
   227  					testAccCheckAWSDBInstanceAttributes(&v),
   228  				),
   229  			},
   230  
   231  			{
   232  				Config: testAccSnapshotInstanceConfig_iopsUpdate(rName, 2000),
   233  				Check: resource.ComposeTestCheckFunc(
   234  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
   235  					testAccCheckAWSDBInstanceAttributes(&v),
   236  				),
   237  			},
   238  		},
   239  	})
   240  }
   241  
   242  func TestAccAWSDBInstance_portUpdate(t *testing.T) {
   243  	var v rds.DBInstance
   244  
   245  	rName := acctest.RandString(5)
   246  
   247  	resource.Test(t, resource.TestCase{
   248  		PreCheck:     func() { testAccPreCheck(t) },
   249  		Providers:    testAccProviders,
   250  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
   251  		Steps: []resource.TestStep{
   252  			{
   253  				Config: testAccSnapshotInstanceConfig_mysqlPort(rName),
   254  				Check: resource.ComposeTestCheckFunc(
   255  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
   256  					resource.TestCheckResourceAttr(
   257  						"aws_db_instance.bar", "port", "3306"),
   258  				),
   259  			},
   260  
   261  			{
   262  				Config: testAccSnapshotInstanceConfig_updateMysqlPort(rName),
   263  				Check: resource.ComposeTestCheckFunc(
   264  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
   265  					resource.TestCheckResourceAttr(
   266  						"aws_db_instance.bar", "port", "3305"),
   267  				),
   268  			},
   269  		},
   270  	})
   271  }
   272  
   273  func TestAccAWSDBInstance_MSSQL_TZ(t *testing.T) {
   274  	var v rds.DBInstance
   275  
   276  	resource.Test(t, resource.TestCase{
   277  		PreCheck:     func() { testAccPreCheck(t) },
   278  		Providers:    testAccProviders,
   279  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
   280  		Steps: []resource.TestStep{
   281  			{
   282  				Config: testAccAWSDBMSSQL_timezone,
   283  				Check: resource.ComposeTestCheckFunc(
   284  					testAccCheckAWSDBInstanceExists("aws_db_instance.mssql", &v),
   285  					testAccCheckAWSDBInstanceAttributes_MSSQL(&v, ""),
   286  					resource.TestCheckResourceAttr(
   287  						"aws_db_instance.mssql", "allocated_storage", "20"),
   288  					resource.TestCheckResourceAttr(
   289  						"aws_db_instance.mssql", "engine", "sqlserver-ex"),
   290  				),
   291  			},
   292  
   293  			{
   294  				Config: testAccAWSDBMSSQL_timezone_AKST,
   295  				Check: resource.ComposeTestCheckFunc(
   296  					testAccCheckAWSDBInstanceExists("aws_db_instance.mssql", &v),
   297  					testAccCheckAWSDBInstanceAttributes_MSSQL(&v, "Alaskan Standard Time"),
   298  					resource.TestCheckResourceAttr(
   299  						"aws_db_instance.mssql", "allocated_storage", "20"),
   300  					resource.TestCheckResourceAttr(
   301  						"aws_db_instance.mssql", "engine", "sqlserver-ex"),
   302  				),
   303  			},
   304  		},
   305  	})
   306  }
   307  
   308  func TestAccAWSDBInstance_MinorVersion(t *testing.T) {
   309  	var v rds.DBInstance
   310  
   311  	resource.Test(t, resource.TestCase{
   312  		PreCheck:     func() { testAccPreCheck(t) },
   313  		Providers:    testAccProviders,
   314  		CheckDestroy: testAccCheckAWSDBInstanceDestroy,
   315  		Steps: []resource.TestStep{
   316  			{
   317  				Config: testAccAWSDBInstanceConfigAutoMinorVersion,
   318  				Check: resource.ComposeTestCheckFunc(
   319  					testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v),
   320  				),
   321  			},
   322  		},
   323  	})
   324  }
   325  
   326  func testAccCheckAWSDBInstanceDestroy(s *terraform.State) error {
   327  	conn := testAccProvider.Meta().(*AWSClient).rdsconn
   328  
   329  	for _, rs := range s.RootModule().Resources {
   330  		if rs.Type != "aws_db_instance" {
   331  			continue
   332  		}
   333  
   334  		// Try to find the Group
   335  		var err error
   336  		resp, err := conn.DescribeDBInstances(
   337  			&rds.DescribeDBInstancesInput{
   338  				DBInstanceIdentifier: aws.String(rs.Primary.ID),
   339  			})
   340  
   341  		if ae, ok := err.(awserr.Error); ok && ae.Code() == "DBInstanceNotFound" {
   342  			continue
   343  		}
   344  
   345  		if err == nil {
   346  			if len(resp.DBInstances) != 0 &&
   347  				*resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID {
   348  				return fmt.Errorf("DB Instance still exists")
   349  			}
   350  		}
   351  
   352  		// Verify the error
   353  		newerr, ok := err.(awserr.Error)
   354  		if !ok {
   355  			return err
   356  		}
   357  		if newerr.Code() != "DBInstanceNotFound" {
   358  			return err
   359  		}
   360  	}
   361  
   362  	return nil
   363  }
   364  
   365  func testAccCheckAWSDBInstanceAttributes(v *rds.DBInstance) resource.TestCheckFunc {
   366  	return func(s *terraform.State) error {
   367  
   368  		if *v.Engine != "mysql" {
   369  			return fmt.Errorf("bad engine: %#v", *v.Engine)
   370  		}
   371  
   372  		if *v.EngineVersion == "" {
   373  			return fmt.Errorf("bad engine_version: %#v", *v.EngineVersion)
   374  		}
   375  
   376  		if *v.BackupRetentionPeriod != 0 {
   377  			return fmt.Errorf("bad backup_retention_period: %#v", *v.BackupRetentionPeriod)
   378  		}
   379  
   380  		return nil
   381  	}
   382  }
   383  
   384  func testAccCheckAWSDBInstanceAttributes_MSSQL(v *rds.DBInstance, tz string) resource.TestCheckFunc {
   385  	return func(s *terraform.State) error {
   386  
   387  		if *v.Engine != "sqlserver-ex" {
   388  			return fmt.Errorf("bad engine: %#v", *v.Engine)
   389  		}
   390  
   391  		rtz := ""
   392  		if v.Timezone != nil {
   393  			rtz = *v.Timezone
   394  		}
   395  
   396  		if tz != rtz {
   397  			return fmt.Errorf("Expected (%s) Timezone for MSSQL test, got (%s)", tz, rtz)
   398  		}
   399  
   400  		return nil
   401  	}
   402  }
   403  
   404  func testAccCheckAWSDBInstanceReplicaAttributes(source, replica *rds.DBInstance) resource.TestCheckFunc {
   405  	return func(s *terraform.State) error {
   406  
   407  		if replica.ReadReplicaSourceDBInstanceIdentifier != nil && *replica.ReadReplicaSourceDBInstanceIdentifier != *source.DBInstanceIdentifier {
   408  			return fmt.Errorf("bad source identifier for replica, expected: '%s', got: '%s'", *source.DBInstanceIdentifier, *replica.ReadReplicaSourceDBInstanceIdentifier)
   409  		}
   410  
   411  		return nil
   412  	}
   413  }
   414  
   415  func testAccCheckAWSDBInstanceSnapshot(s *terraform.State) error {
   416  	conn := testAccProvider.Meta().(*AWSClient).rdsconn
   417  
   418  	for _, rs := range s.RootModule().Resources {
   419  		if rs.Type != "aws_db_instance" {
   420  			continue
   421  		}
   422  
   423  		var err error
   424  		resp, err := conn.DescribeDBInstances(
   425  			&rds.DescribeDBInstancesInput{
   426  				DBInstanceIdentifier: aws.String(rs.Primary.ID),
   427  			})
   428  
   429  		if err != nil {
   430  			newerr, _ := err.(awserr.Error)
   431  			if newerr.Code() != "DBInstanceNotFound" {
   432  				return err
   433  			}
   434  
   435  		} else {
   436  			if len(resp.DBInstances) != 0 &&
   437  				*resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID {
   438  				return fmt.Errorf("DB Instance still exists")
   439  			}
   440  		}
   441  
   442  		log.Printf("[INFO] Trying to locate the DBInstance Final Snapshot")
   443  		snapshot_identifier := "foobarbaz-test-terraform-final-snapshot-1"
   444  		_, snapErr := conn.DescribeDBSnapshots(
   445  			&rds.DescribeDBSnapshotsInput{
   446  				DBSnapshotIdentifier: aws.String(snapshot_identifier),
   447  			})
   448  
   449  		if snapErr != nil {
   450  			newerr, _ := snapErr.(awserr.Error)
   451  			if newerr.Code() == "DBSnapshotNotFound" {
   452  				return fmt.Errorf("Snapshot %s not found", snapshot_identifier)
   453  			}
   454  		} else { // snapshot was found,
   455  			// verify we have the tags copied to the snapshot
   456  			instanceARN, err := buildRDSARN(snapshot_identifier, testAccProvider.Meta().(*AWSClient).partition, testAccProvider.Meta().(*AWSClient).accountid, testAccProvider.Meta().(*AWSClient).region)
   457  			// tags have a different ARN, just swapping :db: for :snapshot:
   458  			tagsARN := strings.Replace(instanceARN, ":db:", ":snapshot:", 1)
   459  			if err != nil {
   460  				return fmt.Errorf("Error building ARN for tags check with ARN (%s): %s", tagsARN, err)
   461  			}
   462  			resp, err := conn.ListTagsForResource(&rds.ListTagsForResourceInput{
   463  				ResourceName: aws.String(tagsARN),
   464  			})
   465  			if err != nil {
   466  				return fmt.Errorf("Error retrieving tags for ARN (%s): %s", tagsARN, err)
   467  			}
   468  
   469  			if resp.TagList == nil || len(resp.TagList) == 0 {
   470  				return fmt.Errorf("Tag list is nil or zero: %s", resp.TagList)
   471  			}
   472  
   473  			var found bool
   474  			for _, t := range resp.TagList {
   475  				if *t.Key == "Name" && *t.Value == "tf-tags-db" {
   476  					found = true
   477  				}
   478  			}
   479  			if !found {
   480  				return fmt.Errorf("Expected to find tag Name (%s), but wasn't found. Tags: %s", "tf-tags-db", resp.TagList)
   481  			}
   482  			// end tag search
   483  
   484  			log.Printf("[INFO] Deleting the Snapshot %s", snapshot_identifier)
   485  			_, snapDeleteErr := conn.DeleteDBSnapshot(
   486  				&rds.DeleteDBSnapshotInput{
   487  					DBSnapshotIdentifier: aws.String(snapshot_identifier),
   488  				})
   489  			if snapDeleteErr != nil {
   490  				return err
   491  			}
   492  		} // end snapshot was found
   493  	}
   494  
   495  	return nil
   496  }
   497  
   498  func testAccCheckAWSDBInstanceNoSnapshot(s *terraform.State) error {
   499  	conn := testAccProvider.Meta().(*AWSClient).rdsconn
   500  
   501  	for _, rs := range s.RootModule().Resources {
   502  		if rs.Type != "aws_db_instance" {
   503  			continue
   504  		}
   505  
   506  		var err error
   507  		resp, err := conn.DescribeDBInstances(
   508  			&rds.DescribeDBInstancesInput{
   509  				DBInstanceIdentifier: aws.String(rs.Primary.ID),
   510  			})
   511  
   512  		if err != nil {
   513  			newerr, _ := err.(awserr.Error)
   514  			if newerr.Code() != "DBInstanceNotFound" {
   515  				return err
   516  			}
   517  
   518  		} else {
   519  			if len(resp.DBInstances) != 0 &&
   520  				*resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID {
   521  				return fmt.Errorf("DB Instance still exists")
   522  			}
   523  		}
   524  
   525  		snapshot_identifier := "foobarbaz-test-terraform-final-snapshot-2"
   526  		_, snapErr := conn.DescribeDBSnapshots(
   527  			&rds.DescribeDBSnapshotsInput{
   528  				DBSnapshotIdentifier: aws.String(snapshot_identifier),
   529  			})
   530  
   531  		if snapErr != nil {
   532  			newerr, _ := snapErr.(awserr.Error)
   533  			if newerr.Code() != "DBSnapshotNotFound" {
   534  				return fmt.Errorf("Snapshot %s found and it shouldn't have been", snapshot_identifier)
   535  			}
   536  		}
   537  	}
   538  
   539  	return nil
   540  }
   541  
   542  func testAccCheckAWSDBInstanceExists(n string, v *rds.DBInstance) resource.TestCheckFunc {
   543  	return func(s *terraform.State) error {
   544  		rs, ok := s.RootModule().Resources[n]
   545  		if !ok {
   546  			return fmt.Errorf("Not found: %s", n)
   547  		}
   548  
   549  		if rs.Primary.ID == "" {
   550  			return fmt.Errorf("No DB Instance ID is set")
   551  		}
   552  
   553  		conn := testAccProvider.Meta().(*AWSClient).rdsconn
   554  
   555  		opts := rds.DescribeDBInstancesInput{
   556  			DBInstanceIdentifier: aws.String(rs.Primary.ID),
   557  		}
   558  
   559  		resp, err := conn.DescribeDBInstances(&opts)
   560  
   561  		if err != nil {
   562  			return err
   563  		}
   564  
   565  		if len(resp.DBInstances) != 1 ||
   566  			*resp.DBInstances[0].DBInstanceIdentifier != rs.Primary.ID {
   567  			return fmt.Errorf("DB Instance not found")
   568  		}
   569  
   570  		*v = *resp.DBInstances[0]
   571  
   572  		return nil
   573  	}
   574  }
   575  
   576  // Database names cannot collide, and deletion takes so long, that making the
   577  // name a bit random helps so able we can kill a test that's just waiting for a
   578  // delete and not be blocked on kicking off another one.
   579  var testAccAWSDBInstanceConfig = `
   580  resource "aws_db_instance" "bar" {
   581  	allocated_storage = 10
   582  	engine = "MySQL"
   583  	engine_version = "5.6.21"
   584  	instance_class = "db.t1.micro"
   585  	name = "baz"
   586  	password = "barbarbarbar"
   587  	username = "foo"
   588  
   589  
   590  	# Maintenance Window is stored in lower case in the API, though not strictly 
   591  	# documented. Terraform will downcase this to match (as opposed to throw a 
   592  	# validation error).
   593  	maintenance_window = "Fri:09:00-Fri:09:30"
   594  
   595  	backup_retention_period = 0
   596  
   597  	parameter_group_name = "default.mysql5.6"
   598  }`
   599  
   600  var testAccAWSDBInstanceConfigKmsKeyId = `
   601  resource "aws_kms_key" "foo" {
   602      description = "Terraform acc test %s"
   603      policy = <<POLICY
   604  {
   605    "Version": "2012-10-17",
   606    "Id": "kms-tf-1",
   607    "Statement": [
   608      {
   609        "Sid": "Enable IAM User Permissions",
   610        "Effect": "Allow",
   611        "Principal": {
   612          "AWS": "*"
   613        },
   614        "Action": "kms:*",
   615        "Resource": "*"
   616      }
   617    ]
   618  }
   619  POLICY
   620  }
   621  
   622  resource "aws_db_instance" "bar" {
   623  	allocated_storage = 10
   624  	engine = "MySQL"
   625  	engine_version = "5.6.21"
   626  	instance_class = "db.m3.medium"
   627  	name = "baz"
   628  	password = "barbarbarbar"
   629  	username = "foo"
   630  
   631  
   632  	# Maintenance Window is stored in lower case in the API, though not strictly
   633  	# documented. Terraform will downcase this to match (as opposed to throw a
   634  	# validation error).
   635  	maintenance_window = "Fri:09:00-Fri:09:30"
   636  
   637  	backup_retention_period = 0
   638  	storage_encrypted = true
   639  	kms_key_id = "${aws_kms_key.foo.arn}"
   640  
   641  	parameter_group_name = "default.mysql5.6"
   642  }
   643  `
   644  
   645  var testAccAWSDBInstanceConfigWithOptionGroup = fmt.Sprintf(`
   646  
   647  resource "aws_db_option_group" "bar" {
   648  	name = "option-group-test-terraform"
   649  	option_group_description = "Test option group for terraform"
   650  	engine_name = "mysql"
   651  	major_engine_version = "5.6"
   652  }
   653  
   654  resource "aws_db_instance" "bar" {
   655  	identifier = "foobarbaz-test-terraform-%d"
   656  
   657  	allocated_storage = 10
   658  	engine = "MySQL"
   659  	instance_class = "db.m1.small"
   660  	name = "baz"
   661  	password = "barbarbarbar"
   662  	username = "foo"
   663  
   664  	backup_retention_period = 0
   665  
   666  	parameter_group_name = "default.mysql5.6"
   667  	option_group_name = "${aws_db_option_group.bar.name}"
   668  }`, acctest.RandInt())
   669  
   670  func testAccReplicaInstanceConfig(val int) string {
   671  	return fmt.Sprintf(`
   672  	resource "aws_db_instance" "bar" {
   673  		identifier = "foobarbaz-test-terraform-%d"
   674  
   675  		allocated_storage = 5
   676  		engine = "mysql"
   677  		engine_version = "5.6.21"
   678  		instance_class = "db.t1.micro"
   679  		name = "baz"
   680  		password = "barbarbarbar"
   681  		username = "foo"
   682  
   683  		backup_retention_period = 1
   684  
   685  		parameter_group_name = "default.mysql5.6"
   686  	}
   687  	
   688  	resource "aws_db_instance" "replica" {
   689  		identifier = "tf-replica-db-%d"
   690  		backup_retention_period = 0
   691  		replicate_source_db = "${aws_db_instance.bar.identifier}"
   692  		allocated_storage = "${aws_db_instance.bar.allocated_storage}"
   693  		engine = "${aws_db_instance.bar.engine}"
   694  		engine_version = "${aws_db_instance.bar.engine_version}"
   695  		instance_class = "${aws_db_instance.bar.instance_class}"
   696  		password = "${aws_db_instance.bar.password}"
   697  		username = "${aws_db_instance.bar.username}"
   698  		tags {
   699  			Name = "tf-replica-db"
   700  		}
   701  	}
   702  	`, val, val)
   703  }
   704  
   705  func testAccSnapshotInstanceConfig() string {
   706  	return fmt.Sprintf(`
   707  provider "aws" {
   708    region = "us-east-1"
   709  }
   710  resource "aws_db_instance" "snapshot" {
   711  	identifier = "tf-snapshot-%d"
   712  
   713  	allocated_storage = 5
   714  	engine = "mysql"
   715  	engine_version = "5.6.21"
   716  	instance_class = "db.t1.micro"
   717  	name = "baz"
   718  	password = "barbarbarbar"
   719  	username = "foo"
   720  	security_group_names = ["default"]
   721  	backup_retention_period = 1
   722  
   723  	publicly_accessible = true
   724  
   725  	parameter_group_name = "default.mysql5.6"
   726  
   727  	skip_final_snapshot = false
   728  	copy_tags_to_snapshot = true
   729  	final_snapshot_identifier = "foobarbaz-test-terraform-final-snapshot-1"
   730  	tags {
   731  		Name = "tf-tags-db"
   732  	}
   733  }`, acctest.RandInt())
   734  }
   735  
   736  func testAccNoSnapshotInstanceConfig() string {
   737  	return fmt.Sprintf(`
   738  provider "aws" {
   739    region = "us-east-1"
   740  }
   741  resource "aws_db_instance" "no_snapshot" {
   742  	identifier = "tf-test-%s"
   743  
   744  	allocated_storage = 5
   745  	engine = "mysql"
   746  	engine_version = "5.6.21"
   747  	instance_class = "db.t1.micro"
   748  	name = "baz"
   749  	password = "barbarbarbar"
   750  	publicly_accessible = true
   751  	username = "foo"
   752      security_group_names = ["default"]
   753  	backup_retention_period = 1
   754  
   755  	parameter_group_name = "default.mysql5.6"
   756  
   757  	skip_final_snapshot = true
   758  	final_snapshot_identifier = "foobarbaz-test-terraform-final-snapshot-2"
   759  }
   760  `, acctest.RandString(5))
   761  }
   762  
   763  func testAccSnapshotInstanceConfig_enhancedMonitoring(rName string) string {
   764  	return fmt.Sprintf(`
   765  resource "aws_iam_role" "enhanced_policy_role" {
   766      name = "enhanced-monitoring-role-%s"
   767      assume_role_policy = <<EOF
   768  {
   769    "Version": "2012-10-17",
   770    "Statement": [
   771      {
   772        "Sid": "",
   773        "Effect": "Allow",
   774        "Principal": {
   775          "Service": "monitoring.rds.amazonaws.com"
   776        },
   777        "Action": "sts:AssumeRole"
   778      }
   779    ]
   780  }
   781  EOF
   782  
   783  }
   784  
   785  resource "aws_iam_policy_attachment" "test-attach" {
   786      name = "enhanced-monitoring-attachment"
   787      roles = [
   788          "${aws_iam_role.enhanced_policy_role.name}",
   789      ]
   790  
   791      policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole"
   792  }
   793  
   794  resource "aws_db_instance" "enhanced_monitoring" {
   795  	identifier = "foobarbaz-enhanced-monitoring-%s"
   796  	depends_on = ["aws_iam_policy_attachment.test-attach"]
   797  
   798  	allocated_storage = 5
   799  	engine = "mysql"
   800  	engine_version = "5.6.21"
   801  	instance_class = "db.m3.medium"
   802  	name = "baz"
   803  	password = "barbarbarbar"
   804  	username = "foo"
   805  	backup_retention_period = 1
   806  
   807  	parameter_group_name = "default.mysql5.6"
   808  
   809  	monitoring_role_arn = "${aws_iam_role.enhanced_policy_role.arn}"
   810  	monitoring_interval = "5"
   811  
   812  	skip_final_snapshot = true
   813  }`, rName, rName)
   814  }
   815  
   816  func testAccSnapshotInstanceConfig_iopsUpdate(rName string, iops int) string {
   817  	return fmt.Sprintf(`
   818  resource "aws_db_instance" "bar" {
   819    identifier           = "mydb-rds-%s"
   820    engine               = "mysql"
   821    engine_version       = "5.6.23"
   822    instance_class       = "db.t2.micro"
   823    name                 = "mydb"
   824    username             = "foo"
   825    password             = "barbarbar"
   826    parameter_group_name = "default.mysql5.6"
   827  
   828    apply_immediately = true
   829  
   830    storage_type      = "io1"
   831    allocated_storage = 200
   832    iops              = %d
   833  }`, rName, iops)
   834  }
   835  
   836  func testAccSnapshotInstanceConfig_mysqlPort(rName string) string {
   837  	return fmt.Sprintf(`
   838  resource "aws_db_instance" "bar" {
   839    identifier           = "mydb-rds-%s"
   840    engine               = "mysql"
   841    engine_version       = "5.6.23"
   842    instance_class       = "db.t2.micro"
   843    name                 = "mydb"
   844    username             = "foo"
   845    password             = "barbarbar"
   846    parameter_group_name = "default.mysql5.6"
   847    port = 3306
   848    allocated_storage = 10
   849  
   850    apply_immediately = true
   851  }`, rName)
   852  }
   853  
   854  func testAccSnapshotInstanceConfig_updateMysqlPort(rName string) string {
   855  	return fmt.Sprintf(`
   856  resource "aws_db_instance" "bar" {
   857    identifier           = "mydb-rds-%s"
   858    engine               = "mysql"
   859    engine_version       = "5.6.23"
   860    instance_class       = "db.t2.micro"
   861    name                 = "mydb"
   862    username             = "foo"
   863    password             = "barbarbar"
   864    parameter_group_name = "default.mysql5.6"
   865    port = 3305
   866    allocated_storage = 10
   867  
   868    apply_immediately = true
   869  }`, rName)
   870  }
   871  
   872  func testAccAWSDBInstanceConfigWithSubnetGroup(rName string) string {
   873  	return fmt.Sprintf(`
   874  resource "aws_vpc" "foo" {
   875  	cidr_block = "10.1.0.0/16"
   876  }
   877  
   878  resource "aws_subnet" "foo" {
   879  	cidr_block = "10.1.1.0/24"
   880  	availability_zone = "us-west-2a"
   881  	vpc_id = "${aws_vpc.foo.id}"
   882  	tags {
   883  		Name = "tf-dbsubnet-test-1"
   884  	}
   885  }
   886  
   887  resource "aws_subnet" "bar" {
   888  	cidr_block = "10.1.2.0/24"
   889  	availability_zone = "us-west-2b"
   890  	vpc_id = "${aws_vpc.foo.id}"
   891  	tags {
   892  		Name = "tf-dbsubnet-test-2"
   893  	}
   894  }
   895  
   896  resource "aws_db_subnet_group" "foo" {
   897  	name = "foo"
   898  	subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"]
   899  	tags {
   900  		Name = "tf-dbsubnet-group-test"
   901  	}
   902  }
   903  
   904  resource "aws_db_instance" "bar" {
   905    identifier           = "mydb-rds-%s"
   906    engine               = "mysql"
   907    engine_version       = "5.6.23"
   908    instance_class       = "db.t2.micro"
   909    name                 = "mydb"
   910    username             = "foo"
   911    password             = "barbarbar"
   912    parameter_group_name = "default.mysql5.6"
   913    db_subnet_group_name = "${aws_db_subnet_group.foo.name}"
   914    port = 3305
   915    allocated_storage = 10
   916  
   917    apply_immediately = true
   918  }`, rName)
   919  }
   920  
   921  func testAccAWSDBInstanceConfigWithSubnetGroupUpdated(rName string) string {
   922  	return fmt.Sprintf(`
   923  resource "aws_vpc" "foo" {
   924  	cidr_block = "10.1.0.0/16"
   925  }
   926  
   927  resource "aws_vpc" "bar" {
   928  	cidr_block = "10.10.0.0/16"
   929  }
   930  
   931  resource "aws_subnet" "foo" {
   932  	cidr_block = "10.1.1.0/24"
   933  	availability_zone = "us-west-2a"
   934  	vpc_id = "${aws_vpc.foo.id}"
   935  	tags {
   936  		Name = "tf-dbsubnet-test-1"
   937  	}
   938  }
   939  
   940  resource "aws_subnet" "bar" {
   941  	cidr_block = "10.1.2.0/24"
   942  	availability_zone = "us-west-2b"
   943  	vpc_id = "${aws_vpc.foo.id}"
   944  	tags {
   945  		Name = "tf-dbsubnet-test-2"
   946  	}
   947  }
   948  
   949  resource "aws_subnet" "test" {
   950  	cidr_block = "10.10.3.0/24"
   951  	availability_zone = "us-west-2c"
   952  	vpc_id = "${aws_vpc.bar.id}"
   953  	tags {
   954  		Name = "tf-dbsubnet-test-3"
   955  	}
   956  }
   957  
   958  resource "aws_subnet" "another_test" {
   959  	cidr_block = "10.10.4.0/24"
   960  	availability_zone = "us-west-2a"
   961  	vpc_id = "${aws_vpc.bar.id}"
   962  	tags {
   963  		Name = "tf-dbsubnet-test-4"
   964  	}
   965  }
   966  
   967  resource "aws_db_subnet_group" "foo" {
   968  	name = "foo"
   969  	subnet_ids = ["${aws_subnet.foo.id}", "${aws_subnet.bar.id}"]
   970  	tags {
   971  		Name = "tf-dbsubnet-group-test"
   972  	}
   973  }
   974  
   975  resource "aws_db_subnet_group" "bar" {
   976  	name = "bar"
   977  	subnet_ids = ["${aws_subnet.test.id}", "${aws_subnet.another_test.id}"]
   978  	tags {
   979  		Name = "tf-dbsubnet-group-test-updated"
   980  	}
   981  }
   982  
   983  resource "aws_db_instance" "bar" {
   984    identifier           = "mydb-rds-%s"
   985    engine               = "mysql"
   986    engine_version       = "5.6.23"
   987    instance_class       = "db.t2.micro"
   988    name                 = "mydb"
   989    username             = "foo"
   990    password             = "barbarbar"
   991    parameter_group_name = "default.mysql5.6"
   992    db_subnet_group_name = "${aws_db_subnet_group.bar.name}"
   993    port = 3305
   994    allocated_storage = 10
   995  
   996    apply_immediately = true
   997  }`, rName)
   998  }
   999  
  1000  const testAccAWSDBMSSQL_timezone = `
  1001  provider "aws" {
  1002    region = "us-west-2"
  1003  }
  1004  
  1005  resource "aws_vpc" "foo" {
  1006    cidr_block           = "10.1.0.0/16"
  1007    enable_dns_hostnames = true
  1008  	tags {
  1009  		Name = "tf-rds-mssql-timezone-test"
  1010  	}
  1011  }
  1012  
  1013  resource "aws_db_subnet_group" "rds_one" {
  1014    name        = "rds_one_db"
  1015    description = "db subnets for rds_one"
  1016  
  1017    subnet_ids = ["${aws_subnet.main.id}", "${aws_subnet.other.id}"]
  1018  }
  1019  
  1020  resource "aws_subnet" "main" {
  1021    vpc_id            = "${aws_vpc.foo.id}"
  1022    availability_zone = "us-west-2a"
  1023    cidr_block        = "10.1.1.0/24"
  1024  }
  1025  
  1026  resource "aws_subnet" "other" {
  1027    vpc_id            = "${aws_vpc.foo.id}"
  1028    availability_zone = "us-west-2b"
  1029    cidr_block        = "10.1.2.0/24"
  1030  }
  1031  
  1032  resource "aws_db_instance" "mssql" {
  1033    #identifier = "tf-test-mssql"
  1034  
  1035    db_subnet_group_name = "${aws_db_subnet_group.rds_one.name}"
  1036  
  1037    instance_class          = "db.t2.micro"
  1038    allocated_storage       = 20
  1039    username                = "somecrazyusername"
  1040    password                = "somecrazypassword"
  1041    engine                  = "sqlserver-ex"
  1042    backup_retention_period = 0
  1043  
  1044    #publicly_accessible = true
  1045  
  1046    vpc_security_group_ids = ["${aws_security_group.rds-mssql.id}"]
  1047  }
  1048  
  1049  resource "aws_security_group" "rds-mssql" {
  1050    name = "tf-rds-mssql-test"
  1051  
  1052    description = "TF Testing"
  1053    vpc_id      = "${aws_vpc.foo.id}"
  1054  }
  1055  
  1056  resource "aws_security_group_rule" "rds-mssql-1" {
  1057    type        = "egress"
  1058    from_port   = 0
  1059    to_port     = 0
  1060    protocol    = "-1"
  1061    cidr_blocks = ["0.0.0.0/0"]
  1062  
  1063    security_group_id = "${aws_security_group.rds-mssql.id}"
  1064  }
  1065  `
  1066  
  1067  const testAccAWSDBMSSQL_timezone_AKST = `
  1068  provider "aws" {
  1069    region = "us-west-2"
  1070  }
  1071  
  1072  resource "aws_vpc" "foo" {
  1073    cidr_block           = "10.1.0.0/16"
  1074    enable_dns_hostnames = true
  1075  	tags {
  1076  		Name = "tf-rds-mssql-timezone-test"
  1077  	}
  1078  }
  1079  
  1080  resource "aws_db_subnet_group" "rds_one" {
  1081    name        = "rds_one_db"
  1082    description = "db subnets for rds_one"
  1083  
  1084    subnet_ids = ["${aws_subnet.main.id}", "${aws_subnet.other.id}"]
  1085  }
  1086  
  1087  resource "aws_subnet" "main" {
  1088    vpc_id            = "${aws_vpc.foo.id}"
  1089    availability_zone = "us-west-2a"
  1090    cidr_block        = "10.1.1.0/24"
  1091  }
  1092  
  1093  resource "aws_subnet" "other" {
  1094    vpc_id            = "${aws_vpc.foo.id}"
  1095    availability_zone = "us-west-2b"
  1096    cidr_block        = "10.1.2.0/24"
  1097  }
  1098  
  1099  resource "aws_db_instance" "mssql" {
  1100    #identifier = "tf-test-mssql"
  1101  
  1102    db_subnet_group_name = "${aws_db_subnet_group.rds_one.name}"
  1103  
  1104    instance_class          = "db.t2.micro"
  1105    allocated_storage       = 20
  1106    username                = "somecrazyusername"
  1107    password                = "somecrazypassword"
  1108    engine                  = "sqlserver-ex"
  1109    backup_retention_period = 0
  1110  
  1111    #publicly_accessible = true
  1112  
  1113    vpc_security_group_ids = ["${aws_security_group.rds-mssql.id}"]
  1114    timezone               = "Alaskan Standard Time"
  1115  }
  1116  
  1117  resource "aws_security_group" "rds-mssql" {
  1118    name = "tf-rds-mssql-test"
  1119  
  1120    description = "TF Testing"
  1121    vpc_id      = "${aws_vpc.foo.id}"
  1122  }
  1123  
  1124  resource "aws_security_group_rule" "rds-mssql-1" {
  1125    type        = "egress"
  1126    from_port   = 0
  1127    to_port     = 0
  1128    protocol    = "-1"
  1129    cidr_blocks = ["0.0.0.0/0"]
  1130  
  1131    security_group_id = "${aws_security_group.rds-mssql.id}"
  1132  }
  1133  `
  1134  
  1135  var testAccAWSDBInstanceConfigAutoMinorVersion = fmt.Sprintf(`
  1136  resource "aws_db_instance" "bar" {
  1137    identifier = "foobarbaz-test-terraform-%d"
  1138  	allocated_storage = 10
  1139  	engine = "MySQL"
  1140  	engine_version = "5.6"
  1141  	instance_class = "db.t1.micro"
  1142  	name = "baz"
  1143  	password = "barbarbarbar"
  1144  	username = "foo"
  1145  }
  1146  `, acctest.RandInt())