Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/workflows/terraform_provider_pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,18 @@ jobs:
- run: EXECUTE_TESTS=true make testacc TESTARGS='-run="TestAccResourceRedisCloudEssentialsDatabase_CRUDI"'


go_test_smoke_essentials_sub:
name: go test smoke essentials sub
needs: [go_build]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-go@0aaccfd150d50ccaeb58ebd88d36e91967a5f35b # v5.4.0
with:
go-version-file: go.mod
- run: EXECUTE_TESTS=true make testacc TESTARGS='-run="TestAccResourceRedisCloudEssentialsSubscription"'


go_test_smoke_pro_db:
name: go test smoke pro db
needs: [go_build]
Expand Down
1 change: 1 addition & 0 deletions docs/data-sources/rediscloud_essentials_subscription.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ output "rediscloud_essentials_subscription" {

* `status` - The current status of the subscription
* `plan_id` - The plan to which this subscription belongs
* `payment_method` - Payment method for the requested subscription. If `credit-card` is specified, the payment method id must be defined. This information is only used when creating a new subscription and any changes will be ignored after this.
* `payment_method_id` - A valid payment method pre-defined in the current account
* `creation_date` - When the subscription was created
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/RedisLabs/terraform-provider-rediscloud
go 1.22.4

require (
github.com/RedisLabs/rediscloud-go-api v0.26.0
github.com/RedisLabs/rediscloud-go-api v0.27.0
github.com/bflad/tfproviderlint v0.31.0
github.com/hashicorp/go-cty v1.5.0
github.com/hashicorp/terraform-plugin-sdk/v2 v2.36.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk=
github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/RedisLabs/rediscloud-go-api v0.26.0 h1:ka6CN2O+Ti6igkfH8lDT9Ua1/ksEh2H5dj1GF/pnKKQ=
github.com/RedisLabs/rediscloud-go-api v0.26.0/go.mod h1:3/oVb71rv2OstFRYEc65QCIbfwnJTgZeQhtPCcdHook=
github.com/RedisLabs/rediscloud-go-api v0.27.0 h1:eTaxZFl+y6z+loViUl6CDhlG+JVDokXHbkIctRD+r2g=
github.com/RedisLabs/rediscloud-go-api v0.27.0/go.mod h1:3/oVb71rv2OstFRYEc65QCIbfwnJTgZeQhtPCcdHook=
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
Expand Down
14 changes: 7 additions & 7 deletions provider/datasource_rediscloud_essentials_subscription.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"strconv"

"github.com/RedisLabs/rediscloud-go-api/redis"
fixedSubscriptions "github.com/RedisLabs/rediscloud-go-api/service/fixed/subscriptions"
fs "github.com/RedisLabs/rediscloud-go-api/service/fixed/subscriptions"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
Expand Down Expand Up @@ -60,16 +60,16 @@ func dataSourceRedisCloudEssentialsSubscriptionRead(ctx context.Context, d *sche
return diag.FromErr(err)
}

var filters []func(method *fixedSubscriptions.FixedSubscription) bool
var filters []func(method *fs.FixedSubscriptionResponse) bool

if id, ok := d.GetOk("id"); ok {
filters = append(filters, func(sub *fixedSubscriptions.FixedSubscription) bool {
filters = append(filters, func(sub *fs.FixedSubscriptionResponse) bool {
return redis.IntValue(sub.ID) == id
})
}

if name, ok := d.GetOk("name"); ok {
filters = append(filters, func(sub *fixedSubscriptions.FixedSubscription) bool {
filters = append(filters, func(sub *fs.FixedSubscriptionResponse) bool {
return redis.StringValue(sub.Name) == name
})
}
Expand Down Expand Up @@ -109,8 +109,8 @@ func dataSourceRedisCloudEssentialsSubscriptionRead(ctx context.Context, d *sche
return diags
}

func filterFixedSubscriptions(subs []*fixedSubscriptions.FixedSubscription, filters []func(sub *fixedSubscriptions.FixedSubscription) bool) []*fixedSubscriptions.FixedSubscription {
var filteredSubs []*fixedSubscriptions.FixedSubscription
func filterFixedSubscriptions(subs []*fs.FixedSubscriptionResponse, filters []func(sub *fs.FixedSubscriptionResponse) bool) []*fs.FixedSubscriptionResponse {
var filteredSubs []*fs.FixedSubscriptionResponse
for _, sub := range subs {
if filterFixedSub(sub, filters) {
filteredSubs = append(filteredSubs, sub)
Expand All @@ -120,7 +120,7 @@ func filterFixedSubscriptions(subs []*fixedSubscriptions.FixedSubscription, filt
return filteredSubs
}

func filterFixedSub(method *fixedSubscriptions.FixedSubscription, filters []func(method *fixedSubscriptions.FixedSubscription) bool) bool {
func filterFixedSub(method *fs.FixedSubscriptionResponse, filters []func(method *fs.FixedSubscriptionResponse) bool) bool {
for _, f := range filters {
if !f(method) {
return false
Expand Down
227 changes: 221 additions & 6 deletions provider/rediscloud_essentials_subscription_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"regexp"
"strconv"
"testing"
)

func TestAccResourceRedisCloudEssentialsSubscription_FreeCRUDI(t *testing.T) {
func TestAccResourceRedisCloudEssentialsSubscription_Free_CRUDI(t *testing.T) {

testAccRequiresEnvVar(t, "EXECUTE_TESTS")

Expand Down Expand Up @@ -76,7 +77,7 @@ func TestAccResourceRedisCloudEssentialsSubscription_FreeCRUDI(t *testing.T) {
})
}

func TestAccResourceRedisCloudEssentialsSubscription_PaidCRUDI(t *testing.T) {
func TestAccResourceRedisCloudEssentialsSubscription_Paid_CreditCard_CRUDI(t *testing.T) {

testAccRequiresEnvVar(t, "EXECUTE_TESTS")

Expand All @@ -92,13 +93,14 @@ func TestAccResourceRedisCloudEssentialsSubscription_PaidCRUDI(t *testing.T) {
CheckDestroy: testAccCheckEssentialsSubscriptionDestroy,
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidEssentialsSubscription, subscriptionName),
Config: fmt.Sprintf(testAccResourceRedisCloudPaidCreditCardEssentialsSubscription, subscriptionName),
Check: resource.ComposeAggregateTestCheckFunc(
// Test the resource
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "name", subscriptionName),
resource.TestCheckResourceAttr(resourceName, "status", "active"),
resource.TestCheckResourceAttrSet(resourceName, "plan_id"),
resource.TestCheckResourceAttrSet(resourceName, "payment_method"),
resource.TestCheckResourceAttrSet(resourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(resourceName, "creation_date"),

Expand All @@ -112,7 +114,7 @@ func TestAccResourceRedisCloudEssentialsSubscription_PaidCRUDI(t *testing.T) {
),
},
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidEssentialsSubscription, subscriptionNameUpdated),
Config: fmt.Sprintf(testAccResourceRedisCloudPaidCreditCardEssentialsSubscription, subscriptionNameUpdated),
Check: resource.ComposeAggregateTestCheckFunc(
// Test the resource
resource.TestCheckResourceAttrSet(resourceName, "id"),
Expand All @@ -132,7 +134,7 @@ func TestAccResourceRedisCloudEssentialsSubscription_PaidCRUDI(t *testing.T) {
),
},
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidEssentialsSubscription, subscriptionNameUpdated),
Config: fmt.Sprintf(testAccResourceRedisCloudPaidCreditCardEssentialsSubscription, subscriptionNameUpdated),
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
Expand All @@ -141,6 +143,158 @@ func TestAccResourceRedisCloudEssentialsSubscription_PaidCRUDI(t *testing.T) {
})
}

func TestAccResourceRedisCloudEssentialsSubscription_Paid_NoPaymentType_CRUDI(t *testing.T) {

testAccRequiresEnvVar(t, "EXECUTE_TESTS")

subscriptionName := acctest.RandomWithPrefix(testResourcePrefix)
subscriptionNameUpdated := subscriptionName + "-updated"

const resourceName = "rediscloud_essentials_subscription.example"
const datasourceName = "data.rediscloud_essentials_subscription.example"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: providerFactories,
CheckDestroy: testAccCheckEssentialsSubscriptionDestroy,
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidNoPaymentTypeEssentialsSubscription, subscriptionName),
Check: resource.ComposeAggregateTestCheckFunc(
// Test the resource
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "name", subscriptionName),
resource.TestCheckResourceAttr(resourceName, "status", "active"),
resource.TestCheckResourceAttrSet(resourceName, "plan_id"),
resource.TestCheckResourceAttrSet(resourceName, "payment_method"),
resource.TestCheckResourceAttrSet(resourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(resourceName, "creation_date"),

// Test the datasource
resource.TestCheckResourceAttrSet(datasourceName, "id"),
resource.TestCheckResourceAttr(datasourceName, "name", subscriptionName),
resource.TestCheckResourceAttr(datasourceName, "status", "active"),
resource.TestCheckResourceAttrSet(datasourceName, "plan_id"),
resource.TestCheckResourceAttrSet(datasourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(datasourceName, "creation_date"),
),
},
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidNoPaymentTypeEssentialsSubscription, subscriptionNameUpdated),
Check: resource.ComposeAggregateTestCheckFunc(
// Test the resource
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "name", subscriptionNameUpdated),
resource.TestCheckResourceAttr(resourceName, "status", "active"),
resource.TestCheckResourceAttrSet(resourceName, "plan_id"),
resource.TestCheckResourceAttrSet(resourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(resourceName, "creation_date"),

// Test the datasource
resource.TestCheckResourceAttrSet(datasourceName, "id"),
resource.TestCheckResourceAttr(datasourceName, "name", subscriptionNameUpdated),
resource.TestCheckResourceAttr(datasourceName, "status", "active"),
resource.TestCheckResourceAttrSet(datasourceName, "plan_id"),
resource.TestCheckResourceAttrSet(datasourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(datasourceName, "creation_date"),
),
},
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidNoPaymentTypeEssentialsSubscription, subscriptionNameUpdated),
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccResourceRedisCloudEssentialsSubscription_Paid_Marketplace_CRUDI(t *testing.T) {
// Only the qa environment has access to the marketplace, so this test will normally fail.
// Leaving this in the test suite for manual runs
testAccRequiresEnvVar(t, "EXECUTE_QA_TESTS")

subscriptionName := acctest.RandomWithPrefix(testResourcePrefix)
subscriptionNameUpdated := subscriptionName + "-updated"

const resourceName = "rediscloud_essentials_subscription.example"
const datasourceName = "data.rediscloud_essentials_subscription.example"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: providerFactories,
CheckDestroy: testAccCheckEssentialsSubscriptionDestroy,
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidMarketplaceEssentialsSubscription, subscriptionName),
Check: resource.ComposeAggregateTestCheckFunc(
// Test the resource
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "name", subscriptionName),
resource.TestCheckResourceAttr(resourceName, "status", "active"),
resource.TestCheckResourceAttrSet(resourceName, "plan_id"),
resource.TestCheckResourceAttr(resourceName, "payment_method", "credit-card"),
resource.TestCheckResourceAttrSet(resourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(resourceName, "creation_date"),

// Test the datasource
resource.TestCheckResourceAttrSet(datasourceName, "id"),
resource.TestCheckResourceAttr(datasourceName, "name", subscriptionName),
resource.TestCheckResourceAttr(datasourceName, "status", "active"),
resource.TestCheckResourceAttrSet(datasourceName, "plan_id"),
resource.TestCheckResourceAttrSet(datasourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(datasourceName, "creation_date"),
),
},
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidMarketplaceEssentialsSubscription, subscriptionNameUpdated),
Check: resource.ComposeAggregateTestCheckFunc(
// Test the resource
resource.TestCheckResourceAttrSet(resourceName, "id"),
resource.TestCheckResourceAttr(resourceName, "name", subscriptionNameUpdated),
resource.TestCheckResourceAttr(resourceName, "status", "active"),
resource.TestCheckResourceAttrSet(resourceName, "plan_id"),
resource.TestCheckResourceAttr(resourceName, "payment_method", "credit-card"),
resource.TestCheckResourceAttrSet(resourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(resourceName, "creation_date"),

// Test the datasource
resource.TestCheckResourceAttrSet(datasourceName, "id"),
resource.TestCheckResourceAttr(datasourceName, "name", subscriptionNameUpdated),
resource.TestCheckResourceAttr(datasourceName, "status", "active"),
resource.TestCheckResourceAttrSet(datasourceName, "plan_id"),
resource.TestCheckResourceAttrSet(datasourceName, "payment_method_id"),
resource.TestCheckResourceAttrSet(datasourceName, "creation_date"),
),
},
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidMarketplaceEssentialsSubscription, subscriptionNameUpdated),
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccResourceRedisCloudEssentialsSubscription_Incorrect_PaymentIdForType(t *testing.T) {
testAccRequiresEnvVar(t, "EXECUTE_TESTS")

subscriptionName := acctest.RandomWithPrefix(testResourcePrefix)

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
CheckDestroy: testAccCheckEssentialsSubscriptionDestroy,
ProviderFactories: providerFactories,
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(testAccResourceRedisCloudPaidIncorrectPaymentTypeEssentialsSubscription, subscriptionName),
ExpectError: regexp.MustCompile("payment methods aside from credit-card cannot have a payment ID"),
},
},
})
}

const testAccResourceRedisCloudFreeEssentialsSubscription = `
data "rediscloud_essentials_plan" "example" {
name = "30MB"
Expand All @@ -158,7 +312,25 @@ data "rediscloud_essentials_subscription" "example" {
}
`

const testAccResourceRedisCloudPaidEssentialsSubscription = `
const testAccResourceRedisCloudPaidMarketplaceEssentialsSubscription = `
data "rediscloud_essentials_plan" "example" {
name = "250MB"
cloud_provider = "AWS"
region = "us-east-1"
}

resource "rediscloud_essentials_subscription" "example" {
name = "%s"
plan_id = data.rediscloud_essentials_plan.example.id
payment_method = "marketplace"
}

data "rediscloud_essentials_subscription" "example" {
name = rediscloud_essentials_subscription.example.name
}
`

const testAccResourceRedisCloudPaidCreditCardEssentialsSubscription = `
data "rediscloud_payment_method" "card" {
card_type = "Visa"
}
Expand All @@ -173,6 +345,49 @@ resource "rediscloud_essentials_subscription" "example" {
name = "%s"
plan_id = data.rediscloud_essentials_plan.example.id
payment_method_id = data.rediscloud_payment_method.card.id
payment_method = "credit-card"
}

data "rediscloud_essentials_subscription" "example" {
name = rediscloud_essentials_subscription.example.name
}
`

// doesn't contain credit-card, tests for default
const testAccResourceRedisCloudPaidNoPaymentTypeEssentialsSubscription = `
data "rediscloud_payment_method" "card" {
card_type = "Visa"
}

data "rediscloud_essentials_plan" "example" {
name = "250MB"
cloud_provider = "AWS"
region = "us-east-1"
}

resource "rediscloud_essentials_subscription" "example" {
name = "%s"
plan_id = data.rediscloud_essentials_plan.example.id
payment_method_id = data.rediscloud_payment_method.card.id
}

data "rediscloud_essentials_subscription" "example" {
name = rediscloud_essentials_subscription.example.name
}
`

const testAccResourceRedisCloudPaidIncorrectPaymentTypeEssentialsSubscription = `
data "rediscloud_essentials_plan" "example" {
name = "250MB"
cloud_provider = "AWS"
region = "us-east-1"
}

resource "rediscloud_essentials_subscription" "example" {
name = "%s"
plan_id = data.rediscloud_essentials_plan.example.id
payment_method = "marketplace"
payment_method_id = 999999999
}

data "rediscloud_essentials_subscription" "example" {
Expand Down
Loading