-
Notifications
You must be signed in to change notification settings - Fork 0
/
remove.go
132 lines (103 loc) · 2.48 KB
/
remove.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package features
import (
"fmt"
"github.com/recode-sh/recode/actions"
"github.com/recode-sh/recode/entities"
"github.com/recode-sh/recode/stepper"
)
type RemoveInput struct {
ResolvedRepository entities.ResolvedDevEnvRepository
PreRemoveHook entities.HookRunner
ForceRemove bool
ConfirmRemove func() (bool, error)
}
type RemoveOutput struct {
Error error
Content *RemoveOutputContent
Stepper stepper.Stepper
}
type RemoveOutputContent struct {
Cluster *entities.Cluster
DevEnv *entities.DevEnv
}
type RemoveOutputHandler interface {
HandleOutput(RemoveOutput) error
}
type RemoveFeature struct {
stepper stepper.Stepper
outputHandler RemoveOutputHandler
cloudServiceBuilder entities.CloudServiceBuilder
}
func NewRemoveFeature(
stepper stepper.Stepper,
outputHandler RemoveOutputHandler,
cloudServiceBuilder entities.CloudServiceBuilder,
) RemoveFeature {
return RemoveFeature{
stepper: stepper,
outputHandler: outputHandler,
cloudServiceBuilder: cloudServiceBuilder,
}
}
func (r RemoveFeature) Execute(input RemoveInput) error {
handleError := func(err error) error {
r.outputHandler.HandleOutput(RemoveOutput{
Stepper: r.stepper,
Error: err,
})
return err
}
devEnvName := entities.BuildDevEnvNameFromResolvedRepo(
input.ResolvedRepository,
)
step := fmt.Sprintf("Removing the development environment \"%s\"", devEnvName)
r.stepper.StartTemporaryStep(step)
cloudService, err := r.cloudServiceBuilder.Build()
if err != nil {
return handleError(err)
}
recodeConfig, err := cloudService.LookupRecodeConfig(
r.stepper,
)
if err != nil {
return handleError(err)
}
clusterName := entities.DefaultClusterName
cluster, err := recodeConfig.GetCluster(clusterName)
if err != nil {
return handleError(err)
}
devEnv, err := recodeConfig.GetDevEnv(cluster.Name, devEnvName)
if err != nil {
return handleError(err)
}
if !input.ForceRemove && input.ConfirmRemove != nil {
r.stepper.StopCurrentStep()
confirmed, err := input.ConfirmRemove()
if err != nil {
return handleError(err)
}
if !confirmed {
return nil
}
r.stepper.StartTemporaryStep(step)
}
err = actions.RemoveDevEnv(
r.stepper,
cloudService,
recodeConfig,
cluster,
devEnv,
input.PreRemoveHook,
)
if err != nil {
return handleError(err)
}
return r.outputHandler.HandleOutput(RemoveOutput{
Stepper: r.stepper,
Content: &RemoveOutputContent{
Cluster: cluster,
DevEnv: devEnv,
},
})
}