From 21771a39bd9175bdcc4cb9be758051a27363820b Mon Sep 17 00:00:00 2001 From: Aditya Menon Date: Sun, 16 Nov 2025 04:39:03 +0100 Subject: [PATCH] feat: Add Helm 3 and Helm 4 support with version matrix testing This commit introduces comprehensive support for both Helm 3 and Helm 4: - Added version-specific handling in chartify and chartrepo server - Implemented OCIPlainHTTP option for Helm 4 OCI support - Updated CI to run matrix tests for both Helm versions - Removed hardcoded Helm version references from tests and CLI - Updated Helm 3 version to 3.19.2 in CI - Skipped kustomize test for Helm 4 due to incompatibility - Updated documentation with latest version references Signed-off-by: Aditya Menon --- .github/copilot-instructions.md | 4 +- .github/workflows/go.yml | 12 +- .github/workflows/lint.yaml | 2 +- chartify.go | 23 +++- chartify_test.go | 8 +- chartrepo/server.go | 212 +++++++++++++++++++++++++++++--- chartrepo/server_test.go | 204 ++++++++++++++++++++++++++++++ cmd/chartify/main.go | 2 +- go.mod | 61 +++++---- go.sum | 178 +++++++++++++++------------ integration_test.go | 38 +++--- patch.go | 2 +- replace.go | 4 +- requirements.go | 2 +- runner.go | 31 ++++- tempdir_test.go | 8 +- util_test.go | 4 +- 17 files changed, 636 insertions(+), 159 deletions(-) create mode 100644 chartrepo/server_test.go diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 1c15b09..d51ee46 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -7,7 +7,7 @@ Chartify is a Go library and CLI tool that converts Kubernetes resource YAMLs, K ## Working Effectively ### Bootstrap and Build -- **Prerequisites**: Go 1.24+, Helm v3.18.6, Kustomize v5.6.0+ are required +- **Prerequisites**: Go 1.25.4+, Helm v4.0.0, Kustomize v5.8.0+ are required - Build the CLI: `go build -o chartify ./cmd/chartify` -- takes 25 seconds. **NEVER CANCEL**. Set timeout to 60+ seconds. - Build dependencies: `go mod download` -- takes 15 seconds. **NEVER CANCEL**. Set timeout to 120+ seconds. - Alternative build with chart repo server: `go build -o chartreposerver ./cmd/chartreposerver` @@ -72,7 +72,7 @@ Chartify is a Go library and CLI tool that converts Kubernetes resource YAMLs, K - The CLI expects exactly 2 positional arguments: RELEASE_NAME and CHART_PATH, with -o flag for output directory. ## CI/CD Integration -- GitHub Actions run on Go 1.24+ with Helm v3.18.6 and Kustomize v5.6.0 +- GitHub Actions run on Go 1.25.4+ with Helm v4.0.0 and Kustomize v5.8.0 - CI runs `CGO_ENABLED=0 go test ./...` after attempting to add helm stable repo - Linting workflow uses golangci-lint v2.1.6 but has configuration compatibility issues diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 7a63ace..d85abf3 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -6,8 +6,13 @@ on: branches: [main, master] jobs: build: - name: test + name: test (helm ${{ matrix.helm-version }}) runs-on: ubuntu-latest + strategy: + matrix: + helm-version: + - v3.19.2 + - v4.0.0 steps: - name: Check out code into the Go module directory uses: actions/checkout@v5 @@ -20,15 +25,16 @@ jobs: - name: Install Helm uses: azure/setup-helm@v4.3.1 with: - version: v3.19.0 # default is latest (stable) + version: ${{ matrix.helm-version }} - name: Install Kustomize uses: syntaqx/setup-kustomize@v1 with: - kustomize-version: 5.6.0 + kustomize-version: 5.8.0 - name: Test run: | + helm version helm repo add stable https://charts.helm.sh/stable CGO_ENABLED=0 go test ./... diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 94e9e3e..319fba3 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -24,4 +24,4 @@ jobs: - name: Golangci lint uses: golangci/golangci-lint-action@v8 with: - version: v2.1.6 + version: v2.6.2 diff --git a/chartify.go b/chartify.go index a70593e..ec13432 100644 --- a/chartify.go +++ b/chartify.go @@ -11,7 +11,8 @@ import ( "github.com/Masterminds/semver/v3" "github.com/otiai10/copy" - "helm.sh/helm/v3/pkg/registry" + registryv3 "helm.sh/helm/v3/pkg/registry" + registryv4 "helm.sh/helm/v4/pkg/registry" ) var ( @@ -84,6 +85,10 @@ type ChartifyOpts struct { // https://github.com/roboll/helmfile/issues/1547 SkipDeps bool + // OCIPlainHTTP uses plain HTTP for OCI registries when running helm dependency commands. + // Required for local/insecure OCI registries in Helm 4. + OCIPlainHTTP bool + // IncludeCRDs is a Helm 3 only option. When it is true, chartify passes a `--include-crds` flag // to helm-template. IncludeCRDs bool @@ -378,7 +383,12 @@ func (r *Runner) Chartify(release, dirOrChart string, opts ...ChartifyOption) (s } else { // Flatten the chart by fetching dependent chart archives and merging their K8s manifests into the temporary local chart // So that we can uniformly patch them with JSON patch, Strategic-Merge patch, or with injectors - _, err := r.run(nil, r.helmBin(), "dependency", "up", tempDir) + depArgs := []string{"dependency", "up", tempDir} + // Helm 4 requires --plain-http for HTTP-only OCI registries + if u.OCIPlainHTTP && r.IsHelm4() { + depArgs = append(depArgs, "--plain-http") + } + _, err := r.run(nil, r.helmBin(), depArgs...) if err != nil { return "", err } @@ -388,7 +398,12 @@ func (r *Runner) Chartify(release, dirOrChart string, opts ...ChartifyOption) (s // and its dependencies. But ovbiously, previous `helm fetch` run doesn't download the adhoc dependencies we added // after running `helm fetch`. // We need to download adhoc dependencies on our own by running helmfile dependency up. - _, err := r.run(nil, r.helmBin(), "dependency", "up", tempDir) + depArgs := []string{"dependency", "up", tempDir} + // Helm 4 requires --plain-http for HTTP-only OCI registries + if u.OCIPlainHTTP && r.IsHelm4() { + depArgs = append(depArgs, "--plain-http") + } + _, err := r.run(nil, r.helmBin(), depArgs...) if err != nil { return "", err } @@ -521,7 +536,7 @@ func (r *Runner) ReadAdhocDependencies(u *ChartifyOpts) ([]Dependency, error) { if isLocalChart { name = filepath.Base(d.Chart) repoUrl = fmt.Sprintf("file://%s", d.Chart) - } else if registry.IsOCI(d.Chart) { + } else if (r.IsHelm3() && registryv3.IsOCI(d.Chart)) || (r.IsHelm4() && registryv4.IsOCI(d.Chart)) { name = filepath.Base(d.Chart) // Trim trailing slash to avoid invalid repository error due to duplicate slash in oci registry url // while running helm dependency up diff --git a/chartify_test.go b/chartify_test.go index 4516449..b78a9d1 100644 --- a/chartify_test.go +++ b/chartify_test.go @@ -118,7 +118,13 @@ func TestUseHelmChartsInKustomize(t *testing.T) { repo := "myrepo" startServer(t, repo) - r := New(UseHelm3(true), HelmBin(helm)) + r := New(HelmBin(helm)) + + // Skip this test for Helm 4 as Kustomize 5.8.0 doesn't support Helm 4 yet + // Kustomize tries to run 'helm version -c --short' which is not supported in Helm 4 + if r.IsHelm4() { + t.Skip("Skipping test: Kustomize 5.8.0 does not support Helm 4 (uses unsupported 'helm version -c' flag)") + } tests := []struct { name string diff --git a/chartrepo/server.go b/chartrepo/server.go index 7868e16..a03d2b6 100644 --- a/chartrepo/server.go +++ b/chartrepo/server.go @@ -18,15 +18,23 @@ import ( "strings" "time" - "helm.sh/helm/v3/pkg/chart/loader" - "helm.sh/helm/v3/pkg/provenance" - "helm.sh/helm/v3/pkg/repo" + "github.com/Masterminds/semver/v3" + loaderv3 "helm.sh/helm/v3/pkg/chart/loader" + provenancev3 "helm.sh/helm/v3/pkg/provenance" + repov3 "helm.sh/helm/v3/pkg/repo" + loaderv4 "helm.sh/helm/v4/pkg/chart/loader" + v2 "helm.sh/helm/v4/pkg/chart/v2" + provenancev4 "helm.sh/helm/v4/pkg/provenance" + repov4 "helm.sh/helm/v4/pkg/repo/v1" ) type Server struct { Port int Host string ChartsDir string + HelmBin string + isHelm3 *bool + isHelm4 *bool } func (s *Server) getPort() int { @@ -52,8 +60,73 @@ func (s *Server) ServerURL() string { return serverURL } +func (s *Server) getHelmBin() string { + if s.HelmBin == "" { + return "helm" + } + return s.HelmBin +} + +func (s *Server) detectHelmVersion() (*semver.Version, error) { + helmBin := s.getHelmBin() + cmd := exec.Command(helmBin, "version", "--template={{.Version}}+g{{.GitCommit}}") + out, err := cmd.CombinedOutput() + if err != nil { + return nil, fmt.Errorf("detecting helm version: %w: %s", err, string(out)) + } + + verStr := strings.TrimSpace(string(out)) + sv, err := semver.NewVersion(verStr) + if err != nil { + return nil, fmt.Errorf("parsing helm version %q: %w", verStr, err) + } + + return sv, nil +} + +func (s *Server) IsHelm3() bool { + if s.isHelm3 != nil { + return *s.isHelm3 + } + + if os.Getenv("HELM_X_HELM3") != "" { + v := true + s.isHelm3 = &v + return true + } + + sv, err := s.detectHelmVersion() + if err != nil { + panic(err) + } + + v := sv.Major() == 3 + s.isHelm3 = &v + return v +} + +func (s *Server) IsHelm4() bool { + if s.isHelm4 != nil { + return *s.isHelm4 + } + + if os.Getenv("HELM_X_HELM4") != "" { + v := true + s.isHelm4 = &v + return true + } + + sv, err := s.detectHelmVersion() + if err != nil { + panic(err) + } + + v := sv.Major() == 4 + s.isHelm4 = &v + return v +} + func (s *Server) Run(ctx context.Context) error { - port := s.getPort() serverURL := s.ServerURL() chartsDir := s.ChartsDir if chartsDir == "" { @@ -90,7 +163,7 @@ func (s *Server) Run(ctx context.Context) error { return fmt.Errorf("unable to get abs path to %s: %w", chart, err) } - cmd := exec.CommandContext(ctx, "helm", "package", abs) + cmd := exec.CommandContext(ctx, s.getHelmBin(), "package", abs) cmd.Dir = worktree out, err := cmd.CombinedOutput() if err != nil { @@ -101,15 +174,83 @@ func (s *Server) Run(ctx context.Context) error { indexYamlPath := filepath.Join(worktree, "index.yaml") - var indexFile *repo.IndexFile - _, err = os.Stat(indexYamlPath) + if s.IsHelm3() { + return s.runHelm3(ctx, worktree, indexYamlPath, serverURL) + } else if s.IsHelm4() { + return s.runHelm4(ctx, worktree, indexYamlPath, serverURL) + } + + return fmt.Errorf("unsupported helm version") +} + +func (s *Server) runHelm3(ctx context.Context, worktree, indexYamlPath, serverURL string) error { + var indexFile *repov3.IndexFile + _, err := os.Stat(indexYamlPath) + if err == nil { + indexFile, err = repov3.LoadIndexFile(indexYamlPath) + if err != nil { + return err + } + } else if errors.Is(err, os.ErrNotExist) { + indexFile = repov3.NewIndexFile() + } else { + return err + } + + chartPackages, err := filepath.Glob(filepath.Join(worktree, "*.tgz")) + if err != nil { + return err + } + + var update bool + for _, chartPackage := range chartPackages { + _, err := loaderv3.LoadFile(chartPackage) + if err != nil { + return err + } + pkgURL := fmt.Sprintf("%s%s", serverURL, filepath.Base(chartPackage)) + + downloadUrl, _ := url.Parse(pkgURL) + name := filepath.Base(downloadUrl.Path) + baseName := strings.TrimSuffix(name, filepath.Ext(name)) + tagParts := splitPackageNameAndVersion(baseName) + packageName, packageVersion := tagParts[0], tagParts[1] + fmt.Printf("Found %s-%s.tgz\n", packageName, packageVersion) + if _, err := indexFile.Get(packageName, packageVersion); err != nil { + if err := addToIndexFileHelm3(worktree, indexFile, downloadUrl.String()); err != nil { + return err + } + update = true + } + } + + if !update { + fmt.Printf("Index %s did not change\n", indexYamlPath) + return nil + } + + fmt.Printf("Updating index %s\n", indexYamlPath) + indexFile.SortEntries() + + indexFile.Generated = time.Now() + + if err := indexFile.WriteFile(indexYamlPath, 0644); err != nil { + return err + } + + return s.startHTTPServer(ctx, worktree, indexYamlPath) +} + +func (s *Server) runHelm4(ctx context.Context, worktree, indexYamlPath, serverURL string) error { + var indexFile *repov4.IndexFile + _, err := os.Stat(indexYamlPath) if err == nil { - indexFile, err = repo.LoadIndexFile(indexYamlPath) + indexFile, err = repov4.LoadIndexFile(indexYamlPath) if err != nil { return err } } else if errors.Is(err, os.ErrNotExist) { - indexFile = repo.NewIndexFile() + indexFile = repov4.NewIndexFile() } else { return err } @@ -121,7 +262,7 @@ func (s *Server) Run(ctx context.Context) error { var update bool for _, chartPackage := range chartPackages { - _, err := loader.LoadFile(chartPackage) + _, err := loaderv4.LoadFile(chartPackage) if err != nil { return err } @@ -134,7 +275,7 @@ func (s *Server) Run(ctx context.Context) error { packageName, packageVersion := tagParts[0], tagParts[1] fmt.Printf("Found %s-%s.tgz\n", packageName, packageVersion) if _, err := indexFile.Get(packageName, packageVersion); err != nil { - if err := addToIndexFile(worktree, indexFile, downloadUrl.String()); err != nil { + if err := addToIndexFileHelm4(worktree, indexFile, downloadUrl.String()); err != nil { return err } update = true @@ -155,6 +296,12 @@ func (s *Server) Run(ctx context.Context) error { return err } + return s.startHTTPServer(ctx, worktree, indexYamlPath) +} + +func (s *Server) startHTTPServer(ctx context.Context, worktree, indexYamlPath string) error { + port := s.getPort() + var serveMux http.ServeMux serveMux.HandleFunc("/index.yaml", func(w http.ResponseWriter, _ *http.Request) { @@ -217,18 +364,55 @@ func splitPackageNameAndVersion(pkg string) []string { return []string{pkg[0:delimIndex], pkg[delimIndex+1:]} } -func addToIndexFile(worktree string, indexFile *repo.IndexFile, url string) error { +func addToIndexFileHelm3(worktree string, indexFile *repov3.IndexFile, url string) error { arch := filepath.Join(worktree, filepath.Base(url)) // extract chart metadata fmt.Printf("Extracting chart metadata from %s\n", arch) - c, err := loader.LoadFile(arch) + c, err := loaderv3.LoadFile(arch) if err != nil { return fmt.Errorf("%s is not a helm chart package: %w", arch, err) } + + // calculate hash + fmt.Printf("Calculating Hash for %s\n", arch) + hash, err := provenancev3.DigestFile(arch) + if err != nil { + return err + } + + // remove url name from url as helm's index library + // adds it in during .Add + // there should be a better way to handle this :( + s := strings.Split(url, "/") + s = s[:len(s)-1] + + // Add to index + if err := indexFile.MustAdd(c.Metadata, filepath.Base(arch), strings.Join(s, "/"), hash); err != nil { + return err + } + return nil +} + +func addToIndexFileHelm4(worktree string, indexFile *repov4.IndexFile, url string) error { + arch := filepath.Join(worktree, filepath.Base(url)) + + // extract chart metadata + fmt.Printf("Extracting chart metadata from %s\n", arch) + charter, err := loaderv4.LoadFile(arch) + if err != nil { + return fmt.Errorf("%s is not a helm chart package: %w", arch, err) + } + + // Convert Charter to v2.Chart to access metadata + c, ok := charter.(*v2.Chart) + if !ok { + return fmt.Errorf("chart is not a v2 chart") + } + // calculate hash fmt.Printf("Calculating Hash for %s\n", arch) - hash, err := provenance.DigestFile(arch) + hash, err := provenancev4.DigestFile(arch) if err != nil { return err } diff --git a/chartrepo/server_test.go b/chartrepo/server_test.go new file mode 100644 index 0000000..9424cf5 --- /dev/null +++ b/chartrepo/server_test.go @@ -0,0 +1,204 @@ +package chartrepo + +import ( + "context" + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestServer_detectHelmVersion(t *testing.T) { + helmBin := "helm" + if h := os.Getenv("HELM_BIN"); h != "" { + helmBin = h + } + + s := &Server{ + HelmBin: helmBin, + } + + version, err := s.detectHelmVersion() + require.NoError(t, err, "should detect helm version") + require.NotNil(t, version, "version should not be nil") + + t.Logf("Detected Helm version: %s", version.String()) + require.True(t, version.Major() == 3 || version.Major() == 4, "should be Helm 3 or 4") +} + +func TestServer_IsHelm3(t *testing.T) { + helmBin := "helm" + if h := os.Getenv("HELM_BIN"); h != "" { + helmBin = h + } + + s := &Server{ + HelmBin: helmBin, + } + + isHelm3 := s.IsHelm3() + t.Logf("IsHelm3: %v", isHelm3) + + // Should be either true or false, not panic + require.NotNil(t, s.isHelm3, "isHelm3 should be cached") +} + +func TestServer_IsHelm4(t *testing.T) { + helmBin := "helm" + if h := os.Getenv("HELM_BIN"); h != "" { + helmBin = h + } + + s := &Server{ + HelmBin: helmBin, + } + + isHelm4 := s.IsHelm4() + t.Logf("IsHelm4: %v", isHelm4) + + // Should be either true or false, not panic + require.NotNil(t, s.isHelm4, "isHelm4 should be cached") +} + +func TestServer_VersionDetectionConsistency(t *testing.T) { + helmBin := "helm" + if h := os.Getenv("HELM_BIN"); h != "" { + helmBin = h + } + + s := &Server{ + HelmBin: helmBin, + } + + isHelm3 := s.IsHelm3() + isHelm4 := s.IsHelm4() + + // Should be exactly one of Helm 3 or Helm 4, not both + require.True(t, isHelm3 != isHelm4, "should be either Helm 3 or Helm 4, not both") +} + +func TestServer_Run_Helm3And4(t *testing.T) { + helmBin := "helm" + if h := os.Getenv("HELM_BIN"); h != "" { + helmBin = h + } + + chartsDir := "../testdata/charts" + + s := &Server{ + Port: 0, // Use default port + ChartsDir: chartsDir, + HelmBin: helmBin, + } + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + // Start server in background + errChan := make(chan error, 1) + go func() { + errChan <- s.Run(ctx) + }() + + // Give server time to start + time.Sleep(1 * time.Second) + + // Cancel context to stop server + cancel() + + // Wait for server to stop + select { + case err := <-errChan: + // Server should stop gracefully when context is canceled + if err != nil && err.Error() != "starting server: http: Server closed" { + t.Logf("Server stopped with: %v", err) + } + case <-time.After(3 * time.Second): + t.Fatal("Server did not stop in time") + } +} + +func TestServer_EnvVarOverride(t *testing.T) { + tests := []struct { + name string + envVar string + envValue string + expected bool + checkFn func(*Server) bool + }{ + { + name: "HELM_X_HELM3 forces Helm 3", + envVar: "HELM_X_HELM3", + envValue: "1", + expected: true, + checkFn: func(s *Server) bool { return s.IsHelm3() }, + }, + { + name: "HELM_X_HELM4 forces Helm 4", + envVar: "HELM_X_HELM4", + envValue: "1", + expected: true, + checkFn: func(s *Server) bool { return s.IsHelm4() }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Set env var + oldVal := os.Getenv(tt.envVar) + os.Setenv(tt.envVar, tt.envValue) + defer func() { + if oldVal == "" { + os.Unsetenv(tt.envVar) + } else { + os.Setenv(tt.envVar, oldVal) + } + }() + + s := &Server{ + HelmBin: "helm", + } + + result := tt.checkFn(s) + require.Equal(t, tt.expected, result, "env var should override version detection") + }) + } +} + +func TestSplitPackageNameAndVersion(t *testing.T) { + tests := []struct { + name string + pkg string + expectedName string + expectedVersion string + }{ + { + name: "simple chart", + pkg: "mychart-1.0.0", + expectedName: "mychart", + expectedVersion: "1.0.0", + }, + { + name: "chart with dash in name", + pkg: "my-chart-1.0.0", + expectedName: "my-chart", + expectedVersion: "1.0.0", + }, + { + name: "chart with multiple dashes", + pkg: "my-awesome-chart-2.3.4", + expectedName: "my-awesome-chart", + expectedVersion: "2.3.4", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + parts := splitPackageNameAndVersion(tt.pkg) + require.Len(t, parts, 2, "should return exactly 2 parts") + require.Equal(t, tt.expectedName, parts[0], "package name should match") + require.Equal(t, tt.expectedVersion, parts[1], "version should match") + }) + } +} diff --git a/cmd/chartify/main.go b/cmd/chartify/main.go index 5fbac4d..7d64a5a 100644 --- a/cmd/chartify/main.go +++ b/cmd/chartify/main.go @@ -62,7 +62,7 @@ func main() { opts.DeprecatedAdhocChartDependencies = deps - c := chartify.New(chartify.UseHelm3(true), chartify.HelmBin("helm")) + c := chartify.New(chartify.HelmBin("helm")) args := flag.Args() diff --git a/go.mod b/go.mod index 1c62595..7601b34 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/helmfile/chartify -go 1.24.0 +go 1.25.4 require ( github.com/Masterminds/semver/v3 v3.4.0 @@ -9,27 +9,35 @@ require ( github.com/otiai10/copy v1.14.1 github.com/stretchr/testify v1.11.1 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.19.0 + helm.sh/helm/v3 v3.19.2 + helm.sh/helm/v4 v4.0.0 ) require ( github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/ProtonMail/go-crypto v1.3.0 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/containerd/containerd v1.7.28 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/containerd/containerd v1.7.29 // indirect github.com/containerd/errdefs v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v0.2.1 // indirect + github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/evanphx/json-patch v5.9.11+incompatible // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/extism/go-sdk v1.7.1 // indirect + github.com/fluxcd/cli-utils v0.36.0-flux.14 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect - github.com/go-errors/errors v1.4.2 // indirect - github.com/go-logr/logr v1.4.2 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-errors/errors v1.5.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-openapi/jsonpointer v0.21.1 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.1 // indirect + github.com/gobwas/glob v0.2.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.7.0 // indirect @@ -38,12 +46,13 @@ require ( github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/ianlancetaylor/demangle v0.0.0-20240805132620-81f5be970eca // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/moby/spdystream v0.5.0 // indirect github.com/moby/term v0.5.2 // indirect @@ -61,35 +70,39 @@ require ( github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/cobra v1.10.1 // indirect - github.com/spf13/pflag v1.0.9 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 // indirect + github.com/tetratelabs/wazero v1.9.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xlab/treeprint v1.2.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.41.0 // indirect - golang.org/x/net v0.42.0 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/net v0.45.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/term v0.34.0 // indirect - golang.org/x/text v0.28.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect golang.org/x/time v0.12.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/grpc v1.72.1 // indirect - google.golang.org/protobuf v1.36.5 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect - k8s.io/api v0.34.0 // indirect - k8s.io/apiextensions-apiserver v0.34.0 // indirect - k8s.io/apimachinery v0.34.0 // indirect - k8s.io/cli-runtime v0.34.0 // indirect - k8s.io/client-go v0.34.0 // indirect - k8s.io/component-base v0.34.0 // indirect + k8s.io/api v0.34.1 // indirect + k8s.io/apiextensions-apiserver v0.34.1 // indirect + k8s.io/apimachinery v0.34.1 // indirect + k8s.io/cli-runtime v0.34.1 // indirect + k8s.io/client-go v0.34.1 // indirect + k8s.io/component-base v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect - k8s.io/kubectl v0.34.0 // indirect + k8s.io/kubectl v0.34.1 // indirect k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect oras.land/oras-go/v2 v2.6.0 // indirect + sigs.k8s.io/controller-runtime v0.22.3 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/kustomize/api v0.20.1 // indirect sigs.k8s.io/kustomize/kyaml v0.20.1 // indirect diff --git a/go.sum b/go.sum index b7bfaf8..21fd096 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -20,8 +22,10 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= -github.com/containerd/containerd v1.7.28 h1:Nsgm1AtcmEh4AHAJ4gGlNSaKgXiNccU270Dnf81FQ3c= -github.com/containerd/containerd v1.7.28/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= +github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= @@ -31,7 +35,6 @@ github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7np github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -50,34 +53,44 @@ github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a h1:UwSIFv5g5lIvbGgtf3tVwC7Ky9rmMFBp0RMs+6f6YqE= +github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a/go.mod h1:C8DzXehI4zAbrdlbtOByKX6pfivJTBiV9Jjqv56Yd9Q= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/extism/go-sdk v1.7.1 h1:lWJos6uY+tRFdlIHR+SJjwFDApY7OypS/2nMhiVQ9Sw= +github.com/extism/go-sdk v1.7.1/go.mod h1:IT+Xdg5AZM9hVtpFUA+uZCJMge/hbvshl8bwzLtFyKA= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fluxcd/cli-utils v0.36.0-flux.14 h1:I//AMVUXTc+M04UtIXArMXQZCazGMwfemodV1j/yG8c= +github.com/fluxcd/cli-utils v0.36.0-flux.14/go.mod h1:uDo7BYOfbdmk/asnHuI0IQPl6u0FCgcN54AHDu3Y5As= github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-errors/errors v1.5.1 h1:ZwEMSLRCapFLflTpT7NKaAc7ukJ8ZPEjzlxt8rPN8bk= +github.com/go-errors/errors v1.5.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= +github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -89,8 +102,8 @@ github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7O github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= -github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5 h1:xhMrHhTJ6zxu3gA4enFM9MLn9AY7613teCdFnlUVbSQ= +github.com/google/pprof v0.0.0-20250630185457-6e76a2b096b5/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -112,6 +125,8 @@ github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGN github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/ianlancetaylor/demangle v0.0.0-20240805132620-81f5be970eca h1:T54Ema1DU8ngI+aef9ZhAhNGQhcRTrWxVeG07F+c/Rw= +github.com/ianlancetaylor/demangle v0.0.0-20240805132620-81f5be970eca/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -122,17 +137,14 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= @@ -153,10 +165,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= -github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= -github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= +github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= +github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= +github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -176,12 +188,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= @@ -198,21 +210,21 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= -github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 h1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q= +github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834/go.mod h1:m9ymHTgNSEjuxvw8E7WWe4Pl4hZQHXONY8wE6dMLaRk= +github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I= +github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= @@ -227,8 +239,8 @@ go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQ go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= @@ -253,20 +265,26 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsu go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= @@ -274,46 +292,46 @@ go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM= +golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -325,8 +343,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= @@ -339,30 +357,34 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -helm.sh/helm/v3 v3.19.0 h1:krVyCGa8fa/wzTZgqw0DUiXuRT5BPdeqE/sQXujQ22k= -helm.sh/helm/v3 v3.19.0/go.mod h1:Lk/SfzN0w3a3C3o+TdAKrLwJ0wcZ//t1/SDXAvfgDdc= -k8s.io/api v0.34.0 h1:L+JtP2wDbEYPUeNGbeSa/5GwFtIA662EmT2YSLOkAVE= -k8s.io/api v0.34.0/go.mod h1:YzgkIzOOlhl9uwWCZNqpw6RJy9L2FK4dlJeayUoydug= -k8s.io/apiextensions-apiserver v0.34.0 h1:B3hiB32jV7BcyKcMU5fDaDxk882YrJ1KU+ZSkA9Qxoc= -k8s.io/apiextensions-apiserver v0.34.0/go.mod h1:hLI4GxE1BDBy9adJKxUxCEHBGZtGfIg98Q+JmTD7+g0= -k8s.io/apimachinery v0.34.0 h1:eR1WO5fo0HyoQZt1wdISpFDffnWOvFLOOeJ7MgIv4z0= -k8s.io/apimachinery v0.34.0/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/cli-runtime v0.34.0 h1:N2/rUlJg6TMEBgtQ3SDRJwa8XyKUizwjlOknT1mB2Cw= -k8s.io/cli-runtime v0.34.0/go.mod h1:t/skRecS73Piv+J+FmWIQA2N2/rDjdYSQzEE67LUUs8= -k8s.io/client-go v0.34.0 h1:YoWv5r7bsBfb0Hs2jh8SOvFbKzzxyNo0nSb0zC19KZo= -k8s.io/client-go v0.34.0/go.mod h1:ozgMnEKXkRjeMvBZdV1AijMHLTh3pbACPvK7zFR+QQY= -k8s.io/component-base v0.34.0 h1:bS8Ua3zlJzapklsB1dZgjEJuJEeHjj8yTu1gxE2zQX8= -k8s.io/component-base v0.34.0/go.mod h1:RSCqUdvIjjrEm81epPcjQ/DS+49fADvGSCkIP3IC6vg= +helm.sh/helm/v3 v3.19.2 h1:psQjaM8aIWrSVEly6PgYtLu/y6MRSmok4ERiGhZmtUY= +helm.sh/helm/v3 v3.19.2/go.mod h1:gX10tB5ErM+8fr7bglUUS/UfTOO8UUTYWIBH1IYNnpE= +helm.sh/helm/v4 v4.0.0 h1:Ppai7cygdmyxSR+JR9djUoVrRmyMI/yY5P5TBd25oHs= +helm.sh/helm/v4 v4.0.0/go.mod h1:G1Y5AE+lJPQSAjh7nbXnhZrtGtxo+I6POSu9DruYiGI= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= +k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/cli-runtime v0.34.1 h1:btlgAgTrYd4sk8vJTRG6zVtqBKt9ZMDeQZo2PIzbL7M= +k8s.io/cli-runtime v0.34.1/go.mod h1:aVA65c+f0MZiMUPbseU/M9l1Wo2byeaGwUuQEQVVveE= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/component-base v0.34.1 h1:v7xFgG+ONhytZNFpIz5/kecwD+sUhVE6HU7qQUiRM4A= +k8s.io/component-base v0.34.1/go.mod h1:mknCpLlTSKHzAQJJnnHVKqjxR7gBeHRv0rPXA7gdtQ0= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= -k8s.io/kubectl v0.34.0 h1:NcXz4TPTaUwhiX4LU+6r6udrlm0NsVnSkP3R9t0dmxs= -k8s.io/kubectl v0.34.0/go.mod h1:bmd0W5i+HuG7/p5sqicr0Li0rR2iIhXL0oUyLF3OjR4= +k8s.io/kubectl v0.34.1 h1:1qP1oqT5Xc93K+H8J7ecpBjaz511gan89KO9Vbsh/OI= +k8s.io/kubectl v0.34.1/go.mod h1:JRYlhJpGPyk3dEmJ+BuBiOB9/dAvnrALJEiY/C5qa6A= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= +sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTijTq8Y= +sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/kustomize/api v0.20.1 h1:iWP1Ydh3/lmldBnH/S5RXgT98vWYMaTUL1ADcr+Sv7I= diff --git a/integration_test.go b/integration_test.go index 5fbcde8..8bdfc54 100644 --- a/integration_test.go +++ b/integration_test.go @@ -28,7 +28,7 @@ func TestIntegration(t *testing.T) { repo := "myrepo" startServer(t, repo) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/adhoc_dependency_condition$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/adhoc_dependency_condition$ ./ runTest(t, integrationTestCase{ description: "adhoc dependency condition", release: "myapp", @@ -47,7 +47,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/adhoc_dependency_condition_disabled$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/adhoc_dependency_condition_disabled$ ./ runTest(t, integrationTestCase{ description: "adhoc dependency condition disabled", release: "myapp", @@ -66,7 +66,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/adhoc_dependency_condition_default$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/adhoc_dependency_condition_default$ ./ runTest(t, integrationTestCase{ description: "adhoc dependency condition default", release: "myapp", @@ -82,7 +82,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/force_namespace$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/force_namespace$ ./ runTest(t, integrationTestCase{ description: "force namespace", release: "myapp", @@ -92,7 +92,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/kube_version_and_api_versions$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/kube_version_and_api_versions$ ./ runTest(t, integrationTestCase{ description: "kube_version_and_api_versions", release: "vers1", @@ -107,7 +107,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/disabled_inaccessible_chart_yaml_dep$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/disabled_inaccessible_chart_yaml_dep$ ./ runTest(t, integrationTestCase{ description: "disabled inaccessible chart yaml dep", release: "inaccessible1", @@ -131,7 +131,7 @@ func TestIntegration(t *testing.T) { // Local Chart // - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/local_chart_with_adhoc_dependency$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/local_chart_with_adhoc_dependency$ ./ runTest(t, integrationTestCase{ description: "local chart with adhoc dependency", release: "myapp", @@ -150,7 +150,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/local_chart_with_slash_at_the_end$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/local_chart_with_slash_at_the_end$ ./ // Related to https://github.com/helmfile/chartify/pull/13 runTest(t, integrationTestCase{ description: "local chart with slash at the end", @@ -173,7 +173,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/local_chart_with_dot_at_the_end$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/local_chart_with_dot_at_the_end$ ./ // Related to https://github.com/helmfile/chartify/pull/13 runTest(t, integrationTestCase{ description: "local chart with dot at the end", @@ -196,7 +196,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/local_chart_with_release_namespace$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/local_chart_with_release_namespace$ ./ // Related to https://github.com/helmfile/chartify/pull/13 runTest(t, integrationTestCase{ description: "local chart with release namespace", @@ -210,7 +210,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/local_chart_with_chart_name_unequal_to_dir_name$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/local_chart_with_chart_name_unequal_to_dir_name$ ./ // Related to https://github.com/helmfile/chartify/pull/13#issuecomment-1077431214 runTest(t, integrationTestCase{ description: "local chart with chart name unequal to dir name", @@ -224,7 +224,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/local_tgz_chart$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/local_tgz_chart$ ./ runTest(t, integrationTestCase{ description: "local tgz chart", release: "myapp", @@ -237,7 +237,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/local_chart_with_import_values$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/local_chart_with_import_values$ ./ runTest(t, integrationTestCase{ description: "local_chart_with_import_values", release: "myapp", @@ -248,7 +248,7 @@ func TestIntegration(t *testing.T) { // Kubernets Manifests // - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/kube_manifest_with_adhoc_dep$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/kube_manifest_with_adhoc_dep$ ./ runTest(t, integrationTestCase{ description: "kube_manifest_with_adhoc_dep", release: "myapp", @@ -267,7 +267,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/kube_manifest_with_patch$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/kube_manifest_with_patch$ ./ runTest(t, integrationTestCase{ description: "kube_manifest_with_patch", release: "myapp", @@ -289,7 +289,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/kube_manifest_yml_with_patch$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/kube_manifest_yml_with_patch$ ./ runTest(t, integrationTestCase{ description: "kube_manifest_yml_with_patch", release: "myapp", @@ -311,7 +311,7 @@ func TestIntegration(t *testing.T) { }, }) - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestIntegration/kube_manifest_transformer_alpha_plugin$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestIntegration/kube_manifest_transformer_alpha_plugin$ ./ runTest(t, integrationTestCase{ description: "kube_manifest_transformer_alpha_plugin", release: "myapp", @@ -369,7 +369,7 @@ func doTest(t *testing.T, tc integrationTestCase) { ctx := context.Background() - r := New(UseHelm3(true), HelmBin(helm)) + r := New(HelmBin(helm)) tmpDir, err := r.Chartify(tc.release, tc.chart, WithChartifyOpts(&tc.opts)) t.Cleanup(func() { @@ -408,7 +408,7 @@ func doTest(t *testing.T, tc integrationTestCase) { snapshotFile := filepath.Join("testdata", "integration", "testcases", strings.ReplaceAll(tc.description, " ", "_"), "want") // You can update the snapshot by running e.g.: - // SAVE_SNAPSHOT=1 go1.22 test -run ^TestFramework$ ./ + // SAVE_SNAPSHOT=1 go1.25 test -run ^TestFramework$ ./ if os.Getenv("SAVE_SNAPSHOT") != "" { testcaseDir := filepath.Dir(snapshotFile) err = os.MkdirAll(testcaseDir, 0755) diff --git a/patch.go b/patch.go index bea7364..086d5b8 100644 --- a/patch.go +++ b/patch.go @@ -326,7 +326,7 @@ resources: if len(crds) > 0 { var crdsDir string - if r.isHelm3 { + if r.IsHelm3() || r.IsHelm4() { crdsDir = filepath.Join(tempDir, "crds") } else { crdsDir = filepath.Join(tempDir, "templates") diff --git a/replace.go b/replace.go index 3546c07..d83cfd2 100644 --- a/replace.go +++ b/replace.go @@ -101,7 +101,7 @@ func (r *Runner) ReplaceWithRendered(name, chartName, chartPath string, o Replac var command string writtenFiles := map[string]bool{} - if r.isHelm3 { + if r.IsHelm3() || r.IsHelm4() { args := []string{ fmt.Sprintf("--debug=%v", o.Debug), fmt.Sprintf("--output-dir=%s", helmOutputDir), @@ -218,7 +218,7 @@ func (r *Runner) ReplaceWithRendered(name, chartName, chartPath string, o Replac // Note that this is the fix for adhoc chart dependencies. // The standard chart dependencies that are declared in the original Chart.yaml or requirements.yaml, // should have been downloaded by `helm fetch` that run in an even earlier phase of chartify. - if r.IsHelm3() { + if r.IsHelm3() || r.IsHelm4() { type ChartMeta struct { Dependencies []Dependency `yaml:"dependencies,omitempty"` Data map[string]interface{} `yaml:",inline"` diff --git a/requirements.go b/requirements.go index e3620c2..6a86414 100644 --- a/requirements.go +++ b/requirements.go @@ -59,7 +59,7 @@ func (r *Runner) UpdateRequirements(replace bool, chartYamlPath, tempDir string, var all []Dependency - if r.IsHelm3() { + if r.IsHelm3() || r.IsHelm4() { type ChartMeta struct { Dependencies []Dependency `yaml:"dependencies,omitempty"` Data map[string]interface{} `yaml:",inline"` diff --git a/runner.go b/runner.go index e0d744d..61eb0ca 100644 --- a/runner.go +++ b/runner.go @@ -22,6 +22,7 @@ type Runner struct { KustomizeBinary string isHelm3 bool + isHelm4 bool RunCommand RunCommandFunc @@ -53,6 +54,13 @@ func UseHelm3(u bool) Option { } } +func UseHelm4(u bool) Option { + return func(r *Runner) error { + r.isHelm4 = u + return nil + } +} + func WithLogf(logf func(string, ...interface{})) Option { return func(r *Runner) error { r.Logf = logf @@ -180,13 +188,32 @@ func (r *Runner) IsHelm3() bool { return sv.Major() == 3 } +func (r *Runner) IsHelm4() bool { + if r.isHelm4 { + return true + } + + // Support explicit opt-in via environment variable + if os.Getenv("HELM_X_HELM4") != "" { + return true + } + + // Autodetect from `helm version` + sv, err := r.DetectHelmVersion() + if err != nil { + panic(err) + } + + return sv.Major() == 4 +} + // DetectHelmVersion detects the version of Helm installed on the system. // It runs the `helm version` command and parses the output to extract the client version. // Returns the detected Helm version as a semver.Version object. // If an error occurs during the detection process, it returns an error. func (r *Runner) DetectHelmVersion() (*semver.Version, error) { - // Autodetect from `helm version` - out, err := r.run(nil, r.helmBin(), "version", "--client", "--short") + // Autodetect from `helm version` using template that works for both Helm 3 and 4 + out, err := r.run(nil, r.helmBin(), "version", "--template={{.Version}}+g{{.GitCommit}}") if err != nil { return nil, fmt.Errorf("error determining helm version: %w", err) } diff --git a/tempdir_test.go b/tempdir_test.go index bf64d9a..441a8c5 100644 --- a/tempdir_test.go +++ b/tempdir_test.go @@ -35,21 +35,21 @@ func TestGenerateID(t *testing.T) { release: "foo", chart: "incubator/raw", opts: ChartifyOpts{}, - want: "foo-5b569f58ff", + want: "foo-57669d77b", }) run(testcase{ release: "foo", chart: "stable/envoy", opts: ChartifyOpts{}, - want: "foo-7b5895898b", + want: "foo-6c769b499", }) run(testcase{ release: "bar", chart: "incubator/raw", opts: ChartifyOpts{}, - want: "bar-6c86897994", + want: "bar-7d49bf498c", }) run(testcase{ @@ -57,7 +57,7 @@ func TestGenerateID(t *testing.T) { opts: ChartifyOpts{ Namespace: "myns", }, - want: "myns-foo-564b5d8874", + want: "myns-foo-9c6f7fb79", }) for id, n := range ids { diff --git a/util_test.go b/util_test.go index 031f350..6a944c4 100644 --- a/util_test.go +++ b/util_test.go @@ -89,8 +89,8 @@ func TestFindSemVerInfo(t *testing.T) { }, { name: "helm version info with WARNING message", - version: "WARNING: both 'platformCommand' and 'command' are set in \"/snap/code/194/.local/share/helm/plugins/helm-secrets/plugin.yaml\" (this will become an error in a future Helm version)\nv3.18.3+g6838ebc", - want: "v3.18.3+g6838ebc", + version: "WARNING: both 'platformCommand' and 'command' are set in \"/snap/code/194/.local/share/helm/plugins/helm-secrets/plugin.yaml\" (this will become an error in a future Helm version)\nv4.0.0+g99cd196", + want: "v4.0.0+g99cd196", wantErr: false, }, }