github.com/nathanielks/terraform@v0.6.1-0.20170509030759-13e1a62319dc/builtin/providers/aws/resource_aws_ebs_volume_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"regexp"
     8  
     9  	"github.com/aws/aws-sdk-go/aws"
    10  	"github.com/aws/aws-sdk-go/service/ec2"
    11  	"github.com/hashicorp/terraform/helper/acctest"
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/terraform"
    14  )
    15  
    16  func TestAccAWSEBSVolume_basic(t *testing.T) {
    17  	var v ec2.Volume
    18  	resource.Test(t, resource.TestCase{
    19  		PreCheck:      func() { testAccPreCheck(t) },
    20  		IDRefreshName: "aws_ebs_volume.test",
    21  		Providers:     testAccProviders,
    22  		Steps: []resource.TestStep{
    23  			{
    24  				Config: testAccAwsEbsVolumeConfig,
    25  				Check: resource.ComposeTestCheckFunc(
    26  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
    27  				),
    28  			},
    29  		},
    30  	})
    31  }
    32  
    33  func TestAccAWSEBSVolume_updateAttachedEbsVolume(t *testing.T) {
    34  	var v ec2.Volume
    35  	resource.Test(t, resource.TestCase{
    36  		PreCheck:      func() { testAccPreCheck(t) },
    37  		IDRefreshName: "aws_ebs_volume.test",
    38  		Providers:     testAccProviders,
    39  		Steps: []resource.TestStep{
    40  			{
    41  				Config: testAccAwsEbsAttachedVolumeConfig,
    42  				Check: resource.ComposeTestCheckFunc(
    43  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
    44  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "size", "10"),
    45  				),
    46  			},
    47  			{
    48  				Config: testAccAwsEbsAttachedVolumeConfigUpdateSize,
    49  				Check: resource.ComposeTestCheckFunc(
    50  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
    51  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "size", "20"),
    52  				),
    53  			},
    54  		},
    55  	})
    56  }
    57  
    58  func TestAccAWSEBSVolume_updateSize(t *testing.T) {
    59  	var v ec2.Volume
    60  	resource.Test(t, resource.TestCase{
    61  		PreCheck:      func() { testAccPreCheck(t) },
    62  		IDRefreshName: "aws_ebs_volume.test",
    63  		Providers:     testAccProviders,
    64  		Steps: []resource.TestStep{
    65  			{
    66  				Config: testAccAwsEbsVolumeConfig,
    67  				Check: resource.ComposeTestCheckFunc(
    68  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
    69  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "size", "1"),
    70  				),
    71  			},
    72  			{
    73  				Config: testAccAwsEbsVolumeConfigUpdateSize,
    74  				Check: resource.ComposeTestCheckFunc(
    75  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
    76  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "size", "10"),
    77  				),
    78  			},
    79  		},
    80  	})
    81  }
    82  
    83  func TestAccAWSEBSVolume_updateType(t *testing.T) {
    84  	var v ec2.Volume
    85  	resource.Test(t, resource.TestCase{
    86  		PreCheck:      func() { testAccPreCheck(t) },
    87  		IDRefreshName: "aws_ebs_volume.test",
    88  		Providers:     testAccProviders,
    89  		Steps: []resource.TestStep{
    90  			{
    91  				Config: testAccAwsEbsVolumeConfig,
    92  				Check: resource.ComposeTestCheckFunc(
    93  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
    94  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "type", "gp2"),
    95  				),
    96  			},
    97  			{
    98  				Config: testAccAwsEbsVolumeConfigUpdateType,
    99  				Check: resource.ComposeTestCheckFunc(
   100  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
   101  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "type", "sc1"),
   102  				),
   103  			},
   104  		},
   105  	})
   106  }
   107  
   108  func TestAccAWSEBSVolume_updateIops(t *testing.T) {
   109  	var v ec2.Volume
   110  	resource.Test(t, resource.TestCase{
   111  		PreCheck:      func() { testAccPreCheck(t) },
   112  		IDRefreshName: "aws_ebs_volume.test",
   113  		Providers:     testAccProviders,
   114  		Steps: []resource.TestStep{
   115  			{
   116  				Config: testAccAwsEbsVolumeConfigWithIops,
   117  				Check: resource.ComposeTestCheckFunc(
   118  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
   119  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "iops", "100"),
   120  				),
   121  			},
   122  			{
   123  				Config: testAccAwsEbsVolumeConfigWithIopsUpdated,
   124  				Check: resource.ComposeTestCheckFunc(
   125  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
   126  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "iops", "200"),
   127  				),
   128  			},
   129  		},
   130  	})
   131  }
   132  
   133  func TestAccAWSEBSVolume_kmsKey(t *testing.T) {
   134  	var v ec2.Volume
   135  	ri := acctest.RandInt()
   136  	config := fmt.Sprintf(testAccAwsEbsVolumeConfigWithKmsKey, ri)
   137  	keyRegex := regexp.MustCompile("^arn:aws:([a-zA-Z0-9\\-])+:([a-z]{2}-[a-z]+-\\d{1})?:(\\d{12})?:(.*)$")
   138  
   139  	resource.Test(t, resource.TestCase{
   140  		PreCheck:      func() { testAccPreCheck(t) },
   141  		IDRefreshName: "aws_ebs_volume.test",
   142  		Providers:     testAccProviders,
   143  		Steps: []resource.TestStep{
   144  			{
   145  				Config: config,
   146  				Check: resource.ComposeTestCheckFunc(
   147  					testAccCheckVolumeExists("aws_ebs_volume.test", &v),
   148  					resource.TestCheckResourceAttr("aws_ebs_volume.test", "encrypted", "true"),
   149  					resource.TestMatchResourceAttr("aws_ebs_volume.test", "kms_key_id", keyRegex),
   150  				),
   151  			},
   152  		},
   153  	})
   154  }
   155  
   156  func TestAccAWSEBSVolume_NoIops(t *testing.T) {
   157  	var v ec2.Volume
   158  	resource.Test(t, resource.TestCase{
   159  		PreCheck:  func() { testAccPreCheck(t) },
   160  		Providers: testAccProviders,
   161  		Steps: []resource.TestStep{
   162  			{
   163  				Config: testAccAwsEbsVolumeConfigWithNoIops,
   164  				Check: resource.ComposeTestCheckFunc(
   165  					testAccCheckVolumeExists("aws_ebs_volume.iops_test", &v),
   166  				),
   167  			},
   168  		},
   169  	})
   170  }
   171  
   172  func TestAccAWSEBSVolume_withTags(t *testing.T) {
   173  	var v ec2.Volume
   174  	resource.Test(t, resource.TestCase{
   175  		PreCheck:      func() { testAccPreCheck(t) },
   176  		IDRefreshName: "aws_ebs_volume.tags_test",
   177  		Providers:     testAccProviders,
   178  		Steps: []resource.TestStep{
   179  			{
   180  				Config: testAccAwsEbsVolumeConfigWithTags,
   181  				Check: resource.ComposeTestCheckFunc(
   182  					testAccCheckVolumeExists("aws_ebs_volume.tags_test", &v),
   183  				),
   184  			},
   185  		},
   186  	})
   187  }
   188  
   189  func testAccCheckVolumeExists(n string, v *ec2.Volume) resource.TestCheckFunc {
   190  	return func(s *terraform.State) error {
   191  		rs, ok := s.RootModule().Resources[n]
   192  		if !ok {
   193  			return fmt.Errorf("Not found: %s", n)
   194  		}
   195  
   196  		if rs.Primary.ID == "" {
   197  			return fmt.Errorf("No ID is set")
   198  		}
   199  
   200  		conn := testAccProvider.Meta().(*AWSClient).ec2conn
   201  
   202  		request := &ec2.DescribeVolumesInput{
   203  			VolumeIds: []*string{aws.String(rs.Primary.ID)},
   204  		}
   205  
   206  		response, err := conn.DescribeVolumes(request)
   207  		if err == nil {
   208  			if response.Volumes != nil && len(response.Volumes) > 0 {
   209  				*v = *response.Volumes[0]
   210  				return nil
   211  			}
   212  		}
   213  		return fmt.Errorf("Error finding EC2 volume %s", rs.Primary.ID)
   214  	}
   215  }
   216  
   217  const testAccAwsEbsVolumeConfig = `
   218  resource "aws_ebs_volume" "test" {
   219    availability_zone = "us-west-2a"
   220    type = "gp2"
   221    size = 1
   222    tags {
   223      Name = "tf-acc-test-ebs-volume-test"
   224    }
   225  }
   226  `
   227  
   228  const testAccAwsEbsAttachedVolumeConfig = `
   229  data "aws_ami" "debian_jessie_latest" {
   230    most_recent = true
   231  
   232    filter {
   233      name   = "name"
   234      values = ["debian-jessie-*"]
   235    }
   236  
   237    filter {
   238      name   = "virtualization-type"
   239      values = ["hvm"]
   240    }
   241  
   242    filter {
   243      name   = "architecture"
   244      values = ["x86_64"]
   245    }
   246  
   247    filter {
   248      name   = "root-device-type"
   249      values = ["ebs"]
   250    }
   251  
   252    owners = ["379101102735"] # Debian
   253  }
   254  
   255  resource "aws_instance" "test" {
   256    ami = "${data.aws_ami.debian_jessie_latest.id}"
   257    associate_public_ip_address = true
   258    count = 1
   259    instance_type = "t2.medium"
   260  
   261    root_block_device {
   262      volume_size           = "10"
   263      volume_type           = "standard"
   264      delete_on_termination = true
   265    }
   266  
   267    tags {
   268      Name    = "test-terraform"
   269    }
   270  }
   271  
   272  resource "aws_ebs_volume" "test" {
   273    depends_on = ["aws_instance.test"]
   274    availability_zone = "${aws_instance.test.availability_zone}"
   275    type = "gp2"
   276    size = "10"
   277  }
   278  
   279  resource "aws_volume_attachment" "test" {
   280    depends_on  = ["aws_ebs_volume.test"]
   281    device_name = "/dev/xvdg"
   282    volume_id   = "${aws_ebs_volume.test.id}"
   283    instance_id = "${aws_instance.test.id}"
   284  }
   285  `
   286  
   287  const testAccAwsEbsAttachedVolumeConfigUpdateSize = `
   288  data "aws_ami" "debian_jessie_latest" {
   289    most_recent = true
   290  
   291    filter {
   292      name   = "name"
   293      values = ["debian-jessie-*"]
   294    }
   295  
   296    filter {
   297      name   = "virtualization-type"
   298      values = ["hvm"]
   299    }
   300  
   301    filter {
   302      name   = "architecture"
   303      values = ["x86_64"]
   304    }
   305  
   306    filter {
   307      name   = "root-device-type"
   308      values = ["ebs"]
   309    }
   310  
   311    owners = ["379101102735"] # Debian
   312  }
   313  
   314  resource "aws_instance" "test" {
   315    ami = "${data.aws_ami.debian_jessie_latest.id}"
   316    associate_public_ip_address = true
   317    count = 1
   318    instance_type = "t2.medium"
   319  
   320    root_block_device {
   321      volume_size           = "10"
   322      volume_type           = "standard"
   323      delete_on_termination = true
   324    }
   325  
   326    tags {
   327      Name    = "test-terraform"
   328    }
   329  }
   330  
   331  resource "aws_ebs_volume" "test" {
   332    depends_on = ["aws_instance.test"]
   333    availability_zone = "${aws_instance.test.availability_zone}"
   334    type = "gp2"
   335    size = "20"
   336  }
   337  
   338  resource "aws_volume_attachment" "test" {
   339    depends_on  = ["aws_ebs_volume.test"]
   340    device_name = "/dev/xvdg"
   341    volume_id   = "${aws_ebs_volume.test.id}"
   342    instance_id = "${aws_instance.test.id}"
   343  }
   344  `
   345  
   346  const testAccAwsEbsVolumeConfigUpdateSize = `
   347  resource "aws_ebs_volume" "test" {
   348    availability_zone = "us-west-2a"
   349    type = "gp2"
   350    size = 10
   351    tags {
   352      Name = "tf-acc-test-ebs-volume-test"
   353    }
   354  }
   355  `
   356  
   357  const testAccAwsEbsVolumeConfigUpdateType = `
   358  resource "aws_ebs_volume" "test" {
   359    availability_zone = "us-west-2a"
   360    type = "sc1"
   361    size = 500
   362    tags {
   363      Name = "tf-acc-test-ebs-volume-test"
   364    }
   365  }
   366  `
   367  
   368  const testAccAwsEbsVolumeConfigWithIops = `
   369  resource "aws_ebs_volume" "test" {
   370    availability_zone = "us-west-2a"
   371    type = "io1"
   372    size = 4
   373    iops = 100
   374    tags {
   375      Name = "tf-acc-test-ebs-volume-test"
   376    }
   377  }
   378  `
   379  
   380  const testAccAwsEbsVolumeConfigWithIopsUpdated = `
   381  resource "aws_ebs_volume" "test" {
   382    availability_zone = "us-west-2a"
   383    type = "io1"
   384    size = 4
   385    iops = 200
   386    tags {
   387      Name = "tf-acc-test-ebs-volume-test"
   388    }
   389  }
   390  `
   391  
   392  const testAccAwsEbsVolumeConfigWithKmsKey = `
   393  resource "aws_kms_key" "foo" {
   394    description = "Terraform acc test %d"
   395    policy = <<POLICY
   396  {
   397    "Version": "2012-10-17",
   398    "Id": "kms-tf-1",
   399    "Statement": [
   400      {
   401        "Sid": "Enable IAM User Permissions",
   402        "Effect": "Allow",
   403        "Principal": {
   404          "AWS": "*"
   405        },
   406        "Action": "kms:*",
   407        "Resource": "*"
   408      }
   409    ]
   410  }
   411  POLICY
   412  }
   413  
   414  resource "aws_ebs_volume" "test" {
   415    availability_zone = "us-west-2a"
   416    size = 1
   417    encrypted = true
   418    kms_key_id = "${aws_kms_key.foo.arn}"
   419  }
   420  `
   421  
   422  const testAccAwsEbsVolumeConfigWithTags = `
   423  resource "aws_ebs_volume" "tags_test" {
   424    availability_zone = "us-west-2a"
   425    size = 1
   426    tags {
   427      Name = "TerraformTest"
   428    }
   429  }
   430  `
   431  
   432  const testAccAwsEbsVolumeConfigWithNoIops = `
   433  resource "aws_ebs_volume" "iops_test" {
   434    availability_zone = "us-west-2a"
   435    size = 10
   436    type = "gp2"
   437    iops = 0
   438    tags {
   439      Name = "TerraformTest"
   440    }
   441  }
   442  `