provider/aws: Support the ability to enable / disable ipv6 support in (#12527)
VPC ``` % make testacc TEST=./builtin/providers/aws TESTARGS='-run=TestAccAWSVpc_' ==> Checking that code complies with gofmt requirements... go generate $(go list ./... | grep -v /terraform/vendor/) 2017/03/28 15:49:20 Generated command/internal_plugin_list.go TF_ACC=1 go test ./builtin/providers/aws -v -run=TestAccAWSVpc_ -timeout 120m === RUN TestAccAWSVpc_importBasic --- PASS: TestAccAWSVpc_importBasic (102.01s) === RUN TestAccAWSVpc_basic --- PASS: TestAccAWSVpc_basic (63.75s) === RUN TestAccAWSVpc_enableIpv6 --- PASS: TestAccAWSVpc_enableIpv6 (231.41s) === RUN TestAccAWSVpc_dedicatedTenancy --- PASS: TestAccAWSVpc_dedicatedTenancy (66.65s) === RUN TestAccAWSVpc_tags --- PASS: TestAccAWSVpc_tags (130.26s) === RUN TestAccAWSVpc_update --- PASS: TestAccAWSVpc_update (120.21s) === RUN TestAccAWSVpc_bothDnsOptionsSet --- PASS: TestAccAWSVpc_bothDnsOptionsSet (50.10s) === RUN TestAccAWSVpc_DisabledDnsSupport --- PASS: TestAccAWSVpc_DisabledDnsSupport (67.47s) === RUN TestAccAWSVpc_classiclinkOptionSet --- PASS: TestAccAWSVpc_classiclinkOptionSet (64.57s) PASS ok github.com/hashicorp/terraform/builtin/providers/aws 896.464s ```
This commit is contained in:
parent
b6a3840768
commit
9ed8bb2498
|
@ -60,7 +60,6 @@ func resourceAwsVpc() *schema.Resource {
|
||||||
|
|
||||||
"assign_generated_ipv6_cidr_block": {
|
"assign_generated_ipv6_cidr_block": {
|
||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
ForceNew: true,
|
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Default: false,
|
Default: false,
|
||||||
},
|
},
|
||||||
|
@ -178,7 +177,7 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
d.Set("tags", tagsToMap(vpc.Tags))
|
d.Set("tags", tagsToMap(vpc.Tags))
|
||||||
|
|
||||||
for _, a := range vpc.Ipv6CidrBlockAssociationSet {
|
for _, a := range vpc.Ipv6CidrBlockAssociationSet {
|
||||||
if *a.Ipv6CidrBlockState.State == "associated" {
|
if *a.Ipv6CidrBlockState.State == "associated" { //we can only ever have 1 IPv6 block associated at once
|
||||||
d.Set("assign_generated_ipv6_cidr_block", true)
|
d.Set("assign_generated_ipv6_cidr_block", true)
|
||||||
d.Set("ipv6_association_id", a.AssociationId)
|
d.Set("ipv6_association_id", a.AssociationId)
|
||||||
d.Set("ipv6_cidr_block", a.Ipv6CidrBlock)
|
d.Set("ipv6_cidr_block", a.Ipv6CidrBlock)
|
||||||
|
@ -344,6 +343,68 @@ func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||||
d.SetPartial("enable_classiclink")
|
d.SetPartial("enable_classiclink")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if d.HasChange("assign_generated_ipv6_cidr_block") && !d.IsNewResource() {
|
||||||
|
toAssign := d.Get("assign_generated_ipv6_cidr_block").(bool)
|
||||||
|
|
||||||
|
log.Printf("[INFO] Modifying assign_generated_ipv6_cidr_block to %#v", toAssign)
|
||||||
|
|
||||||
|
if toAssign {
|
||||||
|
modifyOpts := &ec2.AssociateVpcCidrBlockInput{
|
||||||
|
VpcId: &vpcid,
|
||||||
|
AmazonProvidedIpv6CidrBlock: aws.Bool(toAssign),
|
||||||
|
}
|
||||||
|
log.Printf("[INFO] Enabling assign_generated_ipv6_cidr_block vpc attribute for %s: %#v",
|
||||||
|
d.Id(), modifyOpts)
|
||||||
|
resp, err := conn.AssociateVpcCidrBlock(modifyOpts)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the CIDR to become available
|
||||||
|
log.Printf(
|
||||||
|
"[DEBUG] Waiting for IPv6 CIDR (%s) to become associated",
|
||||||
|
d.Id())
|
||||||
|
stateConf := &resource.StateChangeConf{
|
||||||
|
Pending: []string{"associating", "disassociated"},
|
||||||
|
Target: []string{"associated"},
|
||||||
|
Refresh: Ipv6CidrStateRefreshFunc(conn, d.Id(), *resp.Ipv6CidrBlockAssociation.AssociationId),
|
||||||
|
Timeout: 1 * time.Minute,
|
||||||
|
}
|
||||||
|
if _, err := stateConf.WaitForState(); err != nil {
|
||||||
|
return fmt.Errorf(
|
||||||
|
"Error waiting for IPv6 CIDR (%s) to become associated: %s",
|
||||||
|
d.Id(), err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
modifyOpts := &ec2.DisassociateVpcCidrBlockInput{
|
||||||
|
AssociationId: aws.String(d.Get("ipv6_association_id").(string)),
|
||||||
|
}
|
||||||
|
log.Printf("[INFO] Disabling assign_generated_ipv6_cidr_block vpc attribute for %s: %#v",
|
||||||
|
d.Id(), modifyOpts)
|
||||||
|
if _, err := conn.DisassociateVpcCidrBlock(modifyOpts); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the CIDR to become available
|
||||||
|
log.Printf(
|
||||||
|
"[DEBUG] Waiting for IPv6 CIDR (%s) to become disassociated",
|
||||||
|
d.Id())
|
||||||
|
stateConf := &resource.StateChangeConf{
|
||||||
|
Pending: []string{"disassociating", "associated"},
|
||||||
|
Target: []string{"disassociated"},
|
||||||
|
Refresh: Ipv6CidrStateRefreshFunc(conn, d.Id(), d.Get("ipv6_association_id").(string)),
|
||||||
|
Timeout: 1 * time.Minute,
|
||||||
|
}
|
||||||
|
if _, err := stateConf.WaitForState(); err != nil {
|
||||||
|
return fmt.Errorf(
|
||||||
|
"Error waiting for IPv6 CIDR (%s) to become disassociated: %s",
|
||||||
|
d.Id(), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetPartial("assign_generated_ipv6_cidr_block")
|
||||||
|
}
|
||||||
|
|
||||||
if err := setTags(conn, d); err != nil {
|
if err := setTags(conn, d); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
|
@ -412,6 +473,41 @@ func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Ipv6CidrStateRefreshFunc(conn *ec2.EC2, id string, associationId string) resource.StateRefreshFunc {
|
||||||
|
return func() (interface{}, string, error) {
|
||||||
|
describeVpcOpts := &ec2.DescribeVpcsInput{
|
||||||
|
VpcIds: []*string{aws.String(id)},
|
||||||
|
}
|
||||||
|
resp, err := conn.DescribeVpcs(describeVpcOpts)
|
||||||
|
if err != nil {
|
||||||
|
if ec2err, ok := err.(awserr.Error); ok && ec2err.Code() == "InvalidVpcID.NotFound" {
|
||||||
|
resp = nil
|
||||||
|
} else {
|
||||||
|
log.Printf("Error on VPCStateRefresh: %s", err)
|
||||||
|
return nil, "", err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp == nil {
|
||||||
|
// Sometimes AWS just has consistency issues and doesn't see
|
||||||
|
// our instance yet. Return an empty state.
|
||||||
|
return nil, "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.Vpcs[0].Ipv6CidrBlockAssociationSet == nil {
|
||||||
|
return nil, "", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, association := range resp.Vpcs[0].Ipv6CidrBlockAssociationSet {
|
||||||
|
if *association.AssociationId == associationId {
|
||||||
|
return association, *association.Ipv6CidrBlockState.State, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, "", nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func resourceAwsVpcSetDefaultNetworkAcl(conn *ec2.EC2, d *schema.ResourceData) error {
|
func resourceAwsVpcSetDefaultNetworkAcl(conn *ec2.EC2, d *schema.ResourceData) error {
|
||||||
filter1 := &ec2.Filter{
|
filter1 := &ec2.Filter{
|
||||||
Name: aws.String("default"),
|
Name: aws.String("default"),
|
||||||
|
|
|
@ -46,7 +46,7 @@ func TestAccAWSVpc_enableIpv6(t *testing.T) {
|
||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
{
|
{
|
||||||
Config: testAccVpcConfigIpv6Enabled,
|
Config: testAccVpcConfigIpv6Enabled,
|
||||||
Check: resource.ComposeTestCheckFunc(
|
Check: resource.ComposeAggregateTestCheckFunc(
|
||||||
testAccCheckVpcExists("aws_vpc.foo", &vpc),
|
testAccCheckVpcExists("aws_vpc.foo", &vpc),
|
||||||
testAccCheckVpcCidr(&vpc, "10.1.0.0/16"),
|
testAccCheckVpcCidr(&vpc, "10.1.0.0/16"),
|
||||||
resource.TestCheckResourceAttr(
|
resource.TestCheckResourceAttr(
|
||||||
|
@ -55,6 +55,34 @@ func TestAccAWSVpc_enableIpv6(t *testing.T) {
|
||||||
"aws_vpc.foo", "ipv6_association_id"),
|
"aws_vpc.foo", "ipv6_association_id"),
|
||||||
resource.TestCheckResourceAttrSet(
|
resource.TestCheckResourceAttrSet(
|
||||||
"aws_vpc.foo", "ipv6_cidr_block"),
|
"aws_vpc.foo", "ipv6_cidr_block"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_vpc.foo", "assign_generated_ipv6_cidr_block", "true"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Config: testAccVpcConfigIpv6Disabled,
|
||||||
|
Check: resource.ComposeAggregateTestCheckFunc(
|
||||||
|
testAccCheckVpcExists("aws_vpc.foo", &vpc),
|
||||||
|
testAccCheckVpcCidr(&vpc, "10.1.0.0/16"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_vpc.foo", "cidr_block", "10.1.0.0/16"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_vpc.foo", "assign_generated_ipv6_cidr_block", "false"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Config: testAccVpcConfigIpv6Enabled,
|
||||||
|
Check: resource.ComposeAggregateTestCheckFunc(
|
||||||
|
testAccCheckVpcExists("aws_vpc.foo", &vpc),
|
||||||
|
testAccCheckVpcCidr(&vpc, "10.1.0.0/16"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_vpc.foo", "cidr_block", "10.1.0.0/16"),
|
||||||
|
resource.TestCheckResourceAttrSet(
|
||||||
|
"aws_vpc.foo", "ipv6_association_id"),
|
||||||
|
resource.TestCheckResourceAttrSet(
|
||||||
|
"aws_vpc.foo", "ipv6_cidr_block"),
|
||||||
|
resource.TestCheckResourceAttr(
|
||||||
|
"aws_vpc.foo", "assign_generated_ipv6_cidr_block", "true"),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -283,6 +311,12 @@ resource "aws_vpc" "foo" {
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const testAccVpcConfigIpv6Disabled = `
|
||||||
|
resource "aws_vpc" "foo" {
|
||||||
|
cidr_block = "10.1.0.0/16"
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
const testAccVpcConfigUpdate = `
|
const testAccVpcConfigUpdate = `
|
||||||
resource "aws_vpc" "foo" {
|
resource "aws_vpc" "foo" {
|
||||||
cidr_block = "10.1.0.0/16"
|
cidr_block = "10.1.0.0/16"
|
||||||
|
|
Loading…
Reference in New Issue