github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_ami_from_instance_test.go (about) 1 package aws 2 3 import ( 4 "errors" 5 "fmt" 6 "strings" 7 "testing" 8 9 "github.com/aws/aws-sdk-go/aws" 10 "github.com/aws/aws-sdk-go/aws/awserr" 11 "github.com/aws/aws-sdk-go/service/ec2" 12 "github.com/hashicorp/terraform/helper/resource" 13 "github.com/hashicorp/terraform/terraform" 14 ) 15 16 func TestAccAWSAMIFromInstance(t *testing.T) { 17 var amiId string 18 snapshots := []string{} 19 20 resource.Test(t, resource.TestCase{ 21 PreCheck: func() { testAccPreCheck(t) }, 22 Providers: testAccProviders, 23 Steps: []resource.TestStep{ 24 resource.TestStep{ 25 Config: testAccAWSAMIFromInstanceConfig, 26 Check: func(state *terraform.State) error { 27 rs, ok := state.RootModule().Resources["aws_ami_from_instance.test"] 28 if !ok { 29 return fmt.Errorf("AMI resource not found") 30 } 31 32 amiId = rs.Primary.ID 33 34 if amiId == "" { 35 return fmt.Errorf("AMI id is not set") 36 } 37 38 conn := testAccProvider.Meta().(*AWSClient).ec2conn 39 req := &ec2.DescribeImagesInput{ 40 ImageIds: []*string{aws.String(amiId)}, 41 } 42 describe, err := conn.DescribeImages(req) 43 if err != nil { 44 return err 45 } 46 47 if len(describe.Images) != 1 || 48 *describe.Images[0].ImageId != rs.Primary.ID { 49 return fmt.Errorf("AMI not found") 50 } 51 52 image := describe.Images[0] 53 if expected := "available"; *image.State != expected { 54 return fmt.Errorf("invalid image state; expected %v, got %v", expected, image.State) 55 } 56 if expected := "machine"; *image.ImageType != expected { 57 return fmt.Errorf("wrong image type; expected %v, got %v", expected, image.ImageType) 58 } 59 if expected := "terraform-acc-ami-from-instance"; *image.Name != expected { 60 return fmt.Errorf("wrong name; expected %v, got %v", expected, image.Name) 61 } 62 63 for _, bdm := range image.BlockDeviceMappings { 64 if bdm.Ebs != nil && bdm.Ebs.SnapshotId != nil { 65 snapshots = append(snapshots, *bdm.Ebs.SnapshotId) 66 } 67 } 68 69 if expected := 1; len(snapshots) != expected { 70 return fmt.Errorf("wrong number of snapshots; expected %v, got %v", expected, len(snapshots)) 71 } 72 73 return nil 74 }, 75 }, 76 }, 77 CheckDestroy: func(state *terraform.State) error { 78 conn := testAccProvider.Meta().(*AWSClient).ec2conn 79 diReq := &ec2.DescribeImagesInput{ 80 ImageIds: []*string{aws.String(amiId)}, 81 } 82 diRes, err := conn.DescribeImages(diReq) 83 if err != nil { 84 return err 85 } 86 87 if len(diRes.Images) > 0 { 88 state := diRes.Images[0].State 89 return fmt.Errorf("AMI %v remains in state %v", amiId, state) 90 } 91 92 stillExist := make([]string, 0, len(snapshots)) 93 checkErrors := make(map[string]error) 94 for _, snapshotId := range snapshots { 95 dsReq := &ec2.DescribeSnapshotsInput{ 96 SnapshotIds: []*string{aws.String(snapshotId)}, 97 } 98 _, err := conn.DescribeSnapshots(dsReq) 99 if err == nil { 100 stillExist = append(stillExist, snapshotId) 101 continue 102 } 103 104 awsErr, ok := err.(awserr.Error) 105 if !ok { 106 checkErrors[snapshotId] = err 107 continue 108 } 109 110 if awsErr.Code() != "InvalidSnapshot.NotFound" { 111 checkErrors[snapshotId] = err 112 continue 113 } 114 } 115 116 if len(stillExist) > 0 || len(checkErrors) > 0 { 117 errParts := []string{ 118 "Expected all snapshots to be gone, but:", 119 } 120 for _, snapshotId := range stillExist { 121 errParts = append( 122 errParts, 123 fmt.Sprintf("- %v still exists", snapshotId), 124 ) 125 } 126 for snapshotId, err := range checkErrors { 127 errParts = append( 128 errParts, 129 fmt.Sprintf("- checking %v gave error: %v", snapshotId, err), 130 ) 131 } 132 return errors.New(strings.Join(errParts, "\n")) 133 } 134 135 return nil 136 }, 137 }) 138 } 139 140 var testAccAWSAMIFromInstanceConfig = ` 141 provider "aws" { 142 region = "us-east-1" 143 } 144 145 resource "aws_instance" "test" { 146 // This AMI has one block device mapping, so we expect to have 147 // one snapshot in our created AMI. 148 ami = "ami-408c7f28" 149 instance_type = "t1.micro" 150 tags { 151 Name = "testAccAWSAMIFromInstanceConfig_TestAMI" 152 } 153 } 154 155 resource "aws_ami_from_instance" "test" { 156 name = "terraform-acc-ami-from-instance" 157 description = "Testing Terraform aws_ami_from_instance resource" 158 source_instance_id = "${aws_instance.test.id}" 159 } 160 `