github.com/helmwave/helmwave@v0.36.4-0.20240509190856-b35563eba4c6/pkg/plan/validate.go (about)

     1  package plan
     2  
     3  import (
     4  	"os"
     5  
     6  	"github.com/helmwave/helmwave/pkg/monitor"
     7  	"github.com/helmwave/helmwave/pkg/registry"
     8  	"github.com/helmwave/helmwave/pkg/release"
     9  	"github.com/helmwave/helmwave/pkg/release/uniqname"
    10  	"github.com/helmwave/helmwave/pkg/repo"
    11  	log "github.com/sirupsen/logrus"
    12  )
    13  
    14  // ValidateValuesImport checks whether all values files exist.
    15  func (p *Plan) ValidateValuesImport() error {
    16  	f := false
    17  	for _, rel := range p.body.Releases {
    18  		for i := range rel.Values() {
    19  			y := rel.Values()[i].Dst
    20  			_, err := os.Stat(y)
    21  			if os.IsNotExist(err) {
    22  				f = true
    23  				rel.Logger().Errorf("❌ values %q", rel.Values()[i].Src)
    24  			} else if err != nil {
    25  				f = true
    26  				rel.Logger().WithError(err).Errorf("failed to open values %s", y)
    27  			}
    28  		}
    29  	}
    30  	if !f {
    31  		return nil
    32  	}
    33  
    34  	return ErrValidateFailed
    35  }
    36  
    37  // ValidateValuesBuild Dst now is a public method.
    38  // Dst needs to marshal for export.
    39  // Also, dst needs to unmarshal for import from plan.
    40  func (p *Plan) ValidateValuesBuild() error {
    41  	for _, rel := range p.body.Releases {
    42  		err := release.ProhibitDst(rel.Values())
    43  		if err != nil {
    44  			return err
    45  		}
    46  	}
    47  
    48  	return nil
    49  }
    50  
    51  // Validate validates releases and repositories in plan.
    52  func (p *planBody) Validate() error {
    53  	if len(p.Releases) == 0 && len(p.Repositories) == 0 && len(p.Registries) == 0 {
    54  		log.Warn("releases, repositories and registries are empty")
    55  
    56  		return nil
    57  	}
    58  
    59  	if err := p.ValidateRegistries(); err != nil {
    60  		return err
    61  	}
    62  
    63  	if err := p.ValidateRepositories(); err != nil {
    64  		return err
    65  	}
    66  
    67  	if err := p.ValidateReleases(); err != nil {
    68  		return err
    69  	}
    70  
    71  	if err := p.ValidateMonitors(); err != nil {
    72  		return err
    73  	}
    74  
    75  	return nil
    76  }
    77  
    78  // ValidateRepositories validates all repositories.
    79  func (p *planBody) ValidateRepositories() error {
    80  	a := make(map[string]bool)
    81  	for _, r := range p.Repositories {
    82  		err := r.Validate()
    83  		if err != nil {
    84  			return err
    85  		}
    86  
    87  		if a[r.Name()] {
    88  			return repo.NewDuplicateError(r.Name())
    89  		}
    90  
    91  		a[r.Name()] = true
    92  	}
    93  
    94  	return nil
    95  }
    96  
    97  func (p *planBody) ValidateRegistries() error {
    98  	a := make(map[string]bool)
    99  	for _, r := range p.Registries {
   100  		err := r.Validate()
   101  		if err != nil {
   102  			return err
   103  		}
   104  
   105  		if a[r.Host()] {
   106  			return registry.NewDuplicateError(r.Host())
   107  		}
   108  
   109  		a[r.Host()] = true
   110  	}
   111  
   112  	return nil
   113  }
   114  
   115  // ValidateReleases validates all releases.
   116  func (p *planBody) ValidateReleases() error {
   117  	a := make(map[uniqname.UniqName]bool)
   118  	for _, r := range p.Releases {
   119  		err := r.Validate()
   120  		if err != nil {
   121  			return err
   122  		}
   123  
   124  		if a[r.Uniq()] {
   125  			return release.NewDuplicateError(r.Uniq())
   126  		}
   127  
   128  		a[r.Uniq()] = true
   129  	}
   130  
   131  	_, err := p.generateDependencyGraph()
   132  	if err != nil {
   133  		return err
   134  	}
   135  
   136  	return nil
   137  }
   138  
   139  func (p *planBody) ValidateMonitors() error {
   140  	a := make(map[string]bool)
   141  	for _, r := range p.Monitors {
   142  		err := r.Validate()
   143  		if err != nil {
   144  			return err
   145  		}
   146  
   147  		if a[r.Name()] {
   148  			return monitor.NewDuplicateError(r.Name())
   149  		}
   150  
   151  		a[r.Name()] = true
   152  	}
   153  
   154  	for _, r := range p.Releases {
   155  		mons := r.Monitors()
   156  		for i := range mons {
   157  			mon := mons[i]
   158  			if !a[mon.Name] {
   159  				return monitor.NewNotExistsError(mon.Name)
   160  			}
   161  		}
   162  	}
   163  
   164  	return nil
   165  }