Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…vider-aws into bculberson-GH-7212
  • Loading branch information
bflad committed Feb 22, 2019
2 parents bca0296 + 9b7a9b0 commit fd135f8
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 13 deletions.
27 changes: 20 additions & 7 deletions aws/resource_aws_rds_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -712,25 +712,34 @@ func resourceAwsRDSClusterCreate(d *schema.ResourceData, meta interface{}) error
}

} else {
if _, ok := d.GetOk("master_password"); !ok {
return fmt.Errorf(`provider.aws: aws_rds_cluster: %s: "master_password": required field is not set`, d.Get("database_name").(string))
}

if _, ok := d.GetOk("master_username"); !ok {
return fmt.Errorf(`provider.aws: aws_rds_cluster: %s: "master_username": required field is not set`, d.Get("database_name").(string))
if _, ok := d.GetOk("global_cluster_identifier"); !ok {
if _, ok := d.GetOk("master_password"); !ok {
return fmt.Errorf(`provider.aws: aws_db_instance: %s: "master_password": required field is not set`, d.Get("name").(string))
}

if _, ok := d.GetOk("master_username"); !ok {
return fmt.Errorf(`provider.aws: aws_db_instance: %s: "master_username": required field is not set`, d.Get("name").(string))
}
}

createOpts := &rds.CreateDBClusterInput{
DBClusterIdentifier: aws.String(identifier),
DeletionProtection: aws.Bool(d.Get("deletion_protection").(bool)),
Engine: aws.String(d.Get("engine").(string)),
EngineMode: aws.String(d.Get("engine_mode").(string)),
MasterUserPassword: aws.String(d.Get("master_password").(string)),
MasterUsername: aws.String(d.Get("master_username").(string)),
ScalingConfiguration: expandRdsScalingConfiguration(d.Get("scaling_configuration").([]interface{})),
Tags: tags,
}

if v, ok := d.GetOk("master_password"); ok && v.(string) != "" {
createOpts.MasterUserPassword = aws.String(v.(string))
}

if v, ok := d.GetOk("master_username"); ok && v.(string) != "" {
createOpts.MasterUsername = aws.String(v.(string))
}

// Need to check value > 0 due to:
// InvalidParameterValue: Backtrack is not enabled for the aurora-postgresql engine.
if v, ok := d.GetOk("backtrack_window"); ok && v.(int) > 0 {
Expand Down Expand Up @@ -785,6 +794,10 @@ func resourceAwsRDSClusterCreate(d *schema.ResourceData, meta interface{}) error
createOpts.KmsKeyId = aws.String(attr.(string))
}

if attr, ok := d.GetOk("source_region"); ok {
createOpts.SourceRegion = aws.String(attr.(string))
}

if attr, ok := d.GetOk("iam_database_authentication_enabled"); ok {
createOpts.EnableIAMDatabaseAuthentication = aws.Bool(attr.(bool))
}
Expand Down
60 changes: 56 additions & 4 deletions aws/resource_aws_rds_cluster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ func TestAccAWSRDSCluster_GlobalClusterIdentifier_Add(t *testing.T) {
CheckDestroy: testAccCheckAWSClusterDestroy,
Steps: []resource.TestStep{
{
Config: testAccAWSRDSClusterConfig_EngineMode(rName, "global"),
Config: testAccAWSRDSClusterConfig_GlobalEngineMode(rName),
Check: resource.ComposeTestCheckFunc(
testAccCheckAWSClusterExists(resourceName, &dbCluster1),
resource.TestCheckResourceAttr(resourceName, "global_cluster_identifier", ""),
Expand Down Expand Up @@ -735,7 +735,7 @@ func TestAccAWSRDSCluster_GlobalClusterIdentifier_Remove(t *testing.T) {
),
},
{
Config: testAccAWSRDSClusterConfig_EngineMode(rName, "global"),
Config: testAccAWSRDSClusterConfig_GlobalEngineMode(rName),
Check: resource.ComposeTestCheckFunc(
testAccCheckAWSClusterExists(resourceName, &dbCluster1),
resource.TestCheckResourceAttr(resourceName, "global_cluster_identifier", ""),
Expand Down Expand Up @@ -2245,6 +2245,22 @@ resource "aws_rds_cluster" "test" {
`, rName, deletionProtection)
}

func testAccAWSRDSClusterConfig_GlobalEngineMode(rName string) string {
return fmt.Sprintf(`
%s
resource "aws_rds_cluster" "test" {
depends_on = ["aws_db_subnet_group.dbsubnet"]
cluster_identifier = %q
engine_mode = "global"
db_subnet_group_name = %q
master_password = "barbarbarbar"
master_username = "foo"
skip_final_snapshot = true
}
`, testAccAWSRDSClusterConfig_GlobalNetwork(rName), rName, rName)
}

func testAccAWSRDSClusterConfig_EngineMode(rName, engineMode string) string {
return fmt.Sprintf(`
resource "aws_rds_cluster" "test" {
Expand All @@ -2257,40 +2273,76 @@ resource "aws_rds_cluster" "test" {
`, rName, engineMode)
}

func testAccAWSRDSClusterConfig_GlobalNetwork(rName string) string {
return fmt.Sprintf(`
data "aws_availability_zones" "azs" { }
resource "aws_vpc" "vpc" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "terraform-acctest-rds-cluster-global-cross-region"
}
}
resource "aws_subnet" "subnets" {
count = 2
vpc_id = "${aws_vpc.vpc.id}"
availability_zone = "${data.aws_availability_zones.azs.names[count.index]}"
cidr_block = "10.0.${count.index}.0/24"
tags = {
Name = "tf-acc-rds-cluster-global-cross-region-replica-${count.index}"
}
}
resource "aws_db_subnet_group" "dbsubnet" {
name = %q
subnet_ids = ["${aws_subnet.subnets.*.id}"]
}`, rName)

}

func testAccAWSRDSClusterConfig_GlobalClusterIdentifier(rName string) string {
return fmt.Sprintf(`
%s
resource "aws_rds_global_cluster" "test" {
global_cluster_identifier = %q
}
resource "aws_rds_cluster" "test" {
depends_on = ["aws_db_subnet_group.dbsubnet"]
cluster_identifier = %q
global_cluster_identifier = "${aws_rds_global_cluster.test.id}"
engine_mode = "global"
master_password = "barbarbarbar"
master_username = "foo"
skip_final_snapshot = true
db_subnet_group_name = "${aws_db_subnet_group.dbsubnet.name}"
}
`, rName, rName)
`, testAccAWSRDSClusterConfig_GlobalNetwork(rName), rName, rName)
}

func testAccAWSRDSClusterConfig_GlobalClusterIdentifier_Update(rName, globalClusterIdentifierResourceName string) string {
return fmt.Sprintf(`
%s
resource "aws_rds_global_cluster" "test" {
count = 2
global_cluster_identifier = "%s-${count.index}"
}
resource "aws_rds_cluster" "test" {
depends_on = ["aws_db_subnet_group.dbsubnet"]
cluster_identifier = %q
global_cluster_identifier = "${%s.id}"
engine_mode = "global"
master_password = "barbarbarbar"
master_username = "foo"
skip_final_snapshot = true
db_subnet_group_name = %q
}
`, rName, rName, globalClusterIdentifierResourceName)
`, testAccAWSRDSClusterConfig_GlobalNetwork(rName), rName, rName, globalClusterIdentifierResourceName, rName)
}

func testAccAWSRDSClusterConfig_ScalingConfiguration(rName string, autoPause bool, maxCapacity, minCapacity, secondsUntilAutoPause int) string {
Expand Down
5 changes: 3 additions & 2 deletions website/docs/r/rds_cluster.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,9 @@ The following arguments are supported:
* `cluster_identifier_prefix` - (Optional, Forces new resource) Creates a unique cluster identifier beginning with the specified prefix. Conflicts with `cluster_identifier`.
* `database_name` - (Optional) Name for an automatically created database on cluster creation. There are different naming restrictions per database engine: [RDS Naming Constraints][5]
* `deletion_protection` - (Optional) If the DB instance should have deletion protection enabled. The database can't be deleted when this value is set to `true`. The default is `false`.
* `master_password` - (Required unless a `snapshot_identifier` is provided) Password for the master DB user. Note that this may
* `master_password` - (Required unless a `snapshot_identifier` or `global_cluster_identifier` is provided) Password for the master DB user. Note that this may
show up in logs, and it will be stored in the state file. Please refer to the [RDS Naming Constraints][5]
* `master_username` - (Required unless a `snapshot_identifier` is provided) Username for the master DB user. Please refer to the [RDS Naming Constraints][5]
* `master_username` - (Required unless a `snapshot_identifier` or `global_cluster_identifier` is provided) Username for the master DB user. Please refer to the [RDS Naming Constraints][5]
* `final_snapshot_identifier` - (Optional) The name of your final DB snapshot
when this DB cluster is deleted. If omitted, no final snapshot will be
made.
Expand All @@ -103,6 +103,7 @@ Default: A 30-minute window selected at random from an 8-hour block of time per
* `vpc_security_group_ids` - (Optional) List of VPC security groups to associate
with the Cluster
* `snapshot_identifier` - (Optional) Specifies whether or not to create this cluster from a snapshot. You can use either the name or ARN when specifying a DB cluster snapshot, or the ARN when specifying a DB snapshot.
* `global_cluster_identifier` - (Optional) The global cluster identifier specified on [`aws_rds_global_cluster`](/docs/providers/aws/r/rds_global_cluster.html).
* `storage_encrypted` - (Optional) Specifies whether the DB cluster is encrypted. The default is `false` for `provisioned` `engine_mode` and `true` for `serverless` `engine_mode`.
* `replication_source_identifier` - (Optional) ARN of a source DB cluster or DB instance if this DB cluster is to be created as a Read Replica.
* `apply_immediately` - (Optional) Specifies whether any cluster modifications
Expand Down

0 comments on commit fd135f8

Please sign in to comment.