github.com/boyvanduuren/terraform@v0.7.0-rc2.0.20160805175930-de822d909c40/builtin/providers/aws/resource_aws_rds_cluster_instance_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "regexp" 6 "strings" 7 "testing" 8 "time" 9 10 "github.com/hashicorp/terraform/helper/acctest" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 14 "github.com/aws/aws-sdk-go/aws" 15 "github.com/aws/aws-sdk-go/aws/awserr" 16 "github.com/aws/aws-sdk-go/service/rds" 17 ) 18 19 func TestAccAWSRDSClusterInstance_basic(t *testing.T) { 20 var v rds.DBInstance 21 22 resource.Test(t, resource.TestCase{ 23 PreCheck: func() { testAccPreCheck(t) }, 24 Providers: testAccProviders, 25 CheckDestroy: testAccCheckAWSClusterDestroy, 26 Steps: []resource.TestStep{ 27 resource.TestStep{ 28 Config: testAccAWSClusterInstanceConfig(acctest.RandInt()), 29 Check: resource.ComposeTestCheckFunc( 30 testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v), 31 testAccCheckAWSDBClusterInstanceAttributes(&v), 32 ), 33 }, 34 }, 35 }) 36 } 37 38 func TestAccAWSRDSClusterInstance_kmsKey(t *testing.T) { 39 var v rds.DBInstance 40 keyRegex := regexp.MustCompile("^arn:aws:kms:") 41 42 resource.Test(t, resource.TestCase{ 43 PreCheck: func() { testAccPreCheck(t) }, 44 Providers: testAccProviders, 45 CheckDestroy: testAccCheckAWSClusterDestroy, 46 Steps: []resource.TestStep{ 47 resource.TestStep{ 48 Config: testAccAWSClusterInstanceConfigKmsKey(acctest.RandInt()), 49 Check: resource.ComposeTestCheckFunc( 50 testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v), 51 resource.TestMatchResourceAttr( 52 "aws_rds_cluster_instance.cluster_instances", "kms_key_id", keyRegex), 53 ), 54 }, 55 }, 56 }) 57 } 58 59 // https://github.com/hashicorp/terraform/issues/5350 60 func TestAccAWSRDSClusterInstance_disappears(t *testing.T) { 61 var v rds.DBInstance 62 63 resource.Test(t, resource.TestCase{ 64 PreCheck: func() { testAccPreCheck(t) }, 65 Providers: testAccProviders, 66 CheckDestroy: testAccCheckAWSClusterDestroy, 67 Steps: []resource.TestStep{ 68 resource.TestStep{ 69 Config: testAccAWSClusterInstanceConfig(acctest.RandInt()), 70 Check: resource.ComposeTestCheckFunc( 71 testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v), 72 testAccAWSClusterInstanceDisappears(&v), 73 ), 74 // A non-empty plan is what we want. A crash is what we don't want. :) 75 ExpectNonEmptyPlan: true, 76 }, 77 }, 78 }) 79 } 80 81 func testAccCheckAWSClusterInstanceDestroy(s *terraform.State) error { 82 for _, rs := range s.RootModule().Resources { 83 if rs.Type != "aws_rds_cluster" { 84 continue 85 } 86 87 // Try to find the Group 88 conn := testAccProvider.Meta().(*AWSClient).rdsconn 89 var err error 90 resp, err := conn.DescribeDBInstances( 91 &rds.DescribeDBInstancesInput{ 92 DBInstanceIdentifier: aws.String(rs.Primary.ID), 93 }) 94 95 if err == nil { 96 if len(resp.DBInstances) != 0 && 97 *resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID { 98 return fmt.Errorf("DB Cluster Instance %s still exists", rs.Primary.ID) 99 } 100 } 101 102 // Return nil if the Cluster Instance is already destroyed 103 if awsErr, ok := err.(awserr.Error); ok { 104 if awsErr.Code() == "DBInstanceNotFound" { 105 return nil 106 } 107 } 108 109 return err 110 111 } 112 113 return nil 114 } 115 116 func testAccCheckAWSDBClusterInstanceAttributes(v *rds.DBInstance) resource.TestCheckFunc { 117 return func(s *terraform.State) error { 118 119 if *v.Engine != "aurora" { 120 return fmt.Errorf("bad engine, expected \"aurora\": %#v", *v.Engine) 121 } 122 123 if !strings.HasPrefix(*v.DBClusterIdentifier, "tf-aurora-cluster") { 124 return fmt.Errorf("Bad Cluster Identifier prefix:\nexpected: %s\ngot: %s", "tf-aurora-cluster", *v.DBClusterIdentifier) 125 } 126 127 return nil 128 } 129 } 130 131 func testAccAWSClusterInstanceDisappears(v *rds.DBInstance) resource.TestCheckFunc { 132 return func(s *terraform.State) error { 133 conn := testAccProvider.Meta().(*AWSClient).rdsconn 134 opts := &rds.DeleteDBInstanceInput{ 135 DBInstanceIdentifier: v.DBInstanceIdentifier, 136 } 137 if _, err := conn.DeleteDBInstance(opts); err != nil { 138 return err 139 } 140 return resource.Retry(40*time.Minute, func() *resource.RetryError { 141 opts := &rds.DescribeDBInstancesInput{ 142 DBInstanceIdentifier: v.DBInstanceIdentifier, 143 } 144 _, err := conn.DescribeDBInstances(opts) 145 if err != nil { 146 dbinstanceerr, ok := err.(awserr.Error) 147 if ok && dbinstanceerr.Code() == "DBInstanceNotFound" { 148 return nil 149 } 150 return resource.NonRetryableError( 151 fmt.Errorf("Error retrieving DB Instances: %s", err)) 152 } 153 return resource.RetryableError(fmt.Errorf( 154 "Waiting for instance to be deleted: %v", v.DBInstanceIdentifier)) 155 }) 156 } 157 } 158 159 func testAccCheckAWSClusterInstanceExists(n string, v *rds.DBInstance) resource.TestCheckFunc { 160 return func(s *terraform.State) error { 161 rs, ok := s.RootModule().Resources[n] 162 if !ok { 163 return fmt.Errorf("Not found: %s", n) 164 } 165 166 if rs.Primary.ID == "" { 167 return fmt.Errorf("No DB Instance ID is set") 168 } 169 170 conn := testAccProvider.Meta().(*AWSClient).rdsconn 171 resp, err := conn.DescribeDBInstances(&rds.DescribeDBInstancesInput{ 172 DBInstanceIdentifier: aws.String(rs.Primary.ID), 173 }) 174 175 if err != nil { 176 return err 177 } 178 179 for _, d := range resp.DBInstances { 180 if *d.DBInstanceIdentifier == rs.Primary.ID { 181 *v = *d 182 return nil 183 } 184 } 185 186 return fmt.Errorf("DB Cluster (%s) not found", rs.Primary.ID) 187 } 188 } 189 190 // Add some random to the name, to avoid collision 191 func testAccAWSClusterInstanceConfig(n int) string { 192 return fmt.Sprintf(` 193 resource "aws_rds_cluster" "default" { 194 cluster_identifier = "tf-aurora-cluster-test-%d" 195 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 196 database_name = "mydb" 197 master_username = "foo" 198 master_password = "mustbeeightcharaters" 199 } 200 201 resource "aws_rds_cluster_instance" "cluster_instances" { 202 identifier = "tf-cluster-instance-%d" 203 cluster_identifier = "${aws_rds_cluster.default.id}" 204 instance_class = "db.r3.large" 205 db_parameter_group_name = "${aws_db_parameter_group.bar.name}" 206 } 207 208 resource "aws_db_parameter_group" "bar" { 209 name = "tfcluster-test-group-%d" 210 family = "aurora5.6" 211 212 parameter { 213 name = "back_log" 214 value = "32767" 215 apply_method = "pending-reboot" 216 } 217 218 tags { 219 foo = "bar" 220 } 221 } 222 `, n, n, n) 223 } 224 225 func testAccAWSClusterInstanceConfigKmsKey(n int) string { 226 return fmt.Sprintf(` 227 228 resource "aws_kms_key" "foo" { 229 description = "Terraform acc test %d" 230 policy = <<POLICY 231 { 232 "Version": "2012-10-17", 233 "Id": "kms-tf-1", 234 "Statement": [ 235 { 236 "Sid": "Enable IAM User Permissions", 237 "Effect": "Allow", 238 "Principal": { 239 "AWS": "*" 240 }, 241 "Action": "kms:*", 242 "Resource": "*" 243 } 244 ] 245 } 246 POLICY 247 } 248 249 resource "aws_rds_cluster" "default" { 250 cluster_identifier = "tf-aurora-cluster-test-%d" 251 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 252 database_name = "mydb" 253 master_username = "foo" 254 master_password = "mustbeeightcharaters" 255 storage_encrypted = true 256 kms_key_id = "${aws_kms_key.foo.arn}" 257 } 258 259 resource "aws_rds_cluster_instance" "cluster_instances" { 260 identifier = "tf-cluster-instance-%d" 261 cluster_identifier = "${aws_rds_cluster.default.id}" 262 instance_class = "db.r3.large" 263 db_parameter_group_name = "${aws_db_parameter_group.bar.name}" 264 storage_encrypted = true 265 kms_key_id = "${aws_kms_key.foo.arn}" 266 } 267 268 resource "aws_db_parameter_group" "bar" { 269 name = "tfcluster-test-group-%d" 270 family = "aurora5.6" 271 272 parameter { 273 name = "back_log" 274 value = "32767" 275 apply_method = "pending-reboot" 276 } 277 278 tags { 279 foo = "bar" 280 } 281 } 282 `, n, n, n, n) 283 }