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 `