diff --git a/pkg/state/chart_dependency.go b/pkg/state/chart_dependency.go index 3d3e84a4..66023bd2 100644 --- a/pkg/state/chart_dependency.go +++ b/pkg/state/chart_dependency.go @@ -217,16 +217,13 @@ func (st *HelmState) updateDependenciesInTempDir(shell helmexec.DependencyUpdate } func getUnresolvedDependenciess(st *HelmState) (string, *UnresolvedDependencies, error) { - repoToURL := map[string]string{} + repoToURL := map[string]RepositorySpec{} for _, r := range st.Repositories { - repoToURL[r.Name] = r.URL + repoToURL[r.Name] = r } unresolved := &UnresolvedDependencies{deps: map[string][]unresolvedChartDependency{}} - // if err := unresolved.Add("stable/envoy", "https://kubernetes-charts.storage.googleapis.com", ""); err != nil { - // panic(err) - // } for _, r := range st.Releases { repo, chart, ok := resolveRemoteChart(r.Chart) @@ -234,13 +231,19 @@ func getUnresolvedDependenciess(st *HelmState) (string, *UnresolvedDependencies, continue } - url, ok := repoToURL[repo] + repoSpec, ok := repoToURL[repo] // Skip this chart from dependency management, as there's no matching `repository` in the helmfile state, // which may imply that this is a local chart within a directory, like `charts/myapp` if !ok { continue } + url := repoSpec.URL + + if repoSpec.OCI { + url = fmt.Sprintf("oci://%s", url) + } + if err := unresolved.Add(chart, url, r.Version); err != nil { return "", nil, err } diff --git a/pkg/state/chart_dependency_test.go b/pkg/state/chart_dependency_test.go new file mode 100644 index 00000000..8f569c08 --- /dev/null +++ b/pkg/state/chart_dependency_test.go @@ -0,0 +1,66 @@ +package state + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetUnresolvedDependenciess(t *testing.T) { + tests := []struct { + name string + helmState *HelmState + wantErr bool + expectfile string + expectDeps *UnresolvedDependencies + }{ + { + name: "oci chart", + helmState: &HelmState{ + FilePath: "helmfile.yaml", + ReleaseSetSpec: ReleaseSetSpec{ + Releases: []ReleaseSpec{ + { + Name: "foo", + Chart: "charts/abc", + Version: "0.1.0", + }, + }, + Repositories: []RepositorySpec{ + { + Name: "charts", + URL: "localhost:5000/aaa", + OCI: true, + }, + }, + }, + }, + wantErr: false, + expectfile: "helmfile", + expectDeps: &UnresolvedDependencies{ + deps: map[string][]unresolvedChartDependency{ + "abc": { + { + ChartName: "abc", + Repository: "oci://localhost:5000/aaa", + VersionConstraint: "0.1.0", + }, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + f, ds, err := getUnresolvedDependenciess(tt.helmState) + if tt.wantErr { + require.Error(t, err, "getUnresolvedDependenciess() error = nil, wantErr") + } else { + require.NoErrorf(t, err, "getUnresolvedDependenciess() want no error, got %v", err) + } + require.Equalf(t, tt.expectfile, f, "getUnresolvedDependenciess() expect file %s, got %s", tt.expectfile, f) + require.Equalf(t, tt.expectDeps, ds, "getUnresolvedDependenciess() expect deps %v, got %v", tt.expectDeps, ds) + }) + } +}