github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_rds_cluster_instance_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 "time" 8 9 "github.com/hashicorp/terraform/helper/acctest" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 13 "github.com/aws/aws-sdk-go/aws" 14 "github.com/aws/aws-sdk-go/aws/awserr" 15 "github.com/aws/aws-sdk-go/service/rds" 16 ) 17 18 func TestAccAWSRDSClusterInstance_basic(t *testing.T) { 19 var v rds.DBInstance 20 21 resource.Test(t, resource.TestCase{ 22 PreCheck: func() { testAccPreCheck(t) }, 23 Providers: testAccProviders, 24 CheckDestroy: testAccCheckAWSClusterDestroy, 25 Steps: []resource.TestStep{ 26 resource.TestStep{ 27 Config: testAccAWSClusterInstanceConfig(acctest.RandInt()), 28 Check: resource.ComposeTestCheckFunc( 29 testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v), 30 testAccCheckAWSDBClusterInstanceAttributes(&v), 31 ), 32 }, 33 }, 34 }) 35 } 36 37 // https://github.com/hashicorp/terraform/issues/5350 38 func TestAccAWSRDSClusterInstance_disappears(t *testing.T) { 39 var v rds.DBInstance 40 41 resource.Test(t, resource.TestCase{ 42 PreCheck: func() { testAccPreCheck(t) }, 43 Providers: testAccProviders, 44 CheckDestroy: testAccCheckAWSClusterDestroy, 45 Steps: []resource.TestStep{ 46 resource.TestStep{ 47 Config: testAccAWSClusterInstanceConfig(acctest.RandInt()), 48 Check: resource.ComposeTestCheckFunc( 49 testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v), 50 testAccAWSClusterInstanceDisappears(&v), 51 ), 52 // A non-empty plan is what we want. A crash is what we don't want. :) 53 ExpectNonEmptyPlan: true, 54 }, 55 }, 56 }) 57 } 58 59 func testAccCheckAWSClusterInstanceDestroy(s *terraform.State) error { 60 for _, rs := range s.RootModule().Resources { 61 if rs.Type != "aws_rds_cluster" { 62 continue 63 } 64 65 // Try to find the Group 66 conn := testAccProvider.Meta().(*AWSClient).rdsconn 67 var err error 68 resp, err := conn.DescribeDBInstances( 69 &rds.DescribeDBInstancesInput{ 70 DBInstanceIdentifier: aws.String(rs.Primary.ID), 71 }) 72 73 if err == nil { 74 if len(resp.DBInstances) != 0 && 75 *resp.DBInstances[0].DBInstanceIdentifier == rs.Primary.ID { 76 return fmt.Errorf("DB Cluster Instance %s still exists", rs.Primary.ID) 77 } 78 } 79 80 // Return nil if the Cluster Instance is already destroyed 81 if awsErr, ok := err.(awserr.Error); ok { 82 if awsErr.Code() == "DBInstanceNotFound" { 83 return nil 84 } 85 } 86 87 return err 88 89 } 90 91 return nil 92 } 93 94 func testAccCheckAWSDBClusterInstanceAttributes(v *rds.DBInstance) resource.TestCheckFunc { 95 return func(s *terraform.State) error { 96 97 if *v.Engine != "aurora" { 98 return fmt.Errorf("bad engine, expected \"aurora\": %#v", *v.Engine) 99 } 100 101 if !strings.HasPrefix(*v.DBClusterIdentifier, "tf-aurora-cluster") { 102 return fmt.Errorf("Bad Cluster Identifier prefix:\nexpected: %s\ngot: %s", "tf-aurora-cluster", *v.DBClusterIdentifier) 103 } 104 105 return nil 106 } 107 } 108 109 func testAccAWSClusterInstanceDisappears(v *rds.DBInstance) resource.TestCheckFunc { 110 return func(s *terraform.State) error { 111 conn := testAccProvider.Meta().(*AWSClient).rdsconn 112 opts := &rds.DeleteDBInstanceInput{ 113 DBInstanceIdentifier: v.DBInstanceIdentifier, 114 } 115 if _, err := conn.DeleteDBInstance(opts); err != nil { 116 return err 117 } 118 return resource.Retry(40*time.Minute, func() *resource.RetryError { 119 opts := &rds.DescribeDBInstancesInput{ 120 DBInstanceIdentifier: v.DBInstanceIdentifier, 121 } 122 _, err := conn.DescribeDBInstances(opts) 123 if err != nil { 124 dbinstanceerr, ok := err.(awserr.Error) 125 if ok && dbinstanceerr.Code() == "DBInstanceNotFound" { 126 return nil 127 } 128 return resource.NonRetryableError( 129 fmt.Errorf("Error retrieving DB Instances: %s", err)) 130 } 131 return resource.RetryableError(fmt.Errorf( 132 "Waiting for instance to be deleted: %v", v.DBInstanceIdentifier)) 133 }) 134 } 135 } 136 137 func testAccCheckAWSClusterInstanceExists(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 resp, err := conn.DescribeDBInstances(&rds.DescribeDBInstancesInput{ 150 DBInstanceIdentifier: aws.String(rs.Primary.ID), 151 }) 152 153 if err != nil { 154 return err 155 } 156 157 for _, d := range resp.DBInstances { 158 if *d.DBInstanceIdentifier == rs.Primary.ID { 159 *v = *d 160 return nil 161 } 162 } 163 164 return fmt.Errorf("DB Cluster (%s) not found", rs.Primary.ID) 165 } 166 } 167 168 // Add some random to the name, to avoid collision 169 func testAccAWSClusterInstanceConfig(n int) string { 170 return fmt.Sprintf(` 171 resource "aws_rds_cluster" "default" { 172 cluster_identifier = "tf-aurora-cluster-test-%d" 173 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 174 database_name = "mydb" 175 master_username = "foo" 176 master_password = "mustbeeightcharaters" 177 } 178 179 resource "aws_rds_cluster_instance" "cluster_instances" { 180 identifier = "tf-cluster-instance-%d" 181 cluster_identifier = "${aws_rds_cluster.default.id}" 182 instance_class = "db.r3.large" 183 } 184 185 `, n, n) 186 }