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": {
|
||||
Type: schema.TypeBool,
|
||||
ForceNew: true,
|
||||
Optional: true,
|
||||
Default: false,
|
||||
},
|
||||
|
@ -178,7 +177,7 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error {
|
|||
d.Set("tags", tagsToMap(vpc.Tags))
|
||||
|
||||
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("ipv6_association_id", a.AssociationId)
|
||||
d.Set("ipv6_cidr_block", a.Ipv6CidrBlock)
|
||||
|
@ -344,6 +343,68 @@ func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error {
|
|||
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 {
|
||||
return err
|
||||
} 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 {
|
||||
filter1 := &ec2.Filter{
|
||||
Name: aws.String("default"),
|
||||
|
|
|
@ -46,7 +46,7 @@ func TestAccAWSVpc_enableIpv6(t *testing.T) {
|
|||
Steps: []resource.TestStep{
|
||||
{
|
||||
Config: testAccVpcConfigIpv6Enabled,
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
testAccCheckVpcExists("aws_vpc.foo", &vpc),
|
||||
testAccCheckVpcCidr(&vpc, "10.1.0.0/16"),
|
||||
resource.TestCheckResourceAttr(
|
||||
|
@ -55,6 +55,34 @@ func TestAccAWSVpc_enableIpv6(t *testing.T) {
|
|||
"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"),
|
||||
),
|
||||
},
|
||||
{
|
||||
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 = `
|
||||
resource "aws_vpc" "foo" {
|
||||
cidr_block = "10.1.0.0/16"
|
||||
|
|
Loading…
Reference in New Issue