Skip to content

Commit

Permalink
Merge pull request #25046 from hashicorp/b-managed-prefix-list-entry-…
Browse files Browse the repository at this point in the history
…retry

vpc: Problem creating multiple managed prefix list entries
  • Loading branch information
YakDriver authored Jun 13, 2022
2 parents 77b7859 + 9a3ddfc commit 203b8d7
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 29 deletions.
3 changes: 3 additions & 0 deletions .changelog/25046.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/aws_ec2_managed_prefix_list_entry: Fix error when attempting to create or delete multiple list entries
```
70 changes: 41 additions & 29 deletions internal/service/ec2/vpc_managed_prefix_list_entry.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,34 +51,40 @@ func resourceManagedPrefixListEntryCreate(d *schema.ResourceData, meta interface
plID := d.Get("prefix_list_id").(string)
id := ManagedPrefixListEntryCreateID(plID, cidr)

pl, err := FindManagedPrefixListByID(conn, plID)

if err != nil {
return fmt.Errorf("error reading EC2 Managed Prefix List (%s): %w", plID, err)
}

addPrefixListEntry := &ec2.AddPrefixListEntry{Cidr: aws.String(cidr)}

if v, ok := d.GetOk("description"); ok {
addPrefixListEntry.Description = aws.String(v.(string))
}

input := &ec2.ModifyManagedPrefixListInput{
AddEntries: []*ec2.AddPrefixListEntry{addPrefixListEntry},
CurrentVersion: pl.Version,
PrefixListId: aws.String(plID),
}
_, err := tfresource.RetryWhenAWSErrCodeEquals(d.Timeout(schema.TimeoutCreate), func() (interface{}, error) {
mutexKey := fmt.Sprintf("vpc-managed-prefix-list-%s", plID)
conns.GlobalMutexKV.Lock(mutexKey)
defer conns.GlobalMutexKV.Unlock(mutexKey)

pl, err := FindManagedPrefixListByID(conn, plID)

if err != nil {
return nil, fmt.Errorf("error reading VPC Managed Prefix List (%s): %w", plID, err)
}

_, err = conn.ModifyManagedPrefixList(input)
input := &ec2.ModifyManagedPrefixListInput{
AddEntries: []*ec2.AddPrefixListEntry{addPrefixListEntry},
CurrentVersion: pl.Version,
PrefixListId: aws.String(plID),
}

return conn.ModifyManagedPrefixList(input)
}, "IncorrectState", "PrefixListVersionMismatch")

if err != nil {
return fmt.Errorf("error creating EC2 Managed Prefix List Entry (%s): %w", id, err)
return fmt.Errorf("error creating VPC Managed Prefix List Entry (%s): %w", id, err)
}

d.SetId(id)

if _, err := WaitManagedPrefixListModified(conn, plID); err != nil {
return fmt.Errorf("error waiting for EC2 Managed Prefix List Entry (%s) create: %w", d.Id(), err)
return fmt.Errorf("error waiting for VPC Managed Prefix List Entry (%s) create: %w", d.Id(), err)
}

return resourceManagedPrefixListEntryRead(d, meta)
Expand All @@ -98,13 +104,13 @@ func resourceManagedPrefixListEntryRead(d *schema.ResourceData, meta interface{}
}, d.IsNewResource())

if !d.IsNewResource() && tfresource.NotFound(err) {
log.Printf("[WARN] EC2 Managed Prefix List Entry (%s) not found, removing from state", d.Id())
log.Printf("[WARN] VPC Managed Prefix List Entry (%s) not found, removing from state", d.Id())
d.SetId("")
return nil
}

if err != nil {
return fmt.Errorf("error reading EC2 Managed Prefix List Entry (%s): %w", d.Id(), err)
return fmt.Errorf("error reading VPC Managed Prefix List Entry (%s): %w", d.Id(), err)
}

entry := outputRaw.(*ec2.PrefixListEntry)
Expand All @@ -121,31 +127,37 @@ func resourceManagedPrefixListEntryDelete(d *schema.ResourceData, meta interface
plID, cidr, err := ManagedPrefixListEntryParseID(d.Id())

if err != nil {
return err
return fmt.Errorf("error parsing VPC Managed Prefix List Entry ID (%s): %w", d.Id(), err)
}

pl, err := FindManagedPrefixListByID(conn, plID)
_, err = tfresource.RetryWhenAWSErrCodeEquals(d.Timeout(schema.TimeoutCreate), func() (interface{}, error) {
mutexKey := fmt.Sprintf("vpc-managed-prefix-list-%s", plID)
conns.GlobalMutexKV.Lock(mutexKey)
defer conns.GlobalMutexKV.Unlock(mutexKey)

if err != nil {
return fmt.Errorf("error reading EC2 Managed Prefix List (%s): %w", plID, err)
}
pl, err := FindManagedPrefixListByID(conn, plID)

input := &ec2.ModifyManagedPrefixListInput{
CurrentVersion: pl.Version,
PrefixListId: aws.String(plID),
RemoveEntries: []*ec2.RemovePrefixListEntry{{Cidr: aws.String(cidr)}},
}
if err != nil {
return nil, fmt.Errorf("error reading VPC Managed Prefix List (%s): %w", plID, err)
}

input := &ec2.ModifyManagedPrefixListInput{
CurrentVersion: pl.Version,
PrefixListId: aws.String(plID),
RemoveEntries: []*ec2.RemovePrefixListEntry{{Cidr: aws.String(cidr)}},
}

_, err = conn.ModifyManagedPrefixList(input)
return conn.ModifyManagedPrefixList(input)
}, "IncorrectState", "PrefixListVersionMismatch")

if err != nil {
return fmt.Errorf("error deleting EC2 Managed Prefix List Entry (%s): %w", d.Id(), err)
return fmt.Errorf("error deleting VPC Managed Prefix List Entry (%s): %w", d.Id(), err)
}

_, err = WaitManagedPrefixListModified(conn, plID)

if err != nil {
return fmt.Errorf("error waiting for EC2 Managed Prefix List Entry (%s) delete: %w", d.Id(), err)
return fmt.Errorf("error waiting for VPC Managed Prefix List Entry (%s) delete: %w", d.Id(), err)
}

return nil
Expand Down
56 changes: 56 additions & 0 deletions internal/service/ec2/vpc_managed_prefix_list_entry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,34 @@ func TestAccVPCManagedPrefixListEntry_ipv4(t *testing.T) {
})
}

func TestAccVPCManagedPrefixListEntry_ipv4Multiple(t *testing.T) {
var entry ec2.PrefixListEntry
resourceName1 := "aws_ec2_managed_prefix_list_entry.test1"
resourceName2 := "aws_ec2_managed_prefix_list_entry.test2"
resourceName3 := "aws_ec2_managed_prefix_list_entry.test3"
rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix)

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t); testAccPreCheckManagedPrefixList(t) },
ErrorCheck: acctest.ErrorCheck(t, ec2.EndpointsID),
ProviderFactories: acctest.ProviderFactories,
CheckDestroy: testAccCheckManagedPrefixListEntryDestroy,
Steps: []resource.TestStep{
{
Config: testAccVPCManagedPrefixListEntryConfig_ipv4Multiple(rName),
Check: resource.ComposeTestCheckFunc(
testAccCheckManagedPrefixListEntryExists(resourceName1, &entry),
testAccCheckManagedPrefixListEntryExists(resourceName2, &entry),
testAccCheckManagedPrefixListEntryExists(resourceName3, &entry),
resource.TestCheckResourceAttr(resourceName1, "cidr", "10.0.0.0/24"),
resource.TestCheckResourceAttr(resourceName2, "cidr", "10.0.1.0/24"),
resource.TestCheckResourceAttr(resourceName3, "cidr", "10.0.2.0/24"),
),
},
},
})
}

func TestAccVPCManagedPrefixListEntry_ipv6(t *testing.T) {
var entry ec2.PrefixListEntry
resourceName := "aws_ec2_managed_prefix_list_entry.test"
Expand Down Expand Up @@ -259,6 +287,34 @@ resource "aws_ec2_managed_prefix_list_entry" "test" {
`, rName)
}

func testAccVPCManagedPrefixListEntryConfig_ipv4Multiple(rName string) string {
return fmt.Sprintf(`
resource "aws_ec2_managed_prefix_list" "test" {
name = %[1]q
address_family = "IPv4"
max_entries = 5
}
resource "aws_ec2_managed_prefix_list_entry" "test1" {
cidr = "10.0.0.0/24"
description = "description 1"
prefix_list_id = aws_ec2_managed_prefix_list.test.id
}
resource "aws_ec2_managed_prefix_list_entry" "test2" {
cidr = "10.0.1.0/24"
description = "description 2"
prefix_list_id = aws_ec2_managed_prefix_list.test.id
}
resource "aws_ec2_managed_prefix_list_entry" "test3" {
cidr = "10.0.2.0/24"
description = "description 3"
prefix_list_id = aws_ec2_managed_prefix_list.test.id
}
`, rName)
}

func testAccVPCManagedPrefixListEntryConfig_ipv6(rName string) string {
return fmt.Sprintf(`
resource "aws_ec2_managed_prefix_list" "test" {
Expand Down

0 comments on commit 203b8d7

Please sign in to comment.