github.com/dougneal/terraform@v0.6.15-0.20170330092735-b6a3840768a4/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  			{
    28  				Config: testAccAWSClusterInstanceConfig(acctest.RandInt()),
    29  				Check: resource.ComposeTestCheckFunc(
    30  					testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v),
    31  					testAccCheckAWSDBClusterInstanceAttributes(&v),
    32  					resource.TestCheckResourceAttr("aws_rds_cluster_instance.cluster_instances", "auto_minor_version_upgrade", "true"),
    33  					resource.TestCheckResourceAttrSet("aws_rds_cluster_instance.cluster_instances", "preferred_maintenance_window"),
    34  					resource.TestCheckResourceAttrSet("aws_rds_cluster_instance.cluster_instances", "preferred_backup_window"),
    35  				),
    36  			},
    37  			{
    38  				Config: testAccAWSClusterInstanceConfigModified(acctest.RandInt()),
    39  				Check: resource.ComposeTestCheckFunc(
    40  					testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v),
    41  					testAccCheckAWSDBClusterInstanceAttributes(&v),
    42  					resource.TestCheckResourceAttr("aws_rds_cluster_instance.cluster_instances", "auto_minor_version_upgrade", "false"),
    43  				),
    44  			},
    45  		},
    46  	})
    47  }
    48  
    49  func TestAccAWSRDSClusterInstance_kmsKey(t *testing.T) {
    50  	var v rds.DBInstance
    51  	keyRegex := regexp.MustCompile("^arn:aws:kms:")
    52  
    53  	resource.Test(t, resource.TestCase{
    54  		PreCheck:     func() { testAccPreCheck(t) },
    55  		Providers:    testAccProviders,
    56  		CheckDestroy: testAccCheckAWSClusterDestroy,
    57  		Steps: []resource.TestStep{
    58  			{
    59  				Config: testAccAWSClusterInstanceConfigKmsKey(acctest.RandInt()),
    60  				Check: resource.ComposeTestCheckFunc(
    61  					testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v),
    62  					resource.TestMatchResourceAttr(
    63  						"aws_rds_cluster_instance.cluster_instances", "kms_key_id", keyRegex),
    64  				),
    65  			},
    66  		},
    67  	})
    68  }
    69  
    70  // https://github.com/hashicorp/terraform/issues/5350
    71  func TestAccAWSRDSClusterInstance_disappears(t *testing.T) {
    72  	var v rds.DBInstance
    73  
    74  	resource.Test(t, resource.TestCase{
    75  		PreCheck:     func() { testAccPreCheck(t) },
    76  		Providers:    testAccProviders,
    77  		CheckDestroy: testAccCheckAWSClusterDestroy,
    78  		Steps: []resource.TestStep{
    79  			{
    80  				Config: testAccAWSClusterInstanceConfig(acctest.RandInt()),
    81  				Check: resource.ComposeTestCheckFunc(
    82  					testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v),
    83  					testAccAWSClusterInstanceDisappears(&v),
    84  				),
    85  				// A non-empty plan is what we want. A crash is what we don't want. :)
    86  				ExpectNonEmptyPlan: true,
    87  			},
    88  		},
    89  	})
    90  }
    91  
    92  func testAccCheckAWSDBClusterInstanceAttributes(v *rds.DBInstance) resource.TestCheckFunc {
    93  	return func(s *terraform.State) error {
    94  
    95  		if *v.Engine != "aurora" {
    96  			return fmt.Errorf("bad engine, expected \"aurora\": %#v", *v.Engine)
    97  		}
    98  
    99  		if !strings.HasPrefix(*v.DBClusterIdentifier, "tf-aurora-cluster") {
   100  			return fmt.Errorf("Bad Cluster Identifier prefix:\nexpected: %s\ngot: %s", "tf-aurora-cluster", *v.DBClusterIdentifier)
   101  		}
   102  
   103  		return nil
   104  	}
   105  }
   106  
   107  func testAccAWSClusterInstanceDisappears(v *rds.DBInstance) resource.TestCheckFunc {
   108  	return func(s *terraform.State) error {
   109  		conn := testAccProvider.Meta().(*AWSClient).rdsconn
   110  		opts := &rds.DeleteDBInstanceInput{
   111  			DBInstanceIdentifier: v.DBInstanceIdentifier,
   112  		}
   113  		if _, err := conn.DeleteDBInstance(opts); err != nil {
   114  			return err
   115  		}
   116  		return resource.Retry(40*time.Minute, func() *resource.RetryError {
   117  			opts := &rds.DescribeDBInstancesInput{
   118  				DBInstanceIdentifier: v.DBInstanceIdentifier,
   119  			}
   120  			_, err := conn.DescribeDBInstances(opts)
   121  			if err != nil {
   122  				dbinstanceerr, ok := err.(awserr.Error)
   123  				if ok && dbinstanceerr.Code() == "DBInstanceNotFound" {
   124  					return nil
   125  				}
   126  				return resource.NonRetryableError(
   127  					fmt.Errorf("Error retrieving DB Instances: %s", err))
   128  			}
   129  			return resource.RetryableError(fmt.Errorf(
   130  				"Waiting for instance to be deleted: %v", v.DBInstanceIdentifier))
   131  		})
   132  	}
   133  }
   134  
   135  func testAccCheckAWSClusterInstanceExists(n string, v *rds.DBInstance) resource.TestCheckFunc {
   136  	return func(s *terraform.State) error {
   137  		rs, ok := s.RootModule().Resources[n]
   138  		if !ok {
   139  			return fmt.Errorf("Not found: %s", n)
   140  		}
   141  
   142  		if rs.Primary.ID == "" {
   143  			return fmt.Errorf("No DB Instance ID is set")
   144  		}
   145  
   146  		conn := testAccProvider.Meta().(*AWSClient).rdsconn
   147  		resp, err := conn.DescribeDBInstances(&rds.DescribeDBInstancesInput{
   148  			DBInstanceIdentifier: aws.String(rs.Primary.ID),
   149  		})
   150  
   151  		if err != nil {
   152  			return err
   153  		}
   154  
   155  		for _, d := range resp.DBInstances {
   156  			if *d.DBInstanceIdentifier == rs.Primary.ID {
   157  				*v = *d
   158  				return nil
   159  			}
   160  		}
   161  
   162  		return fmt.Errorf("DB Cluster (%s) not found", rs.Primary.ID)
   163  	}
   164  }
   165  
   166  func TestAccAWSRDSClusterInstance_withInstanceEnhancedMonitor(t *testing.T) {
   167  	var v rds.DBInstance
   168  
   169  	resource.Test(t, resource.TestCase{
   170  		PreCheck:     func() { testAccPreCheck(t) },
   171  		Providers:    testAccProviders,
   172  		CheckDestroy: testAccCheckAWSClusterDestroy,
   173  		Steps: []resource.TestStep{
   174  			{
   175  				Config: testAccAWSClusterInstanceEnhancedMonitor(acctest.RandInt()),
   176  				Check: resource.ComposeTestCheckFunc(
   177  					testAccCheckAWSClusterInstanceExists("aws_rds_cluster_instance.cluster_instances", &v),
   178  					testAccCheckAWSDBClusterInstanceAttributes(&v),
   179  				),
   180  			},
   181  		},
   182  	})
   183  }
   184  
   185  // Add some random to the name, to avoid collision
   186  func testAccAWSClusterInstanceConfig(n int) string {
   187  	return fmt.Sprintf(`
   188  resource "aws_rds_cluster" "default" {
   189    cluster_identifier = "tf-aurora-cluster-test-%d"
   190    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   191    database_name      = "mydb"
   192    master_username    = "foo"
   193    master_password    = "mustbeeightcharaters"
   194    skip_final_snapshot = true
   195  }
   196  
   197  resource "aws_rds_cluster_instance" "cluster_instances" {
   198    identifier              = "tf-cluster-instance-%d"
   199    cluster_identifier      = "${aws_rds_cluster.default.id}"
   200    instance_class          = "db.r3.large"
   201    db_parameter_group_name = "${aws_db_parameter_group.bar.name}"
   202    promotion_tier          = "3"
   203  }
   204  
   205  resource "aws_db_parameter_group" "bar" {
   206    name   = "tfcluster-test-group-%d"
   207    family = "aurora5.6"
   208  
   209    parameter {
   210      name         = "back_log"
   211      value        = "32767"
   212      apply_method = "pending-reboot"
   213    }
   214  
   215    tags {
   216      foo = "bar"
   217    }
   218  }
   219  `, n, n, n)
   220  }
   221  
   222  func testAccAWSClusterInstanceConfigModified(n int) string {
   223  	return fmt.Sprintf(`
   224  resource "aws_rds_cluster" "default" {
   225    cluster_identifier = "tf-aurora-cluster-test-%d"
   226    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   227    database_name      = "mydb"
   228    master_username    = "foo"
   229    master_password    = "mustbeeightcharaters"
   230    skip_final_snapshot = true
   231  }
   232  
   233  resource "aws_rds_cluster_instance" "cluster_instances" {
   234    identifier                 = "tf-cluster-instance-%d"
   235    cluster_identifier         = "${aws_rds_cluster.default.id}"
   236    instance_class             = "db.r3.large"
   237    db_parameter_group_name    = "${aws_db_parameter_group.bar.name}"
   238    auto_minor_version_upgrade = false
   239    promotion_tier             = "3"
   240  }
   241  
   242  resource "aws_db_parameter_group" "bar" {
   243    name   = "tfcluster-test-group-%d"
   244    family = "aurora5.6"
   245  
   246    parameter {
   247      name         = "back_log"
   248      value        = "32767"
   249      apply_method = "pending-reboot"
   250    }
   251  
   252    tags {
   253      foo = "bar"
   254    }
   255  }
   256  `, n, n, n)
   257  }
   258  
   259  func testAccAWSClusterInstanceConfigKmsKey(n int) string {
   260  	return fmt.Sprintf(`
   261  
   262  resource "aws_kms_key" "foo" {
   263      description = "Terraform acc test %d"
   264      policy = <<POLICY
   265  {
   266    "Version": "2012-10-17",
   267    "Id": "kms-tf-1",
   268    "Statement": [
   269      {
   270        "Sid": "Enable IAM User Permissions",
   271        "Effect": "Allow",
   272        "Principal": {
   273          "AWS": "*"
   274        },
   275        "Action": "kms:*",
   276        "Resource": "*"
   277      }
   278    ]
   279  }
   280  POLICY
   281  }
   282  
   283  resource "aws_rds_cluster" "default" {
   284    cluster_identifier = "tf-aurora-cluster-test-%d"
   285    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   286    database_name      = "mydb"
   287    master_username    = "foo"
   288    master_password    = "mustbeeightcharaters"
   289    storage_encrypted = true
   290    kms_key_id = "${aws_kms_key.foo.arn}"
   291    skip_final_snapshot = true
   292  }
   293  
   294  resource "aws_rds_cluster_instance" "cluster_instances" {
   295    identifier              = "tf-cluster-instance-%d"
   296    cluster_identifier      = "${aws_rds_cluster.default.id}"
   297    instance_class          = "db.r3.large"
   298    db_parameter_group_name = "${aws_db_parameter_group.bar.name}"
   299  }
   300  
   301  resource "aws_db_parameter_group" "bar" {
   302    name   = "tfcluster-test-group-%d"
   303    family = "aurora5.6"
   304  
   305    parameter {
   306      name         = "back_log"
   307      value        = "32767"
   308      apply_method = "pending-reboot"
   309    }
   310  
   311    tags {
   312      foo = "bar"
   313    }
   314  }
   315  `, n, n, n, n)
   316  }
   317  
   318  func testAccAWSClusterInstanceEnhancedMonitor(n int) string {
   319  	return fmt.Sprintf(`
   320  resource "aws_rds_cluster" "default" {
   321    cluster_identifier = "tf-aurora-cluster-test-%d"
   322    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   323    database_name      = "mydb"
   324    master_username    = "foo"
   325    master_password    = "mustbeeightcharaters"
   326    skip_final_snapshot = true
   327  }
   328  
   329  resource "aws_rds_cluster_instance" "cluster_instances" {
   330    identifier              = "tf-cluster-instance-%d"
   331    cluster_identifier      = "${aws_rds_cluster.default.id}"
   332    instance_class          = "db.r3.large"
   333    db_parameter_group_name = "${aws_db_parameter_group.bar.name}"
   334    monitoring_interval     = "60"
   335    monitoring_role_arn     = "${aws_iam_role.tf_enhanced_monitor_role.arn}"
   336  }
   337  
   338  resource "aws_iam_role" "tf_enhanced_monitor_role" {
   339      name = "tf_enhanced_monitor_role-%d"
   340      assume_role_policy = <<EOF
   341  {
   342              "Version": "2012-10-17",
   343              "Statement": [
   344                  {
   345                      "Action": "sts:AssumeRole",
   346                      "Principal": {
   347                          "Service": "monitoring.rds.amazonaws.com"
   348                      },
   349                      "Effect": "Allow",
   350                      "Sid": ""
   351                  }
   352              ]
   353     }
   354  EOF
   355  }
   356  
   357  resource "aws_iam_policy_attachment" "rds_m_attach" {
   358      name = "AmazonRDSEnhancedMonitoringRole"
   359      roles = ["${aws_iam_role.tf_enhanced_monitor_role.name}"]
   360      policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole"
   361  }
   362  
   363  resource "aws_db_parameter_group" "bar" {
   364    name   = "tfcluster-test-group-%d"
   365    family = "aurora5.6"
   366  
   367    parameter {
   368      name         = "back_log"
   369      value        = "32767"
   370      apply_method = "pending-reboot"
   371    }
   372  
   373    tags {
   374      foo = "bar"
   375    }
   376  }
   377  `, n, n, n, n)
   378  }