From 39bd9b23a00703bb11aecbf04eaff77e33688bd2 Mon Sep 17 00:00:00 2001 From: Gianluca Mardente Date: Mon, 6 Jul 2026 19:12:36 +0200 Subject: [PATCH 1/2] (feat) Helm post-render strategies --- api/v1beta1/spec.go | 28 ++++++++++++ ...fig.projectsveltos.io_clusterprofiles.yaml | 11 +++++ ...g.projectsveltos.io_clusterpromotions.yaml | 11 +++++ ...ig.projectsveltos.io_clustersummaries.yaml | 11 +++++ .../config.projectsveltos.io_profiles.yaml | 11 +++++ controllers/export_test.go | 6 ++- controllers/handlers_helm.go | 10 +++++ controllers/handlers_helm_test.go | 38 ++++++++++++++++ manifest/manifest.yaml | 44 +++++++++++++++++++ 9 files changed, 168 insertions(+), 2 deletions(-) diff --git a/api/v1beta1/spec.go b/api/v1beta1/spec.go index fa068437..f30e1c66 100644 --- a/api/v1beta1/spec.go +++ b/api/v1beta1/spec.go @@ -151,6 +151,27 @@ const ( HelmChartActionUninstall = HelmChartAction("Uninstall") ) +// PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom +// are applied as a post-renderer during this HelmChart's install/upgrade. +// +kubebuilder:validation:Enum:=combined;separate;nohooks +type PostRenderStrategy string + +const ( + // PostRenderStrategyCombined sends hooks and regular templates together as a single + // stream to the post-renderer. This is Helm's own default. + PostRenderStrategyCombined = PostRenderStrategy("combined") + + // PostRenderStrategySeparate sends hooks and regular templates to the post-renderer + // in independent invocations. Use this to avoid duplicate-resource errors from + // post-renderers that de-duplicate by resource identity, such as Patches, when the + // same resource appears in both a hook and a regular template. + PostRenderStrategySeparate = PostRenderStrategy("separate") + + // PostRenderStrategyNoHooks sends only regular templates to the post-renderer and + // leaves hooks untouched. This matches Helm 3's behavior. + PostRenderStrategyNoHooks = PostRenderStrategy("nohooks") +) + type HelmOptions struct { // SkipCRDs controls whether CRDs should be installed during install/upgrade operation. // By default, CRDs are installed if not already present. @@ -233,6 +254,13 @@ type HelmOptions struct { // +optional RunTests bool `json:"runTests,omitempty"` + // PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + // are applied as a post-renderer during this chart's install/upgrade. Only relevant + // when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + // Helm's own default (combined) when unset. + // +optional + PostRenderStrategy PostRenderStrategy `json:"postRenderStrategy,omitempty"` + // HelmInstallOptions are options specific to helm install // +optional InstallOptions HelmInstallOptions `json:"installOptions,omitempty"` diff --git a/config/crd/bases/config.projectsveltos.io_clusterprofiles.yaml b/config/crd/bases/config.projectsveltos.io_clusterprofiles.yaml index 111f5ad2..14fc107e 100644 --- a/config/crd/bases/config.projectsveltos.io_clusterprofiles.yaml +++ b/config/crd/bases/config.projectsveltos.io_clusterprofiles.yaml @@ -339,6 +339,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- diff --git a/config/crd/bases/config.projectsveltos.io_clusterpromotions.yaml b/config/crd/bases/config.projectsveltos.io_clusterpromotions.yaml index 566fcf33..8ade4b54 100644 --- a/config/crd/bases/config.projectsveltos.io_clusterpromotions.yaml +++ b/config/crd/bases/config.projectsveltos.io_clusterpromotions.yaml @@ -239,6 +239,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- diff --git a/config/crd/bases/config.projectsveltos.io_clustersummaries.yaml b/config/crd/bases/config.projectsveltos.io_clustersummaries.yaml index 02cd63b5..85d9f2fa 100644 --- a/config/crd/bases/config.projectsveltos.io_clustersummaries.yaml +++ b/config/crd/bases/config.projectsveltos.io_clustersummaries.yaml @@ -376,6 +376,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- diff --git a/config/crd/bases/config.projectsveltos.io_profiles.yaml b/config/crd/bases/config.projectsveltos.io_profiles.yaml index 81a779fc..a3a18f3f 100644 --- a/config/crd/bases/config.projectsveltos.io_profiles.yaml +++ b/config/crd/bases/config.projectsveltos.io_profiles.yaml @@ -339,6 +339,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- diff --git a/controllers/export_test.go b/controllers/export_test.go index d4d29414..af23095b 100644 --- a/controllers/export_test.go +++ b/controllers/export_test.go @@ -258,11 +258,13 @@ var ( ) var ( - IsCRDEstablished = isCRDEstablished + IsCRDEstablished = isCRDEstablished + GetHelmUpgradeClient = getHelmUpgradeClient ) type ( - ReferencedObject = referencedObject + ReferencedObject = referencedObject + RegistryClientOptions = registryClientOptions ) // NewDeploymentContext constructs a deploymentContext for use in tests. diff --git a/controllers/handlers_helm.go b/controllers/handlers_helm.go index dc3f466b..9b48ae66 100644 --- a/controllers/handlers_helm.go +++ b/controllers/handlers_helm.go @@ -4077,6 +4077,14 @@ func getWaitHelmValue(options *configv1beta1.HelmOptions) bool { return false } +func getPostRenderStrategyValue(options *configv1beta1.HelmOptions) configv1beta1.PostRenderStrategy { + if options != nil { + return options.PostRenderStrategy + } + + return "" +} + func getWaitForJobsHelmValue(options *configv1beta1.HelmOptions) bool { if options != nil { return options.WaitForJobs @@ -4412,6 +4420,7 @@ func getHelmInstallClient(ctx context.Context, requestedChart *configv1beta1.Hel if len(patches) > 0 { installClient.PostRenderer = &patcher.CustomPatchPostRenderer{Patches: patches} + installClient.PostRenderStrategy = action.PostRenderStrategy(getPostRenderStrategyValue(requestedChart.Options)) } if templateOnly { @@ -4474,6 +4483,7 @@ func getHelmUpgradeClient(requestedChart *configv1beta1.HelmChart, actionConfig if len(patches) > 0 { upgradeClient.PostRenderer = &patcher.CustomPatchPostRenderer{Patches: patches} + upgradeClient.PostRenderStrategy = action.PostRenderStrategy(getPostRenderStrategyValue(requestedChart.Options)) } return upgradeClient diff --git a/controllers/handlers_helm_test.go b/controllers/handlers_helm_test.go index 699f83bc..cd7c06ab 100644 --- a/controllers/handlers_helm_test.go +++ b/controllers/handlers_helm_test.go @@ -30,6 +30,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "helm.sh/helm/v4/pkg/action" releasecommon "helm.sh/helm/v4/pkg/release/common" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -2312,3 +2313,40 @@ var _ = Describe("IsCRDEstablished", func() { Expect(controllers.IsCRDEstablished(obj)).To(BeFalse()) }) }) + +var _ = Describe("getHelmUpgradeClient PostRenderStrategy", func() { + It("sets PostRenderer and PostRenderStrategy when patches are present", func() { + requestedChart := &configv1beta1.HelmChart{ + ReleaseName: randomString(), + ReleaseNamespace: randomString(), + Options: &configv1beta1.HelmOptions{ + PostRenderStrategy: configv1beta1.PostRenderStrategySeparate, + }, + } + patches := []libsveltosv1beta1.Patch{ + {Patch: randomString()}, + } + + upgradeClient := controllers.GetHelmUpgradeClient(requestedChart, &action.Configuration{}, + &controllers.RegistryClientOptions{}, patches) + + Expect(upgradeClient.PostRenderer).ToNot(BeNil()) + Expect(upgradeClient.PostRenderStrategy).To(Equal(action.PostRenderStrategySeparate)) + }) + + It("leaves PostRenderer and PostRenderStrategy unset when no patches are present", func() { + requestedChart := &configv1beta1.HelmChart{ + ReleaseName: randomString(), + ReleaseNamespace: randomString(), + Options: &configv1beta1.HelmOptions{ + PostRenderStrategy: configv1beta1.PostRenderStrategySeparate, + }, + } + + upgradeClient := controllers.GetHelmUpgradeClient(requestedChart, &action.Configuration{}, + &controllers.RegistryClientOptions{}, nil) + + Expect(upgradeClient.PostRenderer).To(BeNil()) + Expect(upgradeClient.PostRenderStrategy).To(Equal(action.PostRenderStrategyCombined)) + }) +}) diff --git a/manifest/manifest.yaml b/manifest/manifest.yaml index c50d694c..0d48ce0a 100644 --- a/manifest/manifest.yaml +++ b/manifest/manifest.yaml @@ -648,6 +648,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- @@ -2825,6 +2836,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- @@ -6016,6 +6038,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- @@ -8228,6 +8261,17 @@ spec: description: PassCredentialsAll is the flag to pass credentials to all domains type: boolean + postRenderStrategy: + description: |- + PostRenderStrategy controls whether Helm hooks are included when Patches/PatchesFrom + are applied as a post-renderer during this chart's install/upgrade. Only relevant + when Patches or PatchesFrom is set on the Spec; ignored otherwise. Defaults to + Helm's own default (combined) when unset. + enum: + - combined + - separate + - nohooks + type: string runTests: default: false description: |- From aa8abd20d9a28b0cdee8a068fdea7db6de7df708 Mon Sep 17 00:00:00 2001 From: Gianluca Mardente Date: Wed, 8 Jul 2026 09:09:53 +0200 Subject: [PATCH 2/2] chore: advance golang to v1.26.5 --- .devcontainer/devcontainer.json | 2 +- .github/workflows/main.yaml | 18 +++++++++--------- Dockerfile | 2 +- Dockerfile_WithGit | 2 +- go.mod | 10 +++++----- go.sum | 16 ++++++++-------- hack/tools/go.mod | 2 +- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3cd9959e..96bf58c6 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -8,7 +8,7 @@ "dockerfile": "${localWorkspaceFolder}/.devcontainer/Dockerfile", "context": "${localWorkspaceFolder}", "args": { - "GO_VERSION": "1.26.4", + "GO_VERSION": "1.26.5", "KUBECTX_VERSION": "0.9.5", "SVELTOSCTL_VERSION": "0.53.0" } diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 8495fd05..bcde1949 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -17,7 +17,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Build run: make build - name: FMT @@ -36,7 +36,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: ut run: make test env: @@ -49,7 +49,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: @@ -77,7 +77,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: @@ -105,7 +105,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: @@ -133,7 +133,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: @@ -161,7 +161,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: @@ -189,7 +189,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: @@ -217,7 +217,7 @@ jobs: - name: Set up Go uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0 with: - go-version: 1.26.4 + go-version: 1.26.5 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@main with: diff --git a/Dockerfile b/Dockerfile index e1ba1a5c..7e4c74fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.26.4 AS builder +FROM golang:1.26.5 AS builder ARG BUILDOS ARG TARGETARCH diff --git a/Dockerfile_WithGit b/Dockerfile_WithGit index 9fb44c95..2e19370f 100644 --- a/Dockerfile_WithGit +++ b/Dockerfile_WithGit @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.26.4 AS builder +FROM golang:1.26.5 AS builder ARG BUILDOS ARG TARGETARCH diff --git a/go.mod b/go.mod index 67446241..4e1f9373 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/projectsveltos/addon-controller -go 1.26.4 +go 1.26.5 require ( dario.cat/mergo v1.0.2 @@ -11,7 +11,7 @@ require ( github.com/fluxcd/pkg/apis/meta v1.31.0 github.com/fluxcd/pkg/http/fetch v0.25.0 github.com/fluxcd/pkg/tar v1.2.0 - github.com/fluxcd/source-controller/api v1.9.1 + github.com/fluxcd/source-controller/api v1.9.2 github.com/gdexlab/go-render v1.0.1 github.com/go-logr/logr v1.4.3 github.com/google/go-containerregistry v0.21.7 @@ -27,7 +27,7 @@ require ( github.com/sigstore/sigstore v1.10.8 github.com/spf13/pflag v1.0.10 github.com/yuin/gopher-lua v1.1.2 - golang.org/x/text v0.38.0 + golang.org/x/text v0.39.0 helm.sh/helm/v4 v4.2.2 k8s.io/api v0.36.2 k8s.io/apiextensions-apiserver v0.36.2 @@ -36,7 +36,7 @@ require ( k8s.io/client-go v0.36.2 k8s.io/component-base v0.36.2 k8s.io/klog/v2 v2.140.0 - k8s.io/utils v0.0.0-20260626114624-be93311217bd + k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 oras.land/oras-go/v2 v2.6.1 sigs.k8s.io/cluster-api v1.13.3 sigs.k8s.io/controller-runtime v0.24.1 @@ -284,7 +284,7 @@ require ( golang.org/x/sys v0.46.0 // indirect golang.org/x/term v0.44.0 // indirect golang.org/x/time v0.15.0 // indirect - golang.org/x/tools v0.46.0 // indirect + golang.org/x/tools v0.47.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260523011958-0a33c5d7ca68 // indirect diff --git a/go.sum b/go.sum index 5a318e15..d1e2805f 100644 --- a/go.sum +++ b/go.sum @@ -289,8 +289,8 @@ github.com/fluxcd/pkg/tar v1.2.0 h1:T6WFB5M0YRHktlrgdKNskqpdp76TVDdWTOeuWz33CFs= github.com/fluxcd/pkg/tar v1.2.0/go.mod h1:Wlalp5vIVe+BbckkKkqExKcoHAeeWJPAzwK7ONeFcS0= github.com/fluxcd/pkg/testserver v0.14.0 h1:wVv/JPY3i4OEJ8xakfriuN2oHiUyZZ+BfhC/6RCD2nI= github.com/fluxcd/pkg/testserver v0.14.0/go.mod h1:6D6/SeGl8jT8L8pb5+k+mkE5CtqV1ozC5uqXRuTEBas= -github.com/fluxcd/source-controller/api v1.9.1 h1:04Elx6/iFwgNOmrymfetaDfFFBqw5/LfoiTgyeLlrqQ= -github.com/fluxcd/source-controller/api v1.9.1/go.mod h1:qO98L20gw0MvLpSPapJKypyxHP7PejmJN5KxWXxDjCA= +github.com/fluxcd/source-controller/api v1.9.2 h1:t7P7gzbVE66sfw6oHMSzsp0bH0WdMFf6RvgUW1clCI4= +github.com/fluxcd/source-controller/api v1.9.2/go.mod h1:qO98L20gw0MvLpSPapJKypyxHP7PejmJN5KxWXxDjCA= github.com/foxcpp/go-mockdns v1.2.0 h1:omK3OrHRD1IWJz1FuFBCFquhXslXoF17OvBS6JPzZF0= github.com/foxcpp/go-mockdns v1.2.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -1001,8 +1001,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= +golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= +golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1017,8 +1017,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.46.0 h1:7jTurBkPZu4moS/Uy4OQT1M+QBlsj3wejyZwsT8Z7rk= -golang.org/x/tools v0.46.0/go.mod h1:FrD85F8l+NWL+9XWBSyVSHO6Ne4jutsfIFba7AWQ5Ys= +golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= +golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= 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= @@ -1109,8 +1109,8 @@ k8s.io/kubectl v0.36.1 h1:96HqS9twIdHM0MlJLTwbo14b9kUKPkOzZ4tlRDLv4qI= k8s.io/kubectl v0.36.1/go.mod h1:/DGPAIewKsFWF9VFgGvkPhao2Ev4SNuE3BioZo8yPbk= k8s.io/streaming v0.36.2 h1:NSKthPPg9UFSKsRauVJUVGH2Dvn8fhKmY4qrMkw/p98= k8s.io/streaming v0.36.2/go.mod h1:z6fV3D+NVkoeqRMtWwlUZK6U17SY/LqNzOxWL6GyR/s= -k8s.io/utils v0.0.0-20260626114624-be93311217bd h1:Ea7fgQ5we8Y9T0OX5o0dAHzQOBRI07D/dEYRaB9ZZEs= -k8s.io/utils v0.0.0-20260626114624-be93311217bd/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3 h1:jVkFFVfXdXP74B/zbO3hM3hpSFD0xvhQ5U686DPurkE= +k8s.io/utils v0.0.0-20260707023825-cf1189d6abe3/go.mod h1:M2s5JB1lIYP3jzZdorPLHXIPJzt9vv2muW5a6L9DtNM= oras.land/oras-go/v2 v2.6.1 h1:bonOEkjLfp8tt6qXWRRWP6p1F+9octchOf2EqnWB4Zs= oras.land/oras-go/v2 v2.6.1/go.mod h1:dhtFrFOuZuDtAVeZ9FUnaa5zfzplG3ZnFX9/uH1J/Yk= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.34.0 h1:hSfpvjjTQXQY2Fol2CS0QHMNs/WI1MOSGzCm1KhM5ec= diff --git a/hack/tools/go.mod b/hack/tools/go.mod index 87641b89..bac4ccc0 100644 --- a/hack/tools/go.mod +++ b/hack/tools/go.mod @@ -1,6 +1,6 @@ module github.com/projectsveltos/addon-controller/hack/tools -go 1.26.4 +go 1.26.5 require ( github.com/a8m/envsubst v1.4.3