github.com/mohanarpit/terraform@v0.6.16-0.20160909104007-291f29853544/builtin/providers/aws/data_source_aws_ami_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"testing"
     7  
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"github.com/hashicorp/terraform/terraform"
    10  )
    11  
    12  func TestAccAWSAmiDataSource_natInstance(t *testing.T) {
    13  	resource.Test(t, resource.TestCase{
    14  		PreCheck:  func() { testAccPreCheck(t) },
    15  		Providers: testAccProviders,
    16  		Steps: []resource.TestStep{
    17  			resource.TestStep{
    18  				Config: testAccCheckAwsAmiDataSourceConfig,
    19  				Check: resource.ComposeTestCheckFunc(
    20  					testAccCheckAwsAmiDataSourceID("data.aws_ami.nat_ami"),
    21  					// Check attributes. Some attributes are tough to test - any not contained here should not be considered
    22  					// stable and should not be used in interpolation. Exception to block_device_mappings which should both
    23  					// show up consistently and break if certain references are not available. However modification of the
    24  					// snapshot ID which is bound to happen on the NAT AMIs will cause testing to break consistently, so
    25  					// deep inspection is not included, simply the count is checked.
    26  					// Tags and product codes may need more testing, but I'm having a hard time finding images with
    27  					// these attributes set.
    28  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "architecture", "x86_64"),
    29  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "block_device_mappings.#", "1"),
    30  					resource.TestMatchResourceAttr("data.aws_ami.nat_ami", "creation_date", regexp.MustCompile("^20[0-9]{2}-")),
    31  					resource.TestMatchResourceAttr("data.aws_ami.nat_ami", "description", regexp.MustCompile("^Amazon Linux AMI")),
    32  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "hypervisor", "xen"),
    33  					resource.TestMatchResourceAttr("data.aws_ami.nat_ami", "image_id", regexp.MustCompile("^ami-")),
    34  					resource.TestMatchResourceAttr("data.aws_ami.nat_ami", "image_location", regexp.MustCompile("^amazon/")),
    35  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "image_owner_alias", "amazon"),
    36  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "image_type", "machine"),
    37  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "most_recent", "true"),
    38  					resource.TestMatchResourceAttr("data.aws_ami.nat_ami", "name", regexp.MustCompile("^amzn-ami-vpc-nat")),
    39  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "owner_id", "137112412989"),
    40  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "public", "true"),
    41  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "product_codes.#", "0"),
    42  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "root_device_name", "/dev/xvda"),
    43  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "root_device_type", "ebs"),
    44  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "sriov_net_support", "simple"),
    45  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "state", "available"),
    46  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "state_reason.code", "UNSET"),
    47  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "state_reason.message", "UNSET"),
    48  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "tags.#", "0"),
    49  					resource.TestCheckResourceAttr("data.aws_ami.nat_ami", "virtualization_type", "hvm"),
    50  				),
    51  			},
    52  		},
    53  	})
    54  }
    55  func TestAccAWSAmiDataSource_windowsInstance(t *testing.T) {
    56  	resource.Test(t, resource.TestCase{
    57  		PreCheck:  func() { testAccPreCheck(t) },
    58  		Providers: testAccProviders,
    59  		Steps: []resource.TestStep{
    60  			resource.TestStep{
    61  				Config: testAccCheckAwsAmiDataSourceWindowsConfig,
    62  				Check: resource.ComposeTestCheckFunc(
    63  					testAccCheckAwsAmiDataSourceID("data.aws_ami.windows_ami"),
    64  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "architecture", "x86_64"),
    65  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "block_device_mappings.#", "27"),
    66  					resource.TestMatchResourceAttr("data.aws_ami.windows_ami", "creation_date", regexp.MustCompile("^20[0-9]{2}-")),
    67  					resource.TestMatchResourceAttr("data.aws_ami.windows_ami", "description", regexp.MustCompile("^Microsoft Windows Server 2012")),
    68  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "hypervisor", "xen"),
    69  					resource.TestMatchResourceAttr("data.aws_ami.windows_ami", "image_id", regexp.MustCompile("^ami-")),
    70  					resource.TestMatchResourceAttr("data.aws_ami.windows_ami", "image_location", regexp.MustCompile("^amazon/")),
    71  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "image_owner_alias", "amazon"),
    72  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "image_type", "machine"),
    73  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "most_recent", "true"),
    74  					resource.TestMatchResourceAttr("data.aws_ami.windows_ami", "name", regexp.MustCompile("^Windows_Server-2012-R2")),
    75  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "owner_id", "801119661308"),
    76  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "platform", "windows"),
    77  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "public", "true"),
    78  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "product_codes.#", "0"),
    79  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "root_device_name", "/dev/sda1"),
    80  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "root_device_type", "ebs"),
    81  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "sriov_net_support", "simple"),
    82  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "state", "available"),
    83  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "state_reason.code", "UNSET"),
    84  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "state_reason.message", "UNSET"),
    85  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "tags.#", "0"),
    86  					resource.TestCheckResourceAttr("data.aws_ami.windows_ami", "virtualization_type", "hvm"),
    87  				),
    88  			},
    89  		},
    90  	})
    91  }
    92  
    93  func TestAccAWSAmiDataSource_instanceStore(t *testing.T) {
    94  	resource.Test(t, resource.TestCase{
    95  		PreCheck:  func() { testAccPreCheck(t) },
    96  		Providers: testAccProviders,
    97  		Steps: []resource.TestStep{
    98  			resource.TestStep{
    99  				Config: testAccCheckAwsAmiDataSourceInstanceStoreConfig,
   100  				Check: resource.ComposeTestCheckFunc(
   101  					testAccCheckAwsAmiDataSourceID("data.aws_ami.instance_store_ami"),
   102  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "architecture", "x86_64"),
   103  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "block_device_mappings.#", "0"),
   104  					resource.TestMatchResourceAttr("data.aws_ami.instance_store_ami", "creation_date", regexp.MustCompile("^20[0-9]{2}-")),
   105  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "hypervisor", "xen"),
   106  					resource.TestMatchResourceAttr("data.aws_ami.instance_store_ami", "image_id", regexp.MustCompile("^ami-")),
   107  					resource.TestMatchResourceAttr("data.aws_ami.instance_store_ami", "image_location", regexp.MustCompile("images/hvm-instance/ubuntu-trusty-14.04-amd64-server")),
   108  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "image_type", "machine"),
   109  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "most_recent", "true"),
   110  					resource.TestMatchResourceAttr("data.aws_ami.instance_store_ami", "name", regexp.MustCompile("^ubuntu/images/hvm-instance/ubuntu-trusty-14.04-amd64-server")),
   111  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "owner_id", "099720109477"),
   112  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "public", "true"),
   113  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "product_codes.#", "0"),
   114  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "root_device_type", "instance-store"),
   115  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "sriov_net_support", "simple"),
   116  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "state", "available"),
   117  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "state_reason.code", "UNSET"),
   118  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "state_reason.message", "UNSET"),
   119  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "tags.#", "0"),
   120  					resource.TestCheckResourceAttr("data.aws_ami.instance_store_ami", "virtualization_type", "hvm"),
   121  				),
   122  			},
   123  		},
   124  	})
   125  }
   126  
   127  func TestAccAWSAmiDataSource_owners(t *testing.T) {
   128  	resource.Test(t, resource.TestCase{
   129  		PreCheck:  func() { testAccPreCheck(t) },
   130  		Providers: testAccProviders,
   131  		Steps: []resource.TestStep{
   132  			resource.TestStep{
   133  				Config: testAccCheckAwsAmiDataSourceOwnersConfig,
   134  				Check: resource.ComposeTestCheckFunc(
   135  					testAccCheckAwsAmiDataSourceID("data.aws_ami.amazon_ami"),
   136  				),
   137  			},
   138  		},
   139  	})
   140  }
   141  
   142  func TestAccAWSAmiDataSource_localNameFilter(t *testing.T) {
   143  	resource.Test(t, resource.TestCase{
   144  		PreCheck:  func() { testAccPreCheck(t) },
   145  		Providers: testAccProviders,
   146  		Steps: []resource.TestStep{
   147  			resource.TestStep{
   148  				Config: testAccCheckAwsAmiDataSourceNameRegexConfig,
   149  				Check: resource.ComposeTestCheckFunc(
   150  					testAccCheckAwsAmiDataSourceID("data.aws_ami.name_regex_filtered_ami"),
   151  					resource.TestMatchResourceAttr("data.aws_ami.name_regex_filtered_ami", "image_id", regexp.MustCompile("^ami-")),
   152  				),
   153  			},
   154  		},
   155  	})
   156  }
   157  
   158  func testAccCheckAwsAmiDataSourceDestroy(s *terraform.State) error {
   159  	return nil
   160  }
   161  
   162  func testAccCheckAwsAmiDataSourceID(n string) resource.TestCheckFunc {
   163  	// Wait for IAM role
   164  	return func(s *terraform.State) error {
   165  		rs, ok := s.RootModule().Resources[n]
   166  		if !ok {
   167  			return fmt.Errorf("Can't find AMI data source: %s", n)
   168  		}
   169  
   170  		if rs.Primary.ID == "" {
   171  			return fmt.Errorf("AMI data source ID not set")
   172  		}
   173  		return nil
   174  	}
   175  }
   176  
   177  // Using NAT AMIs for testing - I would expect with NAT gateways now a thing,
   178  // that this will possibly be deprecated at some point in time. Other candidates
   179  // for testing this after that may be Ubuntu's AMI's, or Amazon's regular
   180  // Amazon Linux AMIs.
   181  const testAccCheckAwsAmiDataSourceConfig = `
   182  data "aws_ami" "nat_ami" {
   183  	most_recent = true
   184  	filter {
   185  		name = "owner-alias"
   186  		values = ["amazon"]
   187  	}
   188  	filter {
   189  		name = "name"
   190  		values = ["amzn-ami-vpc-nat*"]
   191  	}
   192  	filter {
   193  		name = "virtualization-type"
   194  		values = ["hvm"]
   195  	}
   196  	filter {
   197  		name = "root-device-type"
   198  		values = ["ebs"]
   199  	}
   200  	filter {
   201  		name = "block-device-mapping.volume-type"
   202  		values = ["standard"]
   203  	}
   204  }
   205  `
   206  
   207  // Windows image test.
   208  const testAccCheckAwsAmiDataSourceWindowsConfig = `
   209  data "aws_ami" "windows_ami" {
   210  	most_recent = true
   211  	filter {
   212  		name = "owner-alias"
   213  		values = ["amazon"]
   214  	}
   215  	filter {
   216  		name = "name"
   217  		values = ["Windows_Server-2012-R2*"]
   218  	}
   219  	filter {
   220  		name = "virtualization-type"
   221  		values = ["hvm"]
   222  	}
   223  	filter {
   224  		name = "root-device-type"
   225  		values = ["ebs"]
   226  	}
   227  	filter {
   228  		name = "block-device-mapping.volume-type"
   229  		values = ["gp2"]
   230  	}
   231  }
   232  `
   233  
   234  // Instance store test - using Ubuntu images
   235  const testAccCheckAwsAmiDataSourceInstanceStoreConfig = `
   236  data "aws_ami" "instance_store_ami" {
   237  	most_recent = true
   238  	filter {
   239  		name = "owner-id"
   240  		values = ["099720109477"]
   241  	}
   242  	filter {
   243  		name = "name"
   244  		values = ["ubuntu/images/hvm-instance/ubuntu-trusty-14.04-amd64-server*"]
   245  	}
   246  	filter {
   247  		name = "virtualization-type"
   248  		values = ["hvm"]
   249  	}
   250  	filter {
   251  		name = "root-device-type"
   252  		values = ["instance-store"]
   253  	}
   254  }
   255  `
   256  
   257  // Testing owner parameter
   258  const testAccCheckAwsAmiDataSourceOwnersConfig = `
   259  data "aws_ami" "amazon_ami" {
   260  	most_recent = true
   261  	owners = ["amazon"]
   262  }
   263  `
   264  
   265  // Testing name_regex parameter
   266  const testAccCheckAwsAmiDataSourceNameRegexConfig = `
   267  data "aws_ami" "name_regex_filtered_ami" {
   268  	most_recent = true
   269  	owners = ["amazon"]
   270  	filter {
   271  		name = "name"
   272  		values = ["amzn-ami-*"]
   273  	}
   274  	name_regex = "^amzn-ami-\\d{3}[5].*-ecs-optimized"
   275  }
   276  `