github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/builtin/providers/aws/resource_aws_rds_cluster_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "regexp" 6 "testing" 7 8 "github.com/hashicorp/terraform/helper/acctest" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 12 "github.com/aws/aws-sdk-go/aws" 13 "github.com/aws/aws-sdk-go/aws/awserr" 14 "github.com/aws/aws-sdk-go/service/rds" 15 ) 16 17 func TestAccAWSRDSCluster_basic(t *testing.T) { 18 var v rds.DBCluster 19 20 resource.Test(t, resource.TestCase{ 21 PreCheck: func() { testAccPreCheck(t) }, 22 Providers: testAccProviders, 23 CheckDestroy: testAccCheckAWSClusterDestroy, 24 Steps: []resource.TestStep{ 25 resource.TestStep{ 26 Config: testAccAWSClusterConfig(acctest.RandInt()), 27 Check: resource.ComposeTestCheckFunc( 28 testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), 29 resource.TestCheckResourceAttr( 30 "aws_rds_cluster.default", "storage_encrypted", "false"), 31 resource.TestCheckResourceAttr( 32 "aws_rds_cluster.default", "db_cluster_parameter_group_name", "default.aurora5.6"), 33 ), 34 }, 35 }, 36 }) 37 } 38 39 func TestAccAWSRDSCluster_updateTags(t *testing.T) { 40 var v rds.DBCluster 41 ri := acctest.RandInt() 42 43 resource.Test(t, resource.TestCase{ 44 PreCheck: func() { testAccPreCheck(t) }, 45 Providers: testAccProviders, 46 CheckDestroy: testAccCheckAWSClusterDestroy, 47 Steps: []resource.TestStep{ 48 resource.TestStep{ 49 Config: testAccAWSClusterConfig(ri), 50 Check: resource.ComposeTestCheckFunc( 51 testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), 52 resource.TestCheckResourceAttr( 53 "aws_rds_cluster.default", "tags.%", "1"), 54 ), 55 }, 56 resource.TestStep{ 57 Config: testAccAWSClusterConfigUpdatedTags(ri), 58 Check: resource.ComposeTestCheckFunc( 59 testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), 60 resource.TestCheckResourceAttr( 61 "aws_rds_cluster.default", "tags.%", "2"), 62 ), 63 }, 64 }, 65 }) 66 } 67 68 func TestAccAWSRDSCluster_kmsKey(t *testing.T) { 69 var v rds.DBCluster 70 keyRegex := regexp.MustCompile("^arn:aws:kms:") 71 72 resource.Test(t, resource.TestCase{ 73 PreCheck: func() { testAccPreCheck(t) }, 74 Providers: testAccProviders, 75 CheckDestroy: testAccCheckAWSClusterDestroy, 76 Steps: []resource.TestStep{ 77 resource.TestStep{ 78 Config: testAccAWSClusterConfig_kmsKey(acctest.RandInt()), 79 Check: resource.ComposeTestCheckFunc( 80 testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), 81 resource.TestMatchResourceAttr( 82 "aws_rds_cluster.default", "kms_key_id", keyRegex), 83 ), 84 }, 85 }, 86 }) 87 } 88 89 func TestAccAWSRDSCluster_encrypted(t *testing.T) { 90 var v rds.DBCluster 91 92 resource.Test(t, resource.TestCase{ 93 PreCheck: func() { testAccPreCheck(t) }, 94 Providers: testAccProviders, 95 CheckDestroy: testAccCheckAWSClusterDestroy, 96 Steps: []resource.TestStep{ 97 resource.TestStep{ 98 Config: testAccAWSClusterConfig_encrypted(acctest.RandInt()), 99 Check: resource.ComposeTestCheckFunc( 100 testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), 101 resource.TestCheckResourceAttr( 102 "aws_rds_cluster.default", "storage_encrypted", "true"), 103 resource.TestCheckResourceAttr( 104 "aws_rds_cluster.default", "db_cluster_parameter_group_name", "default.aurora5.6"), 105 ), 106 }, 107 }, 108 }) 109 } 110 111 func TestAccAWSRDSCluster_backupsUpdate(t *testing.T) { 112 var v rds.DBCluster 113 114 ri := acctest.RandInt() 115 resource.Test(t, resource.TestCase{ 116 PreCheck: func() { testAccPreCheck(t) }, 117 Providers: testAccProviders, 118 CheckDestroy: testAccCheckAWSClusterDestroy, 119 Steps: []resource.TestStep{ 120 resource.TestStep{ 121 Config: testAccAWSClusterConfig_backups(ri), 122 Check: resource.ComposeTestCheckFunc( 123 testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), 124 resource.TestCheckResourceAttr( 125 "aws_rds_cluster.default", "preferred_backup_window", "07:00-09:00"), 126 resource.TestCheckResourceAttr( 127 "aws_rds_cluster.default", "backup_retention_period", "5"), 128 resource.TestCheckResourceAttr( 129 "aws_rds_cluster.default", "preferred_maintenance_window", "tue:04:00-tue:04:30"), 130 ), 131 }, 132 133 resource.TestStep{ 134 Config: testAccAWSClusterConfig_backupsUpdate(ri), 135 Check: resource.ComposeTestCheckFunc( 136 testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), 137 resource.TestCheckResourceAttr( 138 "aws_rds_cluster.default", "preferred_backup_window", "03:00-09:00"), 139 resource.TestCheckResourceAttr( 140 "aws_rds_cluster.default", "backup_retention_period", "10"), 141 resource.TestCheckResourceAttr( 142 "aws_rds_cluster.default", "preferred_maintenance_window", "wed:01:00-wed:01:30"), 143 ), 144 }, 145 }, 146 }) 147 } 148 149 func testAccCheckAWSClusterDestroy(s *terraform.State) error { 150 for _, rs := range s.RootModule().Resources { 151 if rs.Type != "aws_rds_cluster" { 152 continue 153 } 154 155 // Try to find the Group 156 conn := testAccProvider.Meta().(*AWSClient).rdsconn 157 var err error 158 resp, err := conn.DescribeDBClusters( 159 &rds.DescribeDBClustersInput{ 160 DBClusterIdentifier: aws.String(rs.Primary.ID), 161 }) 162 163 if err == nil { 164 if len(resp.DBClusters) != 0 && 165 *resp.DBClusters[0].DBClusterIdentifier == rs.Primary.ID { 166 return fmt.Errorf("DB Cluster %s still exists", rs.Primary.ID) 167 } 168 } 169 170 // Return nil if the cluster is already destroyed 171 if awsErr, ok := err.(awserr.Error); ok { 172 if awsErr.Code() == "DBClusterNotFoundFault" { 173 return nil 174 } 175 } 176 177 return err 178 } 179 180 return nil 181 } 182 183 func testAccCheckAWSClusterExists(n string, v *rds.DBCluster) resource.TestCheckFunc { 184 return func(s *terraform.State) error { 185 rs, ok := s.RootModule().Resources[n] 186 if !ok { 187 return fmt.Errorf("Not found: %s", n) 188 } 189 190 if rs.Primary.ID == "" { 191 return fmt.Errorf("No DB Instance ID is set") 192 } 193 194 conn := testAccProvider.Meta().(*AWSClient).rdsconn 195 resp, err := conn.DescribeDBClusters(&rds.DescribeDBClustersInput{ 196 DBClusterIdentifier: aws.String(rs.Primary.ID), 197 }) 198 199 if err != nil { 200 return err 201 } 202 203 for _, c := range resp.DBClusters { 204 if *c.DBClusterIdentifier == rs.Primary.ID { 205 *v = *c 206 return nil 207 } 208 } 209 210 return fmt.Errorf("DB Cluster (%s) not found", rs.Primary.ID) 211 } 212 } 213 214 func testAccAWSClusterConfig(n int) string { 215 return fmt.Sprintf(` 216 resource "aws_rds_cluster" "default" { 217 cluster_identifier = "tf-aurora-cluster-%d" 218 availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] 219 database_name = "mydb" 220 master_username = "foo" 221 master_password = "mustbeeightcharaters" 222 db_cluster_parameter_group_name = "default.aurora5.6" 223 tags { 224 Environment = "production" 225 } 226 }`, n) 227 } 228 229 func testAccAWSClusterConfigUpdatedTags(n int) string { 230 return fmt.Sprintf(` 231 resource "aws_rds_cluster" "default" { 232 cluster_identifier = "tf-aurora-cluster-%d" 233 availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] 234 database_name = "mydb" 235 master_username = "foo" 236 master_password = "mustbeeightcharaters" 237 db_cluster_parameter_group_name = "default.aurora5.6" 238 tags { 239 Environment = "production" 240 AnotherTag = "test" 241 } 242 }`, n) 243 } 244 245 func testAccAWSClusterConfig_kmsKey(n int) string { 246 return fmt.Sprintf(` 247 248 resource "aws_kms_key" "foo" { 249 description = "Terraform acc test %d" 250 policy = <<POLICY 251 { 252 "Version": "2012-10-17", 253 "Id": "kms-tf-1", 254 "Statement": [ 255 { 256 "Sid": "Enable IAM User Permissions", 257 "Effect": "Allow", 258 "Principal": { 259 "AWS": "*" 260 }, 261 "Action": "kms:*", 262 "Resource": "*" 263 } 264 ] 265 } 266 POLICY 267 } 268 269 resource "aws_rds_cluster" "default" { 270 cluster_identifier = "tf-aurora-cluster-%d" 271 availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] 272 database_name = "mydb" 273 master_username = "foo" 274 master_password = "mustbeeightcharaters" 275 db_cluster_parameter_group_name = "default.aurora5.6" 276 storage_encrypted = true 277 kms_key_id = "${aws_kms_key.foo.arn}" 278 }`, n, n) 279 } 280 281 func testAccAWSClusterConfig_encrypted(n int) string { 282 return fmt.Sprintf(` 283 resource "aws_rds_cluster" "default" { 284 cluster_identifier = "tf-aurora-cluster-%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 }`, n) 291 } 292 293 func testAccAWSClusterConfig_backups(n int) string { 294 return fmt.Sprintf(` 295 resource "aws_rds_cluster" "default" { 296 cluster_identifier = "tf-aurora-cluster-%d" 297 availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] 298 database_name = "mydb" 299 master_username = "foo" 300 master_password = "mustbeeightcharaters" 301 backup_retention_period = 5 302 preferred_backup_window = "07:00-09:00" 303 preferred_maintenance_window = "tue:04:00-tue:04:30" 304 }`, n) 305 } 306 307 func testAccAWSClusterConfig_backupsUpdate(n int) string { 308 return fmt.Sprintf(` 309 resource "aws_rds_cluster" "default" { 310 cluster_identifier = "tf-aurora-cluster-%d" 311 availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] 312 database_name = "mydb" 313 master_username = "foo" 314 master_password = "mustbeeightcharaters" 315 backup_retention_period = 10 316 preferred_backup_window = "03:00-09:00" 317 preferred_maintenance_window = "wed:01:00-wed:01:30" 318 apply_immediately = true 319 }`, n) 320 }