diff --git a/.github/workflows/terraform_provider_pr.yml b/.github/workflows/terraform_provider_pr.yml index eb6b320a..96ecc32b 100644 --- a/.github/workflows/terraform_provider_pr.yml +++ b/.github/workflows/terraform_provider_pr.yml @@ -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] diff --git a/docs/data-sources/rediscloud_essentials_subscription.md b/docs/data-sources/rediscloud_essentials_subscription.md index 50ad40e0..4f3e1410 100644 --- a/docs/data-sources/rediscloud_essentials_subscription.md +++ b/docs/data-sources/rediscloud_essentials_subscription.md @@ -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 diff --git a/go.mod b/go.mod index 282bc8c0..df0040ed 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index abd0f506..cd96b60f 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/provider/datasource_rediscloud_essentials_subscription.go b/provider/datasource_rediscloud_essentials_subscription.go index 10e91f56..e6accacd 100644 --- a/provider/datasource_rediscloud_essentials_subscription.go +++ b/provider/datasource_rediscloud_essentials_subscription.go @@ -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" ) @@ -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 }) } @@ -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) @@ -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 diff --git a/provider/rediscloud_active_active_subscription_test.go b/provider/rediscloud_active_active_subscription_test.go index 63c7d701..6c89f4b4 100644 --- a/provider/rediscloud_active_active_subscription_test.go +++ b/provider/rediscloud_active_active_subscription_test.go @@ -24,7 +24,7 @@ var activeActiveMarketplaceFlag = flag.Bool("activeActiveMarketplace", false, // Also checks active-active subscription regions. func TestAccResourceRedisCloudActiveActiveSubscription_CRUDI(t *testing.T) { - //testAccRequiresEnvVar(t, "EXECUTE_TESTS") + testAccRequiresEnvVar(t, "EXECUTE_TESTS") name := acctest.RandomWithPrefix(testResourcePrefix) const resourceName = "rediscloud_active_active_subscription.example" diff --git a/provider/rediscloud_essentials_subscription_test.go b/provider/rediscloud_essentials_subscription_test.go index 5c4dad4c..21d8b638 100644 --- a/provider/rediscloud_essentials_subscription_test.go +++ b/provider/rediscloud_essentials_subscription_test.go @@ -2,16 +2,21 @@ package provider import ( "context" + "flag" "fmt" "github.com/RedisLabs/rediscloud-go-api/redis" "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) { +var essentialsMarketplaceFlag = flag.Bool("essentialsMarketplace", false, + "Add this flag '-essentialsMarketplace' to run tests for marketplace associated accounts") + +func TestAccResourceRedisCloudEssentialsSubscription_Free_CRUDI(t *testing.T) { testAccRequiresEnvVar(t, "EXECUTE_TESTS") @@ -76,7 +81,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") @@ -92,13 +97,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"), @@ -112,13 +118,151 @@ 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"), + 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(testAccResourceRedisCloudPaidCreditCardEssentialsSubscription, subscriptionNameUpdated), + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +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_TESTS") + + if !*essentialsMarketplaceFlag { + t.Skip("The '-essentialsMarketplace' parameter wasn't provided in the test command.") + } + + 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.TestCheckNoResourceAttr(datasourceName, "payment_method_id"), + //resource.TestCheckResourceAttr(resourceName, "payment_method", "marketplace"), // empty from API? + 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.TestCheckNoResourceAttr(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"), @@ -132,7 +276,7 @@ func TestAccResourceRedisCloudEssentialsSubscription_PaidCRUDI(t *testing.T) { ), }, { - Config: fmt.Sprintf(testAccResourceRedisCloudPaidEssentialsSubscription, subscriptionNameUpdated), + Config: fmt.Sprintf(testAccResourceRedisCloudPaidMarketplaceEssentialsSubscription, subscriptionNameUpdated), ResourceName: resourceName, ImportState: true, ImportStateVerify: true, @@ -141,6 +285,24 @@ func TestAccResourceRedisCloudEssentialsSubscription_PaidCRUDI(t *testing.T) { }) } +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" @@ -158,7 +320,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" } @@ -173,6 +353,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" { diff --git a/provider/resource_rediscloud_essentials_subscription.go b/provider/resource_rediscloud_essentials_subscription.go index b93a5388..d293669b 100644 --- a/provider/resource_rediscloud_essentials_subscription.go +++ b/provider/resource_rediscloud_essentials_subscription.go @@ -2,7 +2,10 @@ package provider import ( "context" + "errors" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "log" + "regexp" "strconv" "time" @@ -50,6 +53,20 @@ func resourceRedisCloudEssentialsSubscription() *schema.Resource { Type: schema.TypeInt, Required: true, }, + "payment_method": { + Description: "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.", + Type: schema.TypeString, + ValidateDiagFunc: validation.ToDiagFunc(validation.StringMatch(regexp.MustCompile("^(credit-card|marketplace)$"), "must be 'credit-card' or 'marketplace'")), + Optional: true, + Default: "credit-card", + DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { + if d.Id() == "" { + // We don't want to ignore the block if the resource is about to be created. + return false + } + return true + }, + }, "payment_method_id": { Description: "The identifier of the method which will be charged for this subscription. Not required for free plans", Type: schema.TypeInt, @@ -68,11 +85,20 @@ func resourceRedisCloudEssentialsSubscriptionCreate(ctx context.Context, d *sche var diags diag.Diagnostics api := meta.(*apiClient) - createSubscriptionRequest := fixedSubscriptions.FixedSubscription{ + createSubscriptionRequest := fixedSubscriptions.FixedSubscriptionRequest{ Name: redis.String(d.Get("name").(string)), PlanId: redis.Int(d.Get("plan_id").(int)), } + // payment_method_id only matters if it is a credit card + if d.Get("payment_method").(string) != "credit-card" && d.Get("payment_method_id") != 0 { + return diag.FromErr(errors.New("payment methods aside from credit-card cannot have a payment ID")) + } + + if v, ok := d.GetOk("payment_method"); ok { + createSubscriptionRequest.PaymentMethod = redis.String(v.(string)) + } + if v, ok := d.GetOk("payment_method_id"); ok { createSubscriptionRequest.PaymentMethodID = redis.Int(v.(int)) } @@ -124,6 +150,9 @@ func resourceRedisCloudEssentialsSubscriptionRead(ctx context.Context, d *schema if err := d.Set("payment_method_id", redis.IntValue(subscription.PaymentMethodID)); err != nil { return diag.FromErr(err) } + if err := d.Set("payment_method", redis.StringValue(subscription.PaymentMethod)); err != nil { + return diag.FromErr(err) + } if err := d.Set("creation_date", redis.TimeValue(subscription.CreationDate).String()); err != nil { return diag.FromErr(err) } @@ -149,11 +178,15 @@ func resourceRedisCloudEssentialsSubscriptionUpdate(ctx context.Context, d *sche return diags } - updateSubscriptionRequest := fixedSubscriptions.FixedSubscription{ + updateSubscriptionRequest := fixedSubscriptions.FixedSubscriptionRequest{ Name: redis.String(d.Get("name").(string)), PlanId: redis.Int(d.Get("plan_id").(int)), } + if v, ok := d.GetOk("payment_method"); ok { + updateSubscriptionRequest.PaymentMethod = redis.String(v.(string)) + } + if v, ok := d.GetOk("payment_method_id"); ok { updateSubscriptionRequest.PaymentMethodID = redis.Int(v.(int)) }