Skip to content

Commit

Permalink
Merge pull request #40281 from hashicorp/b-rds-reserved-instance-offe…
Browse files Browse the repository at this point in the history
…ring-ds

Fix aws_rds_reserved_instance_offering data source
  • Loading branch information
YakDriver authored Nov 24, 2024
2 parents dfe6aaf + 9e2c746 commit 9d4a0d2
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 11 deletions.
3 changes: 3 additions & 0 deletions .changelog/40281.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
data-source/aws_rds_reserved_instance_offering: When `product_description` (e.g., "postgresql") is a substring of multiple products, fix `Error: multiple RDS Reserved Instance Offerings matched; use additional constraints to reduce matches to a single RDS Reserved Instance Offering`
```
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,12 @@ func dataSourceReservedOfferingRead(ctx context.Context, d *schema.ResourceData,
ProductDescription: aws.String(d.Get("product_description").(string)),
}

offering, err := findReservedDBInstancesOffering(ctx, conn, input, tfslices.PredicateTrue[*types.ReservedDBInstancesOffering]())

// A filter is necessary because the API returns all products where the product description contains
// the input product description. Sending "mysql" will return "mysql" *and* "aurora-mysql" offerings,
// causing an error: multiple RDS Reserved Instance Offerings matched
offering, err := findReservedDBInstancesOffering(ctx, conn, input, func(v *types.ReservedDBInstancesOffering) bool {
return aws.ToString(v.ProductDescription) == d.Get("product_description").(string) && aws.ToString(v.DBInstanceClass) == d.Get("db_instance_class").(string)
})
if err != nil {
return sdkdiag.AppendFromErr(diags, tfresource.SingularDataSourceFindError("RDS Reserved Instance Offering", err))
}
Expand All @@ -103,7 +107,6 @@ func dataSourceReservedOfferingRead(ctx context.Context, d *schema.ResourceData,

func findReservedDBInstancesOffering(ctx context.Context, conn *rds.Client, input *rds.DescribeReservedDBInstancesOfferingsInput, filter tfslices.Predicate[*types.ReservedDBInstancesOffering]) (*types.ReservedDBInstancesOffering, error) {
output, err := findReservedDBInstancesOfferings(ctx, conn, input, filter)

if err != nil {
return nil, err
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,58 @@
package rds_test

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-provider-aws/internal/acctest"
"github.com/hashicorp/terraform-provider-aws/names"
)

func TestAccRDSInstanceOffering_basic(t *testing.T) {
const (
testInstanceClass = "db.r5.large"
)

func TestAccRDSReservedInstanceOffering_basic(t *testing.T) {
ctx := acctest.Context(t)
dataSourceName := "data.aws_rds_reserved_instance_offering.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(ctx, t) },
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories,
ErrorCheck: acctest.ErrorCheck(t, names.RDSServiceID),
Steps: []resource.TestStep{
{
Config: testAccReservedInstanceOfferingConfig_basic(testInstanceClass, "postgresql"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(dataSourceName, "currency_code"),
resource.TestCheckResourceAttr(dataSourceName, "db_instance_class", testInstanceClass),
resource.TestCheckResourceAttr(dataSourceName, names.AttrDuration, "31536000"),
resource.TestCheckResourceAttrSet(dataSourceName, "fixed_price"),
resource.TestCheckResourceAttr(dataSourceName, "multi_az", acctest.CtFalse),
resource.TestCheckResourceAttrSet(dataSourceName, "offering_id"),
resource.TestCheckResourceAttr(dataSourceName, "offering_type", "All Upfront"),
resource.TestCheckResourceAttr(dataSourceName, "product_description", "postgresql"),
),
},
{
Config: testAccReservedInstanceOfferingConfig_basic(testInstanceClass, "aurora-postgresql"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(dataSourceName, "currency_code"),
resource.TestCheckResourceAttr(dataSourceName, "db_instance_class", testInstanceClass),
resource.TestCheckResourceAttr(dataSourceName, names.AttrDuration, "31536000"),
resource.TestCheckResourceAttrSet(dataSourceName, "fixed_price"),
resource.TestCheckResourceAttr(dataSourceName, "multi_az", acctest.CtFalse),
resource.TestCheckResourceAttrSet(dataSourceName, "offering_id"),
resource.TestCheckResourceAttr(dataSourceName, "offering_type", "All Upfront"),
resource.TestCheckResourceAttr(dataSourceName, "product_description", "aurora-postgresql"),
),
},
},
})
}

func TestAccRDSReservedInstanceOffering_mysql(t *testing.T) {
ctx := acctest.Context(t)
dataSourceName := "data.aws_rds_reserved_instance_offering.test"

Expand All @@ -21,10 +65,10 @@ func TestAccRDSInstanceOffering_basic(t *testing.T) {
ErrorCheck: acctest.ErrorCheck(t, names.RDSServiceID),
Steps: []resource.TestStep{
{
Config: testAccInstanceOfferingConfig_basic(),
Config: testAccReservedInstanceOfferingConfig_basic(testInstanceClass, "mysql"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(dataSourceName, "currency_code"),
resource.TestCheckResourceAttr(dataSourceName, "db_instance_class", "db.t2.micro"),
resource.TestCheckResourceAttr(dataSourceName, "db_instance_class", testInstanceClass),
resource.TestCheckResourceAttr(dataSourceName, names.AttrDuration, "31536000"),
resource.TestCheckResourceAttrSet(dataSourceName, "fixed_price"),
resource.TestCheckResourceAttr(dataSourceName, "multi_az", acctest.CtFalse),
Expand All @@ -33,18 +77,31 @@ func TestAccRDSInstanceOffering_basic(t *testing.T) {
resource.TestCheckResourceAttr(dataSourceName, "product_description", "mysql"),
),
},
{
Config: testAccReservedInstanceOfferingConfig_basic(testInstanceClass, "aurora-mysql"),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet(dataSourceName, "currency_code"),
resource.TestCheckResourceAttr(dataSourceName, "db_instance_class", testInstanceClass),
resource.TestCheckResourceAttr(dataSourceName, names.AttrDuration, "31536000"),
resource.TestCheckResourceAttrSet(dataSourceName, "fixed_price"),
resource.TestCheckResourceAttr(dataSourceName, "multi_az", acctest.CtFalse),
resource.TestCheckResourceAttrSet(dataSourceName, "offering_id"),
resource.TestCheckResourceAttr(dataSourceName, "offering_type", "All Upfront"),
resource.TestCheckResourceAttr(dataSourceName, "product_description", "aurora-mysql"),
),
},
},
})
}

func testAccInstanceOfferingConfig_basic() string {
return `
func testAccReservedInstanceOfferingConfig_basic(class, desc string) string {
return fmt.Sprintf(`
data "aws_rds_reserved_instance_offering" "test" {
db_instance_class = "db.t2.micro"
db_instance_class = %[1]q
duration = 31536000
multi_az = false
offering_type = "All Upfront"
product_description = "mysql"
product_description = %[2]q
}
`
`, class, desc)
}

0 comments on commit 9d4a0d2

Please sign in to comment.