/
updatesizeorsuspended.go
90 lines (73 loc) · 3.06 KB
/
updatesizeorsuspended.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package workspaces
import (
"context"
"github.com/google/uuid"
"github.com/singlestore-labs/singlestore-go/management"
"github.com/singlestore-labs/terraform-provider-singlestoredb/internal/provider/config"
"github.com/singlestore-labs/terraform-provider-singlestoredb/internal/provider/util"
)
// updateSizeOrSuspended either scales or suspends/resumes if necessary.
func updateSizeOrSuspended(ctx context.Context, c management.ClientWithResponsesInterface, state, plan workspaceResourceModel) (workspaceResourceModel, *util.SummaryWithDetailError) {
if plan.Size.Equal(state.Size) && plan.Suspended.Equal(state.Suspended) {
return state, nil
}
if sizeChanged := !plan.Size.Equal(state.Size); sizeChanged {
return scale(ctx, c, plan)
}
if suspendedChanged := !plan.Suspended.Equal(state.Suspended); suspendedChanged {
if plan.Suspended.ValueBool() {
return suspend(ctx, c, plan)
}
return resume(ctx, c, plan)
}
return state, nil
}
func scale(ctx context.Context, c management.ClientWithResponsesInterface, plan workspaceResourceModel) (workspaceResourceModel, *util.SummaryWithDetailError) {
id := uuid.MustParse(plan.ID.ValueString())
desiredSize := plan.Size.ValueString()
workspaceUpdateResponse, err := c.PatchV1WorkspacesWorkspaceIDWithResponse(ctx, id,
management.WorkspaceUpdate{
Size: util.Ptr(desiredSize),
},
)
if serr := util.StatusOK(workspaceUpdateResponse, err); serr != nil {
return workspaceResourceModel{}, serr
}
workspace, werr := wait(ctx, c, id, config.WorkspaceResumeTimeout,
waitConditionState(management.WorkspaceStateACTIVE),
waitConditionSize(desiredSize),
waitConditionTakesAtLeast(config.WorkspaceScaleTakesAtLeast),
)
if werr != nil {
return workspaceResourceModel{}, werr
}
return toWorkspaceResourceModel(workspace), nil
}
func resume(ctx context.Context, c management.ClientWithResponsesInterface, plan workspaceResourceModel) (workspaceResourceModel, *util.SummaryWithDetailError) {
id := uuid.MustParse(plan.ID.ValueString())
workspaceResumeResponse, err := c.PostV1WorkspacesWorkspaceIDResumeWithResponse(ctx, id)
if serr := util.StatusOK(workspaceResumeResponse, err); serr != nil {
return workspaceResourceModel{}, serr
}
workspace, werr := wait(ctx, c, id, config.WorkspaceResumeTimeout,
waitConditionState(management.WorkspaceStateACTIVE),
)
if werr != nil {
return workspaceResourceModel{}, werr
}
return toWorkspaceResourceModel(workspace), nil
}
func suspend(ctx context.Context, c management.ClientWithResponsesInterface, plan workspaceResourceModel) (workspaceResourceModel, *util.SummaryWithDetailError) {
id := uuid.MustParse(plan.ID.ValueString())
workspaceSuspendResponse, err := c.PostV1WorkspacesWorkspaceIDSuspendWithResponse(ctx, id)
if serr := util.StatusOK(workspaceSuspendResponse, err); serr != nil {
return workspaceResourceModel{}, serr
}
workspace, werr := wait(ctx, c, id, config.WorkspaceResumeTimeout,
waitConditionState(management.WorkspaceStateSUSPENDED),
)
if werr != nil {
return workspaceResourceModel{}, werr
}
return toWorkspaceResourceModel(workspace), nil
}