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  }