github.com/bendemaree/terraform@v0.5.4-0.20150613200311-f50d97d6eee6/builtin/providers/aws/resource_aws_db_instance_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "math/rand" 6 "testing" 7 "time" 8 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 12 "github.com/aws/aws-sdk-go/aws" 13 "github.com/aws/aws-sdk-go/aws/awserr" 14 "github.com/aws/aws-sdk-go/service/rds" 15 ) 16 17 func TestAccAWSDBInstance_basic(t *testing.T) { 18 var v rds.DBInstance 19 20 resource.Test(t, resource.TestCase{ 21 PreCheck: func() { testAccPreCheck(t) }, 22 Providers: testAccProviders, 23 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 24 Steps: []resource.TestStep{ 25 resource.TestStep{ 26 Config: testAccAWSDBInstanceConfig, 27 Check: resource.ComposeTestCheckFunc( 28 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &v), 29 testAccCheckAWSDBInstanceAttributes(&v), 30 resource.TestCheckResourceAttr( 31 "aws_db_instance.bar", "allocated_storage", "10"), 32 resource.TestCheckResourceAttr( 33 "aws_db_instance.bar", "engine", "mysql"), 34 resource.TestCheckResourceAttr( 35 "aws_db_instance.bar", "engine_version", "5.6.21"), 36 resource.TestCheckResourceAttr( 37 "aws_db_instance.bar", "license_model", "general-public-license"), 38 resource.TestCheckResourceAttr( 39 "aws_db_instance.bar", "instance_class", "db.t1.micro"), 40 resource.TestCheckResourceAttr( 41 "aws_db_instance.bar", "name", "baz"), 42 resource.TestCheckResourceAttr( 43 "aws_db_instance.bar", "username", "foo"), 44 resource.TestCheckResourceAttr( 45 "aws_db_instance.bar", "parameter_group_name", "default.mysql5.6"), 46 ), 47 }, 48 }, 49 }) 50 } 51 52 func TestAccAWSDBInstanceReplica(t *testing.T) { 53 var s, r rds.DBInstance 54 55 resource.Test(t, resource.TestCase{ 56 PreCheck: func() { testAccPreCheck(t) }, 57 Providers: testAccProviders, 58 CheckDestroy: testAccCheckAWSDBInstanceDestroy, 59 Steps: []resource.TestStep{ 60 resource.TestStep{ 61 Config: testAccReplicaInstanceConfig(rand.New(rand.NewSource(time.Now().UnixNano())).Int()), 62 Check: resource.ComposeTestCheckFunc( 63 testAccCheckAWSDBInstanceExists("aws_db_instance.bar", &s), 64 testAccCheckAWSDBInstanceExists("aws_db_instance.replica", &r), 65 testAccCheckAWSDBInstanceReplicaAttributes(&s, &r), 66 ), 67 }, 68 }, 69 }) 70 } 71 72 func testAccCheckAWSDBInstanceDestroy(s *terraform.State) error { 73 conn := testAccProvider.Meta().(*AWSClient).rdsconn 74 75 for _, rs := range s.RootModule().Resources { 76 if rs.Type != "aws_db_instance" { 77 continue 78 } 79 80 // Try to find the Group 81 var err error 82 resp, err := conn.DescribeDBInstances( 83 &rds.DescribeDBInstancesInput{ 84 DBInstanceIdentifier: aws.String(rs.Primary.ID), 85 }) 86 87 if err == nil { 88 if len(resp.DBInstances) != 0 && 89 *resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID { 90 return fmt.Errorf("DB Instance still exists") 91 } 92 } 93 94 // Verify the error 95 newerr, ok := err.(awserr.Error) 96 if !ok { 97 return err 98 } 99 if newerr.Code() != "InvalidDBInstance.NotFound" { 100 return err 101 } 102 } 103 104 return nil 105 } 106 107 func testAccCheckAWSDBInstanceAttributes(v *rds.DBInstance) resource.TestCheckFunc { 108 return func(s *terraform.State) error { 109 110 if *v.Engine != "mysql" { 111 return fmt.Errorf("bad engine: %#v", *v.Engine) 112 } 113 114 if *v.EngineVersion != "5.6.21" { 115 return fmt.Errorf("bad engine_version: %#v", *v.EngineVersion) 116 } 117 118 if *v.BackupRetentionPeriod != 0 { 119 return fmt.Errorf("bad backup_retention_period: %#v", *v.BackupRetentionPeriod) 120 } 121 122 return nil 123 } 124 } 125 126 func testAccCheckAWSDBInstanceReplicaAttributes(source, replica *rds.DBInstance) resource.TestCheckFunc { 127 return func(s *terraform.State) error { 128 129 if replica.ReadReplicaSourceDBInstanceIdentifier != nil && *replica.ReadReplicaSourceDBInstanceIdentifier != *source.DBInstanceIdentifier { 130 return fmt.Errorf("bad source identifier for replica, expected: '%s', got: '%s'", *source.DBInstanceIdentifier, *replica.ReadReplicaSourceDBInstanceIdentifier) 131 } 132 133 return nil 134 } 135 } 136 137 func testAccCheckAWSDBInstanceExists(n string, v *rds.DBInstance) resource.TestCheckFunc { 138 return func(s *terraform.State) error { 139 rs, ok := s.RootModule().Resources[n] 140 if !ok { 141 return fmt.Errorf("Not found: %s", n) 142 } 143 144 if rs.Primary.ID == "" { 145 return fmt.Errorf("No DB Instance ID is set") 146 } 147 148 conn := testAccProvider.Meta().(*AWSClient).rdsconn 149 150 opts := rds.DescribeDBInstancesInput{ 151 DBInstanceIdentifier: aws.String(rs.Primary.ID), 152 } 153 154 resp, err := conn.DescribeDBInstances(&opts) 155 156 if err != nil { 157 return err 158 } 159 160 if len(resp.DBInstances) != 1 || 161 *resp.DBInstances[0].DBInstanceIdentifier != rs.Primary.ID { 162 return fmt.Errorf("DB Instance not found") 163 } 164 165 *v = *resp.DBInstances[0] 166 167 return nil 168 } 169 } 170 171 // Database names cannot collide, and deletion takes so long, that making the 172 // name a bit random helps so able we can kill a test that's just waiting for a 173 // delete and not be blocked on kicking off another one. 174 var testAccAWSDBInstanceConfig = fmt.Sprintf(` 175 resource "aws_db_instance" "bar" { 176 identifier = "foobarbaz-test-terraform-%d" 177 178 allocated_storage = 10 179 engine = "mysql" 180 engine_version = "5.6.21" 181 instance_class = "db.t1.micro" 182 name = "baz" 183 password = "barbarbarbar" 184 username = "foo" 185 186 backup_retention_period = 0 187 188 parameter_group_name = "default.mysql5.6" 189 }`, rand.New(rand.NewSource(time.Now().UnixNano())).Int()) 190 191 func testAccReplicaInstanceConfig(val int) string { 192 return fmt.Sprintf(` 193 resource "aws_db_instance" "bar" { 194 identifier = "foobarbaz-test-terraform-%d" 195 196 allocated_storage = 5 197 engine = "mysql" 198 engine_version = "5.6.21" 199 instance_class = "db.t1.micro" 200 name = "baz" 201 password = "barbarbarbar" 202 username = "foo" 203 204 backup_retention_period = 1 205 206 parameter_group_name = "default.mysql5.6" 207 } 208 209 resource "aws_db_instance" "replica" { 210 identifier = "tf-replica-db-%d" 211 backup_retention_period = 0 212 replicate_source_db = "${aws_db_instance.bar.identifier}" 213 allocated_storage = "${aws_db_instance.bar.allocated_storage}" 214 engine = "${aws_db_instance.bar.engine}" 215 engine_version = "${aws_db_instance.bar.engine_version}" 216 instance_class = "${aws_db_instance.bar.instance_class}" 217 password = "${aws_db_instance.bar.password}" 218 username = "${aws_db_instance.bar.username}" 219 tags { 220 Name = "tf-replica-db" 221 } 222 } 223 `, val, val) 224 }