Skip to content

Commit

Permalink
resource/aws_ebs_volume: Allow both 'snapshot_id' and 'size' (#17243)
Browse files Browse the repository at this point in the history
* resource/aws_ebs_volume: Allow both 'snapshot_id' and 'size'.

Acceptance test output:

$ make testacc TEST=./aws TESTARGS='-run=TestAccAWSEBSVolume_snapshotID'
==> Checking that code complies with gofmt requirements...
TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSEBSVolume_snapshotID -timeout 120m
=== RUN   TestAccAWSEBSVolume_snapshotID
=== PAUSE TestAccAWSEBSVolume_snapshotID
=== RUN   TestAccAWSEBSVolume_snapshotIDAndSize
=== PAUSE TestAccAWSEBSVolume_snapshotIDAndSize
=== CONT  TestAccAWSEBSVolume_snapshotID
=== CONT  TestAccAWSEBSVolume_snapshotIDAndSize
--- PASS: TestAccAWSEBSVolume_snapshotIDAndSize (44.60s)
--- PASS: TestAccAWSEBSVolume_snapshotID (46.74s)
PASS
ok  	github.com/terraform-providers/terraform-provider-aws/aws	46.829s

* Fix formatting error in 'tools/main.go'

* Add CHANGELOG entry.

* resource/aws_ebs_volume: Ensure at least one of 'snapshot_id' or 'size'.

Acceptance test output:

$ make testacc TEST=./aws TESTARGS='-run=TestAccAWSEBSVolume_'
==> Checking that code complies with gofmt requirements...
TF_ACC=1 go test ./aws -v -count 1 -parallel 20 -run=TestAccAWSEBSVolume_ -timeout 120m
=== RUN   TestAccAWSEBSVolume_basic
=== PAUSE TestAccAWSEBSVolume_basic
=== RUN   TestAccAWSEBSVolume_updateAttachedEbsVolume
=== PAUSE TestAccAWSEBSVolume_updateAttachedEbsVolume
=== RUN   TestAccAWSEBSVolume_updateSize
=== PAUSE TestAccAWSEBSVolume_updateSize
=== RUN   TestAccAWSEBSVolume_updateType
=== PAUSE TestAccAWSEBSVolume_updateType
=== RUN   TestAccAWSEBSVolume_updateIops_Io1
=== PAUSE TestAccAWSEBSVolume_updateIops_Io1
=== RUN   TestAccAWSEBSVolume_updateIops_Io2
=== PAUSE TestAccAWSEBSVolume_updateIops_Io2
=== RUN   TestAccAWSEBSVolume_kmsKey
=== PAUSE TestAccAWSEBSVolume_kmsKey
=== RUN   TestAccAWSEBSVolume_NoIops
=== PAUSE TestAccAWSEBSVolume_NoIops
=== RUN   TestAccAWSEBSVolume_InvalidIopsForType
=== PAUSE TestAccAWSEBSVolume_InvalidIopsForType
=== RUN   TestAccAWSEBSVolume_InvalidThroughputForType
=== PAUSE TestAccAWSEBSVolume_InvalidThroughputForType
=== RUN   TestAccAWSEBSVolume_withTags
=== PAUSE TestAccAWSEBSVolume_withTags
=== RUN   TestAccAWSEBSVolume_multiAttach
=== PAUSE TestAccAWSEBSVolume_multiAttach
=== RUN   TestAccAWSEBSVolume_outpost
=== PAUSE TestAccAWSEBSVolume_outpost
=== RUN   TestAccAWSEBSVolume_gp3_basic
=== PAUSE TestAccAWSEBSVolume_gp3_basic
=== RUN   TestAccAWSEBSVolume_gp3_iops
=== PAUSE TestAccAWSEBSVolume_gp3_iops
=== RUN   TestAccAWSEBSVolume_gp3_throughput
=== PAUSE TestAccAWSEBSVolume_gp3_throughput
=== RUN   TestAccAWSEBSVolume_snapshotID
=== PAUSE TestAccAWSEBSVolume_snapshotID
=== RUN   TestAccAWSEBSVolume_snapshotIDAndSize
=== PAUSE TestAccAWSEBSVolume_snapshotIDAndSize
=== RUN   TestAccAWSEBSVolume_disappears
=== PAUSE TestAccAWSEBSVolume_disappears
=== CONT  TestAccAWSEBSVolume_basic
=== CONT  TestAccAWSEBSVolume_withTags
=== CONT  TestAccAWSEBSVolume_disappears
=== CONT  TestAccAWSEBSVolume_snapshotIDAndSize
=== CONT  TestAccAWSEBSVolume_snapshotID
=== CONT  TestAccAWSEBSVolume_gp3_throughput
=== CONT  TestAccAWSEBSVolume_gp3_iops
=== CONT  TestAccAWSEBSVolume_gp3_basic
=== CONT  TestAccAWSEBSVolume_outpost
=== CONT  TestAccAWSEBSVolume_multiAttach
=== CONT  TestAccAWSEBSVolume_updateIops_Io2
=== CONT  TestAccAWSEBSVolume_InvalidThroughputForType
=== CONT  TestAccAWSEBSVolume_InvalidIopsForType
=== CONT  TestAccAWSEBSVolume_NoIops
=== CONT  TestAccAWSEBSVolume_kmsKey
=== CONT  TestAccAWSEBSVolume_updateType
=== CONT  TestAccAWSEBSVolume_updateIops_Io1
=== CONT  TestAccAWSEBSVolume_updateSize
=== CONT  TestAccAWSEBSVolume_updateAttachedEbsVolume
=== CONT  TestAccAWSEBSVolume_outpost
    data_source_aws_outposts_outposts_test.go:66: skipping since no Outposts found
--- SKIP: TestAccAWSEBSVolume_outpost (2.98s)
--- PASS: TestAccAWSEBSVolume_InvalidThroughputForType (20.53s)
--- PASS: TestAccAWSEBSVolume_InvalidIopsForType (20.60s)
--- PASS: TestAccAWSEBSVolume_disappears (57.32s)
--- PASS: TestAccAWSEBSVolume_NoIops (65.27s)
--- PASS: TestAccAWSEBSVolume_multiAttach (72.48s)
--- PASS: TestAccAWSEBSVolume_withTags (72.54s)
--- PASS: TestAccAWSEBSVolume_basic (72.60s)
--- PASS: TestAccAWSEBSVolume_gp3_basic (73.47s)
--- PASS: TestAccAWSEBSVolume_kmsKey (74.54s)
--- PASS: TestAccAWSEBSVolume_snapshotIDAndSize (80.58s)
--- PASS: TestAccAWSEBSVolume_snapshotID (84.31s)
--- PASS: TestAccAWSEBSVolume_updateIops_Io2 (84.79s)
--- PASS: TestAccAWSEBSVolume_updateType (97.39s)
--- PASS: TestAccAWSEBSVolume_updateIops_Io1 (100.53s)
--- PASS: TestAccAWSEBSVolume_gp3_throughput (101.28s)
--- PASS: TestAccAWSEBSVolume_updateSize (101.72s)
--- PASS: TestAccAWSEBSVolume_gp3_iops (102.74s)
--- PASS: TestAccAWSEBSVolume_updateAttachedEbsVolume (189.96s)
PASS
ok  	github.com/terraform-providers/terraform-provider-aws/aws	190.076s
  • Loading branch information
ewbankkit committed Jan 26, 2021
1 parent 2bb2457 commit 73d1aaa
Show file tree
Hide file tree
Showing 4 changed files with 149 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .changelog/17243.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/aws_ebs_volume: Allow both `size` and `snapshot_id` attributes to be specified
```
4 changes: 2 additions & 2 deletions aws/resource_aws_ebs_volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,14 @@ func resourceAwsEbsVolume() *schema.Resource {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ExactlyOneOf: []string{"size", "snapshot_id"},
AtLeastOneOf: []string{"size", "snapshot_id"},
},
"snapshot_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
ExactlyOneOf: []string{"size", "snapshot_id"},
AtLeastOneOf: []string{"size", "snapshot_id"},
},
"outpost_arn": {
Type: schema.TypeString,
Expand Down
143 changes: 143 additions & 0 deletions aws/resource_aws_ebs_volume_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,84 @@ func TestAccAWSEBSVolume_gp3_throughput(t *testing.T) {
})
}

func TestAccAWSEBSVolume_snapshotID(t *testing.T) {
var v ec2.Volume
resourceName := "aws_ebs_volume.test"
snapshotResourceName := "aws_ebs_snapshot.test"
rName := acctest.RandomWithPrefix("tf-acc-test")

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
IDRefreshName: resourceName,
Providers: testAccProviders,
CheckDestroy: testAccCheckVolumeDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsEbsVolumeConfigSnapshotId(rName),
Check: resource.ComposeTestCheckFunc(
testAccCheckVolumeExists(resourceName, &v),
testAccMatchResourceAttrRegionalARN(resourceName, "arn", "ec2", regexp.MustCompile(`volume/vol-.+`)),
resource.TestCheckResourceAttr(resourceName, "encrypted", "false"),
resource.TestCheckResourceAttr(resourceName, "iops", "100"),
resource.TestCheckResourceAttr(resourceName, "kms_key_id", ""),
resource.TestCheckResourceAttr(resourceName, "multi_attach_enabled", "false"),
resource.TestCheckResourceAttr(resourceName, "outpost_arn", ""),
resource.TestCheckResourceAttr(resourceName, "size", "1"),
resource.TestCheckResourceAttrPair(resourceName, "snapshot_id", snapshotResourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "tags.%", "1"),
resource.TestCheckResourceAttr(resourceName, "tags.Name", rName),
resource.TestCheckResourceAttr(resourceName, "throughput", "0"),
resource.TestCheckResourceAttr(resourceName, "type", "gp2"),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccAWSEBSVolume_snapshotIDAndSize(t *testing.T) {
var v ec2.Volume
resourceName := "aws_ebs_volume.test"
snapshotResourceName := "aws_ebs_snapshot.test"
rName := acctest.RandomWithPrefix("tf-acc-test")

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
IDRefreshName: resourceName,
Providers: testAccProviders,
CheckDestroy: testAccCheckVolumeDestroy,
Steps: []resource.TestStep{
{
Config: testAccAwsEbsVolumeConfigSnapshotIdAndSize(rName, 20),
Check: resource.ComposeTestCheckFunc(
testAccCheckVolumeExists(resourceName, &v),
testAccMatchResourceAttrRegionalARN(resourceName, "arn", "ec2", regexp.MustCompile(`volume/vol-.+`)),
resource.TestCheckResourceAttr(resourceName, "encrypted", "false"),
resource.TestCheckResourceAttr(resourceName, "iops", "100"),
resource.TestCheckResourceAttr(resourceName, "kms_key_id", ""),
resource.TestCheckResourceAttr(resourceName, "multi_attach_enabled", "false"),
resource.TestCheckResourceAttr(resourceName, "outpost_arn", ""),
resource.TestCheckResourceAttr(resourceName, "size", "20"),
resource.TestCheckResourceAttrPair(resourceName, "snapshot_id", snapshotResourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "tags.%", "1"),
resource.TestCheckResourceAttr(resourceName, "tags.Name", rName),
resource.TestCheckResourceAttr(resourceName, "throughput", "0"),
resource.TestCheckResourceAttr(resourceName, "type", "gp2"),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccAWSEBSVolume_disappears(t *testing.T) {
var v ec2.Volume
resourceName := "aws_ebs_volume.test"
Expand Down Expand Up @@ -1166,3 +1244,68 @@ resource "aws_ebs_volume" "test" {
}
`, rName, iops))
}

func testAccAwsEbsVolumeConfigSnapshotId(rName string) string {
return composeConfig(
testAccAvailableAZsNoOptInConfig(),
fmt.Sprintf(`
resource "aws_ebs_volume" "source" {
availability_zone = data.aws_availability_zones.available.names[0]
size = 1
tags = {
Name = %[1]q
}
}
resource "aws_ebs_snapshot" "test" {
volume_id = aws_ebs_volume.source.id
tags = {
Name = %[1]q
}
}
resource "aws_ebs_volume" "test" {
availability_zone = data.aws_availability_zones.available.names[0]
snapshot_id = aws_ebs_snapshot.test.id
tags = {
Name = %[1]q
}
}
`, rName))
}

func testAccAwsEbsVolumeConfigSnapshotIdAndSize(rName string, size int) string {
return composeConfig(
testAccAvailableAZsNoOptInConfig(),
fmt.Sprintf(`
resource "aws_ebs_volume" "source" {
availability_zone = data.aws_availability_zones.available.names[0]
size = 10
tags = {
Name = %[1]q
}
}
resource "aws_ebs_snapshot" "test" {
volume_id = aws_ebs_volume.source.id
tags = {
Name = %[1]q
}
}
resource "aws_ebs_volume" "test" {
availability_zone = data.aws_availability_zones.available.names[0]
snapshot_id = aws_ebs_snapshot.test.id
size = %[2]d
tags = {
Name = %[1]q
}
}
`, rName, size))
}
2 changes: 1 addition & 1 deletion website/docs/r/ebs_volume.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ resource "aws_ebs_volume" "example" {
}
```

~> **NOTE**: One of `size` or `snapshot_id` is required when specifying an EBS volume
~> **NOTE**: At least one of `size` or `snapshot_id` is required when specifying an EBS volume

## Argument Reference

Expand Down

0 comments on commit 73d1aaa

Please sign in to comment.