diff --git a/pkg/state/state.go b/pkg/state/state.go index 929bc5cc..67cd83a3 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -1215,7 +1215,7 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre chartFetchedByGoGetter := chartPath != chartName if !chartFetchedByGoGetter { - ociChartPath, err := st.getOCIChart(release, dir, helm) + ociChartPath, err := st.getOCIChart(release, dir, helm, opts.OutputDirTemplate) if err != nil { results <- &chartPrepareResult{err: fmt.Errorf("release %q: %w", release.Name, err)} @@ -3646,7 +3646,7 @@ func (st *HelmState) Reverse() { } } -func (st *HelmState) getOCIChart(release *ReleaseSpec, tempDir string, helm helmexec.Interface) (*string, error) { +func (st *HelmState) getOCIChart(release *ReleaseSpec, tempDir string, helm helmexec.Interface, outputDirTemplate string) (*string, error) { qualifiedChartName, chartName, chartVersion, err := st.getOCIQualifiedChartName(release, helm) if err != nil { return nil, err @@ -3656,21 +3656,7 @@ func (st *HelmState) getOCIChart(release *ReleaseSpec, tempDir string, helm helm return nil, nil } - pathElems := []string{ - tempDir, - } - - if release.Namespace != "" { - pathElems = append(pathElems, release.Namespace) - } - - if release.KubeContext != "" { - pathElems = append(pathElems, release.KubeContext) - } - - pathElems = append(pathElems, release.Name, chartName, safeVersionPath(chartVersion)) - - chartPath := filepath.Join(pathElems...) + chartPath, _ := st.getOCIChartPath(tempDir, release, chartName, chartVersion, outputDirTemplate) if st.fs.DirectoryExistsAt(chartPath) { st.logger.Debugf("chart already exists at %s", chartPath) @@ -3754,3 +3740,23 @@ func (st *HelmState) FullFilePath() (string, error) { } return filepath.Join(wd, st.basePath, st.FilePath), err } + +func (st *HelmState) getOCIChartPath(tempDir string, release *ReleaseSpec, chartName, chartVersion, outputDirTemplate string) (string, error) { + if outputDirTemplate != "" { + return generateChartPath(chartName, tempDir, release, outputDirTemplate) + } + + pathElems := []string{tempDir} + + if release.Namespace != "" { + pathElems = append(pathElems, release.Namespace) + } + + if release.KubeContext != "" { + pathElems = append(pathElems, release.KubeContext) + } + + pathElems = append(pathElems, release.Name, chartName, safeVersionPath(chartVersion)) + + return filepath.Join(pathElems...), nil +} diff --git a/pkg/state/state_test.go b/pkg/state/state_test.go index e835bc45..a18ca3b1 100644 --- a/pkg/state/state_test.go +++ b/pkg/state/state_test.go @@ -3724,3 +3724,69 @@ func TestHelmState_appendApiVersionsFlags(t *testing.T) { }) } } + +func TestGetOCIChartPath(t *testing.T) { + tests := []struct { + name string + tempDir string + release *ReleaseSpec + chartName string + chartVersion string + outputDirTemplate string + expectedPath string + expectedErr bool + }{ + { + name: "OCI chart with template", + tempDir: "charts", + release: &ReleaseSpec{ + Name: "karpenter", + Chart: "karpenter/karpenter", + }, + chartName: "karpenter", + chartVersion: "0.37.0", + outputDirTemplate: "{{ .OutputDir }}/", + expectedPath: "charts/", + expectedErr: false, + }, + { + name: "OCI chart with template containing unknown values", + tempDir: "charts", + release: &ReleaseSpec{ + Name: "karpenter", + Chart: "karpenter/karpenter", + }, + chartName: "karpenter", + chartVersion: "0.37.0", + outputDirTemplate: "{{ .SomethingThatDoesNotExist }}/", + expectedPath: "", + expectedErr: true, + }, + { + name: "OCI chart without template", + tempDir: "charts", + release: &ReleaseSpec{ + Name: "karpenter", + Chart: "karpenter/karpenter", + }, + chartName: "karpenter", + chartVersion: "0.37.0", + expectedPath: "charts/karpenter/karpenter/0.37.0", + expectedErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + st := &HelmState{} + path, err := st.getOCIChartPath(tt.tempDir, tt.release, tt.chartName, tt.chartVersion, tt.outputDirTemplate) + + if tt.expectedErr { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedPath, path) + } + }) + } +}