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 }