From 38a8232e9a3234377a07a1360bc9e380ee393641 Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Wed, 25 Feb 2015 15:04:17 +0530 Subject: [PATCH 01/31] Added Connection to config --- builtin/providers/aws/config.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/builtin/providers/aws/config.go b/builtin/providers/aws/config.go index 7a1896c14..9d324e495 100644 --- a/builtin/providers/aws/config.go +++ b/builtin/providers/aws/config.go @@ -14,6 +14,7 @@ import ( awsGo "github.com/awslabs/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/gen/autoscaling" + awsEc2 "github.com/awslabs/aws-sdk-go/gen/ec2" "github.com/awslabs/aws-sdk-go/gen/route53" "github.com/awslabs/aws-sdk-go/gen/s3" ) @@ -32,6 +33,7 @@ type AWSClient struct { rdsconn *rds.Rds r53conn *route53.Route53 region string + awsEc2conn *awsEc2.EC2 } // Client configures and returns a fully initailized AWSClient @@ -76,6 +78,10 @@ func (c *Config) Client() (interface{}, error) { // See http://docs.aws.amazon.com/general/latest/gr/sigv4_changes.html log.Println("[INFO] Initializing Route53 connection") client.r53conn = route53.New(creds, "us-east-1", nil) + + //Check about using us-east-1 for all + log.Println("[INFO] Initializing AWS-GO EC2 Connection") + client.awsEc2conn = awsEc2.New(creds, "us-east-1", nil) } if len(errs) > 0 { From 1472f976d7dabf4702edef4a166253a48b033db9 Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Wed, 25 Feb 2015 16:17:55 +0530 Subject: [PATCH 02/31] First refactor --- builtin/providers/aws/resource_aws_vpc.go | 74 +++++++++++++++-------- 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index f4ac2162e..496096106 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -5,9 +5,10 @@ import ( "log" "time" + awsGo "github.com/awslabs/aws-sdk-go/aws" + "github.com/awslabs/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" - "github.com/mitchellh/goamz/ec2" ) func resourceAwsVpc() *schema.Resource { @@ -57,29 +58,33 @@ func resourceAwsVpc() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + // "tags": tagsSchema(), }, } } func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn - + ec2conn := meta.(*AWSClient).awsEc2conn + cidr := d.Get("cidr_block").(string) + instance_tenancy := "default" + if v := d.Get("instance_tenancy"); v != nil { + instance_tenancy = v.(string) + } // Create the VPC - createOpts := &ec2.CreateVpc{ - CidrBlock: d.Get("cidr_block").(string), - InstanceTenancy: d.Get("instance_tenancy").(string), + createOpts := &ec2.CreateVPCRequest{ + CIDRBlock: &cidr, + InstanceTenancy: &instance_tenancy, } log.Printf("[DEBUG] VPC create config: %#v", createOpts) - vpcResp, err := ec2conn.CreateVpc(createOpts) + vpcResp, err := ec2conn.CreateVPC(createOpts) if err != nil { return fmt.Errorf("Error creating VPC: %s", err) } // Get the ID and store it - vpc := &vpcResp.VPC - log.Printf("[INFO] VPC ID: %s", vpc.VpcId) - d.SetId(vpc.VpcId) + vpc := vpcResp.VPC + d.SetId(*vpc.VPCID) + log.Printf("[INFO] VPC ID: %s", d.Id()) // Set partial mode and say that we setup the cidr block d.Partial(true) @@ -106,7 +111,7 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn + ec2conn := meta.(*AWSClient).awsEc2conn // Refresh the VPC state vpcRaw, _, err := VPCStateRefreshFunc(ec2conn, d.Id())() @@ -120,34 +125,53 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { // VPC stuff vpc := vpcRaw.(*ec2.VPC) - d.Set("cidr_block", vpc.CidrBlock) + vpcid := d.Id() + d.Set("cidr_block", vpc.CIDRBlock) - // Tags - d.Set("tags", tagsToMap(vpc.Tags)) + // Tags - TBD rmenn + //d.Set("tags", tagsToMap(vpc.Tags)) // Attributes - resp, err := ec2conn.VpcAttribute(d.Id(), "enableDnsSupport") + attribute := "enableDnsSupport" + DescribeAttrOpts := &ec2.DescribeVPCAttributeRequest{ + Attribute: &attribute, + VPCID: &vpcid, + } + resp, err := ec2conn.DescribeVPCAttribute(DescribeAttrOpts) if err != nil { return err } - d.Set("enable_dns_support", resp.EnableDnsSupport) - - resp, err = ec2conn.VpcAttribute(d.Id(), "enableDnsHostnames") + d.Set("enable_dns_support", *resp.EnableDNSSupport) + attribute = "enableDnsHostnames" + DescribeAttrOpts = &ec2.DescribeVPCAttributeRequest{ + Attribute: &attribute, + VPCID: &vpcid, + } + resp, err = ec2conn.DescribeVPCAttribute(DescribeAttrOpts) if err != nil { return err } - d.Set("enable_dns_hostnames", resp.EnableDnsHostnames) + d.Set("enable_dns_hostnames", *resp.EnableDNSHostnames) // Get the main routing table for this VPC - filter := ec2.NewFilter() - filter.Add("association.main", "true") - filter.Add("vpc-id", d.Id()) - routeResp, err := ec2conn.DescribeRouteTables(nil, filter) + // Really Ugly need to make this better - rmenn + filter1 := &ec2.Filter{ + Name: awsGo.String("association.main"), + Values: []string{("true")}, + } + filter2 := &ec2.Filter{ + Name: awsGo.String("VPCID"), + Values: []string{(d.Id())}, + } + DescribeRouteOpts := &ec2.DescribeRouteTablesRequest{ + Filters: []ec2.Filter{*filter1, *filter2}, + } + routeResp, err := ec2conn.DescribeRouteTables(DescribeRouteOpts) if err != nil { return err } if v := routeResp.RouteTables; len(v) > 0 { - d.Set("main_route_table_id", v[0].RouteTableId) + d.Set("main_route_table_id", *v[0].RouteTableID) } resourceAwsVpcSetDefaultNetworkAcl(ec2conn, d) From 06b2d0bbf61c5a0810747e14aad99e45fd744466 Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Wed, 25 Feb 2015 17:34:27 +0530 Subject: [PATCH 03/31] VPC Refactor --- builtin/providers/aws/resource_aws_vpc.go | 101 ++++++++++++++-------- 1 file changed, 64 insertions(+), 37 deletions(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index 496096106..153eda29a 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -181,20 +181,24 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn + ec2conn := meta.(*AWSClient).awsEc2conn // Turn on partial mode d.Partial(true) - + vpcid := d.Id() + modifyOpts := &ec2.ModifyVPCAttributeRequest{ + VPCID: &vpcid, + } if d.HasChange("enable_dns_hostnames") { - options := new(ec2.ModifyVpcAttribute) - options.EnableDnsHostnames = d.Get("enable_dns_hostnames").(bool) - options.SetEnableDnsHostnames = true + val := d.Get("enable_dns_hostnames").(bool) + modifyOpts.EnableDNSHostnames = &ec2.AttributeBooleanValue{ + Value: &val, + } log.Printf( "[INFO] Modifying enable_dns_hostnames vpc attribute for %s: %#v", - d.Id(), options) - if _, err := ec2conn.ModifyVpcAttribute(d.Id(), options); err != nil { + d.Id(), modifyOpts) + if err := ec2conn.ModifyVPCAttribute(modifyOpts); err != nil { return err } @@ -202,36 +206,40 @@ func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { } if d.HasChange("enable_dns_support") { - options := new(ec2.ModifyVpcAttribute) - options.EnableDnsSupport = d.Get("enable_dns_support").(bool) - options.SetEnableDnsSupport = true + val := d.Get("enable_dns_hostnames").(bool) + modifyOpts.EnableDNSSupport = &ec2.AttributeBooleanValue{ + Value: &val, + } log.Printf( "[INFO] Modifying enable_dns_support vpc attribute for %s: %#v", - d.Id(), options) - if _, err := ec2conn.ModifyVpcAttribute(d.Id(), options); err != nil { + d.Id(), modifyOpts) + if err := ec2conn.ModifyVPCAttribute(modifyOpts); err != nil { return err } d.SetPartial("enable_dns_support") } - - if err := setTags(ec2conn, d); err != nil { - return err - } else { - d.SetPartial("tags") - } + //Tagging Support need to be worked on - rmenn + // if err := setTags(ec2conn, d); err != nil { + // return err + // } else { + // d.SetPartial("tags") + // } d.Partial(false) return resourceAwsVpcRead(d, meta) } func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn - + ec2conn := meta.(*AWSClient).awsEc2conn + vpcID := d.Id() + DeleteVpcOpts := &ec2.DeleteVPCRequest{ + VPCID: &vpcID, + } log.Printf("[INFO] Deleting VPC: %s", d.Id()) - if _, err := ec2conn.DeleteVpc(d.Id()); err != nil { - ec2err, ok := err.(*ec2.Error) + if err := ec2conn.DeleteVPC(DeleteVpcOpts); err != nil { + ec2err, ok := err.(*awsGo.APIError) if ok && ec2err.Code == "InvalidVpcID.NotFound" { return nil } @@ -246,9 +254,12 @@ func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { // a VPC. func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - resp, err := conn.DescribeVpcs([]string{id}, ec2.NewFilter()) + DescribeVpcOpts := &ec2.DescribeVPCsRequest{ + VPCIDs: []string{id}, + } + resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err != nil { - if ec2err, ok := err.(*ec2.Error); ok && ec2err.Code == "InvalidVpcID.NotFound" { + if ec2err, ok := err.(*awsGo.APIError); ok && ec2err.Code == "InvalidVpcID.NotFound" { resp = nil } else { log.Printf("Error on VPCStateRefresh: %s", err) @@ -263,37 +274,53 @@ func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { } vpc := &resp.VPCs[0] - return vpc, vpc.State, nil + return vpc, *vpc.State, nil } } func resourceAwsVpcSetDefaultNetworkAcl(conn *ec2.EC2, d *schema.ResourceData) error { - filter := ec2.NewFilter() - filter.Add("default", "true") - filter.Add("vpc-id", d.Id()) - networkAclResp, err := conn.NetworkAcls(nil, filter) + filter1 := &ec2.Filter{ + Name: awsGo.String("default"), + Values: []string{("true")}, + } + filter2 := &ec2.Filter{ + Name: awsGo.String("vpc-id"), + Values: []string{(d.Id())}, + } + DescribeNetworkACLOpts := &ec2.DescribeNetworkACLsRequest{ + Filters: []ec2.Filter{*filter1, *filter2}, + } + networkAclResp, err := conn.DescribeNetworkACLs(DescribeNetworkACLOpts) if err != nil { return err } - if v := networkAclResp.NetworkAcls; len(v) > 0 { - d.Set("default_network_acl_id", v[0].NetworkAclId) + if v := networkAclResp.NetworkACLs; len(v) > 0 { + d.Set("default_network_acl_id", v[0].NetworkACLID) } return nil } func resourceAwsVpcSetDefaultSecurityGroup(conn *ec2.EC2, d *schema.ResourceData) error { - filter := ec2.NewFilter() - filter.Add("group-name", "default") - filter.Add("vpc-id", d.Id()) - securityGroupResp, err := conn.SecurityGroups(nil, filter) + filter1 := &ec2.Filter{ + Name: awsGo.String("group-name"), + Values: []string{("default")}, + } + filter2 := &ec2.Filter{ + Name: awsGo.String("vpc-id"), + Values: []string{(d.Id())}, + } + DescribeSgOpts := &ec2.DescribeSecurityGroupsRequest{ + Filters: []ec2.Filter{*filter1, *filter2}, + } + securityGroupResp, err := conn.DescribeSecurityGroups(DescribeSgOpts) if err != nil { return err } - if v := securityGroupResp.Groups; len(v) > 0 { - d.Set("default_security_group_id", v[0].Id) + if v := securityGroupResp.SecurityGroups; len(v) > 0 { + d.Set("default_security_group_id", v[0].GroupID) } return nil From 89d01b49aba8a48b0b9f58559a02ff4eb1a287fc Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Mon, 2 Mar 2015 14:21:13 +0530 Subject: [PATCH 04/31] Refactor with Acceptance Tests --- builtin/providers/aws/config.go | 2 +- builtin/providers/aws/resource_aws_vpc.go | 8 +- .../providers/aws/resource_aws_vpc_test.go | 87 ++++++++++--------- 3 files changed, 52 insertions(+), 45 deletions(-) diff --git a/builtin/providers/aws/config.go b/builtin/providers/aws/config.go index 9d324e495..c4d9a09f0 100644 --- a/builtin/providers/aws/config.go +++ b/builtin/providers/aws/config.go @@ -81,7 +81,7 @@ func (c *Config) Client() (interface{}, error) { //Check about using us-east-1 for all log.Println("[INFO] Initializing AWS-GO EC2 Connection") - client.awsEc2conn = awsEc2.New(creds, "us-east-1", nil) + client.awsEc2conn = awsEc2.New(creds, c.Region, nil) } if len(errs) > 0 { diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index 153eda29a..d3207dfa7 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -67,7 +67,7 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { ec2conn := meta.(*AWSClient).awsEc2conn cidr := d.Get("cidr_block").(string) instance_tenancy := "default" - if v := d.Get("instance_tenancy"); v != nil { + if v, ok := d.GetOk("instance_tenancy"); ok { instance_tenancy = v.(string) } // Create the VPC @@ -75,10 +75,10 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { CIDRBlock: &cidr, InstanceTenancy: &instance_tenancy, } - log.Printf("[DEBUG] VPC create config: %#v", createOpts) + log.Printf("[DEBUG] VPC create config: %#v", *createOpts) vpcResp, err := ec2conn.CreateVPC(createOpts) if err != nil { - return fmt.Errorf("Error creating VPC: %s", err) + return fmt.Errorf("Error creating VPC: %s : %s", err) } // Get the ID and store it @@ -160,7 +160,7 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { Values: []string{("true")}, } filter2 := &ec2.Filter{ - Name: awsGo.String("VPCID"), + Name: awsGo.String("vpc-id"), Values: []string{(d.Id())}, } DescribeRouteOpts := &ec2.DescribeRouteTablesRequest{ diff --git a/builtin/providers/aws/resource_aws_vpc_test.go b/builtin/providers/aws/resource_aws_vpc_test.go index b555e0875..f91d2ac76 100644 --- a/builtin/providers/aws/resource_aws_vpc_test.go +++ b/builtin/providers/aws/resource_aws_vpc_test.go @@ -2,11 +2,11 @@ package aws import ( "fmt" - "testing" - + awsGo "github.com/awslabs/aws-sdk-go/aws" + "github.com/awslabs/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" - "github.com/mitchellh/goamz/ec2" + "testing" ) func TestAccVpc_basic(t *testing.T) { @@ -50,36 +50,36 @@ func TestAccVpc_dedicatedTenancy(t *testing.T) { }) } -func TestAccVpc_tags(t *testing.T) { - var vpc ec2.VPC - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckVpcDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccVpcConfigTags, - Check: resource.ComposeTestCheckFunc( - testAccCheckVpcExists("aws_vpc.foo", &vpc), - testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), - resource.TestCheckResourceAttr( - "aws_vpc.foo", "cidr_block", "10.1.0.0/16"), - testAccCheckTags(&vpc.Tags, "foo", "bar"), - ), - }, - - resource.TestStep{ - Config: testAccVpcConfigTagsUpdate, - Check: resource.ComposeTestCheckFunc( - testAccCheckVpcExists("aws_vpc.foo", &vpc), - testAccCheckTags(&vpc.Tags, "foo", ""), - testAccCheckTags(&vpc.Tags, "bar", "baz"), - ), - }, - }, - }) -} +//func TestAccVpc_tags(t *testing.T) { +// var vpc ec2.VPC +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testAccCheckVpcDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccVpcConfigTags, +// Check: resource.ComposeTestCheckFunc( +// testAccCheckVpcExists("aws_vpc.foo", &vpc), +// testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), +// resource.TestCheckResourceAttr( +// "aws_vpc.foo", "cidr_block", "10.1.0.0/16"), +// testAccCheckTags(&vpc.Tags, "foo", "bar"), +// ), +// }, +// +// resource.TestStep{ +// Config: testAccVpcConfigTagsUpdate, +// Check: resource.ComposeTestCheckFunc( +// testAccCheckVpcExists("aws_vpc.foo", &vpc), +// testAccCheckTags(&vpc.Tags, "foo", ""), +// testAccCheckTags(&vpc.Tags, "bar", "baz"), +// ), +// }, +// }, +// }) +//} func TestAccVpcUpdate(t *testing.T) { var vpc ec2.VPC @@ -111,7 +111,7 @@ func TestAccVpcUpdate(t *testing.T) { } func testAccCheckVpcDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).ec2conn + conn := testAccProvider.Meta().(*AWSClient).awsEc2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_vpc" { @@ -119,7 +119,10 @@ func testAccCheckVpcDestroy(s *terraform.State) error { } // Try to find the VPC - resp, err := conn.DescribeVpcs([]string{rs.Primary.ID}, ec2.NewFilter()) + DescribeVpcOpts := &ec2.DescribeVPCsRequest{ + VPCIDs: []string{rs.Primary.ID}, + } + resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err == nil { if len(resp.VPCs) > 0 { return fmt.Errorf("VPCs still exist.") @@ -129,7 +132,7 @@ func testAccCheckVpcDestroy(s *terraform.State) error { } // Verify the error is what we want - ec2err, ok := err.(*ec2.Error) + ec2err, ok := err.(*awsGo.APIError) if !ok { return err } @@ -143,8 +146,9 @@ func testAccCheckVpcDestroy(s *terraform.State) error { func testAccCheckVpcCidr(vpc *ec2.VPC, expected string) resource.TestCheckFunc { return func(s *terraform.State) error { - if vpc.CidrBlock != expected { - return fmt.Errorf("Bad cidr: %s", vpc.CidrBlock) + CIDRBlock := vpc.CIDRBlock + if *CIDRBlock != expected { + return fmt.Errorf("Bad cidr: %s", *vpc.CIDRBlock) } return nil @@ -162,8 +166,11 @@ func testAccCheckVpcExists(n string, vpc *ec2.VPC) resource.TestCheckFunc { return fmt.Errorf("No VPC ID is set") } - conn := testAccProvider.Meta().(*AWSClient).ec2conn - resp, err := conn.DescribeVpcs([]string{rs.Primary.ID}, ec2.NewFilter()) + conn := testAccProvider.Meta().(*AWSClient).awsEc2conn + DescribeVpcOpts := &ec2.DescribeVPCsRequest{ + VPCIDs: []string{rs.Primary.ID}, + } + resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err != nil { return err } From d77df312a36fefd10ee667e355d327146078d2fe Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Tue, 3 Mar 2015 10:45:15 +0530 Subject: [PATCH 05/31] Changed things around as suggested by @catsby --- builtin/providers/aws/resource_aws_vpc.go | 21 +++++++++---------- .../providers/aws/resource_aws_vpc_test.go | 4 ++-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index d3207dfa7..6e2ddc95b 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -5,7 +5,7 @@ import ( "log" "time" - awsGo "github.com/awslabs/aws-sdk-go/aws" + "github.com/awslabs/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" @@ -65,14 +65,13 @@ func resourceAwsVpc() *schema.Resource { func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { ec2conn := meta.(*AWSClient).awsEc2conn - cidr := d.Get("cidr_block").(string) instance_tenancy := "default" if v, ok := d.GetOk("instance_tenancy"); ok { instance_tenancy = v.(string) } // Create the VPC createOpts := &ec2.CreateVPCRequest{ - CIDRBlock: &cidr, + CIDRBlock: aws.String(d.Get("cidr_block").(string)), InstanceTenancy: &instance_tenancy, } log.Printf("[DEBUG] VPC create config: %#v", *createOpts) @@ -156,11 +155,11 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { // Get the main routing table for this VPC // Really Ugly need to make this better - rmenn filter1 := &ec2.Filter{ - Name: awsGo.String("association.main"), + Name: aws.String("association.main"), Values: []string{("true")}, } filter2 := &ec2.Filter{ - Name: awsGo.String("vpc-id"), + Name: aws.String("vpc-id"), Values: []string{(d.Id())}, } DescribeRouteOpts := &ec2.DescribeRouteTablesRequest{ @@ -239,7 +238,7 @@ func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { } log.Printf("[INFO] Deleting VPC: %s", d.Id()) if err := ec2conn.DeleteVPC(DeleteVpcOpts); err != nil { - ec2err, ok := err.(*awsGo.APIError) + ec2err, ok := err.(*aws.APIError) if ok && ec2err.Code == "InvalidVpcID.NotFound" { return nil } @@ -259,7 +258,7 @@ func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { } resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err != nil { - if ec2err, ok := err.(*awsGo.APIError); ok && ec2err.Code == "InvalidVpcID.NotFound" { + if ec2err, ok := err.(*aws.APIError); ok && ec2err.Code == "InvalidVpcID.NotFound" { resp = nil } else { log.Printf("Error on VPCStateRefresh: %s", err) @@ -280,11 +279,11 @@ func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { func resourceAwsVpcSetDefaultNetworkAcl(conn *ec2.EC2, d *schema.ResourceData) error { filter1 := &ec2.Filter{ - Name: awsGo.String("default"), + Name: aws.String("default"), Values: []string{("true")}, } filter2 := &ec2.Filter{ - Name: awsGo.String("vpc-id"), + Name: aws.String("vpc-id"), Values: []string{(d.Id())}, } DescribeNetworkACLOpts := &ec2.DescribeNetworkACLsRequest{ @@ -304,11 +303,11 @@ func resourceAwsVpcSetDefaultNetworkAcl(conn *ec2.EC2, d *schema.ResourceData) e func resourceAwsVpcSetDefaultSecurityGroup(conn *ec2.EC2, d *schema.ResourceData) error { filter1 := &ec2.Filter{ - Name: awsGo.String("group-name"), + Name: aws.String("group-name"), Values: []string{("default")}, } filter2 := &ec2.Filter{ - Name: awsGo.String("vpc-id"), + Name: aws.String("vpc-id"), Values: []string{(d.Id())}, } DescribeSgOpts := &ec2.DescribeSecurityGroupsRequest{ diff --git a/builtin/providers/aws/resource_aws_vpc_test.go b/builtin/providers/aws/resource_aws_vpc_test.go index f91d2ac76..dee441af8 100644 --- a/builtin/providers/aws/resource_aws_vpc_test.go +++ b/builtin/providers/aws/resource_aws_vpc_test.go @@ -2,7 +2,7 @@ package aws import ( "fmt" - awsGo "github.com/awslabs/aws-sdk-go/aws" + "github.com/awslabs/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" @@ -132,7 +132,7 @@ func testAccCheckVpcDestroy(s *terraform.State) error { } // Verify the error is what we want - ec2err, ok := err.(*awsGo.APIError) + ec2err, ok := err.(*aws.APIError) if !ok { return err } From c5efe1e5ce4779c39b566b987b72ad84413f204a Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Tue, 3 Mar 2015 10:49:21 +0530 Subject: [PATCH 06/31] Using hashicorp/aws-sdk-go --- builtin/providers/aws/config.go | 10 +++++----- builtin/providers/aws/resource_aws_vpc.go | 4 ++-- builtin/providers/aws/resource_aws_vpc_test.go | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/builtin/providers/aws/config.go b/builtin/providers/aws/config.go index c4d9a09f0..f603598f3 100644 --- a/builtin/providers/aws/config.go +++ b/builtin/providers/aws/config.go @@ -12,11 +12,11 @@ import ( "github.com/mitchellh/goamz/elb" "github.com/mitchellh/goamz/rds" - awsGo "github.com/awslabs/aws-sdk-go/aws" - "github.com/awslabs/aws-sdk-go/gen/autoscaling" - awsEc2 "github.com/awslabs/aws-sdk-go/gen/ec2" - "github.com/awslabs/aws-sdk-go/gen/route53" - "github.com/awslabs/aws-sdk-go/gen/s3" + awsGo "github.com/hashicorp/aws-sdk-go/aws" + "github.com/hashicorp/aws-sdk-go/gen/autoscaling" + awsEc2 "github.com/hashicorp/aws-sdk-go/gen/ec2" + "github.com/hashicorp/aws-sdk-go/gen/route53" + "github.com/hashicorp/aws-sdk-go/gen/s3" ) type Config struct { diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index 6e2ddc95b..4d1d871ba 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -5,8 +5,8 @@ import ( "log" "time" - "github.com/awslabs/aws-sdk-go/aws" - "github.com/awslabs/aws-sdk-go/gen/ec2" + "github.com/hashicorp/aws-sdk-go/aws" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" ) diff --git a/builtin/providers/aws/resource_aws_vpc_test.go b/builtin/providers/aws/resource_aws_vpc_test.go index dee441af8..7570a1873 100644 --- a/builtin/providers/aws/resource_aws_vpc_test.go +++ b/builtin/providers/aws/resource_aws_vpc_test.go @@ -2,8 +2,8 @@ package aws import ( "fmt" - "github.com/awslabs/aws-sdk-go/aws" - "github.com/awslabs/aws-sdk-go/gen/ec2" + "github.com/hashicorp/aws-sdk-go/aws" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" "testing" From d56c683602ace8799ff6f58f3d13da43a56d657a Mon Sep 17 00:00:00 2001 From: rmenn Date: Tue, 3 Mar 2015 20:57:30 +0530 Subject: [PATCH 07/31] Removed additional variable for print, added for debugging --- builtin/providers/aws/resource_aws_vpc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index 4d1d871ba..00c8f6983 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -77,7 +77,7 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { log.Printf("[DEBUG] VPC create config: %#v", *createOpts) vpcResp, err := ec2conn.CreateVPC(createOpts) if err != nil { - return fmt.Errorf("Error creating VPC: %s : %s", err) + return fmt.Errorf("Error creating VPC: %s", err) } // Get the ID and store it From 1cecb37ab95302713d3303a1dcc6b254070e7463 Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Wed, 25 Feb 2015 15:04:17 +0530 Subject: [PATCH 08/31] Added vpc refactor in aws sdk go --- builtin/providers/aws/resource_aws_vpc.go | 180 +++++++++++------- .../providers/aws/resource_aws_vpc_test.go | 87 +++++---- 2 files changed, 162 insertions(+), 105 deletions(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index f4ac2162e..4d1d871ba 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -5,9 +5,10 @@ import ( "log" "time" + "github.com/hashicorp/aws-sdk-go/aws" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" - "github.com/mitchellh/goamz/ec2" ) func resourceAwsVpc() *schema.Resource { @@ -57,29 +58,32 @@ func resourceAwsVpc() *schema.Resource { Computed: true, }, - "tags": tagsSchema(), + // "tags": tagsSchema(), }, } } func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn - - // Create the VPC - createOpts := &ec2.CreateVpc{ - CidrBlock: d.Get("cidr_block").(string), - InstanceTenancy: d.Get("instance_tenancy").(string), + ec2conn := meta.(*AWSClient).awsEc2conn + instance_tenancy := "default" + if v, ok := d.GetOk("instance_tenancy"); ok { + instance_tenancy = v.(string) } - log.Printf("[DEBUG] VPC create config: %#v", createOpts) - vpcResp, err := ec2conn.CreateVpc(createOpts) + // Create the VPC + createOpts := &ec2.CreateVPCRequest{ + CIDRBlock: aws.String(d.Get("cidr_block").(string)), + InstanceTenancy: &instance_tenancy, + } + log.Printf("[DEBUG] VPC create config: %#v", *createOpts) + vpcResp, err := ec2conn.CreateVPC(createOpts) if err != nil { - return fmt.Errorf("Error creating VPC: %s", err) + return fmt.Errorf("Error creating VPC: %s : %s", err) } // Get the ID and store it - vpc := &vpcResp.VPC - log.Printf("[INFO] VPC ID: %s", vpc.VpcId) - d.SetId(vpc.VpcId) + vpc := vpcResp.VPC + d.SetId(*vpc.VPCID) + log.Printf("[INFO] VPC ID: %s", d.Id()) // Set partial mode and say that we setup the cidr block d.Partial(true) @@ -106,7 +110,7 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn + ec2conn := meta.(*AWSClient).awsEc2conn // Refresh the VPC state vpcRaw, _, err := VPCStateRefreshFunc(ec2conn, d.Id())() @@ -120,34 +124,53 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { // VPC stuff vpc := vpcRaw.(*ec2.VPC) - d.Set("cidr_block", vpc.CidrBlock) + vpcid := d.Id() + d.Set("cidr_block", vpc.CIDRBlock) - // Tags - d.Set("tags", tagsToMap(vpc.Tags)) + // Tags - TBD rmenn + //d.Set("tags", tagsToMap(vpc.Tags)) // Attributes - resp, err := ec2conn.VpcAttribute(d.Id(), "enableDnsSupport") + attribute := "enableDnsSupport" + DescribeAttrOpts := &ec2.DescribeVPCAttributeRequest{ + Attribute: &attribute, + VPCID: &vpcid, + } + resp, err := ec2conn.DescribeVPCAttribute(DescribeAttrOpts) if err != nil { return err } - d.Set("enable_dns_support", resp.EnableDnsSupport) - - resp, err = ec2conn.VpcAttribute(d.Id(), "enableDnsHostnames") + d.Set("enable_dns_support", *resp.EnableDNSSupport) + attribute = "enableDnsHostnames" + DescribeAttrOpts = &ec2.DescribeVPCAttributeRequest{ + Attribute: &attribute, + VPCID: &vpcid, + } + resp, err = ec2conn.DescribeVPCAttribute(DescribeAttrOpts) if err != nil { return err } - d.Set("enable_dns_hostnames", resp.EnableDnsHostnames) + d.Set("enable_dns_hostnames", *resp.EnableDNSHostnames) // Get the main routing table for this VPC - filter := ec2.NewFilter() - filter.Add("association.main", "true") - filter.Add("vpc-id", d.Id()) - routeResp, err := ec2conn.DescribeRouteTables(nil, filter) + // Really Ugly need to make this better - rmenn + filter1 := &ec2.Filter{ + Name: aws.String("association.main"), + Values: []string{("true")}, + } + filter2 := &ec2.Filter{ + Name: aws.String("vpc-id"), + Values: []string{(d.Id())}, + } + DescribeRouteOpts := &ec2.DescribeRouteTablesRequest{ + Filters: []ec2.Filter{*filter1, *filter2}, + } + routeResp, err := ec2conn.DescribeRouteTables(DescribeRouteOpts) if err != nil { return err } if v := routeResp.RouteTables; len(v) > 0 { - d.Set("main_route_table_id", v[0].RouteTableId) + d.Set("main_route_table_id", *v[0].RouteTableID) } resourceAwsVpcSetDefaultNetworkAcl(ec2conn, d) @@ -157,20 +180,24 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn + ec2conn := meta.(*AWSClient).awsEc2conn // Turn on partial mode d.Partial(true) - + vpcid := d.Id() + modifyOpts := &ec2.ModifyVPCAttributeRequest{ + VPCID: &vpcid, + } if d.HasChange("enable_dns_hostnames") { - options := new(ec2.ModifyVpcAttribute) - options.EnableDnsHostnames = d.Get("enable_dns_hostnames").(bool) - options.SetEnableDnsHostnames = true + val := d.Get("enable_dns_hostnames").(bool) + modifyOpts.EnableDNSHostnames = &ec2.AttributeBooleanValue{ + Value: &val, + } log.Printf( "[INFO] Modifying enable_dns_hostnames vpc attribute for %s: %#v", - d.Id(), options) - if _, err := ec2conn.ModifyVpcAttribute(d.Id(), options); err != nil { + d.Id(), modifyOpts) + if err := ec2conn.ModifyVPCAttribute(modifyOpts); err != nil { return err } @@ -178,36 +205,40 @@ func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { } if d.HasChange("enable_dns_support") { - options := new(ec2.ModifyVpcAttribute) - options.EnableDnsSupport = d.Get("enable_dns_support").(bool) - options.SetEnableDnsSupport = true + val := d.Get("enable_dns_hostnames").(bool) + modifyOpts.EnableDNSSupport = &ec2.AttributeBooleanValue{ + Value: &val, + } log.Printf( "[INFO] Modifying enable_dns_support vpc attribute for %s: %#v", - d.Id(), options) - if _, err := ec2conn.ModifyVpcAttribute(d.Id(), options); err != nil { + d.Id(), modifyOpts) + if err := ec2conn.ModifyVPCAttribute(modifyOpts); err != nil { return err } d.SetPartial("enable_dns_support") } - - if err := setTags(ec2conn, d); err != nil { - return err - } else { - d.SetPartial("tags") - } + //Tagging Support need to be worked on - rmenn + // if err := setTags(ec2conn, d); err != nil { + // return err + // } else { + // d.SetPartial("tags") + // } d.Partial(false) return resourceAwsVpcRead(d, meta) } func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).ec2conn - + ec2conn := meta.(*AWSClient).awsEc2conn + vpcID := d.Id() + DeleteVpcOpts := &ec2.DeleteVPCRequest{ + VPCID: &vpcID, + } log.Printf("[INFO] Deleting VPC: %s", d.Id()) - if _, err := ec2conn.DeleteVpc(d.Id()); err != nil { - ec2err, ok := err.(*ec2.Error) + if err := ec2conn.DeleteVPC(DeleteVpcOpts); err != nil { + ec2err, ok := err.(*aws.APIError) if ok && ec2err.Code == "InvalidVpcID.NotFound" { return nil } @@ -222,9 +253,12 @@ func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { // a VPC. func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - resp, err := conn.DescribeVpcs([]string{id}, ec2.NewFilter()) + DescribeVpcOpts := &ec2.DescribeVPCsRequest{ + VPCIDs: []string{id}, + } + resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err != nil { - if ec2err, ok := err.(*ec2.Error); ok && ec2err.Code == "InvalidVpcID.NotFound" { + if ec2err, ok := err.(*aws.APIError); ok && ec2err.Code == "InvalidVpcID.NotFound" { resp = nil } else { log.Printf("Error on VPCStateRefresh: %s", err) @@ -239,37 +273,53 @@ func VPCStateRefreshFunc(conn *ec2.EC2, id string) resource.StateRefreshFunc { } vpc := &resp.VPCs[0] - return vpc, vpc.State, nil + return vpc, *vpc.State, nil } } func resourceAwsVpcSetDefaultNetworkAcl(conn *ec2.EC2, d *schema.ResourceData) error { - filter := ec2.NewFilter() - filter.Add("default", "true") - filter.Add("vpc-id", d.Id()) - networkAclResp, err := conn.NetworkAcls(nil, filter) + filter1 := &ec2.Filter{ + Name: aws.String("default"), + Values: []string{("true")}, + } + filter2 := &ec2.Filter{ + Name: aws.String("vpc-id"), + Values: []string{(d.Id())}, + } + DescribeNetworkACLOpts := &ec2.DescribeNetworkACLsRequest{ + Filters: []ec2.Filter{*filter1, *filter2}, + } + networkAclResp, err := conn.DescribeNetworkACLs(DescribeNetworkACLOpts) if err != nil { return err } - if v := networkAclResp.NetworkAcls; len(v) > 0 { - d.Set("default_network_acl_id", v[0].NetworkAclId) + if v := networkAclResp.NetworkACLs; len(v) > 0 { + d.Set("default_network_acl_id", v[0].NetworkACLID) } return nil } func resourceAwsVpcSetDefaultSecurityGroup(conn *ec2.EC2, d *schema.ResourceData) error { - filter := ec2.NewFilter() - filter.Add("group-name", "default") - filter.Add("vpc-id", d.Id()) - securityGroupResp, err := conn.SecurityGroups(nil, filter) + filter1 := &ec2.Filter{ + Name: aws.String("group-name"), + Values: []string{("default")}, + } + filter2 := &ec2.Filter{ + Name: aws.String("vpc-id"), + Values: []string{(d.Id())}, + } + DescribeSgOpts := &ec2.DescribeSecurityGroupsRequest{ + Filters: []ec2.Filter{*filter1, *filter2}, + } + securityGroupResp, err := conn.DescribeSecurityGroups(DescribeSgOpts) if err != nil { return err } - if v := securityGroupResp.Groups; len(v) > 0 { - d.Set("default_security_group_id", v[0].Id) + if v := securityGroupResp.SecurityGroups; len(v) > 0 { + d.Set("default_security_group_id", v[0].GroupID) } return nil diff --git a/builtin/providers/aws/resource_aws_vpc_test.go b/builtin/providers/aws/resource_aws_vpc_test.go index b555e0875..7570a1873 100644 --- a/builtin/providers/aws/resource_aws_vpc_test.go +++ b/builtin/providers/aws/resource_aws_vpc_test.go @@ -2,11 +2,11 @@ package aws import ( "fmt" - "testing" - + "github.com/hashicorp/aws-sdk-go/aws" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" - "github.com/mitchellh/goamz/ec2" + "testing" ) func TestAccVpc_basic(t *testing.T) { @@ -50,36 +50,36 @@ func TestAccVpc_dedicatedTenancy(t *testing.T) { }) } -func TestAccVpc_tags(t *testing.T) { - var vpc ec2.VPC - - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckVpcDestroy, - Steps: []resource.TestStep{ - resource.TestStep{ - Config: testAccVpcConfigTags, - Check: resource.ComposeTestCheckFunc( - testAccCheckVpcExists("aws_vpc.foo", &vpc), - testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), - resource.TestCheckResourceAttr( - "aws_vpc.foo", "cidr_block", "10.1.0.0/16"), - testAccCheckTags(&vpc.Tags, "foo", "bar"), - ), - }, - - resource.TestStep{ - Config: testAccVpcConfigTagsUpdate, - Check: resource.ComposeTestCheckFunc( - testAccCheckVpcExists("aws_vpc.foo", &vpc), - testAccCheckTags(&vpc.Tags, "foo", ""), - testAccCheckTags(&vpc.Tags, "bar", "baz"), - ), - }, - }, - }) -} +//func TestAccVpc_tags(t *testing.T) { +// var vpc ec2.VPC +// +// resource.Test(t, resource.TestCase{ +// PreCheck: func() { testAccPreCheck(t) }, +// Providers: testAccProviders, +// CheckDestroy: testAccCheckVpcDestroy, +// Steps: []resource.TestStep{ +// resource.TestStep{ +// Config: testAccVpcConfigTags, +// Check: resource.ComposeTestCheckFunc( +// testAccCheckVpcExists("aws_vpc.foo", &vpc), +// testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), +// resource.TestCheckResourceAttr( +// "aws_vpc.foo", "cidr_block", "10.1.0.0/16"), +// testAccCheckTags(&vpc.Tags, "foo", "bar"), +// ), +// }, +// +// resource.TestStep{ +// Config: testAccVpcConfigTagsUpdate, +// Check: resource.ComposeTestCheckFunc( +// testAccCheckVpcExists("aws_vpc.foo", &vpc), +// testAccCheckTags(&vpc.Tags, "foo", ""), +// testAccCheckTags(&vpc.Tags, "bar", "baz"), +// ), +// }, +// }, +// }) +//} func TestAccVpcUpdate(t *testing.T) { var vpc ec2.VPC @@ -111,7 +111,7 @@ func TestAccVpcUpdate(t *testing.T) { } func testAccCheckVpcDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).ec2conn + conn := testAccProvider.Meta().(*AWSClient).awsEc2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_vpc" { @@ -119,7 +119,10 @@ func testAccCheckVpcDestroy(s *terraform.State) error { } // Try to find the VPC - resp, err := conn.DescribeVpcs([]string{rs.Primary.ID}, ec2.NewFilter()) + DescribeVpcOpts := &ec2.DescribeVPCsRequest{ + VPCIDs: []string{rs.Primary.ID}, + } + resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err == nil { if len(resp.VPCs) > 0 { return fmt.Errorf("VPCs still exist.") @@ -129,7 +132,7 @@ func testAccCheckVpcDestroy(s *terraform.State) error { } // Verify the error is what we want - ec2err, ok := err.(*ec2.Error) + ec2err, ok := err.(*aws.APIError) if !ok { return err } @@ -143,8 +146,9 @@ func testAccCheckVpcDestroy(s *terraform.State) error { func testAccCheckVpcCidr(vpc *ec2.VPC, expected string) resource.TestCheckFunc { return func(s *terraform.State) error { - if vpc.CidrBlock != expected { - return fmt.Errorf("Bad cidr: %s", vpc.CidrBlock) + CIDRBlock := vpc.CIDRBlock + if *CIDRBlock != expected { + return fmt.Errorf("Bad cidr: %s", *vpc.CIDRBlock) } return nil @@ -162,8 +166,11 @@ func testAccCheckVpcExists(n string, vpc *ec2.VPC) resource.TestCheckFunc { return fmt.Errorf("No VPC ID is set") } - conn := testAccProvider.Meta().(*AWSClient).ec2conn - resp, err := conn.DescribeVpcs([]string{rs.Primary.ID}, ec2.NewFilter()) + conn := testAccProvider.Meta().(*AWSClient).awsEc2conn + DescribeVpcOpts := &ec2.DescribeVPCsRequest{ + VPCIDs: []string{rs.Primary.ID}, + } + resp, err := conn.DescribeVPCs(DescribeVpcOpts) if err != nil { return err } From 840e6f4826afd12e0fa7ad41ee6c9cedd1f0726f Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Wed, 4 Mar 2015 18:37:30 +0530 Subject: [PATCH 09/31] Added Tagging --- builtin/providers/aws/resource_aws_vpc.go | 26 ++++---- .../providers/aws/resource_aws_vpc_test.go | 64 +++++++++---------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index 4d1d871ba..d1234e637 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -58,13 +58,13 @@ func resourceAwsVpc() *schema.Resource { Computed: true, }, - // "tags": tagsSchema(), + "tags": tagsSchema(), }, } } func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEc2conn + ec2conn := meta.(*AWSClient).awsEC2conn instance_tenancy := "default" if v, ok := d.GetOk("instance_tenancy"); ok { instance_tenancy = v.(string) @@ -110,7 +110,7 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEc2conn + ec2conn := meta.(*AWSClient).awsEC2conn // Refresh the VPC state vpcRaw, _, err := VPCStateRefreshFunc(ec2conn, d.Id())() @@ -127,8 +127,8 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { vpcid := d.Id() d.Set("cidr_block", vpc.CIDRBlock) - // Tags - TBD rmenn - //d.Set("tags", tagsToMap(vpc.Tags)) + // Tags + d.Set("tags", tagsToMapSDK(vpc.Tags)) // Attributes attribute := "enableDnsSupport" @@ -180,7 +180,7 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEc2conn + ec2conn := meta.(*AWSClient).awsEC2conn // Turn on partial mode d.Partial(true) @@ -219,19 +219,19 @@ func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { d.SetPartial("enable_dns_support") } - //Tagging Support need to be worked on - rmenn - // if err := setTags(ec2conn, d); err != nil { - // return err - // } else { - // d.SetPartial("tags") - // } + + if err := setTagsSDK(ec2conn, d); err != nil { + return err + } else { + d.SetPartial("tags") + } d.Partial(false) return resourceAwsVpcRead(d, meta) } func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEc2conn + ec2conn := meta.(*AWSClient).awsEC2conn vpcID := d.Id() DeleteVpcOpts := &ec2.DeleteVPCRequest{ VPCID: &vpcID, diff --git a/builtin/providers/aws/resource_aws_vpc_test.go b/builtin/providers/aws/resource_aws_vpc_test.go index 7570a1873..7e324a5d9 100644 --- a/builtin/providers/aws/resource_aws_vpc_test.go +++ b/builtin/providers/aws/resource_aws_vpc_test.go @@ -50,36 +50,36 @@ func TestAccVpc_dedicatedTenancy(t *testing.T) { }) } -//func TestAccVpc_tags(t *testing.T) { -// var vpc ec2.VPC -// -// resource.Test(t, resource.TestCase{ -// PreCheck: func() { testAccPreCheck(t) }, -// Providers: testAccProviders, -// CheckDestroy: testAccCheckVpcDestroy, -// Steps: []resource.TestStep{ -// resource.TestStep{ -// Config: testAccVpcConfigTags, -// Check: resource.ComposeTestCheckFunc( -// testAccCheckVpcExists("aws_vpc.foo", &vpc), -// testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), -// resource.TestCheckResourceAttr( -// "aws_vpc.foo", "cidr_block", "10.1.0.0/16"), -// testAccCheckTags(&vpc.Tags, "foo", "bar"), -// ), -// }, -// -// resource.TestStep{ -// Config: testAccVpcConfigTagsUpdate, -// Check: resource.ComposeTestCheckFunc( -// testAccCheckVpcExists("aws_vpc.foo", &vpc), -// testAccCheckTags(&vpc.Tags, "foo", ""), -// testAccCheckTags(&vpc.Tags, "bar", "baz"), -// ), -// }, -// }, -// }) -//} +func TestAccVpc_tags(t *testing.T) { + var vpc ec2.VPC + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckVpcDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccVpcConfigTags, + Check: resource.ComposeTestCheckFunc( + testAccCheckVpcExists("aws_vpc.foo", &vpc), + testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), + resource.TestCheckResourceAttr( + "aws_vpc.foo", "cidr_block", "10.1.0.0/16"), + testAccCheckTagsSDK(&vpc.Tags, "foo", "bar"), + ), + }, + + resource.TestStep{ + Config: testAccVpcConfigTagsUpdate, + Check: resource.ComposeTestCheckFunc( + testAccCheckVpcExists("aws_vpc.foo", &vpc), + testAccCheckTagsSDK(&vpc.Tags, "foo", ""), + testAccCheckTagsSDK(&vpc.Tags, "bar", "baz"), + ), + }, + }, + }) +} func TestAccVpcUpdate(t *testing.T) { var vpc ec2.VPC @@ -111,7 +111,7 @@ func TestAccVpcUpdate(t *testing.T) { } func testAccCheckVpcDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEc2conn + conn := testAccProvider.Meta().(*AWSClient).awsEC2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_vpc" { @@ -166,7 +166,7 @@ func testAccCheckVpcExists(n string, vpc *ec2.VPC) resource.TestCheckFunc { return fmt.Errorf("No VPC ID is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEc2conn + conn := testAccProvider.Meta().(*AWSClient).awsEC2conn DescribeVpcOpts := &ec2.DescribeVPCsRequest{ VPCIDs: []string{rs.Primary.ID}, } From a34800dff270e9eb0484db0435b26aa5ab7f4289 Mon Sep 17 00:00:00 2001 From: Rahul Menon Date: Mon, 9 Mar 2015 14:39:06 +0530 Subject: [PATCH 10/31] Tags Schema --- builtin/providers/aws/resource_aws_vpc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index 840c0b1b3..d1234e637 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -58,7 +58,7 @@ func resourceAwsVpc() *schema.Resource { Computed: true, }, - // "tags": tagsSchema(), + "tags": tagsSchema(), }, } } From 749db242f4716047fe271f770d1a119ec8989ef1 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Thu, 12 Mar 2015 11:04:31 -0500 Subject: [PATCH 11/31] Fix issue with Network interfaces and an instance-level security groups (#1188) --- .../providers/aws/resource_aws_instance.go | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/builtin/providers/aws/resource_aws_instance.go b/builtin/providers/aws/resource_aws_instance.go index 5475e7454..28c7b79e7 100644 --- a/builtin/providers/aws/resource_aws_instance.go +++ b/builtin/providers/aws/resource_aws_instance.go @@ -292,6 +292,17 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { subnet, hasSubnet := d.GetOk("subnet_id") subnetID := subnet.(string) + var groups []string + if v := d.Get("security_groups"); v != nil { + // Security group names. + // For a nondefault VPC, you must use security group IDs instead. + // See http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html + for _, v := range v.(*schema.Set).List() { + str := v.(string) + groups = append(groups, str) + } + } + if hasSubnet && associatePublicIPAddress { // If we have a non-default VPC / Subnet specified, we can flag // AssociatePublicIpAddress to get a Public IP assigned. By default these are not provided. @@ -310,6 +321,10 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { ni.PrivateIPAddress = aws.String(v.(string)) } + if len(groups) > 0 { + ni.Groups = groups + } + runOpts.NetworkInterfaces = []ec2.InstanceNetworkInterfaceSpecification{ni} } else { if subnetID != "" { @@ -319,21 +334,6 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { if v, ok := d.GetOk("private_ip"); ok { runOpts.PrivateIPAddress = aws.String(v.(string)) } - } - - if v, ok := d.GetOk("key_name"); ok { - runOpts.KeyName = aws.String(v.(string)) - } - - if v := d.Get("security_groups"); v != nil { - // Security group names. - // For a nondefault VPC, you must use security group IDs instead. - // See http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html - var groups []string - for _, v := range v.(*schema.Set).List() { - str := v.(string) - groups = append(groups, str) - } if runOpts.SubnetID != nil && *runOpts.SubnetID != "" { runOpts.SecurityGroupIDs = groups @@ -342,6 +342,10 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { } } + if v, ok := d.GetOk("key_name"); ok { + runOpts.KeyName = aws.String(v.(string)) + } + blockDevices := make([]interface{}, 0) if v := d.Get("block_device"); v != nil { From 3a5918d013739bc798d57ae0bc644047c2d00c09 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Thu, 12 Mar 2015 14:26:10 -0500 Subject: [PATCH 12/31] Add acceptance test for Network / Instance security group fix --- .../aws/resource_aws_instance_test.go | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/builtin/providers/aws/resource_aws_instance_test.go b/builtin/providers/aws/resource_aws_instance_test.go index 3a9c16588..1076c49e0 100644 --- a/builtin/providers/aws/resource_aws_instance_test.go +++ b/builtin/providers/aws/resource_aws_instance_test.go @@ -207,6 +207,25 @@ func TestAccAWSInstance_vpc(t *testing.T) { }) } +func TestAccInstance_NetworkInstanceSecurityGroups(t *testing.T) { + var v ec2.Instance + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckInstanceDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccInstanceNetworkInstanceSecurityGroups, + Check: resource.ComposeTestCheckFunc( + testAccCheckInstanceExists( + "aws_instance.foo_instance", &v), + ), + }, + }, + }) +} + func TestAccAWSInstance_tags(t *testing.T) { var v ec2.Instance @@ -533,3 +552,44 @@ resource "aws_instance" "foo" { private_ip = "10.1.1.42" } ` + +const testAccInstanceNetworkInstanceSecurityGroups = ` +resource "aws_internet_gateway" "gw" { + vpc_id = "${aws_vpc.foo.id}" +} + +resource "aws_vpc" "foo" { + cidr_block = "10.1.0.0/16" +} + +resource "aws_security_group" "tf_test_foo" { + name = "tf_test_foo" + description = "foo" + vpc_id="${aws_vpc.foo.id}" + + ingress { + protocol = "icmp" + from_port = -1 + to_port = -1 + cidr_blocks = ["0.0.0.0/0"] + } +} + +resource "aws_subnet" "foo" { + cidr_block = "10.1.1.0/24" + vpc_id = "${aws_vpc.foo.id}" +} + +resource "aws_instance" "foo_instance" { + ami = "ami-21f78e11" + instance_type = "t1.micro" + security_groups = ["${aws_security_group.tf_test_foo.id}"] + subnet_id = "${aws_subnet.foo.id}" + associate_public_ip_address = true +} + +resource "aws_eip" "foo_eip" { + instance = "${aws_instance.foo_instance.id}" + vpc = true +} +` From 33fdc0c63f4202a145edf84cb8d0e96f1a3cd50f Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Thu, 12 Mar 2015 15:01:24 -0500 Subject: [PATCH 13/31] update the new test config --- builtin/providers/aws/resource_aws_instance_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/builtin/providers/aws/resource_aws_instance_test.go b/builtin/providers/aws/resource_aws_instance_test.go index 1076c49e0..f85928cc5 100644 --- a/builtin/providers/aws/resource_aws_instance_test.go +++ b/builtin/providers/aws/resource_aws_instance_test.go @@ -556,10 +556,14 @@ resource "aws_instance" "foo" { const testAccInstanceNetworkInstanceSecurityGroups = ` resource "aws_internet_gateway" "gw" { vpc_id = "${aws_vpc.foo.id}" + depends_on = ["aws_eip.foo_eip"] } resource "aws_vpc" "foo" { cidr_block = "10.1.0.0/16" + tags { + Name = "tf-network-test" + } } resource "aws_security_group" "tf_test_foo" { From 0fbd701ccbfc5a31d59e375e784eb89382b9bfe4 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Thu, 12 Mar 2015 15:13:45 -0500 Subject: [PATCH 14/31] minor style cleanups --- builtin/providers/aws/resource_aws_vpc.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index d1234e637..df7feb5a0 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -72,12 +72,12 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { // Create the VPC createOpts := &ec2.CreateVPCRequest{ CIDRBlock: aws.String(d.Get("cidr_block").(string)), - InstanceTenancy: &instance_tenancy, + InstanceTenancy: aws.String(instance_tenancy), } log.Printf("[DEBUG] VPC create config: %#v", *createOpts) vpcResp, err := ec2conn.CreateVPC(createOpts) if err != nil { - return fmt.Errorf("Error creating VPC: %s : %s", err) + return fmt.Errorf("Error creating VPC: %s", err) } // Get the ID and store it @@ -133,8 +133,8 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { // Attributes attribute := "enableDnsSupport" DescribeAttrOpts := &ec2.DescribeVPCAttributeRequest{ - Attribute: &attribute, - VPCID: &vpcid, + Attribute: aws.String(attribute), + VPCID: aws.String(vpcid), } resp, err := ec2conn.DescribeVPCAttribute(DescribeAttrOpts) if err != nil { From 57556bba75737c93ac6064c9d1a6006df202654e Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Thu, 12 Mar 2015 16:43:08 -0500 Subject: [PATCH 15/31] Replace tags files with tags_sdk, rename, and update --- .../providers/aws/resource_aws_instance.go | 4 +- .../aws/resource_aws_instance_test.go | 8 +- .../aws/resource_aws_internet_gateway.go | 6 +- .../aws/resource_aws_internet_gateway_test.go | 6 +- .../providers/aws/resource_aws_network_acl.go | 4 +- .../aws/resource_aws_network_acl_test.go | 2 +- .../providers/aws/resource_aws_route_table.go | 4 +- .../aws/resource_aws_route_table_test.go | 6 +- .../aws/resource_aws_security_group.go | 4 +- .../aws/resource_aws_security_group_test.go | 6 +- builtin/providers/aws/resource_aws_subnet.go | 4 +- builtin/providers/aws/resource_aws_vpc.go | 4 +- .../resource_aws_vpc_peering_connection.go | 4 +- .../providers/aws/resource_aws_vpc_test.go | 6 +- builtin/providers/aws/tags.go | 28 +++-- builtin/providers/aws/tags_sdk.go | 106 ------------------ builtin/providers/aws/tags_sdk_test.go | 85 -------------- builtin/providers/aws/tags_test.go | 2 +- 18 files changed, 54 insertions(+), 235 deletions(-) delete mode 100644 builtin/providers/aws/tags_sdk.go delete mode 100644 builtin/providers/aws/tags_sdk_test.go diff --git a/builtin/providers/aws/resource_aws_instance.go b/builtin/providers/aws/resource_aws_instance.go index 5475e7454..5ecd86645 100644 --- a/builtin/providers/aws/resource_aws_instance.go +++ b/builtin/providers/aws/resource_aws_instance.go @@ -481,7 +481,7 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error { d.Set("subnet_id", instance.SubnetID) } d.Set("ebs_optimized", instance.EBSOptimized) - d.Set("tags", tagsToMapSDK(instance.Tags)) + d.Set("tags", tagsToMap(instance.Tags)) d.Set("tenancy", instance.Placement.Tenancy) // Determine whether we're referring to security groups with @@ -579,7 +579,7 @@ func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { // TODO(mitchellh): wait for the attributes we modified to // persist the change... - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } else { d.SetPartial("tags") diff --git a/builtin/providers/aws/resource_aws_instance_test.go b/builtin/providers/aws/resource_aws_instance_test.go index 3a9c16588..b0d2783ac 100644 --- a/builtin/providers/aws/resource_aws_instance_test.go +++ b/builtin/providers/aws/resource_aws_instance_test.go @@ -219,9 +219,9 @@ func TestAccAWSInstance_tags(t *testing.T) { Config: testAccCheckInstanceConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckInstanceExists("aws_instance.foo", &v), - testAccCheckTagsSDK(&v.Tags, "foo", "bar"), + testAccCheckTags(&v.Tags, "foo", "bar"), // Guard against regression of https://github.com/hashicorp/terraform/issues/914 - testAccCheckTagsSDK(&v.Tags, "#", ""), + testAccCheckTags(&v.Tags, "#", ""), ), }, @@ -229,8 +229,8 @@ func TestAccAWSInstance_tags(t *testing.T) { Config: testAccCheckInstanceConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckInstanceExists("aws_instance.foo", &v), - testAccCheckTagsSDK(&v.Tags, "foo", ""), - testAccCheckTagsSDK(&v.Tags, "bar", "baz"), + testAccCheckTags(&v.Tags, "foo", ""), + testAccCheckTags(&v.Tags, "bar", "baz"), ), }, }, diff --git a/builtin/providers/aws/resource_aws_internet_gateway.go b/builtin/providers/aws/resource_aws_internet_gateway.go index 499a20ed3..b43e4fd44 100644 --- a/builtin/providers/aws/resource_aws_internet_gateway.go +++ b/builtin/providers/aws/resource_aws_internet_gateway.go @@ -43,7 +43,7 @@ func resourceAwsInternetGatewayCreate(d *schema.ResourceData, meta interface{}) d.SetId(*ig.InternetGatewayID) log.Printf("[INFO] InternetGateway ID: %s", d.Id()) - err = setTagsSDK(ec2conn, d) + err = setTags(ec2conn, d) if err != nil { return err } @@ -73,7 +73,7 @@ func resourceAwsInternetGatewayRead(d *schema.ResourceData, meta interface{}) er d.Set("vpc_id", ig.Attachments[0].VPCID) } - d.Set("tags", tagsToMapSDK(ig.Tags)) + d.Set("tags", tagsToMap(ig.Tags)) return nil } @@ -93,7 +93,7 @@ func resourceAwsInternetGatewayUpdate(d *schema.ResourceData, meta interface{}) ec2conn := meta.(*AWSClient).awsEC2conn - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } diff --git a/builtin/providers/aws/resource_aws_internet_gateway_test.go b/builtin/providers/aws/resource_aws_internet_gateway_test.go index 26929f466..48f7de664 100644 --- a/builtin/providers/aws/resource_aws_internet_gateway_test.go +++ b/builtin/providers/aws/resource_aws_internet_gateway_test.go @@ -98,7 +98,7 @@ func TestAccInternetGateway_tags(t *testing.T) { Config: testAccCheckInternetGatewayConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckInternetGatewayExists("aws_internet_gateway.foo", &v), - testAccCheckTagsSDK(&v.Tags, "foo", "bar"), + testAccCheckTags(&v.Tags, "foo", "bar"), ), }, @@ -106,8 +106,8 @@ func TestAccInternetGateway_tags(t *testing.T) { Config: testAccCheckInternetGatewayConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckInternetGatewayExists("aws_internet_gateway.foo", &v), - testAccCheckTagsSDK(&v.Tags, "foo", ""), - testAccCheckTagsSDK(&v.Tags, "bar", "baz"), + testAccCheckTags(&v.Tags, "foo", ""), + testAccCheckTags(&v.Tags, "bar", "baz"), ), }, }, diff --git a/builtin/providers/aws/resource_aws_network_acl.go b/builtin/providers/aws/resource_aws_network_acl.go index a8f654db7..9afe8aee3 100644 --- a/builtin/providers/aws/resource_aws_network_acl.go +++ b/builtin/providers/aws/resource_aws_network_acl.go @@ -161,7 +161,7 @@ func resourceAwsNetworkAclRead(d *schema.ResourceData, meta interface{}) error { d.Set("vpc_id", networkAcl.VPCID) d.Set("ingress", ingressEntries) d.Set("egress", egressEntries) - d.Set("tags", tagsToMapSDK(networkAcl.Tags)) + d.Set("tags", tagsToMap(networkAcl.Tags)) return nil } @@ -202,7 +202,7 @@ func resourceAwsNetworkAclUpdate(d *schema.ResourceData, meta interface{}) error } } - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } else { d.SetPartial("tags") diff --git a/builtin/providers/aws/resource_aws_network_acl_test.go b/builtin/providers/aws/resource_aws_network_acl_test.go index a4183a1a1..e27e57d1a 100644 --- a/builtin/providers/aws/resource_aws_network_acl_test.go +++ b/builtin/providers/aws/resource_aws_network_acl_test.go @@ -151,7 +151,7 @@ func TestAccAWSNetworkAclsOnlyEgressRules(t *testing.T) { Config: testAccAWSNetworkAclEgressConfig, Check: resource.ComposeTestCheckFunc( testAccCheckAWSNetworkAclExists("aws_network_acl.bond", &networkAcl), - testAccCheckTagsSDK(&networkAcl.Tags, "foo", "bar"), + testAccCheckTags(&networkAcl.Tags, "foo", "bar"), ), }, }, diff --git a/builtin/providers/aws/resource_aws_route_table.go b/builtin/providers/aws/resource_aws_route_table.go index 0290d053f..e26c17ce1 100644 --- a/builtin/providers/aws/resource_aws_route_table.go +++ b/builtin/providers/aws/resource_aws_route_table.go @@ -146,7 +146,7 @@ func resourceAwsRouteTableRead(d *schema.ResourceData, meta interface{}) error { d.Set("route", route) // Tags - d.Set("tags", tagsToMapSDK(rt.Tags)) + d.Set("tags", tagsToMap(rt.Tags)) return nil } @@ -203,7 +203,7 @@ func resourceAwsRouteTableUpdate(d *schema.ResourceData, meta interface{}) error } } - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } else { d.SetPartial("tags") diff --git a/builtin/providers/aws/resource_aws_route_table_test.go b/builtin/providers/aws/resource_aws_route_table_test.go index 5e6f90026..da90d491d 100644 --- a/builtin/providers/aws/resource_aws_route_table_test.go +++ b/builtin/providers/aws/resource_aws_route_table_test.go @@ -134,7 +134,7 @@ func TestAccAWSRouteTable_tags(t *testing.T) { Config: testAccRouteTableConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckRouteTableExists("aws_route_table.foo", &route_table), - testAccCheckTagsSDK(&route_table.Tags, "foo", "bar"), + testAccCheckTags(&route_table.Tags, "foo", "bar"), ), }, @@ -142,8 +142,8 @@ func TestAccAWSRouteTable_tags(t *testing.T) { Config: testAccRouteTableConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckRouteTableExists("aws_route_table.foo", &route_table), - testAccCheckTagsSDK(&route_table.Tags, "foo", ""), - testAccCheckTagsSDK(&route_table.Tags, "bar", "baz"), + testAccCheckTags(&route_table.Tags, "foo", ""), + testAccCheckTags(&route_table.Tags, "bar", "baz"), ), }, }, diff --git a/builtin/providers/aws/resource_aws_security_group.go b/builtin/providers/aws/resource_aws_security_group.go index b7addd9aa..588040830 100644 --- a/builtin/providers/aws/resource_aws_security_group.go +++ b/builtin/providers/aws/resource_aws_security_group.go @@ -209,7 +209,7 @@ func resourceAwsSecurityGroupRead(d *schema.ResourceData, meta interface{}) erro d.Set("owner_id", sg.OwnerID) d.Set("ingress", ingressRules) d.Set("egress", egressRules) - d.Set("tags", tagsToMapSDK(sg.Tags)) + d.Set("tags", tagsToMap(sg.Tags)) return nil } @@ -239,7 +239,7 @@ func resourceAwsSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) er } } - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } diff --git a/builtin/providers/aws/resource_aws_security_group_test.go b/builtin/providers/aws/resource_aws_security_group_test.go index c292c80d6..a0cd2c12f 100644 --- a/builtin/providers/aws/resource_aws_security_group_test.go +++ b/builtin/providers/aws/resource_aws_security_group_test.go @@ -296,7 +296,7 @@ func TestAccAWSSecurityGroup_tags(t *testing.T) { Config: testAccAWSSecurityGroupConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckAWSSecurityGroupExists("aws_security_group.foo", &group), - testAccCheckTagsSDK(&group.Tags, "foo", "bar"), + testAccCheckTags(&group.Tags, "foo", "bar"), ), }, @@ -304,8 +304,8 @@ func TestAccAWSSecurityGroup_tags(t *testing.T) { Config: testAccAWSSecurityGroupConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckAWSSecurityGroupExists("aws_security_group.foo", &group), - testAccCheckTagsSDK(&group.Tags, "foo", ""), - testAccCheckTagsSDK(&group.Tags, "bar", "baz"), + testAccCheckTags(&group.Tags, "foo", ""), + testAccCheckTags(&group.Tags, "bar", "baz"), ), }, }, diff --git a/builtin/providers/aws/resource_aws_subnet.go b/builtin/providers/aws/resource_aws_subnet.go index e09fb8bc4..07a3413f2 100644 --- a/builtin/providers/aws/resource_aws_subnet.go +++ b/builtin/providers/aws/resource_aws_subnet.go @@ -115,7 +115,7 @@ func resourceAwsSubnetRead(d *schema.ResourceData, meta interface{}) error { d.Set("availability_zone", subnet.AvailabilityZone) d.Set("cidr_block", subnet.CIDRBlock) d.Set("map_public_ip_on_launch", subnet.MapPublicIPOnLaunch) - d.Set("tags", tagsToMapSDK(subnet.Tags)) + d.Set("tags", tagsToMap(subnet.Tags)) return nil } @@ -125,7 +125,7 @@ func resourceAwsSubnetUpdate(d *schema.ResourceData, meta interface{}) error { d.Partial(true) - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } else { d.SetPartial("tags") diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index df7feb5a0..0e2485972 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -128,7 +128,7 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { d.Set("cidr_block", vpc.CIDRBlock) // Tags - d.Set("tags", tagsToMapSDK(vpc.Tags)) + d.Set("tags", tagsToMap(vpc.Tags)) // Attributes attribute := "enableDnsSupport" @@ -220,7 +220,7 @@ func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { d.SetPartial("enable_dns_support") } - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } else { d.SetPartial("tags") diff --git a/builtin/providers/aws/resource_aws_vpc_peering_connection.go b/builtin/providers/aws/resource_aws_vpc_peering_connection.go index 06f50f01c..548718f43 100644 --- a/builtin/providers/aws/resource_aws_vpc_peering_connection.go +++ b/builtin/providers/aws/resource_aws_vpc_peering_connection.go @@ -95,7 +95,7 @@ func resourceAwsVpcPeeringRead(d *schema.ResourceData, meta interface{}) error { d.Set("peer_owner_id", pc.AccepterVPCInfo.OwnerID) d.Set("peer_vpc_id", pc.AccepterVPCInfo.VPCID) d.Set("vpc_id", pc.RequesterVPCInfo.VPCID) - d.Set("tags", tagsToMapSDK(pc.Tags)) + d.Set("tags", tagsToMap(pc.Tags)) return nil } @@ -103,7 +103,7 @@ func resourceAwsVpcPeeringRead(d *schema.ResourceData, meta interface{}) error { func resourceAwsVpcPeeringUpdate(d *schema.ResourceData, meta interface{}) error { ec2conn := meta.(*AWSClient).awsEC2conn - if err := setTagsSDK(ec2conn, d); err != nil { + if err := setTags(ec2conn, d); err != nil { return err } else { d.SetPartial("tags") diff --git a/builtin/providers/aws/resource_aws_vpc_test.go b/builtin/providers/aws/resource_aws_vpc_test.go index 7e324a5d9..4f3f02f0f 100644 --- a/builtin/providers/aws/resource_aws_vpc_test.go +++ b/builtin/providers/aws/resource_aws_vpc_test.go @@ -65,7 +65,7 @@ func TestAccVpc_tags(t *testing.T) { testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), resource.TestCheckResourceAttr( "aws_vpc.foo", "cidr_block", "10.1.0.0/16"), - testAccCheckTagsSDK(&vpc.Tags, "foo", "bar"), + testAccCheckTags(&vpc.Tags, "foo", "bar"), ), }, @@ -73,8 +73,8 @@ func TestAccVpc_tags(t *testing.T) { Config: testAccVpcConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckVpcExists("aws_vpc.foo", &vpc), - testAccCheckTagsSDK(&vpc.Tags, "foo", ""), - testAccCheckTagsSDK(&vpc.Tags, "bar", "baz"), + testAccCheckTags(&vpc.Tags, "foo", ""), + testAccCheckTags(&vpc.Tags, "bar", "baz"), ), }, }, diff --git a/builtin/providers/aws/tags.go b/builtin/providers/aws/tags.go index b45875c59..1c64b18b4 100644 --- a/builtin/providers/aws/tags.go +++ b/builtin/providers/aws/tags.go @@ -3,11 +3,13 @@ package aws import ( "log" + "github.com/hashicorp/aws-sdk-go/aws" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/schema" - "github.com/mitchellh/goamz/ec2" ) // tagsSchema returns the schema to use for tags. +// func tagsSchema() *schema.Schema { return &schema.Schema{ Type: schema.TypeMap, @@ -27,13 +29,21 @@ func setTags(conn *ec2.EC2, d *schema.ResourceData) error { // Set tags if len(remove) > 0 { log.Printf("[DEBUG] Removing tags: %#v", remove) - if _, err := conn.DeleteTags([]string{d.Id()}, remove); err != nil { + err := conn.DeleteTags(&ec2.DeleteTagsRequest{ + Resources: []string{d.Id()}, + Tags: remove, + }) + if err != nil { return err } } if len(create) > 0 { log.Printf("[DEBUG] Creating tags: %#v", create) - if _, err := conn.CreateTags([]string{d.Id()}, create); err != nil { + err := conn.CreateTags(&ec2.CreateTagsRequest{ + Resources: []string{d.Id()}, + Tags: create, + }) + if err != nil { return err } } @@ -49,14 +59,14 @@ func diffTags(oldTags, newTags []ec2.Tag) ([]ec2.Tag, []ec2.Tag) { // First, we're creating everything we have create := make(map[string]interface{}) for _, t := range newTags { - create[t.Key] = t.Value + create[*t.Key] = *t.Value } // Build the list of what to remove var remove []ec2.Tag for _, t := range oldTags { - old, ok := create[t.Key] - if !ok || old != t.Value { + old, ok := create[*t.Key] + if !ok || old != *t.Value { // Delete it! remove = append(remove, t) } @@ -70,8 +80,8 @@ func tagsFromMap(m map[string]interface{}) []ec2.Tag { result := make([]ec2.Tag, 0, len(m)) for k, v := range m { result = append(result, ec2.Tag{ - Key: k, - Value: v.(string), + Key: aws.String(k), + Value: aws.String(v.(string)), }) } @@ -82,7 +92,7 @@ func tagsFromMap(m map[string]interface{}) []ec2.Tag { func tagsToMap(ts []ec2.Tag) map[string]string { result := make(map[string]string) for _, t := range ts { - result[t.Key] = t.Value + result[*t.Key] = *t.Value } return result diff --git a/builtin/providers/aws/tags_sdk.go b/builtin/providers/aws/tags_sdk.go deleted file mode 100644 index 7e9690b78..000000000 --- a/builtin/providers/aws/tags_sdk.go +++ /dev/null @@ -1,106 +0,0 @@ -package aws - -// TODO: Clint: consolidate tags and tags_sdk -// tags_sdk and tags_sdk_test are used only for transition to aws-sdk-go -// and will replace tags and tags_test when the transition to aws-sdk-go/ec2 is -// complete - -import ( - "log" - - "github.com/hashicorp/aws-sdk-go/aws" - "github.com/hashicorp/aws-sdk-go/gen/ec2" - "github.com/hashicorp/terraform/helper/schema" -) - -// tagsSchema returns the schema to use for tags. -// -// TODO: uncomment this when we replace the original tags.go -// -// func tagsSchema() *schema.Schema { -// return &schema.Schema{ -// Type: schema.TypeMap, -// Optional: true, -// } -// } - -// setTags is a helper to set the tags for a resource. It expects the -// tags field to be named "tags" -func setTagsSDK(conn *ec2.EC2, d *schema.ResourceData) error { - if d.HasChange("tags") { - oraw, nraw := d.GetChange("tags") - o := oraw.(map[string]interface{}) - n := nraw.(map[string]interface{}) - create, remove := diffTagsSDK(tagsFromMapSDK(o), tagsFromMapSDK(n)) - - // Set tags - if len(remove) > 0 { - log.Printf("[DEBUG] Removing tags: %#v", remove) - err := conn.DeleteTags(&ec2.DeleteTagsRequest{ - Resources: []string{d.Id()}, - Tags: remove, - }) - if err != nil { - return err - } - } - if len(create) > 0 { - log.Printf("[DEBUG] Creating tags: %#v", create) - err := conn.CreateTags(&ec2.CreateTagsRequest{ - Resources: []string{d.Id()}, - Tags: create, - }) - if err != nil { - return err - } - } - } - - return nil -} - -// diffTags takes our tags locally and the ones remotely and returns -// the set of tags that must be created, and the set of tags that must -// be destroyed. -func diffTagsSDK(oldTags, newTags []ec2.Tag) ([]ec2.Tag, []ec2.Tag) { - // First, we're creating everything we have - create := make(map[string]interface{}) - for _, t := range newTags { - create[*t.Key] = *t.Value - } - - // Build the list of what to remove - var remove []ec2.Tag - for _, t := range oldTags { - old, ok := create[*t.Key] - if !ok || old != *t.Value { - // Delete it! - remove = append(remove, t) - } - } - - return tagsFromMapSDK(create), remove -} - -// tagsFromMap returns the tags for the given map of data. -func tagsFromMapSDK(m map[string]interface{}) []ec2.Tag { - result := make([]ec2.Tag, 0, len(m)) - for k, v := range m { - result = append(result, ec2.Tag{ - Key: aws.String(k), - Value: aws.String(v.(string)), - }) - } - - return result -} - -// tagsToMap turns the list of tags into a map. -func tagsToMapSDK(ts []ec2.Tag) map[string]string { - result := make(map[string]string) - for _, t := range ts { - result[*t.Key] = *t.Value - } - - return result -} diff --git a/builtin/providers/aws/tags_sdk_test.go b/builtin/providers/aws/tags_sdk_test.go deleted file mode 100644 index 5a5b0e600..000000000 --- a/builtin/providers/aws/tags_sdk_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package aws - -import ( - "fmt" - "reflect" - "testing" - - "github.com/hashicorp/aws-sdk-go/gen/ec2" - "github.com/hashicorp/terraform/helper/resource" - "github.com/hashicorp/terraform/terraform" -) - -func TestDiffTagsSDK(t *testing.T) { - cases := []struct { - Old, New map[string]interface{} - Create, Remove map[string]string - }{ - // Basic add/remove - { - Old: map[string]interface{}{ - "foo": "bar", - }, - New: map[string]interface{}{ - "bar": "baz", - }, - Create: map[string]string{ - "bar": "baz", - }, - Remove: map[string]string{ - "foo": "bar", - }, - }, - - // Modify - { - Old: map[string]interface{}{ - "foo": "bar", - }, - New: map[string]interface{}{ - "foo": "baz", - }, - Create: map[string]string{ - "foo": "baz", - }, - Remove: map[string]string{ - "foo": "bar", - }, - }, - } - - for i, tc := range cases { - c, r := diffTagsSDK(tagsFromMapSDK(tc.Old), tagsFromMapSDK(tc.New)) - cm := tagsToMapSDK(c) - rm := tagsToMapSDK(r) - if !reflect.DeepEqual(cm, tc.Create) { - t.Fatalf("%d: bad create: %#v", i, cm) - } - if !reflect.DeepEqual(rm, tc.Remove) { - t.Fatalf("%d: bad remove: %#v", i, rm) - } - } -} - -// testAccCheckTags can be used to check the tags on a resource. -func testAccCheckTagsSDK( - ts *[]ec2.Tag, key string, value string) resource.TestCheckFunc { - return func(s *terraform.State) error { - m := tagsToMapSDK(*ts) - v, ok := m[key] - if value != "" && !ok { - return fmt.Errorf("Missing tag: %s", key) - } else if value == "" && ok { - return fmt.Errorf("Extra tag: %s", key) - } - if value == "" { - return nil - } - - if v != value { - return fmt.Errorf("%s: bad value: %s", key, v) - } - - return nil - } -} diff --git a/builtin/providers/aws/tags_test.go b/builtin/providers/aws/tags_test.go index 6e89492ca..16578ac1b 100644 --- a/builtin/providers/aws/tags_test.go +++ b/builtin/providers/aws/tags_test.go @@ -5,9 +5,9 @@ import ( "reflect" "testing" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" - "github.com/mitchellh/goamz/ec2" ) func TestDiffTags(t *testing.T) { From 580b696e7f167b23b0b6e4fa8f76560b27a54a82 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Thu, 12 Mar 2015 16:49:38 -0500 Subject: [PATCH 16/31] Strike 'goamz' from the repo' --- builtin/providers/aws/config.go | 14 ++++------- .../aws/resource_aws_db_parameter_group.go | 2 +- builtin/providers/aws/resource_aws_elb.go | 2 +- builtin/providers/aws/structure.go | 23 +++++++++---------- .../providers/aws/r/vpc_peering.html.markdown | 2 +- 5 files changed, 18 insertions(+), 25 deletions(-) diff --git a/builtin/providers/aws/config.go b/builtin/providers/aws/config.go index 8bc9adab5..c318465b2 100644 --- a/builtin/providers/aws/config.go +++ b/builtin/providers/aws/config.go @@ -7,17 +7,14 @@ import ( "unicode" "github.com/hashicorp/terraform/helper/multierror" - "github.com/mitchellh/goamz/aws" - "github.com/mitchellh/goamz/ec2" - awsGo "github.com/hashicorp/aws-sdk-go/aws" + "github.com/hashicorp/aws-sdk-go/aws" "github.com/hashicorp/aws-sdk-go/gen/autoscaling" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/aws-sdk-go/gen/elb" "github.com/hashicorp/aws-sdk-go/gen/rds" "github.com/hashicorp/aws-sdk-go/gen/route53" "github.com/hashicorp/aws-sdk-go/gen/s3" - - awsEC2 "github.com/hashicorp/aws-sdk-go/gen/ec2" ) type Config struct { @@ -29,7 +26,6 @@ type Config struct { type AWSClient struct { ec2conn *ec2.EC2 - awsEC2conn *awsEC2.EC2 elbconn *elb.ELB autoscalingconn *autoscaling.AutoScaling s3conn *s3.S3 @@ -62,10 +58,8 @@ func (c *Config) Client() (interface{}, error) { // bucket storage in S3 client.region = c.Region - creds := awsGo.Creds(c.AccessKey, c.SecretKey, c.Token) + creds := aws.Creds(c.AccessKey, c.SecretKey, c.Token) - log.Println("[INFO] Initializing EC2 connection") - client.ec2conn = ec2.New(auth, region) log.Println("[INFO] Initializing ELB connection") client.elbconn = elb.New(creds, c.Region, nil) log.Println("[INFO] Initializing AutoScaling connection") @@ -80,7 +74,7 @@ func (c *Config) Client() (interface{}, error) { // See http://docs.aws.amazon.com/general/latest/gr/sigv4_changes.html log.Println("[INFO] Initializing Route53 connection") client.r53conn = route53.New(creds, "us-east-1", nil) - log.Println("[INFO] Initializing AWS-GO EC2 Connection") + log.Println("[INFO] Initializing EC2 Connection") client.awsEC2conn = awsEC2.New(creds, c.Region, nil) } diff --git a/builtin/providers/aws/resource_aws_db_parameter_group.go b/builtin/providers/aws/resource_aws_db_parameter_group.go index cf40d3b26..a5eda1a64 100644 --- a/builtin/providers/aws/resource_aws_db_parameter_group.go +++ b/builtin/providers/aws/resource_aws_db_parameter_group.go @@ -152,7 +152,7 @@ func resourceAwsDbParameterGroupUpdate(d *schema.ResourceData, meta interface{}) os := o.(*schema.Set) ns := n.(*schema.Set) - // Expand the "parameter" set to goamz compat []rds.Parameter + // Expand the "parameter" set to aws-sdk-go compat []rds.Parameter parameters, err := expandParameters(ns.Difference(os).List()) if err != nil { return err diff --git a/builtin/providers/aws/resource_aws_elb.go b/builtin/providers/aws/resource_aws_elb.go index e5ed9f3cf..7898f2120 100644 --- a/builtin/providers/aws/resource_aws_elb.go +++ b/builtin/providers/aws/resource_aws_elb.go @@ -161,7 +161,7 @@ func resourceAwsElb() *schema.Resource { func resourceAwsElbCreate(d *schema.ResourceData, meta interface{}) error { elbconn := meta.(*AWSClient).elbconn - // Expand the "listener" set to goamz compat []elb.Listener + // Expand the "listener" set to aws-sdk-go compat []elb.Listener listeners, err := expandListeners(d.Get("listener").(*schema.Set).List()) if err != nil { return err diff --git a/builtin/providers/aws/structure.go b/builtin/providers/aws/structure.go index 910f748e6..bdc04bcd2 100644 --- a/builtin/providers/aws/structure.go +++ b/builtin/providers/aws/structure.go @@ -4,11 +4,10 @@ import ( "strings" "github.com/hashicorp/aws-sdk-go/aws" - awsEC2 "github.com/hashicorp/aws-sdk-go/gen/ec2" + "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/aws-sdk-go/gen/elb" "github.com/hashicorp/aws-sdk-go/gen/rds" "github.com/hashicorp/terraform/helper/schema" - "github.com/mitchellh/goamz/ec2" ) // Takes the result of flatmap.Expand for an array of listeners and @@ -17,7 +16,7 @@ func expandListeners(configured []interface{}) ([]elb.Listener, error) { listeners := make([]elb.Listener, 0, len(configured)) // Loop over our configured listeners and create - // an array of goamz compatabile objects + // an array of aws-sdk-go compatabile objects for _, lRaw := range configured { data := lRaw.(map[string]interface{}) @@ -40,10 +39,10 @@ func expandListeners(configured []interface{}) ([]elb.Listener, error) { // Takes the result of flatmap.Expand for an array of ingress/egress // security group rules and returns EC2 API compatible objects -func expandIPPerms(id string, configured []interface{}) []awsEC2.IPPermission { - perms := make([]awsEC2.IPPermission, len(configured)) +func expandIPPerms(id string, configured []interface{}) []ec2.IPPermission { + perms := make([]ec2.IPPermission, len(configured)) for i, mRaw := range configured { - var perm awsEC2.IPPermission + var perm ec2.IPPermission m := mRaw.(map[string]interface{}) perm.FromPort = aws.Integer(m["from_port"].(int)) @@ -62,14 +61,14 @@ func expandIPPerms(id string, configured []interface{}) []awsEC2.IPPermission { } if len(groups) > 0 { - perm.UserIDGroupPairs = make([]awsEC2.UserIDGroupPair, len(groups)) + perm.UserIDGroupPairs = make([]ec2.UserIDGroupPair, len(groups)) for i, name := range groups { ownerId, id := "", name if items := strings.Split(id, "/"); len(items) > 1 { ownerId, id = items[0], items[1] } - perm.UserIDGroupPairs[i] = awsEC2.UserIDGroupPair{ + perm.UserIDGroupPairs[i] = ec2.UserIDGroupPair{ GroupID: aws.String(id), UserID: aws.String(ownerId), } @@ -78,9 +77,9 @@ func expandIPPerms(id string, configured []interface{}) []awsEC2.IPPermission { if raw, ok := m["cidr_blocks"]; ok { list := raw.([]interface{}) - perm.IPRanges = make([]awsEC2.IPRange, len(list)) + perm.IPRanges = make([]ec2.IPRange, len(list)) for i, v := range list { - perm.IPRanges[i] = awsEC2.IPRange{aws.String(v.(string))} + perm.IPRanges[i] = ec2.IPRange{aws.String(v.(string))} } } @@ -96,7 +95,7 @@ func expandParameters(configured []interface{}) ([]rds.Parameter, error) { parameters := make([]rds.Parameter, 0, len(configured)) // Loop over our configured parameters and create - // an array of goamz compatabile objects + // an array of aws-sdk-go compatabile objects for _, pRaw := range configured { data := pRaw.(map[string]interface{}) @@ -139,7 +138,7 @@ func flattenSecurityGroups(list []ec2.UserSecurityGroup) []string { } // Flattens an array of UserSecurityGroups into a []string -func flattenSecurityGroupsSDK(list []awsEC2.UserIDGroupPair) []string { +func flattenSecurityGroupsSDK(list []ec2.UserIDGroupPair) []string { result := make([]string, 0, len(list)) for _, g := range list { result = append(result, *g.GroupID) diff --git a/website/source/docs/providers/aws/r/vpc_peering.html.markdown b/website/source/docs/providers/aws/r/vpc_peering.html.markdown index 59af3c0ca..1d396a584 100644 --- a/website/source/docs/providers/aws/r/vpc_peering.html.markdown +++ b/website/source/docs/providers/aws/r/vpc_peering.html.markdown @@ -56,4 +56,4 @@ The following attributes are exported: ## Notes -You still have to accept the peering with the aws console, aws-cli or goamz +You still have to accept the peering with the aws console, aws-cli or aws-sdk-go. From 28fbd971fc1b3890044b83fe10e26517420987d9 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Fri, 13 Mar 2015 09:42:50 -0500 Subject: [PATCH 17/31] Retire goamz --- builtin/providers/aws/config.go | 55 ++----------------- builtin/providers/aws/resource_aws_eip.go | 8 +-- .../providers/aws/resource_aws_eip_test.go | 4 +- .../providers/aws/resource_aws_instance.go | 8 +-- .../aws/resource_aws_instance_test.go | 4 +- .../aws/resource_aws_internet_gateway.go | 12 ++-- .../aws/resource_aws_internet_gateway_test.go | 4 +- .../providers/aws/resource_aws_key_pair.go | 6 +- .../aws/resource_aws_key_pair_test.go | 4 +- ...source_aws_main_route_table_association.go | 8 +-- ...e_aws_main_route_table_association_test.go | 2 +- .../providers/aws/resource_aws_network_acl.go | 8 +-- .../aws/resource_aws_network_acl_test.go | 8 +-- .../providers/aws/resource_aws_route_table.go | 8 +-- .../resource_aws_route_table_association.go | 8 +-- ...source_aws_route_table_association_test.go | 4 +- .../aws/resource_aws_route_table_test.go | 4 +- .../aws/resource_aws_security_group.go | 13 ++--- .../aws/resource_aws_security_group_test.go | 4 +- builtin/providers/aws/resource_aws_subnet.go | 8 +-- .../providers/aws/resource_aws_subnet_test.go | 4 +- builtin/providers/aws/resource_aws_vpc.go | 8 +-- .../resource_aws_vpc_peering_connection.go | 8 +-- ...esource_aws_vpc_peering_connection_test.go | 2 +- .../providers/aws/resource_aws_vpc_test.go | 4 +- builtin/providers/aws/structure.go | 11 +--- builtin/providers/aws/structure_test.go | 20 +++---- 27 files changed, 92 insertions(+), 145 deletions(-) diff --git a/builtin/providers/aws/config.go b/builtin/providers/aws/config.go index c318465b2..672af6f07 100644 --- a/builtin/providers/aws/config.go +++ b/builtin/providers/aws/config.go @@ -3,8 +3,6 @@ package aws import ( "fmt" "log" - "strings" - "unicode" "github.com/hashicorp/terraform/helper/multierror" @@ -41,14 +39,9 @@ func (c *Config) Client() (interface{}, error) { // Get the auth and region. This can fail if keys/regions were not // specified and we're attempting to use the environment. var errs []error - log.Println("[INFO] Building AWS auth structure") - auth, err := c.AWSAuth() - if err != nil { - errs = append(errs, err) - } log.Println("[INFO] Building AWS region structure") - region, err := c.AWSRegion() + err := c.ValidateRegion() if err != nil { errs = append(errs, err) } @@ -58,6 +51,7 @@ func (c *Config) Client() (interface{}, error) { // bucket storage in S3 client.region = c.Region + log.Println("[INFO] Building AWS auth structure") creds := aws.Creds(c.AccessKey, c.SecretKey, c.Token) log.Println("[INFO] Initializing ELB connection") @@ -75,7 +69,7 @@ func (c *Config) Client() (interface{}, error) { log.Println("[INFO] Initializing Route53 connection") client.r53conn = route53.New(creds, "us-east-1", nil) log.Println("[INFO] Initializing EC2 Connection") - client.awsEC2conn = awsEC2.New(creds, c.Region, nil) + client.ec2conn = ec2.New(creds, c.Region, nil) } if len(errs) > 0 { @@ -85,54 +79,17 @@ func (c *Config) Client() (interface{}, error) { return &client, nil } -// AWSAuth returns a valid aws.Auth object for access to AWS services, or -// an error if the authentication couldn't be resolved. -// -// TODO(mitchellh): Test in some way. -func (c *Config) AWSAuth() (aws.Auth, error) { - auth, err := aws.GetAuth(c.AccessKey, c.SecretKey) - if err == nil { - // Store the accesskey and secret that we got... - c.AccessKey = auth.AccessKey - c.SecretKey = auth.SecretKey - c.Token = auth.Token - } - - return auth, err -} - // IsValidRegion returns true if the configured region is a valid AWS // region and false if it's not -func (c *Config) IsValidRegion() bool { +func (c *Config) ValidateRegion() error { var regions = [11]string{"us-east-1", "us-west-2", "us-west-1", "eu-west-1", "eu-central-1", "ap-southeast-1", "ap-southeast-2", "ap-northeast-1", "sa-east-1", "cn-north-1", "us-gov-west-1"} for _, valid := range regions { if c.Region == valid { - return true + return nil } } - return false -} - -// AWSRegion returns the configured region. -// -// TODO(mitchellh): Test in some way. -func (c *Config) AWSRegion() (aws.Region, error) { - if c.Region != "" { - if c.IsValidRegion() { - return aws.Regions[c.Region], nil - } else { - return aws.Region{}, fmt.Errorf("Not a valid region: %s", c.Region) - } - } - - md, err := aws.GetMetaData("placement/availability-zone") - if err != nil { - return aws.Region{}, err - } - - region := strings.TrimRightFunc(string(md), unicode.IsLetter) - return aws.Regions[region], nil + return fmt.Errorf("Not a valid region: %s", c.Region) } diff --git a/builtin/providers/aws/resource_aws_eip.go b/builtin/providers/aws/resource_aws_eip.go index 103f9bc5a..c78fec4c9 100644 --- a/builtin/providers/aws/resource_aws_eip.go +++ b/builtin/providers/aws/resource_aws_eip.go @@ -60,7 +60,7 @@ func resourceAwsEip() *schema.Resource { } func resourceAwsEipCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // By default, we're not in a VPC domainOpt := "" @@ -97,7 +97,7 @@ func resourceAwsEipCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsEipRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn domain := resourceAwsEipDomain(d) id := d.Id() @@ -148,7 +148,7 @@ func resourceAwsEipRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsEipUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn domain := resourceAwsEipDomain(d) @@ -181,7 +181,7 @@ func resourceAwsEipUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsEipDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn if err := resourceAwsEipRead(d, meta); err != nil { return err diff --git a/builtin/providers/aws/resource_aws_eip_test.go b/builtin/providers/aws/resource_aws_eip_test.go index 79e88b8f3..b9944366f 100644 --- a/builtin/providers/aws/resource_aws_eip_test.go +++ b/builtin/providers/aws/resource_aws_eip_test.go @@ -58,7 +58,7 @@ func TestAccAWSEIP_instance(t *testing.T) { } func testAccCheckAWSEIPDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_eip" { @@ -113,7 +113,7 @@ func testAccCheckAWSEIPExists(n string, res *ec2.Address) resource.TestCheckFunc return fmt.Errorf("No EIP ID is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn if strings.Contains(rs.Primary.ID, "eipalloc") { req := &ec2.DescribeAddressesRequest{ diff --git a/builtin/providers/aws/resource_aws_instance.go b/builtin/providers/aws/resource_aws_instance.go index 5ecd86645..0fb3d68c0 100644 --- a/builtin/providers/aws/resource_aws_instance.go +++ b/builtin/providers/aws/resource_aws_instance.go @@ -253,7 +253,7 @@ func resourceAwsInstance() *schema.Resource { } func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Figure out user data userData := "" @@ -437,7 +437,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn resp, err := ec2conn.DescribeInstances(&ec2.DescribeInstancesRequest{ InstanceIDs: []string{d.Id()}, @@ -561,7 +561,7 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn opts := new(ec2.ModifyInstanceAttributeRequest) log.Printf("[INFO] Modifying instance %s: %#v", d.Id(), opts) @@ -589,7 +589,7 @@ func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsInstanceDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn log.Printf("[INFO] Terminating instance: %s", d.Id()) req := &ec2.TerminateInstancesRequest{ diff --git a/builtin/providers/aws/resource_aws_instance_test.go b/builtin/providers/aws/resource_aws_instance_test.go index b0d2783ac..369c1b832 100644 --- a/builtin/providers/aws/resource_aws_instance_test.go +++ b/builtin/providers/aws/resource_aws_instance_test.go @@ -296,7 +296,7 @@ func TestAccAWSInstance_associatePublicIPAndPrivateIP(t *testing.T) { } func testAccCheckInstanceDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_instance" { @@ -339,7 +339,7 @@ func testAccCheckInstanceExists(n string, i *ec2.Instance) resource.TestCheckFun return fmt.Errorf("No ID is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := conn.DescribeInstances(&ec2.DescribeInstancesRequest{ InstanceIDs: []string{rs.Primary.ID}, }) diff --git a/builtin/providers/aws/resource_aws_internet_gateway.go b/builtin/providers/aws/resource_aws_internet_gateway.go index b43e4fd44..9546ffb5c 100644 --- a/builtin/providers/aws/resource_aws_internet_gateway.go +++ b/builtin/providers/aws/resource_aws_internet_gateway.go @@ -29,7 +29,7 @@ func resourceAwsInternetGateway() *schema.Resource { } func resourceAwsInternetGatewayCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Create the gateway log.Printf("[DEBUG] Creating internet gateway") @@ -53,7 +53,7 @@ func resourceAwsInternetGatewayCreate(d *schema.ResourceData, meta interface{}) } func resourceAwsInternetGatewayRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn igRaw, _, err := IGStateRefreshFunc(ec2conn, d.Id())() if err != nil { @@ -91,7 +91,7 @@ func resourceAwsInternetGatewayUpdate(d *schema.ResourceData, meta interface{}) } } - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn if err := setTags(ec2conn, d); err != nil { return err @@ -103,7 +103,7 @@ func resourceAwsInternetGatewayUpdate(d *schema.ResourceData, meta interface{}) } func resourceAwsInternetGatewayDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Detach if it is attached if err := resourceAwsInternetGatewayDetach(d, meta); err != nil { @@ -137,7 +137,7 @@ func resourceAwsInternetGatewayDelete(d *schema.ResourceData, meta interface{}) } func resourceAwsInternetGatewayAttach(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn if d.Get("vpc_id").(string) == "" { log.Printf( @@ -182,7 +182,7 @@ func resourceAwsInternetGatewayAttach(d *schema.ResourceData, meta interface{}) } func resourceAwsInternetGatewayDetach(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Get the old VPC ID to detach from vpcID, _ := d.GetChange("vpc_id") diff --git a/builtin/providers/aws/resource_aws_internet_gateway_test.go b/builtin/providers/aws/resource_aws_internet_gateway_test.go index 48f7de664..a07d1abff 100644 --- a/builtin/providers/aws/resource_aws_internet_gateway_test.go +++ b/builtin/providers/aws/resource_aws_internet_gateway_test.go @@ -115,7 +115,7 @@ func TestAccInternetGateway_tags(t *testing.T) { } func testAccCheckInternetGatewayDestroy(s *terraform.State) error { - ec2conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + ec2conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_internet_gateway" { @@ -158,7 +158,7 @@ func testAccCheckInternetGatewayExists(n string, ig *ec2.InternetGateway) resour return fmt.Errorf("No ID is set") } - ec2conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + ec2conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := ec2conn.DescribeInternetGateways(&ec2.DescribeInternetGatewaysRequest{ InternetGatewayIDs: []string{rs.Primary.ID}, }) diff --git a/builtin/providers/aws/resource_aws_key_pair.go b/builtin/providers/aws/resource_aws_key_pair.go index 573a93567..e96ecf620 100644 --- a/builtin/providers/aws/resource_aws_key_pair.go +++ b/builtin/providers/aws/resource_aws_key_pair.go @@ -37,7 +37,7 @@ func resourceAwsKeyPair() *schema.Resource { } func resourceAwsKeyPairCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn keyName := d.Get("key_name").(string) publicKey := d.Get("public_key").(string) @@ -55,7 +55,7 @@ func resourceAwsKeyPairCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsKeyPairRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn req := &ec2.DescribeKeyPairsRequest{ KeyNames: []string{d.Id()}, @@ -77,7 +77,7 @@ func resourceAwsKeyPairRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsKeyPairDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn err := ec2conn.DeleteKeyPair(&ec2.DeleteKeyPairRequest{ KeyName: aws.String(d.Id()), diff --git a/builtin/providers/aws/resource_aws_key_pair_test.go b/builtin/providers/aws/resource_aws_key_pair_test.go index b601d479a..695da661f 100644 --- a/builtin/providers/aws/resource_aws_key_pair_test.go +++ b/builtin/providers/aws/resource_aws_key_pair_test.go @@ -30,7 +30,7 @@ func TestAccAWSKeyPair_normal(t *testing.T) { } func testAccCheckAWSKeyPairDestroy(s *terraform.State) error { - ec2conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + ec2conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_key_pair" { @@ -81,7 +81,7 @@ func testAccCheckAWSKeyPairExists(n string, res *ec2.KeyPairInfo) resource.TestC return fmt.Errorf("No KeyPair name is set") } - ec2conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + ec2conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := ec2conn.DescribeKeyPairs(&ec2.DescribeKeyPairsRequest{ KeyNames: []string{rs.Primary.ID}, diff --git a/builtin/providers/aws/resource_aws_main_route_table_association.go b/builtin/providers/aws/resource_aws_main_route_table_association.go index a489b9a50..40303ab1e 100644 --- a/builtin/providers/aws/resource_aws_main_route_table_association.go +++ b/builtin/providers/aws/resource_aws_main_route_table_association.go @@ -40,7 +40,7 @@ func resourceAwsMainRouteTableAssociation() *schema.Resource { } func resourceAwsMainRouteTableAssociationCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn vpcId := d.Get("vpc_id").(string) routeTableId := d.Get("route_table_id").(string) @@ -67,7 +67,7 @@ func resourceAwsMainRouteTableAssociationCreate(d *schema.ResourceData, meta int } func resourceAwsMainRouteTableAssociationRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn mainAssociation, err := findMainRouteTableAssociation( ec2conn, @@ -88,7 +88,7 @@ func resourceAwsMainRouteTableAssociationRead(d *schema.ResourceData, meta inter // original_route_table_id - this needs to stay recorded as the AWS-created // table from VPC creation. func resourceAwsMainRouteTableAssociationUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn vpcId := d.Get("vpc_id").(string) routeTableId := d.Get("route_table_id").(string) @@ -109,7 +109,7 @@ func resourceAwsMainRouteTableAssociationUpdate(d *schema.ResourceData, meta int } func resourceAwsMainRouteTableAssociationDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn vpcId := d.Get("vpc_id").(string) originalRouteTableId := d.Get("original_route_table_id").(string) diff --git a/builtin/providers/aws/resource_aws_main_route_table_association_test.go b/builtin/providers/aws/resource_aws_main_route_table_association_test.go index 76e3e4d72..81f87a901 100644 --- a/builtin/providers/aws/resource_aws_main_route_table_association_test.go +++ b/builtin/providers/aws/resource_aws_main_route_table_association_test.go @@ -65,7 +65,7 @@ func testAccCheckMainRouteTableAssociation( return fmt.Errorf("Not found: %s", vpcResource) } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn mainAssociation, err := findMainRouteTableAssociation(conn, vpc.Primary.ID) if err != nil { return err diff --git a/builtin/providers/aws/resource_aws_network_acl.go b/builtin/providers/aws/resource_aws_network_acl.go index 9afe8aee3..0d625ffe4 100644 --- a/builtin/providers/aws/resource_aws_network_acl.go +++ b/builtin/providers/aws/resource_aws_network_acl.go @@ -109,7 +109,7 @@ func resourceAwsNetworkAcl() *schema.Resource { func resourceAwsNetworkAclCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Create the Network Acl createOpts := &ec2.CreateNetworkACLRequest{ @@ -132,7 +132,7 @@ func resourceAwsNetworkAclCreate(d *schema.ResourceData, meta interface{}) error } func resourceAwsNetworkAclRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn resp, err := ec2conn.DescribeNetworkACLs(&ec2.DescribeNetworkACLsRequest{ NetworkACLIDs: []string{d.Id()}, @@ -167,7 +167,7 @@ func resourceAwsNetworkAclRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsNetworkAclUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn d.Partial(true) if d.HasChange("ingress") { @@ -265,7 +265,7 @@ func updateNetworkAclEntries(d *schema.ResourceData, entryType string, ec2conn * } func resourceAwsNetworkAclDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn log.Printf("[INFO] Deleting Network Acl: %s", d.Id()) return resource.Retry(5*time.Minute, func() error { diff --git a/builtin/providers/aws/resource_aws_network_acl_test.go b/builtin/providers/aws/resource_aws_network_acl_test.go index e27e57d1a..23c60db44 100644 --- a/builtin/providers/aws/resource_aws_network_acl_test.go +++ b/builtin/providers/aws/resource_aws_network_acl_test.go @@ -184,7 +184,7 @@ func TestAccAWSNetworkAcl_SubnetChange(t *testing.T) { } func testAccCheckAWSNetworkAclDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_network" { @@ -226,7 +226,7 @@ func testAccCheckAWSNetworkAclExists(n string, networkAcl *ec2.NetworkACL) resou if rs.Primary.ID == "" { return fmt.Errorf("No Security Group is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := conn.DescribeNetworkACLs(&ec2.DescribeNetworkACLsRequest{ NetworkACLIDs: []string{rs.Primary.ID}, @@ -266,7 +266,7 @@ func testAccCheckSubnetIsAssociatedWithAcl(acl string, sub string) resource.Test networkAcl := s.RootModule().Resources[acl] subnet := s.RootModule().Resources[sub] - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := conn.DescribeNetworkACLs(&ec2.DescribeNetworkACLsRequest{ NetworkACLIDs: []string{networkAcl.Primary.ID}, Filters: []ec2.Filter{ @@ -296,7 +296,7 @@ func testAccCheckSubnetIsNotAssociatedWithAcl(acl string, subnet string) resourc networkAcl := s.RootModule().Resources[acl] subnet := s.RootModule().Resources[subnet] - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := conn.DescribeNetworkACLs(&ec2.DescribeNetworkACLsRequest{ NetworkACLIDs: []string{networkAcl.Primary.ID}, Filters: []ec2.Filter{ diff --git a/builtin/providers/aws/resource_aws_route_table.go b/builtin/providers/aws/resource_aws_route_table.go index e26c17ce1..6a4b1d3ca 100644 --- a/builtin/providers/aws/resource_aws_route_table.go +++ b/builtin/providers/aws/resource_aws_route_table.go @@ -62,7 +62,7 @@ func resourceAwsRouteTable() *schema.Resource { } func resourceAwsRouteTableCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Create the routing table createOpts := &ec2.CreateRouteTableRequest{ @@ -100,7 +100,7 @@ func resourceAwsRouteTableCreate(d *schema.ResourceData, meta interface{}) error } func resourceAwsRouteTableRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn rtRaw, _, err := resourceAwsRouteTableStateRefreshFunc(ec2conn, d.Id())() if err != nil { @@ -152,7 +152,7 @@ func resourceAwsRouteTableRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsRouteTableUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Check if the route set as a whole has changed if d.HasChange("route") { @@ -213,7 +213,7 @@ func resourceAwsRouteTableUpdate(d *schema.ResourceData, meta interface{}) error } func resourceAwsRouteTableDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // First request the routing table since we'll have to disassociate // all the subnets first. diff --git a/builtin/providers/aws/resource_aws_route_table_association.go b/builtin/providers/aws/resource_aws_route_table_association.go index a9a614f7f..8fd324035 100644 --- a/builtin/providers/aws/resource_aws_route_table_association.go +++ b/builtin/providers/aws/resource_aws_route_table_association.go @@ -32,7 +32,7 @@ func resourceAwsRouteTableAssociation() *schema.Resource { } func resourceAwsRouteTableAssociationCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn log.Printf( "[INFO] Creating route table association: %s => %s", @@ -56,7 +56,7 @@ func resourceAwsRouteTableAssociationCreate(d *schema.ResourceData, meta interfa } func resourceAwsRouteTableAssociationRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Get the routing table that this association belongs to rtRaw, _, err := resourceAwsRouteTableStateRefreshFunc( @@ -88,7 +88,7 @@ func resourceAwsRouteTableAssociationRead(d *schema.ResourceData, meta interface } func resourceAwsRouteTableAssociationUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn log.Printf( "[INFO] Creating route table association: %s => %s", @@ -119,7 +119,7 @@ func resourceAwsRouteTableAssociationUpdate(d *schema.ResourceData, meta interfa } func resourceAwsRouteTableAssociationDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn log.Printf("[INFO] Deleting route table association: %s", d.Id()) err := ec2conn.DisassociateRouteTable(&ec2.DisassociateRouteTableRequest{ diff --git a/builtin/providers/aws/resource_aws_route_table_association_test.go b/builtin/providers/aws/resource_aws_route_table_association_test.go index 8c4246aba..f5302258d 100644 --- a/builtin/providers/aws/resource_aws_route_table_association_test.go +++ b/builtin/providers/aws/resource_aws_route_table_association_test.go @@ -38,7 +38,7 @@ func TestAccAWSRouteTableAssociation(t *testing.T) { } func testAccCheckRouteTableAssociationDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_route_table_association" { @@ -83,7 +83,7 @@ func testAccCheckRouteTableAssociationExists(n string, v *ec2.RouteTable) resour return fmt.Errorf("No ID is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := conn.DescribeRouteTables(&ec2.DescribeRouteTablesRequest{ RouteTableIDs: []string{rs.Primary.Attributes["route_table_id"]}, }) diff --git a/builtin/providers/aws/resource_aws_route_table_test.go b/builtin/providers/aws/resource_aws_route_table_test.go index da90d491d..b428b8786 100644 --- a/builtin/providers/aws/resource_aws_route_table_test.go +++ b/builtin/providers/aws/resource_aws_route_table_test.go @@ -151,7 +151,7 @@ func TestAccAWSRouteTable_tags(t *testing.T) { } func testAccCheckRouteTableDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_route_table" { @@ -194,7 +194,7 @@ func testAccCheckRouteTableExists(n string, v *ec2.RouteTable) resource.TestChec return fmt.Errorf("No ID is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := conn.DescribeRouteTables(&ec2.DescribeRouteTablesRequest{ RouteTableIDs: []string{rs.Primary.ID}, }) diff --git a/builtin/providers/aws/resource_aws_security_group.go b/builtin/providers/aws/resource_aws_security_group.go index 588040830..c8051813f 100644 --- a/builtin/providers/aws/resource_aws_security_group.go +++ b/builtin/providers/aws/resource_aws_security_group.go @@ -142,7 +142,7 @@ func resourceAwsSecurityGroup() *schema.Resource { } func resourceAwsSecurityGroupCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn securityGroupOpts := &ec2.CreateSecurityGroupRequest{ GroupName: aws.String(d.Get("name").(string)), @@ -187,7 +187,7 @@ func resourceAwsSecurityGroupCreate(d *schema.ResourceData, meta interface{}) er } func resourceAwsSecurityGroupRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn sgRaw, _, err := SGStateRefreshFunc(ec2conn, d.Id())() if err != nil { @@ -214,7 +214,7 @@ func resourceAwsSecurityGroupRead(d *schema.ResourceData, meta interface{}) erro } func resourceAwsSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn sgRaw, _, err := SGStateRefreshFunc(ec2conn, d.Id())() if err != nil { @@ -249,7 +249,7 @@ func resourceAwsSecurityGroupUpdate(d *schema.ResourceData, meta interface{}) er } func resourceAwsSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn log.Printf("[DEBUG] Security Group destroy: %v", d.Id()) @@ -354,7 +354,7 @@ func resourceAwsSecurityGroupIPPermGather(d *schema.ResourceData, permissions [] var groups []string if len(perm.UserIDGroupPairs) > 0 { - groups = flattenSecurityGroupsSDK(perm.UserIDGroupPairs) + groups = flattenSecurityGroups(perm.UserIDGroupPairs) } for i, id := range groups { if id == d.Id() { @@ -396,7 +396,6 @@ func resourceAwsSecurityGroupUpdateRules( os := o.(*schema.Set) ns := n.(*schema.Set) - // TODO: re-munge this when test is updated remove := expandIPPerms(d.Id(), os.Difference(ns).List()) add := expandIPPerms(d.Id(), ns.Difference(os).List()) @@ -410,7 +409,7 @@ func resourceAwsSecurityGroupUpdateRules( // not have service issues. if len(remove) > 0 || len(add) > 0 { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn var err error if len(remove) > 0 { diff --git a/builtin/providers/aws/resource_aws_security_group_test.go b/builtin/providers/aws/resource_aws_security_group_test.go index a0cd2c12f..b1e4e8c82 100644 --- a/builtin/providers/aws/resource_aws_security_group_test.go +++ b/builtin/providers/aws/resource_aws_security_group_test.go @@ -186,7 +186,7 @@ func TestAccAWSSecurityGroup_Change(t *testing.T) { } func testAccCheckAWSSecurityGroupDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_security_group" { @@ -230,7 +230,7 @@ func testAccCheckAWSSecurityGroupExists(n string, group *ec2.SecurityGroup) reso return fmt.Errorf("No Security Group is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn req := &ec2.DescribeSecurityGroupsRequest{ GroupIDs: []string{rs.Primary.ID}, } diff --git a/builtin/providers/aws/resource_aws_subnet.go b/builtin/providers/aws/resource_aws_subnet.go index 07a3413f2..d1db5aed9 100644 --- a/builtin/providers/aws/resource_aws_subnet.go +++ b/builtin/providers/aws/resource_aws_subnet.go @@ -51,7 +51,7 @@ func resourceAwsSubnet() *schema.Resource { } func resourceAwsSubnetCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn createOpts := &ec2.CreateSubnetRequest{ AvailabilityZone: aws.String(d.Get("availability_zone").(string)), @@ -91,7 +91,7 @@ func resourceAwsSubnetCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsSubnetRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn resp, err := ec2conn.DescribeSubnets(&ec2.DescribeSubnetsRequest{ SubnetIDs: []string{d.Id()}, @@ -121,7 +121,7 @@ func resourceAwsSubnetRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsSubnetUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn d.Partial(true) @@ -154,7 +154,7 @@ func resourceAwsSubnetUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsSubnetDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn log.Printf("[INFO] Deleting subnet: %s", d.Id()) diff --git a/builtin/providers/aws/resource_aws_subnet_test.go b/builtin/providers/aws/resource_aws_subnet_test.go index 77dfeccf0..ae7b28dee 100644 --- a/builtin/providers/aws/resource_aws_subnet_test.go +++ b/builtin/providers/aws/resource_aws_subnet_test.go @@ -43,7 +43,7 @@ func TestAccAWSSubnet(t *testing.T) { } func testAccCheckSubnetDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_subnet" { @@ -86,7 +86,7 @@ func testAccCheckSubnetExists(n string, v *ec2.Subnet) resource.TestCheckFunc { return fmt.Errorf("No ID is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn resp, err := conn.DescribeSubnets(&ec2.DescribeSubnetsRequest{ SubnetIDs: []string{rs.Primary.ID}, }) diff --git a/builtin/providers/aws/resource_aws_vpc.go b/builtin/providers/aws/resource_aws_vpc.go index 0e2485972..0ef8aa570 100644 --- a/builtin/providers/aws/resource_aws_vpc.go +++ b/builtin/providers/aws/resource_aws_vpc.go @@ -64,7 +64,7 @@ func resourceAwsVpc() *schema.Resource { } func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn instance_tenancy := "default" if v, ok := d.GetOk("instance_tenancy"); ok { instance_tenancy = v.(string) @@ -110,7 +110,7 @@ func resourceAwsVpcCreate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Refresh the VPC state vpcRaw, _, err := VPCStateRefreshFunc(ec2conn, d.Id())() @@ -180,7 +180,7 @@ func resourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Turn on partial mode d.Partial(true) @@ -231,7 +231,7 @@ func resourceAwsVpcUpdate(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn vpcID := d.Id() DeleteVpcOpts := &ec2.DeleteVPCRequest{ VPCID: &vpcID, diff --git a/builtin/providers/aws/resource_aws_vpc_peering_connection.go b/builtin/providers/aws/resource_aws_vpc_peering_connection.go index 548718f43..0f8c6185b 100644 --- a/builtin/providers/aws/resource_aws_vpc_peering_connection.go +++ b/builtin/providers/aws/resource_aws_vpc_peering_connection.go @@ -41,7 +41,7 @@ func resourceAwsVpcPeeringConnection() *schema.Resource { } func resourceAwsVpcPeeringCreate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn // Create the vpc peering connection createOpts := &ec2.CreateVPCPeeringConnectionRequest{ @@ -80,7 +80,7 @@ func resourceAwsVpcPeeringCreate(d *schema.ResourceData, meta interface{}) error } func resourceAwsVpcPeeringRead(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn pcRaw, _, err := resourceAwsVpcPeeringConnectionStateRefreshFunc(ec2conn, d.Id())() if err != nil { return err @@ -101,7 +101,7 @@ func resourceAwsVpcPeeringRead(d *schema.ResourceData, meta interface{}) error { } func resourceAwsVpcPeeringUpdate(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn if err := setTags(ec2conn, d); err != nil { return err @@ -113,7 +113,7 @@ func resourceAwsVpcPeeringUpdate(d *schema.ResourceData, meta interface{}) error } func resourceAwsVpcPeeringDelete(d *schema.ResourceData, meta interface{}) error { - ec2conn := meta.(*AWSClient).awsEC2conn + ec2conn := meta.(*AWSClient).ec2conn _, err := ec2conn.DeleteVPCPeeringConnection( &ec2.DeleteVPCPeeringConnectionRequest{ diff --git a/builtin/providers/aws/resource_aws_vpc_peering_connection_test.go b/builtin/providers/aws/resource_aws_vpc_peering_connection_test.go index 307dcb7d9..c374646b8 100644 --- a/builtin/providers/aws/resource_aws_vpc_peering_connection_test.go +++ b/builtin/providers/aws/resource_aws_vpc_peering_connection_test.go @@ -28,7 +28,7 @@ func TestAccAWSVPCPeeringConnection_normal(t *testing.T) { } func testAccCheckAWSVpcPeeringConnectionDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_vpc_peering_connection" { diff --git a/builtin/providers/aws/resource_aws_vpc_test.go b/builtin/providers/aws/resource_aws_vpc_test.go index 4f3f02f0f..092f47806 100644 --- a/builtin/providers/aws/resource_aws_vpc_test.go +++ b/builtin/providers/aws/resource_aws_vpc_test.go @@ -111,7 +111,7 @@ func TestAccVpcUpdate(t *testing.T) { } func testAccCheckVpcDestroy(s *terraform.State) error { - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn for _, rs := range s.RootModule().Resources { if rs.Type != "aws_vpc" { @@ -166,7 +166,7 @@ func testAccCheckVpcExists(n string, vpc *ec2.VPC) resource.TestCheckFunc { return fmt.Errorf("No VPC ID is set") } - conn := testAccProvider.Meta().(*AWSClient).awsEC2conn + conn := testAccProvider.Meta().(*AWSClient).ec2conn DescribeVpcOpts := &ec2.DescribeVPCsRequest{ VPCIDs: []string{rs.Primary.ID}, } diff --git a/builtin/providers/aws/structure.go b/builtin/providers/aws/structure.go index bdc04bcd2..617c2bbf9 100644 --- a/builtin/providers/aws/structure.go +++ b/builtin/providers/aws/structure.go @@ -129,16 +129,7 @@ func flattenHealthCheck(check *elb.HealthCheck) []map[string]interface{} { } // Flattens an array of UserSecurityGroups into a []string -func flattenSecurityGroups(list []ec2.UserSecurityGroup) []string { - result := make([]string, 0, len(list)) - for _, g := range list { - result = append(result, g.Id) - } - return result -} - -// Flattens an array of UserSecurityGroups into a []string -func flattenSecurityGroupsSDK(list []ec2.UserIDGroupPair) []string { +func flattenSecurityGroups(list []ec2.UserIDGroupPair) []string { result := make([]string, 0, len(list)) for _, g := range list { result = append(result, *g.GroupID) diff --git a/builtin/providers/aws/structure_test.go b/builtin/providers/aws/structure_test.go index d5e470341..b85adc51a 100644 --- a/builtin/providers/aws/structure_test.go +++ b/builtin/providers/aws/structure_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/hashicorp/aws-sdk-go/aws" - awsEC2 "github.com/hashicorp/aws-sdk-go/gen/ec2" + ec2 "github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/hashicorp/aws-sdk-go/gen/elb" "github.com/hashicorp/aws-sdk-go/gen/rds" "github.com/hashicorp/terraform/flatmap" @@ -61,28 +61,28 @@ func TestExpandIPPerms(t *testing.T) { } perms := expandIPPerms("foo", expanded) - expected := []awsEC2.IPPermission{ - awsEC2.IPPermission{ + expected := []ec2.IPPermission{ + ec2.IPPermission{ IPProtocol: aws.String("icmp"), FromPort: aws.Integer(1), ToPort: aws.Integer(-1), - IPRanges: []awsEC2.IPRange{awsEC2.IPRange{aws.String("0.0.0.0/0")}}, - UserIDGroupPairs: []awsEC2.UserIDGroupPair{ - awsEC2.UserIDGroupPair{ + IPRanges: []ec2.IPRange{ec2.IPRange{aws.String("0.0.0.0/0")}}, + UserIDGroupPairs: []ec2.UserIDGroupPair{ + ec2.UserIDGroupPair{ UserID: aws.String("foo"), GroupID: aws.String("sg-22222"), }, - awsEC2.UserIDGroupPair{ + ec2.UserIDGroupPair{ GroupID: aws.String("sg-22222"), }, }, }, - awsEC2.IPPermission{ + ec2.IPPermission{ IPProtocol: aws.String("icmp"), FromPort: aws.Integer(1), ToPort: aws.Integer(-1), - UserIDGroupPairs: []awsEC2.UserIDGroupPair{ - awsEC2.UserIDGroupPair{ + UserIDGroupPairs: []ec2.UserIDGroupPair{ + ec2.UserIDGroupPair{ UserID: aws.String("foo"), }, }, From d5f23aec0a5c795635687386ebf9430f787c1b10 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Fri, 13 Mar 2015 10:54:00 -0500 Subject: [PATCH 18/31] provider/aws: Fix encoding bug with AWS Instance --- builtin/providers/aws/resource_aws_instance.go | 3 ++- builtin/providers/aws/resource_aws_instance_test.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/builtin/providers/aws/resource_aws_instance.go b/builtin/providers/aws/resource_aws_instance.go index 5475e7454..6ffd6a983 100644 --- a/builtin/providers/aws/resource_aws_instance.go +++ b/builtin/providers/aws/resource_aws_instance.go @@ -3,6 +3,7 @@ package aws import ( "bytes" "crypto/sha1" + "encoding/base64" "encoding/hex" "fmt" "log" @@ -258,7 +259,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { // Figure out user data userData := "" if v := d.Get("user_data"); v != nil { - userData = v.(string) + userData = base64.StdEncoding.EncodeToString([]byte(v.(string))) } placement := &ec2.Placement{ diff --git a/builtin/providers/aws/resource_aws_instance_test.go b/builtin/providers/aws/resource_aws_instance_test.go index 3a9c16588..a9d439591 100644 --- a/builtin/providers/aws/resource_aws_instance_test.go +++ b/builtin/providers/aws/resource_aws_instance_test.go @@ -392,7 +392,7 @@ resource "aws_instance" "foo" { instance_type = "m1.small" security_groups = ["${aws_security_group.tf_test_foo.name}"] - user_data = "foo" + user_data = "foo:-with-character's" } ` From 670d22e18f1f7991475da33546b42bfdceffe0f1 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Fri, 13 Mar 2015 14:58:05 -0500 Subject: [PATCH 19/31] update acceptance test with the correct depends_on declarations --- builtin/providers/aws/resource_aws_instance_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/builtin/providers/aws/resource_aws_instance_test.go b/builtin/providers/aws/resource_aws_instance_test.go index e5f460954..461a5e926 100644 --- a/builtin/providers/aws/resource_aws_instance_test.go +++ b/builtin/providers/aws/resource_aws_instance_test.go @@ -556,7 +556,6 @@ resource "aws_instance" "foo" { const testAccInstanceNetworkInstanceSecurityGroups = ` resource "aws_internet_gateway" "gw" { vpc_id = "${aws_vpc.foo.id}" - depends_on = ["aws_eip.foo_eip"] } resource "aws_vpc" "foo" { @@ -590,10 +589,12 @@ resource "aws_instance" "foo_instance" { security_groups = ["${aws_security_group.tf_test_foo.id}"] subnet_id = "${aws_subnet.foo.id}" associate_public_ip_address = true + depends_on = ["aws_internet_gateway.gw"] } resource "aws_eip" "foo_eip" { instance = "${aws_instance.foo_instance.id}" vpc = true + depends_on = ["aws_internet_gateway.gw"] } ` From 2d62e55b0edce36d07653cf09257a1835f9ea974 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Fri, 13 Mar 2015 15:39:17 -0500 Subject: [PATCH 20/31] Add note to Intergent Gateway resource on using depends_on --- .../docs/providers/aws/r/internet_gateway.html.markdown | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/website/source/docs/providers/aws/r/internet_gateway.html.markdown b/website/source/docs/providers/aws/r/internet_gateway.html.markdown index ec79f922a..40fedbb2a 100644 --- a/website/source/docs/providers/aws/r/internet_gateway.html.markdown +++ b/website/source/docs/providers/aws/r/internet_gateway.html.markdown @@ -29,6 +29,11 @@ The following arguments are supported: * `vpc_id` - (Required) The VPC ID to create in. * `tags` - (Optional) A mapping of tags to assign to the resource. +-> **Note:** When using Internet Gateways with AWS Instances or Elastic IPs, +it is recommended to denote that they depend on the Internet Gateway created, +via the `depends_on` attribute: +`depends_on = ["aws_internet_gateway.gw"]`. + ## Attributes Reference The following attributes are exported: From cd15c9aaf9bbca910a19b22d68a00c04ce2cbc8e Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Fri, 13 Mar 2015 16:04:27 -0500 Subject: [PATCH 21/31] clean up docs --- .../aws/r/internet_gateway.html.markdown | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/website/source/docs/providers/aws/r/internet_gateway.html.markdown b/website/source/docs/providers/aws/r/internet_gateway.html.markdown index 40fedbb2a..cefedc6ad 100644 --- a/website/source/docs/providers/aws/r/internet_gateway.html.markdown +++ b/website/source/docs/providers/aws/r/internet_gateway.html.markdown @@ -29,10 +29,17 @@ The following arguments are supported: * `vpc_id` - (Required) The VPC ID to create in. * `tags` - (Optional) A mapping of tags to assign to the resource. --> **Note:** When using Internet Gateways with AWS Instances or Elastic IPs, -it is recommended to denote that they depend on the Internet Gateway created, -via the `depends_on` attribute: -`depends_on = ["aws_internet_gateway.gw"]`. +-> **Note:** It's recommended to denote that the AWS Instance or Elastic IP depends on the Internet Gateway. For example: + + + resource "aws_internet_gateway" "gw" { + vpc_id = "${aws_vpc.main.id}" + } + + resource "aws_instance" "foo" { + depends_on = ["aws_internet_gateway.gw"] + } + ## Attributes Reference From 0d13cd1f54cf220d8f88f3d94f8c6574014bd14d Mon Sep 17 00:00:00 2001 From: Joshua Lund Date: Fri, 13 Mar 2015 17:37:05 -0600 Subject: [PATCH 22/31] Typo fix. --- website/source/docs/commands/remote.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/source/docs/commands/remote.html.markdown b/website/source/docs/commands/remote.html.markdown index 3bc96c802..22d341891 100644 --- a/website/source/docs/commands/remote.html.markdown +++ b/website/source/docs/commands/remote.html.markdown @@ -16,7 +16,7 @@ Terraform will automatically fetch the latest state from the remote server when necessary and if any updates are made, the newest state is persisted back to the remote server. In this mode, users do not need to durably store the state using version -control or shared storaged. +control or shared storage. ## Usage From 49e6c8fd87b4324ccd70853aeb5dbd044c1757c9 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Tue, 17 Mar 2015 14:57:45 -0500 Subject: [PATCH 23/31] provider/aws: Fix wildcard support in Route53 record Fixes a bug in Route53 and wildcard entries. Refs #501. Also fixes: - an issue in the library where we don't fully wait for the results, because the error code/condition changed with the migration to aws-sdk-go - a limitation in the test, where we only consider the first record returned --- .../aws/resource_aws_route53_record.go | 33 ++++-- .../aws/resource_aws_route53_record_test.go | 102 ++++++++++++++++-- 2 files changed, 119 insertions(+), 16 deletions(-) diff --git a/builtin/providers/aws/resource_aws_route53_record.go b/builtin/providers/aws/resource_aws_route53_record.go index fcd781c61..abfa04942 100644 --- a/builtin/providers/aws/resource_aws_route53_record.go +++ b/builtin/providers/aws/resource_aws_route53_record.go @@ -173,7 +173,8 @@ func resourceAwsRoute53RecordRead(d *schema.ResourceData, meta interface{}) erro // Scan for a matching record found := false for _, record := range resp.ResourceRecordSets { - if FQDN(*record.Name) != FQDN(*lopts.StartRecordName) { + name := cleanRecordName(*record.Name) + if FQDN(name) != FQDN(*lopts.StartRecordName) { continue } if strings.ToUpper(*record.Type) != strings.ToUpper(*lopts.StartRecordType) { @@ -232,15 +233,17 @@ func resourceAwsRoute53RecordDelete(d *schema.ResourceData, meta interface{}) er Refresh: func() (interface{}, string, error) { _, err := conn.ChangeResourceRecordSets(req) if err != nil { - if strings.Contains(err.Error(), "PriorRequestNotComplete") { - // There is some pending operation, so just retry - // in a bit. - return 42, "rejected", nil - } + if r53err, ok := err.(aws.APIError); ok { + if r53err.Code == "PriorRequestNotComplete" { + // There is some pending operation, so just retry + // in a bit. + return 42, "rejected", nil + } - if strings.Contains(err.Error(), "InvalidChangeBatch") { - // This means that the record is already gone. - return 42, "accepted", nil + if r53err.Code == "InvalidChangeBatch" { + // This means that the record is already gone. + return 42, "accepted", nil + } } return 42, "failure", err @@ -282,3 +285,15 @@ func FQDN(name string) string { return name + "." } } + +// Route 53 stores the "*" wildcard indicator as ASCII 42 and returns the +// octal equivalent, "\\052". Here we look for that, and convert back to "*" +// as needed. +func cleanRecordName(name string) string { + str := name + if strings.HasPrefix(name, "\\052") { + str = strings.Replace(name, "\\052", "*", 1) + log.Printf("[DEBUG] Replacing octal \\052 for * in: %s", name) + } + return str +} diff --git a/builtin/providers/aws/resource_aws_route53_record_test.go b/builtin/providers/aws/resource_aws_route53_record_test.go index 08325c783..0608c51d1 100644 --- a/builtin/providers/aws/resource_aws_route53_record_test.go +++ b/builtin/providers/aws/resource_aws_route53_record_test.go @@ -9,9 +9,26 @@ import ( "github.com/hashicorp/terraform/terraform" "github.com/hashicorp/aws-sdk-go/aws" - awsr53 "github.com/hashicorp/aws-sdk-go/gen/route53" + route53 "github.com/hashicorp/aws-sdk-go/gen/route53" ) +func TestCleanRecordName(t *testing.T) { + cases := []struct { + Input, Output string + }{ + {"www.nonexample.com", "www.nonexample.com"}, + {"\\052.nonexample.com", "*.nonexample.com"}, + {"nonexample.com", "nonexample.com"}, + } + + for _, tc := range cases { + actual := cleanRecordName(tc.Input) + if actual != tc.Output { + t.Fatalf("input: %s\noutput: %s", tc.Input, actual) + } + } +} + func TestAccRoute53Record(t *testing.T) { resource.Test(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -44,6 +61,30 @@ func TestAccRoute53Record_generatesSuffix(t *testing.T) { }) } +func TestAccRoute53Record_wildcard(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckRoute53RecordDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccRoute53WildCardRecordConfig, + Check: resource.ComposeTestCheckFunc( + testAccCheckRoute53RecordExists("aws_route53_record.wildcard"), + ), + }, + + // Cause a change, which will trigger a refresh + resource.TestStep{ + Config: testAccRoute53WildCardRecordConfigUpdate, + Check: resource.ComposeTestCheckFunc( + testAccCheckRoute53RecordExists("aws_route53_record.wildcard"), + ), + }, + }, + }) +} + func testAccCheckRoute53RecordDestroy(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).r53conn for _, rs := range s.RootModule().Resources { @@ -56,7 +97,7 @@ func testAccCheckRoute53RecordDestroy(s *terraform.State) error { name := parts[1] rType := parts[2] - lopts := &awsr53.ListResourceRecordSetsRequest{ + lopts := &route53.ListResourceRecordSetsRequest{ HostedZoneID: aws.String(cleanZoneID(zone)), StartRecordName: aws.String(name), StartRecordType: aws.String(rType), @@ -94,7 +135,7 @@ func testAccCheckRoute53RecordExists(n string) resource.TestCheckFunc { name := parts[1] rType := parts[2] - lopts := &awsr53.ListResourceRecordSetsRequest{ + lopts := &route53.ListResourceRecordSetsRequest{ HostedZoneID: aws.String(cleanZoneID(zone)), StartRecordName: aws.String(name), StartRecordType: aws.String(rType), @@ -107,11 +148,14 @@ func testAccCheckRoute53RecordExists(n string) resource.TestCheckFunc { if len(resp.ResourceRecordSets) == 0 { return fmt.Errorf("Record does not exist") } - rec := resp.ResourceRecordSets[0] - if FQDN(*rec.Name) == FQDN(name) && *rec.Type == rType { - return nil + // rec := resp.ResourceRecordSets[0] + for _, rec := range resp.ResourceRecordSets { + recName := cleanRecordName(*rec.Name) + if FQDN(recName) == FQDN(name) && *rec.Type == rType { + return nil + } } - return fmt.Errorf("Record does not exist: %#v", rec) + return fmt.Errorf("Record does not exist: %#v", rs.Primary.ID) } } @@ -142,3 +186,47 @@ resource "aws_route53_record" "default" { records = ["127.0.0.1", "127.0.0.27"] } ` + +const testAccRoute53WildCardRecordConfig = ` +resource "aws_route53_zone" "main" { + name = "notexample.com" +} + +resource "aws_route53_record" "default" { + zone_id = "${aws_route53_zone.main.zone_id}" + name = "subdomain" + type = "A" + ttl = "30" + records = ["127.0.0.1", "127.0.0.27"] +} + +resource "aws_route53_record" "wildcard" { + zone_id = "${aws_route53_zone.main.zone_id}" + name = "*.notexample.com" + type = "A" + ttl = "30" + records = ["127.0.0.1"] +} +` + +const testAccRoute53WildCardRecordConfigUpdate = ` +resource "aws_route53_zone" "main" { + name = "notexample.com" +} + +resource "aws_route53_record" "default" { + zone_id = "${aws_route53_zone.main.zone_id}" + name = "subdomain" + type = "A" + ttl = "30" + records = ["127.0.0.1", "127.0.0.27"] +} + +resource "aws_route53_record" "wildcard" { + zone_id = "${aws_route53_zone.main.zone_id}" + name = "*.notexample.com" + type = "A" + ttl = "60" + records = ["127.0.0.1"] +} +` From 7034619863d14d4c43996e657467868fa8ddee07 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Tue, 17 Mar 2015 15:48:10 -0500 Subject: [PATCH 24/31] provider/aws: Fix issue where we ignored the 'self' attribute of a security group rule --- builtin/providers/aws/resource_aws_security_group.go | 1 + 1 file changed, 1 insertion(+) diff --git a/builtin/providers/aws/resource_aws_security_group.go b/builtin/providers/aws/resource_aws_security_group.go index c8051813f..8a307babb 100644 --- a/builtin/providers/aws/resource_aws_security_group.go +++ b/builtin/providers/aws/resource_aws_security_group.go @@ -285,6 +285,7 @@ func resourceAwsSecurityGroupRuleHash(v interface{}) int { buf.WriteString(fmt.Sprintf("%d-", m["from_port"].(int))) buf.WriteString(fmt.Sprintf("%d-", m["to_port"].(int))) buf.WriteString(fmt.Sprintf("%s-", m["protocol"].(string))) + buf.WriteString(fmt.Sprintf("%t-", m["self"].(bool))) // We need to make sure to sort the strings below so that we always // generate the same hash code no matter what is in the set. From 0a24e72c3b740f54c385d4d78b4f049745bd4f07 Mon Sep 17 00:00:00 2001 From: Paul Hinze Date: Tue, 17 Mar 2015 17:08:22 -0400 Subject: [PATCH 25/31] state/remote: allow https consul addresses Sending state over a cleartext protocol is bad in untrusted networks. Expose `-backend-config="scheme=https"` and wire it through to the Consul client. --- state/remote/consul.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/state/remote/consul.go b/state/remote/consul.go index 274b5e37d..791f4dca3 100644 --- a/state/remote/consul.go +++ b/state/remote/consul.go @@ -20,6 +20,9 @@ func consulFactory(conf map[string]string) (Client, error) { if addr, ok := conf["address"]; ok && addr != "" { config.Address = addr } + if scheme, ok := conf["scheme"]; ok && scheme != "" { + config.Scheme = scheme + } client, err := consulapi.NewClient(config) if err != nil { From f74e68ea46ace04a89174bee6eb448c66aad2463 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Tue, 17 Mar 2015 17:22:30 -0500 Subject: [PATCH 26/31] provider/aws: Fixes issue 886 in DB Parameter group --- builtin/providers/aws/resource_aws_db_parameter_group.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/builtin/providers/aws/resource_aws_db_parameter_group.go b/builtin/providers/aws/resource_aws_db_parameter_group.go index a5eda1a64..68c5b52e6 100644 --- a/builtin/providers/aws/resource_aws_db_parameter_group.go +++ b/builtin/providers/aws/resource_aws_db_parameter_group.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "log" + "strings" "time" "github.com/hashicorp/terraform/helper/hashcode" @@ -220,7 +221,8 @@ func resourceAwsDbParameterHash(v interface{}) int { var buf bytes.Buffer m := v.(map[string]interface{}) buf.WriteString(fmt.Sprintf("%s-", m["name"].(string))) - buf.WriteString(fmt.Sprintf("%s-", m["value"].(string))) + // Store the value as a lower case string, to match how we store them in flattenParameters + buf.WriteString(fmt.Sprintf("%s-", strings.ToLower(m["value"].(string)))) return hashcode.String(buf.String()) } From d823a8cf81f7f30942dd18760bdc2d4d71df77e2 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Mar 2015 13:47:59 +0000 Subject: [PATCH 27/31] providers/aws: fix security group self ingress rules on EC2-classic --- .../aws/resource_aws_security_group.go | 9 ++- builtin/providers/aws/structure.go | 16 +++- builtin/providers/aws/structure_test.go | 79 ++++++++++++++++++- 3 files changed, 99 insertions(+), 5 deletions(-) diff --git a/builtin/providers/aws/resource_aws_security_group.go b/builtin/providers/aws/resource_aws_security_group.go index c8051813f..ec859b697 100644 --- a/builtin/providers/aws/resource_aws_security_group.go +++ b/builtin/providers/aws/resource_aws_security_group.go @@ -396,8 +396,8 @@ func resourceAwsSecurityGroupUpdateRules( os := o.(*schema.Set) ns := n.(*schema.Set) - remove := expandIPPerms(d.Id(), os.Difference(ns).List()) - add := expandIPPerms(d.Id(), ns.Difference(os).List()) + remove := expandIPPerms(group, os.Difference(ns).List()) + add := expandIPPerms(group, ns.Difference(os).List()) // TODO: We need to handle partial state better in the in-between // in this update. @@ -452,6 +452,11 @@ func resourceAwsSecurityGroupUpdateRules( GroupID: group.GroupID, IPPermissions: add, } + if group.VPCID == nil || *group.VPCID == "" { + req.GroupID = nil + req.GroupName = group.GroupName + } + err = ec2conn.AuthorizeSecurityGroupIngress(req) } diff --git a/builtin/providers/aws/structure.go b/builtin/providers/aws/structure.go index 617c2bbf9..3880f3e82 100644 --- a/builtin/providers/aws/structure.go +++ b/builtin/providers/aws/structure.go @@ -39,7 +39,10 @@ func expandListeners(configured []interface{}) ([]elb.Listener, error) { // Takes the result of flatmap.Expand for an array of ingress/egress // security group rules and returns EC2 API compatible objects -func expandIPPerms(id string, configured []interface{}) []ec2.IPPermission { +func expandIPPerms( + group ec2.SecurityGroup, configured []interface{}) []ec2.IPPermission { + vpc := group.VPCID != nil + perms := make([]ec2.IPPermission, len(configured)) for i, mRaw := range configured { var perm ec2.IPPermission @@ -57,7 +60,11 @@ func expandIPPerms(id string, configured []interface{}) []ec2.IPPermission { } } if v, ok := m["self"]; ok && v.(bool) { - groups = append(groups, id) + if vpc { + groups = append(groups, *group.GroupID) + } else { + groups = append(groups, *group.GroupName) + } } if len(groups) > 0 { @@ -72,6 +79,11 @@ func expandIPPerms(id string, configured []interface{}) []ec2.IPPermission { GroupID: aws.String(id), UserID: aws.String(ownerId), } + if !vpc { + perm.UserIDGroupPairs[i].GroupID = nil + perm.UserIDGroupPairs[i].GroupName = aws.String(id) + perm.UserIDGroupPairs[i].UserID = nil + } } } diff --git a/builtin/providers/aws/structure_test.go b/builtin/providers/aws/structure_test.go index b85adc51a..12af95328 100644 --- a/builtin/providers/aws/structure_test.go +++ b/builtin/providers/aws/structure_test.go @@ -59,7 +59,11 @@ func TestExpandIPPerms(t *testing.T) { "self": true, }, } - perms := expandIPPerms("foo", expanded) + group := ec2.SecurityGroup{ + GroupID: aws.String("foo"), + VPCID: aws.String("bar"), + } + perms := expandIPPerms(group, expanded) expected := []ec2.IPPermission{ ec2.IPPermission{ @@ -115,6 +119,79 @@ func TestExpandIPPerms(t *testing.T) { } +func TestExpandIPPerms_nonVPC(t *testing.T) { + hash := func(v interface{}) int { + return hashcode.String(v.(string)) + } + + expanded := []interface{}{ + map[string]interface{}{ + "protocol": "icmp", + "from_port": 1, + "to_port": -1, + "cidr_blocks": []interface{}{"0.0.0.0/0"}, + "security_groups": schema.NewSet(hash, []interface{}{ + "sg-11111", + "foo/sg-22222", + }), + }, + map[string]interface{}{ + "protocol": "icmp", + "from_port": 1, + "to_port": -1, + "self": true, + }, + } + group := ec2.SecurityGroup{ + GroupName: aws.String("foo"), + } + perms := expandIPPerms(group, expanded) + + expected := []ec2.IPPermission{ + ec2.IPPermission{ + IPProtocol: aws.String("icmp"), + FromPort: aws.Integer(1), + ToPort: aws.Integer(-1), + IPRanges: []ec2.IPRange{ec2.IPRange{aws.String("0.0.0.0/0")}}, + UserIDGroupPairs: []ec2.UserIDGroupPair{ + ec2.UserIDGroupPair{ + GroupName: aws.String("sg-22222"), + }, + ec2.UserIDGroupPair{ + GroupName: aws.String("sg-22222"), + }, + }, + }, + ec2.IPPermission{ + IPProtocol: aws.String("icmp"), + FromPort: aws.Integer(1), + ToPort: aws.Integer(-1), + UserIDGroupPairs: []ec2.UserIDGroupPair{ + ec2.UserIDGroupPair{ + GroupName: aws.String("foo"), + }, + }, + }, + } + + exp := expected[0] + perm := perms[0] + + if *exp.FromPort != *perm.FromPort { + t.Fatalf( + "Got:\n\n%#v\n\nExpected:\n\n%#v\n", + *perm.FromPort, + *exp.FromPort) + } + + if *exp.IPRanges[0].CIDRIP != *perm.IPRanges[0].CIDRIP { + t.Fatalf( + "Got:\n\n%#v\n\nExpected:\n\n%#v\n", + *perm.IPRanges[0].CIDRIP, + *exp.IPRanges[0].CIDRIP) + } +} + func TestExpandListeners(t *testing.T) { expanded := []interface{}{ map[string]interface{}{ From ca6f6a1e143d8875450c84478673182bad81ebb8 Mon Sep 17 00:00:00 2001 From: Paul Hinze Date: Wed, 18 Mar 2015 08:57:41 -0500 Subject: [PATCH 28/31] providers/aws: fix TestAccAWSInstance_normal The test just needed updated SHAs for user_data. --- builtin/providers/aws/resource_aws_instance_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtin/providers/aws/resource_aws_instance_test.go b/builtin/providers/aws/resource_aws_instance_test.go index 897143520..941dd5dd4 100644 --- a/builtin/providers/aws/resource_aws_instance_test.go +++ b/builtin/providers/aws/resource_aws_instance_test.go @@ -44,7 +44,7 @@ func TestAccAWSInstance_normal(t *testing.T) { resource.TestCheckResourceAttr( "aws_instance.foo", "user_data", - "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), + "3dc39dda39be1205215e776bad998da361a5955d"), ), }, @@ -60,7 +60,7 @@ func TestAccAWSInstance_normal(t *testing.T) { resource.TestCheckResourceAttr( "aws_instance.foo", "user_data", - "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), + "3dc39dda39be1205215e776bad998da361a5955d"), ), }, }, From 1979d9b792c34bd9a49be77782c1a245bcfec536 Mon Sep 17 00:00:00 2001 From: "Michael H. Oshita" Date: Thu, 19 Mar 2015 03:45:32 +0900 Subject: [PATCH 29/31] fix indent align indentation with the rest of the code. --- .../source/docs/providers/aws/r/security_group.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/source/docs/providers/aws/r/security_group.html.markdown b/website/source/docs/providers/aws/r/security_group.html.markdown index 869f4bdc5..f23bbcf16 100644 --- a/website/source/docs/providers/aws/r/security_group.html.markdown +++ b/website/source/docs/providers/aws/r/security_group.html.markdown @@ -17,7 +17,7 @@ Basic usage ``` resource "aws_security_group" "allow_all" { name = "allow_all" - description = "Allow all inbound traffic" + description = "Allow all inbound traffic" ingress { from_port = 0 From 50c49396f494c0f71cade0ae77f8d2baede655e8 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Mar 2015 20:48:39 +0100 Subject: [PATCH 30/31] providers/aws: only set instance tenancy if its set /cc @clint --- builtin/providers/aws/resource_aws_instance.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/builtin/providers/aws/resource_aws_instance.go b/builtin/providers/aws/resource_aws_instance.go index 74c7b5845..5fb4f525a 100644 --- a/builtin/providers/aws/resource_aws_instance.go +++ b/builtin/providers/aws/resource_aws_instance.go @@ -264,7 +264,9 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { placement := &ec2.Placement{ AvailabilityZone: aws.String(d.Get("availability_zone").(string)), - Tenancy: aws.String(d.Get("tenancy").(string)), + } + if v := d.Get("tenancy").(string); v != "" { + placement.Tenancy = aws.String(v) } iam := &ec2.IAMInstanceProfileSpecification{ From e84711b46007e37b2e9ac974bad31ed174c1893a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Mar 2015 20:54:44 +0100 Subject: [PATCH 31/31] providers/aws: more classic-mode fixes for instance /cc @catsby - Just a quick note to be careful about checking the nil of a field before cehcking the value (see the subnetid check), to avoid panics --- .../providers/aws/resource_aws_instance.go | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/builtin/providers/aws/resource_aws_instance.go b/builtin/providers/aws/resource_aws_instance.go index 5fb4f525a..4e966e3b6 100644 --- a/builtin/providers/aws/resource_aws_instance.go +++ b/builtin/providers/aws/resource_aws_instance.go @@ -496,7 +496,7 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error { // we use IDs if we're in a VPC. However, if we previously had an // all-name list of security groups, we use names. Or, if we had any // IDs, we use IDs. - useID := *instance.SubnetID != "" + useID := instance.SubnetID != nil && *instance.SubnetID != "" if v := d.Get("security_groups"); v != nil { match := false for _, v := range v.(*schema.Set).List() { @@ -569,18 +569,19 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error { func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { ec2conn := meta.(*AWSClient).ec2conn - opts := new(ec2.ModifyInstanceAttributeRequest) - log.Printf("[INFO] Modifying instance %s: %#v", d.Id(), opts) - err := ec2conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeRequest{ - InstanceID: aws.String(d.Id()), - SourceDestCheck: &ec2.AttributeBooleanValue{ - Value: aws.Boolean(d.Get("source_dest_check").(bool)), - }, - }) - - if err != nil { - return err + // SourceDestCheck can only be set on VPC instances + if d.Get("subnet_id").(string) != "" { + log.Printf("[INFO] Modifying instance %s", d.Id()) + err := ec2conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeRequest{ + InstanceID: aws.String(d.Id()), + SourceDestCheck: &ec2.AttributeBooleanValue{ + Value: aws.Boolean(d.Get("source_dest_check").(bool)), + }, + }) + if err != nil { + return err + } } // TODO(mitchellh): wait for the attributes we modified to