github.com/helmwave/helmwave@v0.36.4-0.20240509190856-b35563eba4c6/pkg/plan/down.go (about) 1 package plan 2 3 import ( 4 "context" 5 6 "github.com/helmwave/helmwave/pkg/parallel" 7 "github.com/helmwave/helmwave/pkg/release" 8 "github.com/helmwave/helmwave/pkg/release/dependency" 9 log "github.com/sirupsen/logrus" 10 ) 11 12 // Down destroys all releases that exist in a plan. 13 func (p *Plan) Down(ctx context.Context) (err error) { 14 dependenciesGraph, err := p.body.generateDependencyGraph() 15 if err != nil { 16 return err 17 } 18 19 dependenciesGraph, err = dependenciesGraph.Reverse() 20 if err != nil { 21 return err 22 } 23 24 // Run hooks 25 err = p.body.Lifecycle.RunPreDown(ctx) 26 if err != nil { 27 return err 28 } 29 30 defer func() { 31 lifecycleErr := p.body.Lifecycle.RunPostDown(ctx) 32 if lifecycleErr != nil { 33 log.Errorf("got an error from postdown hooks: %v", lifecycleErr) 34 if err == nil { 35 err = lifecycleErr 36 } 37 } 38 }() 39 40 nodesChan := dependenciesGraph.Run() 41 42 wg := parallel.NewWaitGroup() 43 wg.Add(len(p.body.Releases)) 44 45 for node := range nodesChan { 46 go func(ctx context.Context, wg *parallel.WaitGroup, node *dependency.Node[release.Config]) { 47 defer wg.Done() 48 rel := node.Data 49 _, err := rel.Uninstall(ctx) 50 if err != nil { 51 log.Errorf("❌ %s: %v", rel.Uniq(), err) 52 wg.ErrChan() <- err 53 node.SetFailed() 54 } else { 55 log.Infof("✅ %s uninstalled!", rel.Uniq()) 56 node.SetSucceeded() 57 } 58 }(ctx, wg, node) 59 } 60 61 err = wg.Wait() 62 63 return err 64 }