@@ -132,7 +132,8 @@ func (m *StackManager) PreviewStack(ctx context.Context, params *StackRequestPar
132
132
// TODO: This is a temporary solution to prevent multiple requests from previewing the same stack and cause concurrency issues
133
133
// To override this, pass in force == true
134
134
if stackEntity .StackInOperation () && ! params .ExecuteParams .Force {
135
- return nil , ErrStackInOperation
135
+ err = ErrStackInOperation
136
+ return nil , err
136
137
}
137
138
138
139
// Set stack sync state to previewing
@@ -250,11 +251,12 @@ func (m *StackManager) ApplyStack(ctx context.Context, params *StackRequestParam
250
251
releaseCreated := false
251
252
// Ensure the state is updated properly
252
253
defer func () {
253
- if ! releaseCreated {
254
- return
255
- }
256
254
if err != nil {
257
255
stackEntity .SyncState = constant .StackStateApplyFailed
256
+ if ! releaseCreated {
257
+ m .stackRepo .Update (ctx , stackEntity )
258
+ return
259
+ }
258
260
release .UpdateReleasePhase (rel , apiv1 .ReleasePhaseFailed , relLock )
259
261
_ = release .UpdateApplyRelease (storage , rel , params .ExecuteParams .Dryrun , relLock )
260
262
} else {
@@ -274,7 +276,8 @@ func (m *StackManager) ApplyStack(ctx context.Context, params *StackRequestParam
274
276
// TODO: This is a temporary solution to prevent multiple requests from applying the same stack and cause concurrency issues
275
277
// To override this, pass in force == true
276
278
if stackEntity .StackInOperation () && ! params .ExecuteParams .Force {
277
- return ErrStackInOperation
279
+ err = ErrStackInOperation
280
+ return err
278
281
}
279
282
// Temporarily commented out
280
283
// if stackEntity.LastPreviewedRevision == "" || stackEntity.SyncState != constant.StackStatePreviewed {
@@ -301,13 +304,22 @@ func (m *StackManager) ApplyStack(ctx context.Context, params *StackRequestParam
301
304
if err != nil {
302
305
return err
303
306
}
307
+ // Allow force unlock of the release
308
+ if params .ExecuteParams .Unlock {
309
+ err = unlockRelease (ctx , storage )
310
+ if err != nil {
311
+ return err
312
+ }
313
+ }
314
+ // Get the latest state from the release
304
315
priorState , err := release .GetLatestState (storage )
305
316
if err != nil {
306
317
return err
307
318
}
308
319
if priorState == nil {
309
320
priorState = & apiv1.State {}
310
321
}
322
+ // Create new release
311
323
rel , err = release .NewApplyRelease (storage , project .Name , stackEntity .Name , ws .Name )
312
324
if err != nil {
313
325
return err
@@ -468,13 +480,14 @@ func (m *StackManager) DestroyStack(ctx context.Context, params *StackRequestPar
468
480
rel := & apiv1.Release {}
469
481
releaseCreated := false
470
482
defer func () {
471
- if ! releaseCreated {
472
- return
473
- }
474
483
if err != nil {
484
+ stackEntity .SyncState = constant .StackStateDestroyFailed
485
+ if ! releaseCreated {
486
+ m .stackRepo .Update (ctx , stackEntity )
487
+ return
488
+ }
475
489
rel .Phase = apiv1 .ReleasePhaseFailed
476
490
_ = release .UpdateDestroyRelease (storage , rel )
477
- stackEntity .SyncState = constant .StackStateDestroyFailed
478
491
} else {
479
492
rel .Phase = apiv1 .ReleasePhaseSucceeded
480
493
err = release .UpdateDestroyRelease (storage , rel )
@@ -490,7 +503,8 @@ func (m *StackManager) DestroyStack(ctx context.Context, params *StackRequestPar
490
503
// TODO: This is a temporary solution to prevent multiple requests from destroying the same stack and cause concurrency issues
491
504
// To override this, pass in force == true
492
505
if stackEntity .StackInOperation () && ! params .ExecuteParams .Force {
493
- return ErrStackInOperation
506
+ err = ErrStackInOperation
507
+ return err
494
508
}
495
509
496
510
// Set stack sync state to destroying
@@ -514,6 +528,14 @@ func (m *StackManager) DestroyStack(ctx context.Context, params *StackRequestPar
514
528
if err != nil {
515
529
return err
516
530
}
531
+ // Allow force unlock of the release
532
+ if params .ExecuteParams .Unlock {
533
+ err = unlockRelease (ctx , storage )
534
+ if err != nil {
535
+ return err
536
+ }
537
+ }
538
+ // Create destroy release
517
539
rel , err = release .CreateDestroyRelease (storage , project .Name , stack .Name , ws .Name )
518
540
if err != nil {
519
541
return
0 commit comments