mirror of https://github.com/helm/helm.git
fix(helm): Port accept dependency in requirements.yaml from charts directory (#6611)
* Port #6578 to Helm 3 Signed-off-by: Martin Hickey <martin.hickey@ie.ibm.com> * Update after reviw Review comments: - https://github.com/helm/helm/pull/6611#discussion_r332745703 Signed-off-by: Martin Hickey <martin.hickey@ie.ibm.com>
This commit is contained in:
parent
7ffc879f13
commit
f2aa97e313
|
@ -53,6 +53,19 @@ func (r *Resolver) Resolve(reqs []*chart.Dependency, repoNames map[string]string
|
|||
locked := make([]*chart.Dependency, len(reqs))
|
||||
missing := []string{}
|
||||
for i, d := range reqs {
|
||||
if d.Repository == "" {
|
||||
// Local chart subfolder
|
||||
if _, err := GetLocalPath(filepath.Join("charts", d.Name), r.chartpath); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
locked[i] = &chart.Dependency{
|
||||
Name: d.Name,
|
||||
Repository: "",
|
||||
Version: d.Version,
|
||||
}
|
||||
continue
|
||||
}
|
||||
if strings.HasPrefix(d.Repository, "file://") {
|
||||
|
||||
if _, err := GetLocalPath(d.Repository, r.chartpath); err != nil {
|
||||
|
|
|
@ -85,6 +85,29 @@ func TestResolve(t *testing.T) {
|
|||
},
|
||||
err: true,
|
||||
},
|
||||
{
|
||||
name: "repo from valid path under charts path",
|
||||
req: []*chart.Dependency{
|
||||
{Name: "localdependency", Repository: "", Version: "0.1.0"},
|
||||
},
|
||||
expect: &chart.Lock{
|
||||
Dependencies: []*chart.Dependency{
|
||||
{Name: "localdependency", Repository: "", Version: "0.1.0"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "repo from invalid path under charts path",
|
||||
req: []*chart.Dependency{
|
||||
{Name: "nonexistentdependency", Repository: "", Version: "0.1.0"},
|
||||
},
|
||||
expect: &chart.Lock{
|
||||
Dependencies: []*chart.Dependency{
|
||||
{Name: "nonexistentlocaldependency", Repository: "", Version: "0.1.0"},
|
||||
},
|
||||
},
|
||||
err: true,
|
||||
},
|
||||
}
|
||||
|
||||
repoNames := map[string]string{"alpine": "kubernetes-charts", "redis": "kubernetes-charts"}
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
description: A Helm chart for Kubernetes
|
||||
name: localdependency
|
||||
version: 0.1.0
|
|
@ -203,6 +203,31 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
|||
fmt.Fprintf(m.Out, "Saving %d charts\n", len(deps))
|
||||
var saveError error
|
||||
for _, dep := range deps {
|
||||
// No repository means the chart is in charts directory
|
||||
if dep.Repository == "" {
|
||||
fmt.Fprintf(m.Out, "Dependency %s did not declare a repository. Assuming it exists in the charts directory\n", dep.Name)
|
||||
chartPath := filepath.Join(tmpPath, dep.Name)
|
||||
ch, err := loader.LoadDir(chartPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Unable to load chart: %v", err)
|
||||
}
|
||||
|
||||
constraint, err := semver.NewConstraint(dep.Version)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Dependency %s has an invalid version/constraint format: %s", dep.Name, err)
|
||||
}
|
||||
|
||||
v, err := semver.NewVersion(ch.Metadata.Version)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Invalid version %s for dependency %s: %s", dep.Version, dep.Name, err)
|
||||
}
|
||||
|
||||
if !constraint.Check(v) {
|
||||
saveError = fmt.Errorf("Dependency %s at version %s does not satisfy the constraint %s", dep.Name, ch.Metadata.Version, dep.Version)
|
||||
break
|
||||
}
|
||||
continue
|
||||
}
|
||||
if strings.HasPrefix(dep.Repository, "file://") {
|
||||
if m.Debug {
|
||||
fmt.Fprintf(m.Out, "Archiving %s from repo %s\n", dep.Name, dep.Repository)
|
||||
|
@ -247,8 +272,11 @@ func (m *Manager) downloadAll(deps []*chart.Dependency) error {
|
|||
if saveError == nil {
|
||||
fmt.Fprintln(m.Out, "Deleting outdated charts")
|
||||
for _, dep := range deps {
|
||||
if err := m.safeDeleteDep(dep.Name, tmpPath); err != nil {
|
||||
return err
|
||||
// Chart from local charts directory stays in place
|
||||
if dep.Repository != "" {
|
||||
if err := m.safeDeleteDep(dep.Name, tmpPath); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
if err := move(tmpPath, destPath); err != nil {
|
||||
|
@ -360,6 +388,10 @@ func (m *Manager) getRepoNames(deps []*chart.Dependency) (map[string]string, err
|
|||
// by Helm.
|
||||
missing := []string{}
|
||||
for _, dd := range deps {
|
||||
// Don't map the repository, we don't need to download chart from charts directory
|
||||
if dd.Repository == "" {
|
||||
continue
|
||||
}
|
||||
// if dep chart is from local path, verify the path is valid
|
||||
if strings.HasPrefix(dd.Repository, "file://") {
|
||||
if _, err := resolver.GetLocalPath(dd.Repository, m.ChartPath); err != nil {
|
||||
|
|
|
@ -147,6 +147,13 @@ func TestGetRepoNames(t *testing.T) {
|
|||
},
|
||||
expect: map[string]string{"oedipus-rex": "testing"},
|
||||
},
|
||||
{
|
||||
name: "repo from local chart under charts path",
|
||||
req: []*chart.Dependency{
|
||||
{Name: "local-subchart", Repository: ""},
|
||||
},
|
||||
expect: map[string]string{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
description: A Helm chart for Kubernetes
|
||||
name: local-subchart
|
||||
version: 0.1.0
|
Loading…
Reference in New Issue