diff --git a/internal/provider/resource_subaccount_service_binding.go b/internal/provider/resource_subaccount_service_binding.go index 56d9df4f..65531723 100644 --- a/internal/provider/resource_subaccount_service_binding.go +++ b/internal/provider/resource_subaccount_service_binding.go @@ -2,6 +2,7 @@ package provider import ( "context" + "errors" "fmt" "net/http" "strings" @@ -187,7 +188,7 @@ func (rs *subaccountServiceBindingResource) Create(ctx context.Context, req reso createStateConf := &tfutils.StateChangeConf{ Pending: []string{servicemanager.StateInProgress}, - Target: []string{servicemanager.StateSucceeded, servicemanager.StateFailed}, + Target: []string{servicemanager.StateSucceeded}, Refresh: func() (interface{}, string, error) { subRes, _, err := rs.cli.Services.Binding.GetById(ctx, plan.SubaccountId.ValueString(), cliRes.Id) @@ -195,6 +196,11 @@ func (rs *subaccountServiceBindingResource) Create(ctx context.Context, req reso return subRes, "", err } + // No error returned even if operation failed + if subRes.LastOperation.State == servicemanager.StateFailed { + return subRes, subRes.LastOperation.State, errors.New("undefined API error during service binding creation") + } + return subRes, subRes.LastOperation.State, nil }, Timeout: 10 * time.Minute, @@ -245,7 +251,7 @@ func (rs *subaccountServiceBindingResource) Delete(ctx context.Context, req reso deleteStateConf := &tfutils.StateChangeConf{ Pending: []string{servicemanager.StateInProgress}, - Target: []string{servicemanager.StateFailed, "DELETED"}, + Target: []string{"DELETED"}, Refresh: func() (interface{}, string, error) { subRes, comRes, err := rs.cli.Services.Binding.GetById(ctx, state.SubaccountId.ValueString(), state.Id.ValueString()) @@ -257,6 +263,11 @@ func (rs *subaccountServiceBindingResource) Delete(ctx context.Context, req reso return subRes, servicemanager.StateFailed, err } + // No error returned even if operation failed + if subRes.LastOperation.State == servicemanager.StateFailed { + return subRes, subRes.LastOperation.State, errors.New("undefined API error during service binding deletion") + } + return subRes, subRes.LastOperation.State, nil }, Timeout: 10 * time.Minute, diff --git a/internal/provider/resource_subaccount_service_instance.go b/internal/provider/resource_subaccount_service_instance.go index 892f2199..562c9c73 100644 --- a/internal/provider/resource_subaccount_service_instance.go +++ b/internal/provider/resource_subaccount_service_instance.go @@ -2,6 +2,7 @@ package provider import ( "context" + "errors" "fmt" "net/http" "strings" @@ -189,7 +190,7 @@ func (rs *subaccountServiceInstanceResource) Create(ctx context.Context, req res createStateConf := &tfutils.StateChangeConf{ Pending: []string{servicemanager.StateInProgress}, - Target: []string{servicemanager.StateSucceeded, servicemanager.StateFailed}, + Target: []string{servicemanager.StateSucceeded}, Refresh: func() (interface{}, string, error) { subRes, _, err := rs.cli.Services.Instance.GetById(ctx, state.SubaccountId.ValueString(), cliRes.Id) @@ -197,6 +198,11 @@ func (rs *subaccountServiceInstanceResource) Create(ctx context.Context, req res return subRes, "", err } + // No error returned even if operation failed + if subRes.LastOperation.State == servicemanager.StateFailed { + return subRes, subRes.LastOperation.State, errors.New("undefined API error during service instance creation") + } + return subRes, subRes.LastOperation.State, nil }, Timeout: 10 * time.Minute, @@ -264,7 +270,7 @@ func (rs *subaccountServiceInstanceResource) Update(ctx context.Context, req res updateStateConf := &tfutils.StateChangeConf{ Pending: []string{servicemanager.StateInProgress}, - Target: []string{servicemanager.StateSucceeded, servicemanager.StateFailed}, + Target: []string{servicemanager.StateSucceeded}, Refresh: func() (interface{}, string, error) { subRes, _, err := rs.cli.Services.Instance.GetById(ctx, state.SubaccountId.ValueString(), cliRes.Id) @@ -272,6 +278,11 @@ func (rs *subaccountServiceInstanceResource) Update(ctx context.Context, req res return subRes, "", err } + // No error returned even if operation failed + if subRes.LastOperation.State == servicemanager.StateFailed { + return subRes, subRes.LastOperation.State, errors.New("undefined API error during service instance update") + } + return subRes, subRes.LastOperation.State, nil }, Timeout: 10 * time.Minute, @@ -308,7 +319,7 @@ func (rs *subaccountServiceInstanceResource) Delete(ctx context.Context, req res deleteStateConf := &tfutils.StateChangeConf{ Pending: []string{servicemanager.StateInProgress}, - Target: []string{servicemanager.StateFailed, "DELETED"}, + Target: []string{"DELETED"}, Refresh: func() (interface{}, string, error) { subRes, comRes, err := rs.cli.Services.Instance.GetById(ctx, state.SubaccountId.ValueString(), state.Id.ValueString()) @@ -320,6 +331,11 @@ func (rs *subaccountServiceInstanceResource) Delete(ctx context.Context, req res return subRes, subRes.LastOperation.State, err } + // No error returned even if operation failed + if subRes.LastOperation.State == servicemanager.StateFailed { + return subRes, subRes.LastOperation.State, errors.New("undefined API error during service instance deletion") + } + return subRes, subRes.LastOperation.State, nil }, Timeout: 10 * time.Minute, diff --git a/internal/provider/resource_subaccount_subscription.go b/internal/provider/resource_subaccount_subscription.go index 67e0cbd1..dc4930e1 100644 --- a/internal/provider/resource_subaccount_subscription.go +++ b/internal/provider/resource_subaccount_subscription.go @@ -2,6 +2,7 @@ package provider import ( "context" + "errors" "fmt" "strings" "time" @@ -229,7 +230,7 @@ func (rs *subaccountSubscriptionResource) Create(ctx context.Context, req resour createStateConf := &tfutils.StateChangeConf{ Pending: []string{saas_manager_service.StateInProcess}, - Target: []string{saas_manager_service.StateSubscribed, saas_manager_service.StateSubscribeFailed}, + Target: []string{saas_manager_service.StateSubscribed}, Refresh: func() (interface{}, string, error) { subRes, _, err := rs.cli.Accounts.Subscription.Get(ctx, plan.SubaccountId.ValueString(), plan.AppName.ValueString(), plan.PlanName.ValueString()) @@ -237,6 +238,11 @@ func (rs *subaccountSubscriptionResource) Create(ctx context.Context, req resour return subRes, "", err } + // No error returned even is subscription failed + if subRes.State == saas_manager_service.StateSubscribeFailed { + return subRes, subRes.State, errors.New("undefined API error during subscription") + } + return subRes, subRes.State, nil }, Timeout: 10 * time.Minute, @@ -287,7 +293,7 @@ func (rs *subaccountSubscriptionResource) Delete(ctx context.Context, req resour deleteStateConf := &tfutils.StateChangeConf{ Pending: []string{saas_manager_service.StateInProcess}, - Target: []string{saas_manager_service.StateUnsubscribeFailed, saas_manager_service.StateNotSubscribed}, + Target: []string{saas_manager_service.StateNotSubscribed}, Refresh: func() (interface{}, string, error) { subRes, _, err := rs.cli.Accounts.Subscription.Get(ctx, state.SubaccountId.ValueString(), state.AppName.ValueString(), state.PlanName.ValueString()) @@ -295,6 +301,11 @@ func (rs *subaccountSubscriptionResource) Delete(ctx context.Context, req resour return subRes, subRes.State, err } + // No error returned even is unsubscribe failed + if subRes.State == saas_manager_service.StateUnsubscribeFailed { + return subRes, subRes.State, errors.New("undefined API error during unsubscription") + } + return subRes, subRes.State, nil }, Timeout: 10 * time.Minute,