package aws import ( "fmt" "math/rand" "testing" "time" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/rds" ) func TestAccAWSRDSCluster_basic(t *testing.T) { var v rds.DBCluster ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int() config := fmt.Sprintf(testAccAWSClusterConfig, ri) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckAWSClusterDestroy, Steps: []resource.TestStep{ resource.TestStep{ Config: config, Check: resource.ComposeTestCheckFunc( testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "storage_encrypted", "false"), ), }, }, }) } func TestAccAWSRDSCluster_encrypted(t *testing.T) { var v rds.DBCluster ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int() encConfig := fmt.Sprintf(testAccAWSClusterConfig_encrypted, ri) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckAWSClusterDestroy, Steps: []resource.TestStep{ resource.TestStep{ Config: encConfig, Check: resource.ComposeTestCheckFunc( testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "storage_encrypted", "true"), ), }, }, }) } func TestAccAWSRDSCluster_backupsUpdate(t *testing.T) { var v rds.DBCluster ri := rand.New(rand.NewSource(time.Now().UnixNano())).Int() preConfig := fmt.Sprintf(testAccAWSClusterConfig_backups, ri) postConfig := fmt.Sprintf(testAccAWSClusterConfig_backupsUpdate, ri) resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, CheckDestroy: testAccCheckAWSClusterDestroy, Steps: []resource.TestStep{ resource.TestStep{ Config: preConfig, Check: resource.ComposeTestCheckFunc( testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "preferred_backup_window", "07:00-09:00"), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "backup_retention_period", "5"), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "preferred_maintenance_window", "tue:04:00-tue:04:30"), ), }, resource.TestStep{ Config: postConfig, Check: resource.ComposeTestCheckFunc( testAccCheckAWSClusterExists("aws_rds_cluster.default", &v), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "preferred_backup_window", "03:00-09:00"), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "backup_retention_period", "10"), resource.TestCheckResourceAttr( "aws_rds_cluster.default", "preferred_maintenance_window", "wed:01:00-wed:01:30"), ), }, }, }) } func testAccCheckAWSClusterDestroy(s *terraform.State) error { for _, rs := range s.RootModule().Resources { if rs.Type != "aws_rds_cluster" { continue } // Try to find the Group conn := testAccProvider.Meta().(*AWSClient).rdsconn var err error resp, err := conn.DescribeDBClusters( &rds.DescribeDBClustersInput{ DBClusterIdentifier: aws.String(rs.Primary.ID), }) if err == nil { if len(resp.DBClusters) != 0 && *resp.DBClusters[0].DBClusterIdentifier == rs.Primary.ID { return fmt.Errorf("DB Cluster %s still exists", rs.Primary.ID) } } // Return nil if the cluster is already destroyed if awsErr, ok := err.(awserr.Error); ok { if awsErr.Code() == "DBClusterNotFoundFault" { return nil } } return err } return nil } func testAccCheckAWSClusterExists(n string, v *rds.DBCluster) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] if !ok { return fmt.Errorf("Not found: %s", n) } if rs.Primary.ID == "" { return fmt.Errorf("No DB Instance ID is set") } conn := testAccProvider.Meta().(*AWSClient).rdsconn resp, err := conn.DescribeDBClusters(&rds.DescribeDBClustersInput{ DBClusterIdentifier: aws.String(rs.Primary.ID), }) if err != nil { return err } for _, c := range resp.DBClusters { if *c.DBClusterIdentifier == rs.Primary.ID { *v = *c return nil } } return fmt.Errorf("DB Cluster (%s) not found", rs.Primary.ID) } } var testAccAWSClusterConfig = ` resource "aws_rds_cluster" "default" { cluster_identifier = "tf-aurora-cluster-%d" availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] database_name = "mydb" master_username = "foo" master_password = "mustbeeightcharaters" }` var testAccAWSClusterConfig_encrypted = ` resource "aws_rds_cluster" "default" { cluster_identifier = "tf-aurora-cluster-%d" availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] database_name = "mydb" master_username = "foo" master_password = "mustbeeightcharaters" storage_encrypted = true }` var testAccAWSClusterConfig_backups = ` resource "aws_rds_cluster" "default" { cluster_identifier = "tf-aurora-cluster-%d" availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] database_name = "mydb" master_username = "foo" master_password = "mustbeeightcharaters" backup_retention_period = 5 preferred_backup_window = "07:00-09:00" preferred_maintenance_window = "tue:04:00-tue:04:30" }` var testAccAWSClusterConfig_backupsUpdate = ` resource "aws_rds_cluster" "default" { cluster_identifier = "tf-aurora-cluster-%d" availability_zones = ["us-west-2a","us-west-2b","us-west-2c"] database_name = "mydb" master_username = "foo" master_password = "mustbeeightcharaters" backup_retention_period = 10 preferred_backup_window = "03:00-09:00" preferred_maintenance_window = "wed:01:00-wed:01:30" apply_immediately = true }`