diff --git a/chartvalidator/checker/engine_chart_rendering.go b/chartvalidator/checker/engine_chart_rendering.go index 5fa75f8..e653d06 100644 --- a/chartvalidator/checker/engine_chart_rendering.go +++ b/chartvalidator/checker/engine_chart_rendering.go @@ -88,9 +88,9 @@ func (engine *ChartRenderingEngine) renderSingleChart(chart ChartRenderParams, w } args := []string{ - "template", chart.ChartName, + "template", + resolveChartReference(chart), "--release-name", chart.ChartName, - "--repo", chart.RepoURL, "-f", chart.BaseValuesFile, "-f", chart.ValuesOverride, "--version", chart.ChartVersion, @@ -98,6 +98,10 @@ func (engine *ChartRenderingEngine) renderSingleChart(chart ChartRenderParams, w "--kube-version", kubernetesVersion, } + if !isOCIRepo(chart.RepoURL) { + args = append(args, "--repo", chart.RepoURL) + } + // Add API versions if any for _, apiVer := range engine.apiVersions { if apiVer != "" { @@ -144,6 +148,17 @@ func (engine *ChartRenderingEngine) renderSingleChart(chart ChartRenderParams, w return &RenderResult{Chart: chart, ManifestPath: outputPath}, nil } +func isOCIRepo(repoURL string) bool { + return strings.HasPrefix(repoURL, "oci://") +} + +func resolveChartReference(chart ChartRenderParams) string { + if isOCIRepo(chart.RepoURL) { + return fmt.Sprintf("%s/%s", strings.TrimSuffix(chart.RepoURL, "/"), chart.ChartName) + } + return chart.ChartName +} + // Suffix the files just in case two charts end up having the same name func generateRandomString(length int) string { const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" diff --git a/chartvalidator/checker/engine_chart_rendering_test.go b/chartvalidator/checker/engine_chart_rendering_test.go index b261751..e5578b5 100644 --- a/chartvalidator/checker/engine_chart_rendering_test.go +++ b/chartvalidator/checker/engine_chart_rendering_test.go @@ -44,7 +44,25 @@ func TestRenderBasics(t *testing.T) { assertChartFieldsMatch(t, testChart, result.Chart) // Verify the command that was executed - expectedCommand := "helm template test-chart --release-name test-chart --repo https://example.com/charts -f values.yaml -f override.yaml --version 1.0.0 --include-crds --kube-version 1.33.0 --api-versions something --api-versions something-else" + expectedCommand := "helm template test-chart --release-name test-chart -f values.yaml -f override.yaml --version 1.0.0 --include-crds --kube-version 1.33.0 --repo https://example.com/charts --api-versions something --api-versions something-else" + actualCommand := mockExecutor.GetFullCommand() + assert.Equal(t, expectedCommand, actualCommand) +} + +func TestRenderOCIRepo(t *testing.T) { + mockExecutor := createMockExecutor() + engine := createEngine(mockExecutor, false) + defer cleanupEngine(engine) + + testChart := createTestChart() + testChart.RepoURL = "oci://europe-west4-docker.pkg.dev/wallet-dev-462809/interledger-helm-charts" + engine.inputChan <- testChart + + result := <-engine.resultChan + assertChartFieldsMatch(t, testChart, result.Chart) + + // OCI charts should be templated using the full OCI chart reference, not --repo. + expectedCommand := "helm template oci://europe-west4-docker.pkg.dev/wallet-dev-462809/interledger-helm-charts/test-chart --release-name test-chart -f values.yaml -f override.yaml --version 1.0.0 --include-crds --kube-version 1.33.0 --api-versions something --api-versions something-else" actualCommand := mockExecutor.GetFullCommand() assert.Equal(t, expectedCommand, actualCommand) }