Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit 4db71fc

Browse files
committed
Folder and Link resource handling - refactor duplicate code
1 parent fa63f4d commit 4db71fc

File tree

1 file changed

+75
-81
lines changed

1 file changed

+75
-81
lines changed

routines/implementations.go

Lines changed: 75 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ package routines
22

33
import (
44
"fmt"
5-
"github.com/chelnak/ysmrr"
6-
xfs "github.com/saitho/golang-extended-fs/v2"
7-
logger "github.com/sirupsen/logrus"
8-
"gopkg.in/yaml.v3"
95
"path"
106
"strconv"
117
"strings"
128
"time"
139

10+
"github.com/chelnak/ysmrr"
11+
xfs "github.com/saitho/golang-extended-fs/v2"
12+
logger "github.com/sirupsen/logrus"
13+
"gopkg.in/yaml.v3"
14+
1415
"github.com/getstackhead/stackhead/project"
1516
"github.com/getstackhead/stackhead/system"
1617
)
@@ -111,24 +112,8 @@ var RollbackResources = Task{
111112
}
112113
var errors []error
113114
for _, resourceGroup := range resourceRollbackOrder {
114-
if resourceGroup.RollbackResourceFunc != nil {
115-
if err := resourceGroup.RollbackResourceFunc(); err != nil {
116-
errors = append(errors, fmt.Errorf("Unable to completely rollback resources: %s", err))
117-
}
118-
}
119-
for _, resource := range resourceGroup.Resources {
120-
spinner := r.TaskRunner.GetNewSubtaskSpinner(resource.ToString(true))
121-
matched, err := system.RollbackResourceOperation(resource, false)
122-
if !matched || err == nil {
123-
if spinner != nil {
124-
spinner.Complete()
125-
}
126-
} else if err != nil {
127-
errors = append(errors, fmt.Errorf("Rollback error: %s", err))
128-
if spinner != nil {
129-
spinner.Error()
130-
}
131-
}
115+
if _, err := processResourceGroup(r.TaskRunner, resourceGroup, true, false); err != nil {
116+
errors = append(errors, fmt.Errorf("Rollback error: %s", err))
132117
}
133118
}
134119

@@ -146,48 +131,73 @@ var RollbackResources = Task{
146131
},
147132
}
148133

134+
// return: bool: whether to consider resource group for requiring rollback ; error
135+
func processResourceGroup(taskRunner *TaskRunner, resourceGroup system.ResourceGroup, isRollbackMode bool, ignoreBackup bool) (bool, error) {
136+
var uncompletedSpinners []*ysmrr.Spinner
137+
var errors []error
138+
139+
// ROLLBACK mode
140+
if isRollbackMode && resourceGroup.RollbackResourceFunc != nil {
141+
if err := resourceGroup.RollbackResourceFunc(); err != nil {
142+
errors = append(errors, fmt.Errorf("Unable to completely rollback resources: %s", err))
143+
}
144+
}
145+
146+
for _, resource := range resourceGroup.Resources {
147+
spinner := taskRunner.GetNewSubtaskSpinner(resource.ToString(isRollbackMode))
148+
var err error
149+
var processed bool
150+
if isRollbackMode {
151+
processed, err = system.RollbackResourceOperation(resource, ignoreBackup)
152+
} else {
153+
processed, err = system.ApplyResourceOperation(resource, ignoreBackup)
154+
}
155+
if err != nil {
156+
if spinner != nil {
157+
spinner.UpdateMessage(err.Error())
158+
spinner.Error()
159+
}
160+
return false, err
161+
}
162+
163+
if spinner != nil {
164+
if processed {
165+
spinner.Complete()
166+
} else {
167+
// uncompleted spinners are resolved when resource group finishes
168+
uncompletedSpinners = append(uncompletedSpinners, spinner)
169+
}
170+
}
171+
}
172+
173+
// APPLY mode
174+
if !isRollbackMode && resourceGroup.ApplyResourceFunc != nil {
175+
if err := resourceGroup.ApplyResourceFunc(); err != nil {
176+
for _, spinner := range uncompletedSpinners {
177+
spinner.Error()
178+
}
179+
return true, err
180+
}
181+
}
182+
for _, spinner := range uncompletedSpinners {
183+
spinner.Complete()
184+
}
185+
return true, nil
186+
}
187+
149188
var CreateResources = Task{
150189
Name: "Creating resources",
151190
Run: func(r *Task) error {
152191
var errors []string
153-
var uncompletedSpinners []*ysmrr.Spinner
154-
155192
for _, resourceGroup := range system.Context.CurrentDeployment.ResourceGroups {
156-
for _, resource := range resourceGroup.Resources {
157-
spinner := r.TaskRunner.GetNewSubtaskSpinner(resource.ToString(false))
158-
processed, err := system.ApplyResourceOperation(resource, false)
159-
if err != nil {
160-
rollback = true
161-
if spinner != nil {
162-
spinner.UpdateMessage(err.Error())
163-
spinner.Error()
164-
}
165-
return err
166-
}
167-
168-
if spinner != nil {
169-
if processed {
170-
spinner.Complete()
171-
} else {
172-
// uncompleted spinners are resolved when resource group finishes
173-
uncompletedSpinners = append(uncompletedSpinners, spinner)
174-
}
175-
}
176-
}
177-
resourceRollbackOrder = append([]system.ResourceGroup{resourceGroup}, resourceRollbackOrder...)
178-
if resourceGroup.ApplyResourceFunc != nil {
179-
if err := resourceGroup.ApplyResourceFunc(); err != nil {
180-
for _, spinner := range uncompletedSpinners {
181-
spinner.Error()
182-
}
183-
rollback = true
184-
errors = append(errors, fmt.Sprintf("Unable to complete resource creation: %s", err))
185-
}
193+
considerForRollback, err := processResourceGroup(r.TaskRunner, resourceGroup, false, false)
194+
if considerForRollback {
195+
resourceRollbackOrder = append([]system.ResourceGroup{resourceGroup}, resourceRollbackOrder...)
186196
}
187-
if !rollback {
188-
for _, spinner := range uncompletedSpinners {
189-
spinner.Complete()
190-
}
197+
if err != nil {
198+
rollback = true
199+
errors = append(errors, err.Error())
200+
break
191201
}
192202
}
193203
if !rollback {
@@ -215,36 +225,20 @@ var RemoveResources = func(latestDeployment *system.Deployment) Task {
215225
return Task{
216226
Name: "Removing project resources",
217227
Run: func(r *Task) error {
218-
var uncompletedSpinners []*ysmrr.Spinner
219-
220228
reverse(latestDeployment.ResourceGroups)
221229
for _, group := range latestDeployment.ResourceGroups {
222-
reverse(group.Resources)
230+
var filteredResources []system.Resource
223231
for _, resource := range group.Resources {
224232
if resource.ExternalResource {
225233
resource.Operation = system.OperationDelete
226-
spinner := r.TaskRunner.GetNewSubtaskSpinner(resource.ToString(false))
227-
if processed, err := system.PerformOperation(resource, true); err != nil {
228-
if err != nil {
229-
if spinner != nil {
230-
spinner.UpdateMessage(err.Error())
231-
spinner.Error()
232-
}
233-
return err
234-
}
235-
if spinner != nil {
236-
if processed {
237-
spinner.Complete()
238-
} else {
239-
// uncompleted spinners are resolved when resource group finishes
240-
uncompletedSpinners = append(uncompletedSpinners, spinner)
241-
}
242-
}
243-
}
234+
filteredResources = append(filteredResources, resource)
244235
}
245236
}
246-
for _, spinner := range uncompletedSpinners {
247-
spinner.Complete()
237+
reverse(filteredResources)
238+
group.Resources = filteredResources
239+
240+
if _, err := processResourceGroup(r.TaskRunner, group, false, true); err != nil {
241+
return err
248242
}
249243
}
250244
return nil

0 commit comments

Comments
 (0)