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  }