Refactor GitGetter to load and package charts using Helm v4 APIs.

Signed-off-by: Gianni Carafa <gianni.carafa@srf.ch>
pull/31547/head
Gianni Carafa 11 months ago
parent e65c3a7bf7
commit 9410bb5b8d
No known key found for this signature in database

@ -21,6 +21,7 @@ import (
"context" "context"
"crypto/sha256" "crypto/sha256"
"encoding/hex" "encoding/hex"
"errors"
"fmt" "fmt"
"log/slog" "log/slog"
"net/url" "net/url"
@ -29,6 +30,10 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"time" "time"
"helm.sh/helm/v4/pkg/chart/loader"
chart "helm.sh/helm/v4/pkg/chart/v2"
chartutil "helm.sh/helm/v4/pkg/chart/v2/util"
) )
// GitGetter handles fetching charts from Git repositories // GitGetter handles fetching charts from Git repositories
@ -186,43 +191,42 @@ func (g *GitGetter) fullCloneAndCheckout(ctx context.Context, repoURL, ref, dest
// packageChart packages a chart directory into a tarball // packageChart packages a chart directory into a tarball
func (g *GitGetter) packageChart(ctx context.Context, chartDir string) (*bytes.Buffer, error) { func (g *GitGetter) packageChart(ctx context.Context, chartDir string) (*bytes.Buffer, error) {
// Use helm package command to create the tarball // Load the chart from the directory
tmpDir, err := os.MkdirTemp("", "helm-git-package-") chrt, err := loader.LoadDir(chartDir)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create temp directory for packaging: %w", err) return nil, fmt.Errorf("failed to load chart: %w", err)
} }
defer os.RemoveAll(tmpDir)
// Use --dependency-update to automatically fetch any dependencies the chart needs // Type assert to get the v2 chart
// This handles charts that have their own dependencies var ch *chart.Chart
cmd := exec.CommandContext(ctx, "helm", "package", chartDir, "-d", tmpDir, "--dependency-update") switch c := chrt.(type) {
var stderr bytes.Buffer case *chart.Chart:
cmd.Stderr = &stderr ch = c
case chart.Chart:
if err := cmd.Run(); err != nil { ch = &c
if ctx.Err() == context.DeadlineExceeded { default:
return nil, fmt.Errorf("helm package timed out") return nil, errors.New("invalid chart apiVersion")
}
return nil, fmt.Errorf("helm package failed: %s", stderr.String())
} }
// Find the created tarball // Create a temporary directory for the packaged chart
entries, err := os.ReadDir(tmpDir) tmpDir, err := os.MkdirTemp("", "helm-git-package-")
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to read package directory: %w", err) return nil, fmt.Errorf("failed to create temp directory for packaging: %w", err)
} }
defer os.RemoveAll(tmpDir)
if len(entries) == 0 { packagePath, err := chartutil.Save(ch, tmpDir)
return nil, fmt.Errorf("no package file created") if err != nil {
return nil, fmt.Errorf("failed to package chart: %w", err)
} }
// Read the tarball tarData, err := os.ReadFile(packagePath)
tarPath := filepath.Join(tmpDir, entries[0].Name())
tarData, err := os.ReadFile(tarPath)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to read package file: %w", err) return nil, fmt.Errorf("failed to read package file: %w", err)
} }
slog.Debug("Packaged chart hash", "hash", computeHash(tarData))
return bytes.NewBuffer(tarData), nil return bytes.NewBuffer(tarData), nil
} }
@ -300,10 +304,5 @@ func NewGitGetter(options ...Option) (Getter, error) {
return nil, fmt.Errorf("git command not found in PATH: %w", err) return nil, fmt.Errorf("git command not found in PATH: %w", err)
} }
// Check if helm is available (for packaging)
if _, err := exec.LookPath("helm"); err != nil {
return nil, fmt.Errorf("helm command not found in PATH: %w", err)
}
return &client, nil return &client, nil
} }

Loading…
Cancel
Save