Merge pull request #1558 from hashicorp/f-aws-upstream-instance

provider/aws: Convert Instance to use upstream library
This commit is contained in:
Clint 2015-04-16 12:37:35 -05:00
commit 7bb8019ce9
3 changed files with 79 additions and 75 deletions

View File

@ -10,8 +10,8 @@ import (
"strings" "strings"
"time" "time"
"github.com/hashicorp/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/aws"
"github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/awslabs/aws-sdk-go/service/ec2"
"github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/hashcode"
"github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/schema"
@ -299,7 +299,7 @@ func resourceAwsInstance() *schema.Resource {
} }
func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error { func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
ec2conn := meta.(*AWSClient).ec2conn conn := meta.(*AWSClient).ec2SDKconn
// Figure out user data // Figure out user data
userData := "" userData := ""
@ -329,12 +329,12 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
} }
// Build the creation struct // Build the creation struct
runOpts := &ec2.RunInstancesRequest{ runOpts := &ec2.RunInstancesInput{
ImageID: aws.String(d.Get("ami").(string)), ImageID: aws.String(d.Get("ami").(string)),
Placement: placement, Placement: placement,
InstanceType: aws.String(d.Get("instance_type").(string)), InstanceType: aws.String(d.Get("instance_type").(string)),
MaxCount: aws.Integer(1), MaxCount: aws.Long(int64(1)),
MinCount: aws.Integer(1), MinCount: aws.Long(int64(1)),
UserData: aws.String(userData), UserData: aws.String(userData),
EBSOptimized: aws.Boolean(d.Get("ebs_optimized").(bool)), EBSOptimized: aws.Boolean(d.Get("ebs_optimized").(bool)),
IAMInstanceProfile: iam, IAMInstanceProfile: iam,
@ -345,7 +345,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
associatePublicIPAddress = v.(bool) associatePublicIPAddress = v.(bool)
} }
var groups []string var groups []*string
if v := d.Get("security_groups"); v != nil { if v := d.Get("security_groups"); v != nil {
// Security group names. // Security group names.
// For a nondefault VPC, you must use security group IDs instead. // For a nondefault VPC, you must use security group IDs instead.
@ -355,7 +355,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
} }
for _, v := range v.(*schema.Set).List() { for _, v := range v.(*schema.Set).List() {
str := v.(string) str := v.(string)
groups = append(groups, str) groups = append(groups, aws.String(str))
} }
} }
@ -367,9 +367,9 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
// You also need to attach Security Groups to the NetworkInterface instead of the instance, // You also need to attach Security Groups to the NetworkInterface instead of the instance,
// to avoid: Network interfaces and an instance-level security groups may not be specified on // to avoid: Network interfaces and an instance-level security groups may not be specified on
// the same request // the same request
ni := ec2.InstanceNetworkInterfaceSpecification{ ni := &ec2.InstanceNetworkInterfaceSpecification{
AssociatePublicIPAddress: aws.Boolean(associatePublicIPAddress), AssociatePublicIPAddress: aws.Boolean(associatePublicIPAddress),
DeviceIndex: aws.Integer(0), DeviceIndex: aws.Long(int64(0)),
SubnetID: aws.String(subnetID), SubnetID: aws.String(subnetID),
} }
@ -379,11 +379,11 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
if v := d.Get("vpc_security_group_ids"); v != nil { if v := d.Get("vpc_security_group_ids"); v != nil {
for _, v := range v.(*schema.Set).List() { for _, v := range v.(*schema.Set).List() {
ni.Groups = append(ni.Groups, v.(string)) ni.Groups = append(ni.Groups, aws.String(v.(string)))
} }
} }
runOpts.NetworkInterfaces = []ec2.InstanceNetworkInterfaceSpecification{ni} runOpts.NetworkInterfaces = []*ec2.InstanceNetworkInterfaceSpecification{ni}
} else { } else {
if subnetID != "" { if subnetID != "" {
runOpts.SubnetID = aws.String(subnetID) runOpts.SubnetID = aws.String(subnetID)
@ -401,7 +401,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
if v := d.Get("vpc_security_group_ids"); v != nil { if v := d.Get("vpc_security_group_ids"); v != nil {
for _, v := range v.(*schema.Set).List() { for _, v := range v.(*schema.Set).List() {
runOpts.SecurityGroupIDs = append(runOpts.SecurityGroupIDs, v.(string)) runOpts.SecurityGroupIDs = append(runOpts.SecurityGroupIDs, aws.String(v.(string)))
} }
} }
} }
@ -410,7 +410,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
runOpts.KeyName = aws.String(v.(string)) runOpts.KeyName = aws.String(v.(string))
} }
blockDevices := make([]ec2.BlockDeviceMapping, 0) blockDevices := make([]*ec2.BlockDeviceMapping, 0)
if v, ok := d.GetOk("ebs_block_device"); ok { if v, ok := d.GetOk("ebs_block_device"); ok {
vL := v.(*schema.Set).List() vL := v.(*schema.Set).List()
@ -425,7 +425,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
} }
if v, ok := bd["volume_size"].(int); ok && v != 0 { if v, ok := bd["volume_size"].(int); ok && v != 0 {
ebs.VolumeSize = aws.Integer(v) ebs.VolumeSize = aws.Long(int64(v))
} }
if v, ok := bd["volume_type"].(string); ok && v != "" { if v, ok := bd["volume_type"].(string); ok && v != "" {
@ -433,10 +433,10 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
} }
if v, ok := bd["iops"].(int); ok && v > 0 { if v, ok := bd["iops"].(int); ok && v > 0 {
ebs.IOPS = aws.Integer(v) ebs.IOPS = aws.Long(int64(v))
} }
blockDevices = append(blockDevices, ec2.BlockDeviceMapping{ blockDevices = append(blockDevices, &ec2.BlockDeviceMapping{
DeviceName: aws.String(bd["device_name"].(string)), DeviceName: aws.String(bd["device_name"].(string)),
EBS: ebs, EBS: ebs,
}) })
@ -447,7 +447,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
vL := v.(*schema.Set).List() vL := v.(*schema.Set).List()
for _, v := range vL { for _, v := range vL {
bd := v.(map[string]interface{}) bd := v.(map[string]interface{})
blockDevices = append(blockDevices, ec2.BlockDeviceMapping{ blockDevices = append(blockDevices, &ec2.BlockDeviceMapping{
DeviceName: aws.String(bd["device_name"].(string)), DeviceName: aws.String(bd["device_name"].(string)),
VirtualName: aws.String(bd["virtual_name"].(string)), VirtualName: aws.String(bd["virtual_name"].(string)),
}) })
@ -466,7 +466,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
} }
if v, ok := bd["volume_size"].(int); ok && v != 0 { if v, ok := bd["volume_size"].(int); ok && v != 0 {
ebs.VolumeSize = aws.Integer(v) ebs.VolumeSize = aws.Long(int64(v))
} }
if v, ok := bd["volume_type"].(string); ok && v != "" { if v, ok := bd["volume_type"].(string); ok && v != "" {
@ -474,11 +474,11 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
} }
if v, ok := bd["iops"].(int); ok && v > 0 { if v, ok := bd["iops"].(int); ok && v > 0 {
ebs.IOPS = aws.Integer(v) ebs.IOPS = aws.Long(int64(v))
} }
if dn, err := fetchRootDeviceName(d.Get("ami").(string), ec2conn); err == nil { if dn, err := fetchRootDeviceName(d.Get("ami").(string), conn); err == nil {
blockDevices = append(blockDevices, ec2.BlockDeviceMapping{ blockDevices = append(blockDevices, &ec2.BlockDeviceMapping{
DeviceName: dn, DeviceName: dn,
EBS: ebs, EBS: ebs,
}) })
@ -494,12 +494,12 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
// Create the instance // Create the instance
log.Printf("[DEBUG] Run configuration: %#v", runOpts) log.Printf("[DEBUG] Run configuration: %#v", runOpts)
runResp, err := ec2conn.RunInstances(runOpts) runResp, err := conn.RunInstances(runOpts)
if err != nil { if err != nil {
return fmt.Errorf("Error launching source instance: %s", err) return fmt.Errorf("Error launching source instance: %s", err)
} }
instance := &runResp.Instances[0] instance := runResp.Instances[0]
log.Printf("[INFO] Instance ID: %s", *instance.InstanceID) log.Printf("[INFO] Instance ID: %s", *instance.InstanceID)
// Store the resulting ID so we can look this up later // Store the resulting ID so we can look this up later
@ -514,7 +514,7 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
stateConf := &resource.StateChangeConf{ stateConf := &resource.StateChangeConf{
Pending: []string{"pending"}, Pending: []string{"pending"},
Target: "running", Target: "running",
Refresh: InstanceStateRefreshFunc(ec2conn, *instance.InstanceID), Refresh: InstanceStateRefreshFunc(conn, *instance.InstanceID),
Timeout: 10 * time.Minute, Timeout: 10 * time.Minute,
Delay: 10 * time.Second, Delay: 10 * time.Second,
MinTimeout: 3 * time.Second, MinTimeout: 3 * time.Second,
@ -547,10 +547,10 @@ func resourceAwsInstanceCreate(d *schema.ResourceData, meta interface{}) error {
} }
func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error { func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error {
ec2conn := meta.(*AWSClient).ec2conn conn := meta.(*AWSClient).ec2SDKconn
resp, err := ec2conn.DescribeInstances(&ec2.DescribeInstancesRequest{ resp, err := conn.DescribeInstances(&ec2.DescribeInstancesInput{
InstanceIDs: []string{d.Id()}, InstanceIDs: []*string{aws.String(d.Id())},
}) })
if err != nil { if err != nil {
// If the instance was not found, return nil so that we can show // If the instance was not found, return nil so that we can show
@ -570,7 +570,7 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error {
return nil return nil
} }
instance := &resp.Reservations[0].Instances[0] instance := resp.Reservations[0].Instances[0]
// If the instance is terminated, then it is gone // If the instance is terminated, then it is gone
if *instance.State.Name == "terminated" { if *instance.State.Name == "terminated" {
@ -596,7 +596,7 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error {
d.Set("subnet_id", instance.SubnetID) d.Set("subnet_id", instance.SubnetID)
} }
d.Set("ebs_optimized", instance.EBSOptimized) d.Set("ebs_optimized", instance.EBSOptimized)
d.Set("tags", tagsToMap(instance.Tags)) d.Set("tags", tagsToMapSDK(instance.Tags))
// Determine whether we're referring to security groups with // Determine whether we're referring to security groups with
// IDs or names. We use a heuristic to figure this out. By default, // IDs or names. We use a heuristic to figure this out. By default,
@ -636,7 +636,7 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error {
} }
} }
if err := readBlockDevices(d, instance, ec2conn); err != nil { if err := readBlockDevices(d, instance, conn); err != nil {
return err return err
} }
@ -644,12 +644,14 @@ func resourceAwsInstanceRead(d *schema.ResourceData, meta interface{}) error {
} }
func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error { func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error {
ec2conn := meta.(*AWSClient).ec2conn conn := meta.(*AWSClient).ec2SDKconn
d.Partial(true)
// SourceDestCheck can only be set on VPC instances // SourceDestCheck can only be set on VPC instances
if d.Get("subnet_id").(string) != "" { if d.Get("subnet_id").(string) != "" {
log.Printf("[INFO] Modifying instance %s", d.Id()) log.Printf("[INFO] Modifying instance %s", d.Id())
err := ec2conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeRequest{ _, err := conn.ModifyInstanceAttribute(&ec2.ModifyInstanceAttributeInput{
InstanceID: aws.String(d.Id()), InstanceID: aws.String(d.Id()),
SourceDestCheck: &ec2.AttributeBooleanValue{ SourceDestCheck: &ec2.AttributeBooleanValue{
Value: aws.Boolean(d.Get("source_dest_check").(bool)), Value: aws.Boolean(d.Get("source_dest_check").(bool)),
@ -663,23 +665,24 @@ func resourceAwsInstanceUpdate(d *schema.ResourceData, meta interface{}) error {
// TODO(mitchellh): wait for the attributes we modified to // TODO(mitchellh): wait for the attributes we modified to
// persist the change... // persist the change...
if err := setTags(ec2conn, d); err != nil { if err := setTagsSDK(conn, d); err != nil {
return err return err
} else { } else {
d.SetPartial("tags") d.SetPartial("tags")
} }
d.Partial(false)
return nil return resourceAwsInstanceRead(d, meta)
} }
func resourceAwsInstanceDelete(d *schema.ResourceData, meta interface{}) error { func resourceAwsInstanceDelete(d *schema.ResourceData, meta interface{}) error {
ec2conn := meta.(*AWSClient).ec2conn conn := meta.(*AWSClient).ec2SDKconn
log.Printf("[INFO] Terminating instance: %s", d.Id()) log.Printf("[INFO] Terminating instance: %s", d.Id())
req := &ec2.TerminateInstancesRequest{ req := &ec2.TerminateInstancesInput{
InstanceIDs: []string{d.Id()}, InstanceIDs: []*string{aws.String(d.Id())},
} }
if _, err := ec2conn.TerminateInstances(req); err != nil { if _, err := conn.TerminateInstances(req); err != nil {
return fmt.Errorf("Error terminating instance: %s", err) return fmt.Errorf("Error terminating instance: %s", err)
} }
@ -690,7 +693,7 @@ func resourceAwsInstanceDelete(d *schema.ResourceData, meta interface{}) error {
stateConf := &resource.StateChangeConf{ stateConf := &resource.StateChangeConf{
Pending: []string{"pending", "running", "shutting-down", "stopped", "stopping"}, Pending: []string{"pending", "running", "shutting-down", "stopped", "stopping"},
Target: "terminated", Target: "terminated",
Refresh: InstanceStateRefreshFunc(ec2conn, d.Id()), Refresh: InstanceStateRefreshFunc(conn, d.Id()),
Timeout: 10 * time.Minute, Timeout: 10 * time.Minute,
Delay: 10 * time.Second, Delay: 10 * time.Second,
MinTimeout: 3 * time.Second, MinTimeout: 3 * time.Second,
@ -711,8 +714,8 @@ func resourceAwsInstanceDelete(d *schema.ResourceData, meta interface{}) error {
// an EC2 instance. // an EC2 instance.
func InstanceStateRefreshFunc(conn *ec2.EC2, instanceID string) resource.StateRefreshFunc { func InstanceStateRefreshFunc(conn *ec2.EC2, instanceID string) resource.StateRefreshFunc {
return func() (interface{}, string, error) { return func() (interface{}, string, error) {
resp, err := conn.DescribeInstances(&ec2.DescribeInstancesRequest{ resp, err := conn.DescribeInstances(&ec2.DescribeInstancesInput{
InstanceIDs: []string{instanceID}, InstanceIDs: []*string{aws.String(instanceID)},
}) })
if err != nil { if err != nil {
if ec2err, ok := err.(aws.APIError); ok && ec2err.Code == "InvalidInstanceID.NotFound" { if ec2err, ok := err.(aws.APIError); ok && ec2err.Code == "InvalidInstanceID.NotFound" {
@ -730,13 +733,13 @@ func InstanceStateRefreshFunc(conn *ec2.EC2, instanceID string) resource.StateRe
return nil, "", nil return nil, "", nil
} }
i := &resp.Reservations[0].Instances[0] i := resp.Reservations[0].Instances[0]
return i, *i.State.Name, nil return i, *i.State.Name, nil
} }
} }
func readBlockDevices(d *schema.ResourceData, instance *ec2.Instance, ec2conn *ec2.EC2) error { func readBlockDevices(d *schema.ResourceData, instance *ec2.Instance, conn *ec2.EC2) error {
ibds, err := readBlockDevicesFromInstance(instance, ec2conn) ibds, err := readBlockDevicesFromInstance(instance, conn)
if err != nil { if err != nil {
return err return err
} }
@ -753,12 +756,12 @@ func readBlockDevices(d *schema.ResourceData, instance *ec2.Instance, ec2conn *e
return nil return nil
} }
func readBlockDevicesFromInstance(instance *ec2.Instance, ec2conn *ec2.EC2) (map[string]interface{}, error) { func readBlockDevicesFromInstance(instance *ec2.Instance, conn *ec2.EC2) (map[string]interface{}, error) {
blockDevices := make(map[string]interface{}) blockDevices := make(map[string]interface{})
blockDevices["ebs"] = make([]map[string]interface{}, 0) blockDevices["ebs"] = make([]map[string]interface{}, 0)
blockDevices["root"] = nil blockDevices["root"] = nil
instanceBlockDevices := make(map[string]ec2.InstanceBlockDeviceMapping) instanceBlockDevices := make(map[string]*ec2.InstanceBlockDeviceMapping)
for _, bd := range instance.BlockDeviceMappings { for _, bd := range instance.BlockDeviceMappings {
if bd.EBS != nil { if bd.EBS != nil {
instanceBlockDevices[*(bd.EBS.VolumeID)] = bd instanceBlockDevices[*(bd.EBS.VolumeID)] = bd
@ -769,14 +772,14 @@ func readBlockDevicesFromInstance(instance *ec2.Instance, ec2conn *ec2.EC2) (map
return nil, nil return nil, nil
} }
volIDs := make([]string, 0, len(instanceBlockDevices)) volIDs := make([]*string, 0, len(instanceBlockDevices))
for volID := range instanceBlockDevices { for volID := range instanceBlockDevices {
volIDs = append(volIDs, volID) volIDs = append(volIDs, aws.String(volID))
} }
// Need to call DescribeVolumes to get volume_size and volume_type for each // Need to call DescribeVolumes to get volume_size and volume_type for each
// EBS block device // EBS block device
volResp, err := ec2conn.DescribeVolumes(&ec2.DescribeVolumesRequest{ volResp, err := conn.DescribeVolumes(&ec2.DescribeVolumesInput{
VolumeIDs: volIDs, VolumeIDs: volIDs,
}) })
if err != nil { if err != nil {
@ -820,19 +823,19 @@ func readBlockDevicesFromInstance(instance *ec2.Instance, ec2conn *ec2.EC2) (map
return blockDevices, nil return blockDevices, nil
} }
func blockDeviceIsRoot(bd ec2.InstanceBlockDeviceMapping, instance *ec2.Instance) bool { func blockDeviceIsRoot(bd *ec2.InstanceBlockDeviceMapping, instance *ec2.Instance) bool {
return (bd.DeviceName != nil && return (bd.DeviceName != nil &&
instance.RootDeviceName != nil && instance.RootDeviceName != nil &&
*bd.DeviceName == *instance.RootDeviceName) *bd.DeviceName == *instance.RootDeviceName)
} }
func fetchRootDeviceName(ami string, conn *ec2.EC2) (aws.StringValue, error) { func fetchRootDeviceName(ami string, conn *ec2.EC2) (*string, error) {
if ami == "" { if ami == "" {
return nil, fmt.Errorf("Cannot fetch root device name for blank AMI ID.") return nil, fmt.Errorf("Cannot fetch root device name for blank AMI ID.")
} }
log.Printf("[DEBUG] Describing AMI %q to get root block device name", ami) log.Printf("[DEBUG] Describing AMI %q to get root block device name", ami)
req := &ec2.DescribeImagesRequest{ImageIDs: []string{ami}} req := &ec2.DescribeImagesInput{ImageIDs: []*string{aws.String(ami)}}
if res, err := conn.DescribeImages(req); err == nil { if res, err := conn.DescribeImages(req); err == nil {
if len(res.Images) == 1 { if len(res.Images) == 1 {
return res.Images[0].RootDeviceName, nil return res.Images[0].RootDeviceName, nil

View File

@ -5,8 +5,8 @@ import (
"reflect" "reflect"
"testing" "testing"
"github.com/hashicorp/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/aws"
"github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/awslabs/aws-sdk-go/service/ec2"
"github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/schema"
"github.com/hashicorp/terraform/terraform" "github.com/hashicorp/terraform/terraform"
@ -41,11 +41,11 @@ func TestAccAWSInstance_normal(t *testing.T) {
// Need a resource in this config so the provisioner will be available // Need a resource in this config so the provisioner will be available
Config: testAccInstanceConfig_pre, Config: testAccInstanceConfig_pre,
Check: func(*terraform.State) error { Check: func(*terraform.State) error {
conn := testAccProvider.Meta().(*AWSClient).ec2conn conn := testAccProvider.Meta().(*AWSClient).ec2SDKconn
var err error var err error
vol, err = conn.CreateVolume(&ec2.CreateVolumeRequest{ vol, err = conn.CreateVolume(&ec2.CreateVolumeInput{
AvailabilityZone: aws.String("us-west-2a"), AvailabilityZone: aws.String("us-west-2a"),
Size: aws.Integer(5), Size: aws.Long(int64(5)),
}) })
return err return err
}, },
@ -88,8 +88,9 @@ func TestAccAWSInstance_normal(t *testing.T) {
resource.TestStep{ resource.TestStep{
Config: testAccInstanceConfig, Config: testAccInstanceConfig,
Check: func(*terraform.State) error { Check: func(*terraform.State) error {
conn := testAccProvider.Meta().(*AWSClient).ec2conn conn := testAccProvider.Meta().(*AWSClient).ec2SDKconn
return conn.DeleteVolume(&ec2.DeleteVolumeRequest{VolumeID: vol.VolumeID}) _, err := conn.DeleteVolume(&ec2.DeleteVolumeInput{VolumeID: vol.VolumeID})
return err
}, },
}, },
}, },
@ -103,7 +104,7 @@ func TestAccAWSInstance_blockDevices(t *testing.T) {
return func(*terraform.State) error { return func(*terraform.State) error {
// Map out the block devices by name, which should be unique. // Map out the block devices by name, which should be unique.
blockDevices := make(map[string]ec2.InstanceBlockDeviceMapping) blockDevices := make(map[string]*ec2.InstanceBlockDeviceMapping)
for _, blockDevice := range v.BlockDeviceMappings { for _, blockDevice := range v.BlockDeviceMappings {
blockDevices[*blockDevice.DeviceName] = blockDevice blockDevices[*blockDevice.DeviceName] = blockDevice
} }
@ -286,9 +287,9 @@ func TestAccAWSInstance_tags(t *testing.T) {
Config: testAccCheckInstanceConfigTags, Config: testAccCheckInstanceConfigTags,
Check: resource.ComposeTestCheckFunc( Check: resource.ComposeTestCheckFunc(
testAccCheckInstanceExists("aws_instance.foo", &v), testAccCheckInstanceExists("aws_instance.foo", &v),
testAccCheckTags(&v.Tags, "foo", "bar"), testAccCheckTagsSDK(&v.Tags, "foo", "bar"),
// Guard against regression of https://github.com/hashicorp/terraform/issues/914 // Guard against regression of https://github.com/hashicorp/terraform/issues/914
testAccCheckTags(&v.Tags, "#", ""), testAccCheckTagsSDK(&v.Tags, "#", ""),
), ),
}, },
@ -296,8 +297,8 @@ func TestAccAWSInstance_tags(t *testing.T) {
Config: testAccCheckInstanceConfigTagsUpdate, Config: testAccCheckInstanceConfigTagsUpdate,
Check: resource.ComposeTestCheckFunc( Check: resource.ComposeTestCheckFunc(
testAccCheckInstanceExists("aws_instance.foo", &v), testAccCheckInstanceExists("aws_instance.foo", &v),
testAccCheckTags(&v.Tags, "foo", ""), testAccCheckTagsSDK(&v.Tags, "foo", ""),
testAccCheckTags(&v.Tags, "bar", "baz"), testAccCheckTagsSDK(&v.Tags, "bar", "baz"),
), ),
}, },
}, },
@ -363,7 +364,7 @@ func TestAccAWSInstance_associatePublicIPAndPrivateIP(t *testing.T) {
} }
func testAccCheckInstanceDestroy(s *terraform.State) error { func testAccCheckInstanceDestroy(s *terraform.State) error {
conn := testAccProvider.Meta().(*AWSClient).ec2conn conn := testAccProvider.Meta().(*AWSClient).ec2SDKconn
for _, rs := range s.RootModule().Resources { for _, rs := range s.RootModule().Resources {
if rs.Type != "aws_instance" { if rs.Type != "aws_instance" {
@ -371,8 +372,8 @@ func testAccCheckInstanceDestroy(s *terraform.State) error {
} }
// Try to find the resource // Try to find the resource
resp, err := conn.DescribeInstances(&ec2.DescribeInstancesRequest{ resp, err := conn.DescribeInstances(&ec2.DescribeInstancesInput{
InstanceIDs: []string{rs.Primary.ID}, InstanceIDs: []*string{aws.String(rs.Primary.ID)},
}) })
if err == nil { if err == nil {
if len(resp.Reservations) > 0 { if len(resp.Reservations) > 0 {
@ -406,9 +407,9 @@ func testAccCheckInstanceExists(n string, i *ec2.Instance) resource.TestCheckFun
return fmt.Errorf("No ID is set") return fmt.Errorf("No ID is set")
} }
conn := testAccProvider.Meta().(*AWSClient).ec2conn conn := testAccProvider.Meta().(*AWSClient).ec2SDKconn
resp, err := conn.DescribeInstances(&ec2.DescribeInstancesRequest{ resp, err := conn.DescribeInstances(&ec2.DescribeInstancesInput{
InstanceIDs: []string{rs.Primary.ID}, InstanceIDs: []*string{aws.String(rs.Primary.ID)},
}) })
if err != nil { if err != nil {
return err return err
@ -417,7 +418,7 @@ func testAccCheckInstanceExists(n string, i *ec2.Instance) resource.TestCheckFun
return fmt.Errorf("Instance not found") return fmt.Errorf("Instance not found")
} }
*i = resp.Reservations[0].Instances[0] *i = *resp.Reservations[0].Instances[0]
return nil return nil
} }

View File

@ -11,7 +11,7 @@ import (
"github.com/awslabs/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/aws"
"github.com/awslabs/aws-sdk-go/service/autoscaling" "github.com/awslabs/aws-sdk-go/service/autoscaling"
"github.com/hashicorp/aws-sdk-go/gen/ec2" "github.com/awslabs/aws-sdk-go/service/ec2"
"github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/hashcode"
"github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/schema"
@ -243,7 +243,7 @@ func resourceAwsLaunchConfiguration() *schema.Resource {
func resourceAwsLaunchConfigurationCreate(d *schema.ResourceData, meta interface{}) error { func resourceAwsLaunchConfigurationCreate(d *schema.ResourceData, meta interface{}) error {
autoscalingconn := meta.(*AWSClient).autoscalingconn autoscalingconn := meta.(*AWSClient).autoscalingconn
ec2conn := meta.(*AWSClient).ec2conn ec2conn := meta.(*AWSClient).ec2SDKconn
createLaunchConfigurationOpts := autoscaling.CreateLaunchConfigurationInput{ createLaunchConfigurationOpts := autoscaling.CreateLaunchConfigurationInput{
LaunchConfigurationName: aws.String(d.Get("name").(string)), LaunchConfigurationName: aws.String(d.Get("name").(string)),
@ -394,7 +394,7 @@ func resourceAwsLaunchConfigurationCreate(d *schema.ResourceData, meta interface
func resourceAwsLaunchConfigurationRead(d *schema.ResourceData, meta interface{}) error { func resourceAwsLaunchConfigurationRead(d *schema.ResourceData, meta interface{}) error {
autoscalingconn := meta.(*AWSClient).autoscalingconn autoscalingconn := meta.(*AWSClient).autoscalingconn
ec2conn := meta.(*AWSClient).ec2conn ec2conn := meta.(*AWSClient).ec2SDKconn
describeOpts := autoscaling.DescribeLaunchConfigurationsInput{ describeOpts := autoscaling.DescribeLaunchConfigurationsInput{
LaunchConfigurationNames: []*string{aws.String(d.Id())}, LaunchConfigurationNames: []*string{aws.String(d.Id())},