github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_ami_launch_permission_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/aws/aws-sdk-go/aws"
     9  	"github.com/aws/aws-sdk-go/service/ec2"
    10  	r "github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/terraform"
    12  )
    13  
    14  func TestAccAWSAMILaunchPermission_Basic(t *testing.T) {
    15  	imageID := ""
    16  	accountID := os.Getenv("AWS_ACCOUNT_ID")
    17  
    18  	r.Test(t, r.TestCase{
    19  		PreCheck: func() {
    20  			testAccPreCheck(t)
    21  			if os.Getenv("AWS_ACCOUNT_ID") == "" {
    22  				t.Fatal("AWS_ACCOUNT_ID must be set")
    23  			}
    24  		},
    25  		Providers: testAccProviders,
    26  		Steps: []r.TestStep{
    27  			// Scaffold everything
    28  			r.TestStep{
    29  				Config: testAccAWSAMILaunchPermissionConfig(accountID, true),
    30  				Check: r.ComposeTestCheckFunc(
    31  					testCheckResourceGetAttr("aws_ami_copy.test", "id", &imageID),
    32  					testAccAWSAMILaunchPermissionExists(accountID, &imageID),
    33  				),
    34  			},
    35  			// Drop just launch permission to test destruction
    36  			r.TestStep{
    37  				Config: testAccAWSAMILaunchPermissionConfig(accountID, false),
    38  				Check: r.ComposeTestCheckFunc(
    39  					testAccAWSAMILaunchPermissionDestroyed(accountID, &imageID),
    40  				),
    41  			},
    42  			// Re-add everything so we can test when AMI disappears
    43  			r.TestStep{
    44  				Config: testAccAWSAMILaunchPermissionConfig(accountID, true),
    45  				Check: r.ComposeTestCheckFunc(
    46  					testCheckResourceGetAttr("aws_ami_copy.test", "id", &imageID),
    47  					testAccAWSAMILaunchPermissionExists(accountID, &imageID),
    48  				),
    49  			},
    50  			// Here we delete the AMI to verify the follow-on refresh after this step
    51  			// should not error.
    52  			r.TestStep{
    53  				Config: testAccAWSAMILaunchPermissionConfig(accountID, true),
    54  				Check: r.ComposeTestCheckFunc(
    55  					testAccAWSAMIDisappears(&imageID),
    56  				),
    57  				ExpectNonEmptyPlan: true,
    58  			},
    59  		},
    60  	})
    61  }
    62  
    63  func testCheckResourceGetAttr(name, key string, value *string) r.TestCheckFunc {
    64  	return func(s *terraform.State) error {
    65  		ms := s.RootModule()
    66  		rs, ok := ms.Resources[name]
    67  		if !ok {
    68  			return fmt.Errorf("Not found: %s", name)
    69  		}
    70  
    71  		is := rs.Primary
    72  		if is == nil {
    73  			return fmt.Errorf("No primary instance: %s", name)
    74  		}
    75  
    76  		*value = is.Attributes[key]
    77  		return nil
    78  	}
    79  }
    80  
    81  func testAccAWSAMILaunchPermissionExists(accountID string, imageID *string) r.TestCheckFunc {
    82  	return func(s *terraform.State) error {
    83  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
    84  		if has, err := hasLaunchPermission(conn, *imageID, accountID); err != nil {
    85  			return err
    86  		} else if !has {
    87  			return fmt.Errorf("launch permission does not exist for '%s' on '%s'", accountID, *imageID)
    88  		}
    89  		return nil
    90  	}
    91  }
    92  
    93  func testAccAWSAMILaunchPermissionDestroyed(accountID string, imageID *string) r.TestCheckFunc {
    94  	return func(s *terraform.State) error {
    95  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
    96  		if has, err := hasLaunchPermission(conn, *imageID, accountID); err != nil {
    97  			return err
    98  		} else if has {
    99  			return fmt.Errorf("launch permission still exists for '%s' on '%s'", accountID, *imageID)
   100  		}
   101  		return nil
   102  	}
   103  }
   104  
   105  // testAccAWSAMIDisappears is technically a "test check function" but really it
   106  // exists to perform a side effect of deleting an AMI out from under a resource
   107  // so we can test that Terraform will react properly
   108  func testAccAWSAMIDisappears(imageID *string) r.TestCheckFunc {
   109  	return func(s *terraform.State) error {
   110  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
   111  		req := &ec2.DeregisterImageInput{
   112  			ImageId: aws.String(*imageID),
   113  		}
   114  
   115  		_, err := conn.DeregisterImage(req)
   116  		if err != nil {
   117  			return err
   118  		}
   119  
   120  		if err := resourceAwsAmiWaitForDestroy(*imageID, conn); err != nil {
   121  			return err
   122  		}
   123  		return nil
   124  	}
   125  }
   126  
   127  func testAccAWSAMILaunchPermissionConfig(accountID string, includeLaunchPermission bool) string {
   128  	base := `
   129  resource "aws_ami_copy" "test" {
   130    name = "launch-permission-test"
   131    description = "Launch Permission Test Copy"
   132    source_ami_id = "ami-7172b611"
   133    source_ami_region = "us-west-2"
   134  }
   135  `
   136  
   137  	if !includeLaunchPermission {
   138  		return base
   139  	}
   140  
   141  	return base + fmt.Sprintf(`
   142  resource "aws_ami_launch_permission" "self-test" {
   143      image_id   = "${aws_ami_copy.test.id}"
   144      account_id = "%s"
   145  }
   146  `, accountID)
   147  }