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 }