terraform/builtin/providers/aws/resource_aws_volume_attachm...

161 lines
3.7 KiB
Go

package aws
import (
"fmt"
"log"
"testing"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)
func TestAccAWSVolumeAttachment_basic(t *testing.T) {
var i ec2.Instance
var v ec2.Volume
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckVolumeAttachmentDestroy,
Steps: []resource.TestStep{
{
Config: testAccVolumeAttachmentConfig,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(
"aws_volume_attachment.ebs_att", "device_name", "/dev/sdh"),
testAccCheckInstanceExists(
"aws_instance.web", &i),
testAccCheckVolumeExists(
"aws_ebs_volume.example", &v),
testAccCheckVolumeAttachmentExists(
"aws_volume_attachment.ebs_att", &i, &v),
),
},
},
})
}
func TestAccAWSVolumeAttachment_skipDestroy(t *testing.T) {
var i ec2.Instance
var v ec2.Volume
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckVolumeAttachmentDestroy,
Steps: []resource.TestStep{
{
Config: testAccVolumeAttachmentConfigSkipDestroy,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(
"aws_volume_attachment.ebs_att", "device_name", "/dev/sdh"),
testAccCheckInstanceExists(
"aws_instance.web", &i),
testAccCheckVolumeExists(
"aws_ebs_volume.example", &v),
testAccCheckVolumeAttachmentExists(
"aws_volume_attachment.ebs_att", &i, &v),
),
},
},
})
}
func testAccCheckVolumeAttachmentExists(n string, i *ec2.Instance, v *ec2.Volume) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", n)
}
if rs.Primary.ID == "" {
return fmt.Errorf("No ID is set")
}
for _, b := range i.BlockDeviceMappings {
if rs.Primary.Attributes["device_name"] == *b.DeviceName {
if b.Ebs.VolumeId != nil && rs.Primary.Attributes["volume_id"] == *b.Ebs.VolumeId {
// pass
return nil
}
}
}
return fmt.Errorf("Error finding instance/volume")
}
}
func testAccCheckVolumeAttachmentDestroy(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
log.Printf("\n\n----- This is never called")
if rs.Type != "aws_volume_attachment" {
continue
}
}
return nil
}
const testAccVolumeAttachmentConfig = `
resource "aws_instance" "web" {
ami = "ami-21f78e11"
availability_zone = "us-west-2a"
instance_type = "t1.micro"
tags {
Name = "HelloWorld"
}
}
resource "aws_ebs_volume" "example" {
availability_zone = "us-west-2a"
size = 1
}
resource "aws_volume_attachment" "ebs_att" {
device_name = "/dev/sdh"
volume_id = "${aws_ebs_volume.example.id}"
instance_id = "${aws_instance.web.id}"
}
`
const testAccVolumeAttachmentConfigSkipDestroy = `
resource "aws_instance" "web" {
ami = "ami-21f78e11"
availability_zone = "us-west-2a"
instance_type = "t1.micro"
tags {
Name = "HelloWorld"
}
}
resource "aws_ebs_volume" "example" {
availability_zone = "us-west-2a"
size = 1
tags {
Name = "TestVolume"
}
}
data "aws_ebs_volume" "ebs_volume" {
filter {
name = "size"
values = ["${aws_ebs_volume.example.size}"]
}
filter {
name = "availability-zone"
values = ["${aws_ebs_volume.example.availability_zone}"]
}
filter {
name = "tag:Name"
values = ["TestVolume"]
}
}
resource "aws_volume_attachment" "ebs_att" {
device_name = "/dev/sdh"
volume_id = "${data.aws_ebs_volume.ebs_volume.id}"
instance_id = "${aws_instance.web.id}"
skip_destroy = true
}
`