Skip to content

Commit cddcf57

Browse files
committed
implement timeout for create and delete
1 parent de62fd3 commit cddcf57

File tree

4 files changed

+38
-21
lines changed

4 files changed

+38
-21
lines changed

internal/service/encryptionatrestprivateendpoint/resource.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/hashicorp/terraform-plugin-framework/path"
1212
"github.com/hashicorp/terraform-plugin-framework/resource"
1313

14+
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/cleanup"
1415
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
1516
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/retrystrategy"
1617
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/validate"
@@ -63,7 +64,12 @@ func (r *encryptionAtRestPrivateEndpointRS) Create(ctx context.Context, req reso
6364
return
6465
}
6566

66-
finalResp, err := waitStateTransition(ctx, projectID, cloudProvider, createResp.GetId(), connV2.EncryptionAtRestUsingCustomerKeyManagementApi)
67+
createTimeout := cleanup.ResolveTimeout(ctx, &earPrivateEndpointPlan.Timeouts, cleanup.OperationCreate, &resp.Diagnostics)
68+
if resp.Diagnostics.HasError() {
69+
return
70+
}
71+
72+
finalResp, err := waitStateTransition(ctx, projectID, cloudProvider, createResp.GetId(), connV2.EncryptionAtRestUsingCustomerKeyManagementApi, createTimeout)
6773
if err != nil {
6874
resp.Diagnostics.AddError("error when waiting for status transition in creation", err.Error())
6975
return
@@ -124,7 +130,12 @@ func (r *encryptionAtRestPrivateEndpointRS) Delete(ctx context.Context, req reso
124130
return
125131
}
126132

127-
model, err := WaitDeleteStateTransition(ctx, projectID, cloudProvider, endpointID, connV2.EncryptionAtRestUsingCustomerKeyManagementApi)
133+
deleteTimeout := cleanup.ResolveTimeout(ctx, &earPrivateEndpointState.Timeouts, cleanup.OperationDelete, &resp.Diagnostics)
134+
if resp.Diagnostics.HasError() {
135+
return
136+
}
137+
138+
model, err := WaitDeleteStateTransition(ctx, projectID, cloudProvider, endpointID, connV2.EncryptionAtRestUsingCustomerKeyManagementApi, deleteTimeout)
128139
if err != nil {
129140
resp.Diagnostics.AddError("error when waiting for status transition in delete", err.Error())
130141
return

internal/service/encryptionatrestprivateendpoint/resource_schema.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package encryptionatrestprivateendpoint
33
import (
44
"context"
55

6+
"github.com/hashicorp/terraform-plugin-framework-timeouts/resource/timeouts"
67
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
78
"github.com/hashicorp/terraform-plugin-framework/types"
89
)
@@ -38,16 +39,21 @@ func ResourceSchema(ctx context.Context) schema.Schema {
3839
Computed: true,
3940
MarkdownDescription: "State of the Encryption At Rest private endpoint.",
4041
},
42+
"timeouts": timeouts.Attributes(ctx, timeouts.Opts{
43+
Create: true,
44+
Delete: true,
45+
}),
4146
},
4247
}
4348
}
4449

4550
type TFEarPrivateEndpointModel struct {
46-
CloudProvider types.String `tfsdk:"cloud_provider"`
47-
ErrorMessage types.String `tfsdk:"error_message"`
48-
ProjectID types.String `tfsdk:"project_id"`
49-
ID types.String `tfsdk:"id"`
50-
PrivateEndpointConnectionName types.String `tfsdk:"private_endpoint_connection_name"`
51-
RegionName types.String `tfsdk:"region_name"`
52-
Status types.String `tfsdk:"status"`
51+
CloudProvider types.String `tfsdk:"cloud_provider"`
52+
ErrorMessage types.String `tfsdk:"error_message"`
53+
ProjectID types.String `tfsdk:"project_id"`
54+
ID types.String `tfsdk:"id"`
55+
PrivateEndpointConnectionName types.String `tfsdk:"private_endpoint_connection_name"`
56+
RegionName types.String `tfsdk:"region_name"`
57+
Status types.String `tfsdk:"status"`
58+
Timeouts timeouts.Value `tfsdk:"timeouts"`
5359
}

internal/service/encryptionatrestprivateendpoint/state_transition.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,36 @@ const (
1818
defaultMinTimeout = 30 * time.Second // Smallest time to wait before refreshes
1919
)
2020

21-
func waitStateTransition(ctx context.Context, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
22-
return WaitStateTransitionWithMinTimeout(ctx, defaultMinTimeout, projectID, cloudProvider, endpointID, client)
21+
func waitStateTransition(ctx context.Context, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi, timeout time.Duration) (*admin.EARPrivateEndpoint, error) {
22+
return WaitStateTransitionWithMinTimeoutAndTimeout(ctx, defaultMinTimeout, timeout, projectID, cloudProvider, endpointID, client)
2323
}
2424

25-
func WaitStateTransitionWithMinTimeout(ctx context.Context, minTimeout time.Duration, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
25+
func WaitStateTransitionWithMinTimeoutAndTimeout(ctx context.Context, minTimeout, timeout time.Duration, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
2626
return waitStateTransitionForStates(
2727
ctx,
2828
[]string{retrystrategy.RetryStrategyInitiatingState},
2929
[]string{retrystrategy.RetryStrategyPendingAcceptanceState, retrystrategy.RetryStrategyActiveState, retrystrategy.RetryStrategyFailedState},
30-
minTimeout, projectID, cloudProvider, endpointID, client)
30+
minTimeout, timeout, projectID, cloudProvider, endpointID, client)
3131
}
3232

33-
func WaitDeleteStateTransition(ctx context.Context, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
34-
return WaitDeleteStateTransitionWithMinTimeout(ctx, defaultMinTimeout, projectID, cloudProvider, endpointID, client)
33+
func WaitDeleteStateTransition(ctx context.Context, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi, timeout time.Duration) (*admin.EARPrivateEndpoint, error) {
34+
return WaitDeleteStateTransitionWithMinTimeout(ctx, defaultMinTimeout, timeout, projectID, cloudProvider, endpointID, client)
3535
}
3636

37-
func WaitDeleteStateTransitionWithMinTimeout(ctx context.Context, minTimeout time.Duration, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
37+
func WaitDeleteStateTransitionWithMinTimeout(ctx context.Context, minTimeout, timeout time.Duration, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
3838
return waitStateTransitionForStates(
3939
ctx,
4040
[]string{retrystrategy.RetryStrategyDeletingState},
4141
[]string{retrystrategy.RetryStrategyDeletedState, retrystrategy.RetryStrategyFailedState},
42-
minTimeout, projectID, cloudProvider, endpointID, client)
42+
minTimeout, timeout, projectID, cloudProvider, endpointID, client)
4343
}
4444

45-
func waitStateTransitionForStates(ctx context.Context, pending, target []string, minTimeout time.Duration, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
45+
func waitStateTransitionForStates(ctx context.Context, pending, target []string, minTimeout, timeout time.Duration, projectID, cloudProvider, endpointID string, client admin.EncryptionAtRestUsingCustomerKeyManagementApi) (*admin.EARPrivateEndpoint, error) {
4646
stateConf := &retry.StateChangeConf{
4747
Pending: pending,
4848
Target: target,
4949
Refresh: refreshFunc(ctx, projectID, cloudProvider, endpointID, client),
50-
Timeout: defaultTimeout,
50+
Timeout: timeout,
5151
MinTimeout: minTimeout,
5252
Delay: 0,
5353
}

internal/service/encryptionatrestprivateendpoint/state_transition_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func TestStateTransition(t *testing.T) {
6767
modelResp, httpResp, err := resp.get()
6868
m.EXPECT().GetEncryptionAtRestPrivateEndpointExecute(mock.Anything).Return(modelResp, httpResp, err).Once()
6969
}
70-
resp, err := encryptionatrestprivateendpoint.WaitStateTransitionWithMinTimeout(t.Context(), 1*time.Second, "project-id", "cloud-provider", "endpoint-id", m)
70+
resp, err := encryptionatrestprivateendpoint.WaitStateTransitionWithMinTimeoutAndTimeout(t.Context(), 1*time.Second, 20*time.Minute, "project-id", "cloud-provider", "endpoint-id", m)
7171
assert.Equal(t, tc.expectedError, err != nil)
7272
if resp != nil {
7373
assert.Equal(t, tc.expectedState, resp.Status)
@@ -111,7 +111,7 @@ func TestDeleteStateTransition(t *testing.T) {
111111
modelResp, httpResp, err := resp.get()
112112
m.EXPECT().GetEncryptionAtRestPrivateEndpointExecute(mock.Anything).Return(modelResp, httpResp, err).Once()
113113
}
114-
resp, err := encryptionatrestprivateendpoint.WaitDeleteStateTransitionWithMinTimeout(t.Context(), 1*time.Second, "project-id", "cloud-provider", "endpoint-id", m)
114+
resp, err := encryptionatrestprivateendpoint.WaitStateTransitionWithMinTimeoutAndTimeout(t.Context(), 1*time.Second, 20*time.Minute, "project-id", "cloud-provider", "endpoint-id", m)
115115
assert.Equal(t, tc.expectedError, err != nil)
116116
if resp != nil {
117117
assert.Equal(t, tc.expectedState, resp.Status)

0 commit comments

Comments
 (0)