github.com/gabrielperezs/terraform@v0.7.0-rc2.0.20160715084931-f7da2612946f/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    db_parameter_group_name = "${aws_db_parameter_group.bar.name}"
   184  }
   185  
   186  resource "aws_db_parameter_group" "bar" {
   187    name   = "tfcluster-test-group-%d"
   188    family = "aurora5.6"
   189  
   190    parameter {
   191      name         = "back_log"
   192      value        = "32767"
   193      apply_method = "pending-reboot"
   194    }
   195  
   196    tags {
   197      foo = "bar"
   198    }
   199  }
   200  `, n, n, n)
   201  }