diff --git a/docs/charts.md b/docs/charts.md index d63df172075588b9d59722245be89a3410ec93be..071eb4980cbae24f297aff51ddc9082e438a4132 100644 --- a/docs/charts.md +++ b/docs/charts.md @@ -234,11 +234,11 @@ team. In addition to the other fields above, each requirements entry may contain the optional field `alias`. -Adding an alias for a dependency chart would add another copy -of the chart as a new depdendency using alias as name of new dependency. +Adding an alias for a dependency chart would put +a chart in dependencies using alias as name of new dependency. -One can use `alias` in cases where they need multiple copies of same chart -as dependencies all independent of one another. +One can use `alias` in cases where they need to access a chart +with other name(s). ```` # parentchart/requirements.yaml @@ -246,16 +246,21 @@ dependencies: - name: subchart repository: http://localhost:10191 version: 0.1.0 - alias: - - one-more-subchart - - another-subchart + alias: new-subchart-1 + - name: subchart + repository: http://localhost:10191 + version: 0.1.0 + alias: new-subchart-2 + - name: subchart + repository: http://localhost:10191 + version: 0.1.0 ```` In the above example we will get 3 depenendencies in all for `parentchart` ``` subchart -one-more-subchart -another-subchart +new-subchart-1 +new-subchart-2 ``` Manual way of achieving this is copy/pasting same chart in diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go index 3d207cf5f0a196ef729ec00e528a024f9a99e1ca..fbd686b9102ce1f8980b2f8795098f778f5fd3ae 100644 --- a/pkg/chartutil/requirements.go +++ b/pkg/chartutil/requirements.go @@ -66,7 +66,7 @@ type Dependency struct { // string or pair of child/parent sublist items. ImportValues []interface{} `json:"import-values"` // Alias usable alias to be used for the chart - Alias []string `json:"alias"` + Alias string `json:"alias"` } // ErrNoRequirementsFile to detect error condition @@ -218,7 +218,7 @@ func ProcessRequirementsTags(reqs *Requirements, cvals Values) { } -func copyChartAsAlias(charts []*chart.Chart, dependentChart, aliasChart string) *chart.Chart { +func getAliasDependency(charts []*chart.Chart, aliasChart *Dependency) *chart.Chart { var chartFound chart.Chart for _, existingChart := range charts { if existingChart == nil { @@ -227,13 +227,17 @@ func copyChartAsAlias(charts []*chart.Chart, dependentChart, aliasChart string) if existingChart.Metadata == nil { continue } - if existingChart.Metadata.Name != dependentChart { + if existingChart.Metadata.Name != aliasChart.Name { + continue + } + if existingChart.Metadata.Version != aliasChart.Version { continue } - chartFound = *existingChart newMetadata := *existingChart.Metadata - newMetadata.Name = aliasChart + if aliasChart.Alias != "" { + newMetadata.Name = aliasChart.Alias + } chartFound.Metadata = &newMetadata return &chartFound } @@ -253,19 +257,16 @@ func ProcessRequirementsEnabled(c *chart.Chart, v *chart.Config) error { return nil } + var chartDependencies []*chart.Chart for _, req := range reqs.Dependencies { - for _, alias := range req.Alias { - aliasDependency := copyChartAsAlias(c.Dependencies, req.Name, alias) - if aliasDependency == nil { - break - } - c.Dependencies = append(c.Dependencies, aliasDependency) - origReqName := req.Name - req.Name = alias - reqs.Dependencies = append(reqs.Dependencies, req) - req.Name = origReqName + if chartDependency := getAliasDependency(c.Dependencies, req); chartDependency != nil { + chartDependencies = append(chartDependencies, chartDependency) + } + if req.Alias != "" { + req.Name = req.Alias } } + c.Dependencies = chartDependencies // set all to true for _, lr := range reqs.Dependencies { diff --git a/pkg/chartutil/requirements_test.go b/pkg/chartutil/requirements_test.go index ad5b5c1714fd8f2bd02aef18627e8fa14d5ea8fa..65d59e52f285443bb8311448be54bfdf981ba7f3 100644 --- a/pkg/chartutil/requirements_test.go +++ b/pkg/chartutil/requirements_test.go @@ -321,22 +321,36 @@ func verifyRequirementsImportValues(t *testing.T, c *chart.Chart, v *chart.Confi } } -func TestCopyChartAsAlias(t *testing.T) { +func TestGetAliasDependency(t *testing.T) { c, err := Load("testdata/frobnitz") if err != nil { t.Fatalf("Failed to load testdata: %s", err) } - - if aliasChart := copyChartAsAlias(c.Dependencies, "mariners", "another-mariner"); aliasChart != nil { - t.Fatalf("expected no chart but got %s", aliasChart.Metadata.Name) + req, err := LoadRequirements(c) + if err != nil { + t.Fatalf("Failed to load requirement for testdata: %s", err) + } + if len(req.Dependencies) == 0 { + t.Fatalf("There are no requirements to test") } - aliasChart := copyChartAsAlias(c.Dependencies, "mariner", "another-mariner") + // Success case + aliasChart := getAliasDependency(c.Dependencies, req.Dependencies[0]) if aliasChart == nil { - t.Fatal("Failed to find dependent chart") + t.Fatalf("Failed to get dependency chart for alias %s", req.Dependencies[0].Name) + } + if req.Dependencies[0].Alias != "" { + if aliasChart.Metadata.Name != req.Dependencies[0].Alias { + t.Fatalf("Dependency chart name should be %s but got %s", req.Dependencies[0].Alias, aliasChart.Metadata.Name) + } + } else if aliasChart.Metadata.Name != req.Dependencies[0].Name { + t.Fatalf("Dependency chart name should be %s but got %s", req.Dependencies[0].Name, aliasChart.Metadata.Name) } - if aliasChart.Metadata.Name != "another-mariner" { - t.Fatal(`Failed to update chart-name for alias "dependent chart`) + + // Failure case + req.Dependencies[0].Name = "something-else" + if aliasChart := getAliasDependency(c.Dependencies, req.Dependencies[0]); aliasChart != nil { + t.Fatalf("expected no chart but got %s", aliasChart.Metadata.Name) } } @@ -364,15 +378,15 @@ func TestDependentChartAliases(t *testing.T) { t.Fatalf("Cannot load requirements for test chart, %v", err) } - var expectedDependencyCharts int - for _, reqmt := range reqmts.Dependencies { - expectedDependencyCharts++ - if len(reqmt.Alias) >= 0 { - expectedDependencyCharts += len(reqmt.Alias) - } - } - if len(c.Dependencies) != expectedDependencyCharts { - t.Fatalf("Expected number of chart dependencies %d, but got %d", expectedDependencyCharts, len(c.Dependencies)) + // var expectedDependencyCharts int + // for _, reqmt := range reqmts.Dependencies { + // expectedDependencyCharts++ + // if len(reqmt.Alias) >= 0 { + // expectedDependencyCharts += len(reqmt.Alias) + // } + // } + if len(c.Dependencies) != len(reqmts.Dependencies) { + t.Fatalf("Expected number of chart dependencies %d, but got %d", len(reqmts.Dependencies), len(c.Dependencies)) } } diff --git a/pkg/chartutil/testdata/dependent-chart-alias/requirements.yaml b/pkg/chartutil/testdata/dependent-chart-alias/requirements.yaml index 2e41105c7a99cbba061a1b069570050a3c32fb32..aab6cddf7cbfc8165e4f8533ee52124347921bc5 100644 --- a/pkg/chartutil/testdata/dependent-chart-alias/requirements.yaml +++ b/pkg/chartutil/testdata/dependent-chart-alias/requirements.yaml @@ -5,6 +5,8 @@ dependencies: - name: mariner version: "4.3.2" repository: https://example.com/charts - alias: - - mariners1 - - mariners2 + alias: mariners2 + - name: mariner + version: "4.3.2" + repository: https://example.com/charts + alias: mariners1 diff --git a/pkg/resolver/resolver_test.go b/pkg/resolver/resolver_test.go index 9453a979f483653c149e17e976e0c9664c1bf1e7..b87022b932fa60ee494c4930cce51dd837d08e1b 100644 --- a/pkg/resolver/resolver_test.go +++ b/pkg/resolver/resolver_test.go @@ -146,7 +146,7 @@ func TestResolve(t *testing.T) { } func TestHashReq(t *testing.T) { - expect := "sha256:917e251ddba291096889f81eb7de713ab4e1afbbb07c576dfd7d66ba9300b12b" + expect := "sha256:45b06fcc4496c705bf3d634f8a2ff84e6a6f0bdcaf010614b8886572d1e52b99" req := &chartutil.Requirements{ Dependencies: []*chartutil.Dependency{ {Name: "alpine", Version: "0.1.0", Repository: "http://localhost:8879/charts"},