@@ -2,15 +2,16 @@ package routines
2
2
3
3
import (
4
4
"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"
9
5
"path"
10
6
"strconv"
11
7
"strings"
12
8
"time"
13
9
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
+
14
15
"github.com/getstackhead/stackhead/project"
15
16
"github.com/getstackhead/stackhead/system"
16
17
)
@@ -111,24 +112,8 @@ var RollbackResources = Task{
111
112
}
112
113
var errors []error
113
114
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 ))
132
117
}
133
118
}
134
119
@@ -146,48 +131,73 @@ var RollbackResources = Task{
146
131
},
147
132
}
148
133
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
+
149
188
var CreateResources = Task {
150
189
Name : "Creating resources" ,
151
190
Run : func (r * Task ) error {
152
191
var errors []string
153
- var uncompletedSpinners []* ysmrr.Spinner
154
-
155
192
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 ... )
186
196
}
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
191
201
}
192
202
}
193
203
if ! rollback {
@@ -215,36 +225,20 @@ var RemoveResources = func(latestDeployment *system.Deployment) Task {
215
225
return Task {
216
226
Name : "Removing project resources" ,
217
227
Run : func (r * Task ) error {
218
- var uncompletedSpinners []* ysmrr.Spinner
219
-
220
228
reverse (latestDeployment .ResourceGroups )
221
229
for _ , group := range latestDeployment .ResourceGroups {
222
- reverse ( group . Resources )
230
+ var filteredResources []system. Resource
223
231
for _ , resource := range group .Resources {
224
232
if resource .ExternalResource {
225
233
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 )
244
235
}
245
236
}
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
248
242
}
249
243
}
250
244
return nil
0 commit comments