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  }