From 9c00867e3e3f13d132eb0f0cce991a5cb6a6f2d1 Mon Sep 17 00:00:00 2001 From: Xu Deng Date: Fri, 29 Sep 2023 16:45:02 +0000 Subject: [PATCH] Refactor copy packages command to support regional ECR --- cmd/eksctl-anywhere/cmd/copypackages.go | 340 ++++++++++-------- cmd/eksctl-anywhere/cmd/copypackages_test.go | 63 ++++ .../airgapped/airgap-packages.md | 17 + .../getting-started/airgapped/airgap-steps.md | 22 +- .../en/docs/reference/eksctl/anywhere_copy.md | 2 +- .../eksctl/anywhere_copy_packages.md | 18 +- docs/themes/docsy | 2 +- go.mod | 3 + go.sum | 34 ++ 9 files changed, 332 insertions(+), 169 deletions(-) create mode 100644 cmd/eksctl-anywhere/cmd/copypackages_test.go create mode 100644 docs/content/en/docs/getting-started/airgapped/airgap-packages.md diff --git a/cmd/eksctl-anywhere/cmd/copypackages.go b/cmd/eksctl-anywhere/cmd/copypackages.go index 97c77c103bc21..ba76f58fb8b7f 100644 --- a/cmd/eksctl-anywhere/cmd/copypackages.go +++ b/cmd/eksctl-anywhere/cmd/copypackages.go @@ -1,188 +1,107 @@ package cmd import ( + "bytes" "context" + "crypto/tls" + "encoding/json" "fmt" - "log" - "os" + "net/http" "strings" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/spf13/cobra" "gopkg.in/yaml.v2" + "helm.sh/helm/v3/pkg/chart/loader" + helmRegistry "helm.sh/helm/v3/pkg/registry" + "oras.land/oras-go/v2" + "oras.land/oras-go/v2/registry/remote" + "oras.land/oras-go/v2/registry/remote/auth" - "github.com/aws/eks-anywhere/pkg/config" + packagesv1 "github.com/aws/eks-anywhere-packages/api/v1alpha1" "github.com/aws/eks-anywhere/pkg/curatedpackages" - "github.com/aws/eks-anywhere/pkg/dependencies" "github.com/aws/eks-anywhere/pkg/executables" "github.com/aws/eks-anywhere/pkg/logger" - "github.com/aws/eks-anywhere/pkg/manifests/bundles" "github.com/aws/eks-anywhere/pkg/registry" ) // copyPackagesCmd is the context for the copy packages command. var copyPackagesCmd = &cobra.Command{ Use: "packages ", - Short: "Copy curated package images and charts from a source to a destination", - Long: `Copy all the EKS Anywhere curated package images and helm charts from a source to a destination.`, + Short: "Copy curated package images and charts from source regisries to a destination registry", + Long: `Copy all the EKS Anywhere curated package images and helm charts from source registries to a destination registry. Registry credentials are fetched from docker config.`, SilenceUsage: true, RunE: runCopyPackages, Args: func(cmd *cobra.Command, args []string) error { if err := cobra.ExactArgs(1)(cmd, args); err != nil { - return fmt.Errorf("A destination must be specified as an argument") + return fmt.Errorf("A destination registry must be specified as an argument") } return nil }, } +var cs = registry.NewCredentialStore() + func init() { copyCmd.AddCommand(copyPackagesCmd) - copyPackagesCmd.Flags().StringVarP(©PackagesCommand.bundleFile, "bundle", "b", "", "EKS-A bundle file to read artifact dependencies from") - if err := copyPackagesCmd.MarkFlagRequired("bundle"); err != nil { - log.Fatalf("Cannot mark 'bundle' flag as required: %s", err) + copyPackagesCmd.Flags().StringVar(&cpc.srcImageRegistry, "src-image-registry", "", "The source registry that stores container images") + if err := copyPackagesCmd.MarkFlagRequired("src-image-registry"); err != nil { + logger.Fatal(err, "Cannot mark flag as required") + } + copyPackagesCmd.Flags().StringVar(&cpc.kubeVersion, "kube-version", "", "The kube version of the package bundle to copy") + if err := copyPackagesCmd.MarkFlagRequired("kube-version"); err != nil { + logger.Fatal(err, "Cannot mark flag as required") + } + copyPackagesCmd.Flags().StringVar(&cpc.srcChartRegistry, "src-chart-registry", "", "The source registry that stores helm charts (default src-image-registry)") + copyPackagesCmd.Flags().BoolVar(&cpc.dstPlainHTTP, "dst-plain-http", false, "Whether to use plain http for destination registry") + copyPackagesCmd.Flags().BoolVar(&cpc.dstInsecure, "dst-insecure", false, "Skip TLS verification against the destination registry") + copyPackagesCmd.Flags().BoolVar(&cpc.dryRun, "dry-run", false, "Dry run will not really copy the artifacts, but shows what artifacts would be copied") + + // making oras client to use dockerconfig + if err := cs.Init(); err != nil { + panic(err) + } + auth.DefaultClient.Credential = func(ctx context.Context, registry string) (auth.Credential, error) { + return cs.Credential(registry) } - copyPackagesCmd.Flags().StringVarP(©PackagesCommand.dstCert, "dst-cert", "", "", "TLS certificate for destination registry") - copyPackagesCmd.Flags().StringVarP(©PackagesCommand.srcCert, "src-cert", "", "", "TLS certificate for source registry") - copyPackagesCmd.Flags().BoolVar(©PackagesCommand.insecure, "insecure", false, "Skip TLS verification while copying images and charts") - copyPackagesCmd.Flags().BoolVar(©PackagesCommand.dryRun, "dry-run", false, "Dry run copy to print images that would be copied") - copyPackagesCmd.Flags().StringVarP(©PackagesCommand.awsRegion, "aws-region", "", os.Getenv(config.EksaRegionEnv), "Region to copy images from") } -var copyPackagesCommand = CopyPackagesCommand{} +var cpc = copyPackagesConfig{} var publicPackages = []string{"ecr-token-refresher", "eks-anywhere-packages", "credential-provider-package"} -// CopyPackagesCommand copies packages specified in a bundle to a destination. -type CopyPackagesCommand struct { - destination string - bundleFile string - srcCert string - dstCert string - insecure bool - dryRun bool - awsRegion string - registryCache *registry.Cache +// copyPackagesConfig copies packages specified in a bundle to a destination. +type copyPackagesConfig struct { + destRegistry string + srcImageRegistry string + srcChartRegistry string + kubeVersion string + dstPlainHTTP bool + dstInsecure bool + dryRun bool } func runCopyPackages(_ *cobra.Command, args []string) error { - ctx := context.Background() - copyPackagesCommand.destination = args[0] - - credentialStore := registry.NewCredentialStore() - err := credentialStore.Init() - if err != nil { - return err - } - - return copyPackagesCommand.call(ctx, credentialStore) -} - -func (c CopyPackagesCommand) call(ctx context.Context, credentialStore *registry.CredentialStore) error { - factory := dependencies.NewFactory() - deps, err := factory. - WithExecutableImage(). - WithManifestReader(). - WithHelm(). - Build(ctx) - if err != nil { - return err - } - defer deps.Close(ctx) - - eksaBundle, err := bundles.Read(deps.ManifestReader, c.bundleFile) - if err != nil { - return err - } - - c.registryCache = registry.NewCache() - bundleReader := curatedpackages.NewPackageReader(c.registryCache, credentialStore, c.awsRegion) - - // Note: package bundle yaml file is included by charts below - charts := bundleReader.ReadChartsFromBundles(ctx, eksaBundle) - tags, err := getTagsFromCharts(ctx, deps.Helm, charts) - if err != nil { - return err - } - - certificates, err := registry.GetCertificates(c.dstCert) - if err != nil { - return err - } - - dstContext := registry.NewStorageContext(c.destination, credentialStore, certificates, c.insecure) - dstRegistry, err := c.registryCache.Get(dstContext) - if err != nil { - return fmt.Errorf("error with repository %s: %v", c.destination, err) - } - - logger.V(0).Info("Copying curated packages helm charts from public ECR to destination", "destination", c.destination) - if err = c.copyArtifacts(ctx, func(a registry.Artifact) registry.StorageClient { - return dstRegistry - }, credentialStore, charts); err != nil { - return err + cpc.destRegistry = args[0] + if cpc.srcChartRegistry == "" { + cpc.srcChartRegistry = cpc.srcImageRegistry } - - imageList, err := bundleReader.ReadImagesFromBundles(ctx, eksaBundle) + ctx := context.Background() + bundle, err := getPackageBundle(ctx, cpc.srcChartRegistry, cpc.kubeVersion) if err != nil { - return err - } - addTags(imageList, tags) - - logger.V(0).Info("Copying curated packages images from private ECR to destination", "destination", c.destination) - publicRepoPrefix := strings.Split(charts[0].Repository, "/")[0] + "/" - return c.copyArtifacts(ctx, func(a registry.Artifact) registry.StorageClient { - // private curated packages should go to curated-packages - dstRegistry.SetProject("curated-packages/") - for _, pp := range publicPackages { - if strings.HasSuffix(a.Repository, pp) { - // public curated packages images should go to publicRepo/* - dstRegistry.SetProject(publicRepoPrefix) - } - } - return dstRegistry - }, credentialStore, imageList) -} - -func addTags(images []registry.Artifact, tags map[string]string) { - for idx, i := range images { - if tag, ok := tags[i.Digest]; ok { - images[idx].Tag = tag - } + return fmt.Errorf("cannot fetch package bundle: %w", err) } -} - -func (c CopyPackagesCommand) copyArtifacts(ctx context.Context, getDstRegistry func(registry.Artifact) registry.StorageClient, credentialStore *registry.CredentialStore, artifacts []registry.Artifact) error { - certificates, err := registry.GetCertificates(c.srcCert) - if err != nil { + if err := copyArtifacts(context.Background(), bundle); err != nil { return err } - for _, a := range artifacts { - host := a.Registry - - srcContext := registry.NewStorageContext(host, credentialStore, certificates, c.insecure) - srcRegistry, err := c.registryCache.Get(srcContext) - if err != nil { - return fmt.Errorf("error with repository %s: %v", host, err) - } - - dstRegistry := getDstRegistry(a) - - artifact := registry.NewArtifact(a.Registry, a.Repository, a.Tag, a.Digest) - logger.V(0).Info("Copying image to destination", "destination", dstRegistry.Destination(artifact)) - if c.dryRun { - continue - } - - err = registry.Copy(ctx, srcRegistry, dstRegistry, artifact) - if err != nil { - return err - } - } - return nil + // copy package bundle yaml after charts and images + tag := getPackageBundleTag(cpc.kubeVersion) + _, err = orasCopy(ctx, curatedpackages.ImageRepositoryName, cpc.srcChartRegistry, tag, cpc.destRegistry, tag) + return err } -// Since package bundle doesn't contain tags, we get tags from chart values. func getTagsFromCharts(ctx context.Context, helm *executables.Helm, charts []registry.Artifact) (map[string]string, error) { tags := make(map[string]string) for _, chart := range charts { @@ -190,12 +109,12 @@ func getTagsFromCharts(ctx context.Context, helm *executables.Helm, charts []reg // only public package charts may contain tags info if strings.HasSuffix(chart.Repository, "/"+pp) { url := "oci://" + chart.Registry + "/" + chart.Repository - values, err := helm.ShowValues(ctx, url, chart.Tag) + values, err := getChartValues(url) if err != nil { return nil, err } - err = getTagsFromChartValues(values.Bytes(), tags) + err = getTagsFromChartValues(values, tags) if err != nil { return nil, err } @@ -205,13 +124,8 @@ func getTagsFromCharts(ctx context.Context, helm *executables.Helm, charts []reg return tags, nil } -func getTagsFromChartValues(chartValues []byte, res map[string]string) error { - type nodeType = map[interface{}]interface{} - m := make(nodeType) - - if err := yaml.Unmarshal(chartValues, &m); err != nil { - return err - } +func getTagsFromChartValues(chartValues map[string]any, res map[string]string) error { + type nodeType = map[string]interface{} var dfs func(nodeType, map[string]string) dfs = func(node nodeType, res map[string]string) { @@ -225,13 +139,141 @@ func getTagsFromChartValues(chartValues []byte, res map[string]string) error { continue } res[vv["digest"].(string)] = vv["tag"].(string) - } else { - dfs(vv, res) } + dfs(vv, res) } } } - dfs(m, res) + dfs(chartValues, res) return nil } + +func getPackageBundleTag(kubeVersion string) string { + return "v" + strings.Replace(kubeVersion, ".", "-", -1) + "-latest" +} + +func getPackageBundle(ctx context.Context, registry, kubeVersion string) (*packagesv1.PackageBundle, error) { + repo, err := remote.NewRepository(registry + "/" + curatedpackages.ImageRepositoryName) + if err != nil { + return nil, err + } + tag := getPackageBundleTag(kubeVersion) + _, data, err := oras.FetchBytes(ctx, repo, tag, oras.DefaultFetchBytesOptions) + if err != nil { + return nil, err + } + + var mani ocispec.Manifest + if err := json.Unmarshal(data, &mani); err != nil { + return nil, fmt.Errorf("unmarshal manifest: %v", err) + } + if len(mani.Layers) < 1 { + return nil, fmt.Errorf("missing layer") + } + + _, data, err = oras.FetchBytes(ctx, repo.Blobs(), string(mani.Layers[0].Digest), oras.DefaultFetchBytesOptions) + if err != nil { + return nil, err + } + + bundle := packagesv1.PackageBundle{} + err = yaml.Unmarshal(data, &bundle) + if err != nil { + return nil, err + } + return &bundle, nil +} + +func copyArtifacts(ctx context.Context, bundle *packagesv1.PackageBundle) error { + for _, p := range bundle.Spec.Packages { + for _, v := range p.Source.Versions { + chartTag := v.Name + url := cpc.srcChartRegistry + "/" + p.Source.Repository + values, err := getChartValues(url + ":" + chartTag) + if err != nil { + return fmt.Errorf("cannot get chart values %s: %w", url+":"+chartTag, err) + } + + tags := make(map[string]string) + if err = getTagsFromChartValues(values, tags); err != nil { + return fmt.Errorf("cannot get tags from chart values: %w", err) + } + _, err = orasCopy(ctx, p.Source.Repository, cpc.srcChartRegistry, chartTag, cpc.destRegistry, chartTag) + if err != nil { + return fmt.Errorf("cannot copy chart to repo: %w", err) + } + if err := copyImages(ctx, v.Images, tags); err != nil { + return fmt.Errorf("cannot process images: %w", err) + } + } + } + return nil +} + +func copyImages(ctx context.Context, images []packagesv1.VersionImages, tags map[string]string) error { + for _, i := range images { + dstRef := i.Digest + if t, ok := tags[i.Digest]; ok { + logger.V(0).Info("Using tag as the reference for digest", "tag", t, "digest", i.Digest) + dstRef = t + } + _, err := orasCopy(ctx, i.Repository, cpc.srcImageRegistry, i.Digest, cpc.destRegistry, dstRef) + if err != nil { + return fmt.Errorf("cannot copy image to repo: %w", err) + } + } + return nil +} + +func getChartValues(chartURL string) (map[string]interface{}, error) { + helmClient, err := helmRegistry.NewClient() + if err != nil { + return nil, err + } + res, err := helmClient.Pull(chartURL) + if err != nil { + return nil, err + } + chart, _ := loader.LoadArchive(bytes.NewReader(res.Chart.Data)) + return chart.Values, nil +} + +func orasCopy(ctx context.Context, repo, srcRegistry, srcRef, dstRegistry, dstRef string) (ocispec.Descriptor, error) { + logger.V(0).Info("Copying artifact", "from", srcRegistry+"/"+repo, "to", dstRegistry+"/"+repo, "dstRef", dstRef) + + if cpc.dryRun { + return ocispec.Descriptor{}, nil + } + + src, err := remote.NewRepository(srcRegistry + "/" + repo) + if err != nil { + return ocispec.Descriptor{}, err + } + + dst, err := remote.NewRepository(dstRegistry + "/" + repo) + if err != nil { + return ocispec.Descriptor{}, err + } + setUpDstRepo(dst, &cpc) + + return oras.Copy(ctx, src, srcRef, dst, dstRef, oras.DefaultCopyOptions) +} + +func setUpDstRepo(dst *remote.Repository, c *copyPackagesConfig) { + dst.PlainHTTP = c.dstPlainHTTP + dst.Client = &auth.Client{ + Client: &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: c.dstInsecure}, + }, + }, + Header: http.Header{ + "User-Agent": {"oras-go"}, + }, + Cache: auth.DefaultCache, + Credential: func(ctx context.Context, registry string) (auth.Credential, error) { + return cs.Credential(registry) + }, + } +} diff --git a/cmd/eksctl-anywhere/cmd/copypackages_test.go b/cmd/eksctl-anywhere/cmd/copypackages_test.go new file mode 100644 index 0000000000000..3507be4acd76b --- /dev/null +++ b/cmd/eksctl-anywhere/cmd/copypackages_test.go @@ -0,0 +1,63 @@ +package cmd + +import ( + "net/http" + "testing" + + "oras.land/oras-go/v2/registry/remote" + "oras.land/oras-go/v2/registry/remote/auth" +) + +func TestGetTagsFromChartValues(t *testing.T) { + res := make(map[string]string) + chartValues := map[string]any{ + "controller1": map[string]any{ + "tag": "testtag1", + "digest": "testdiget1", + }, + "controller2": map[string]any{ + "tag": "testtag2", + "digest": "testdiget2", + "controller3": map[string]any{ + "tag": "testtag3", + "digest": "testdiget3", + }, + }, + } + err := getTagsFromChartValues(chartValues, res) + if err != nil { + t.Error(err) + } + if res["testdiget1"] != "testtag1" { + t.Errorf("Expected tag has not be found") + } + if res["testdiget2"] != "testtag2" { + t.Errorf("Expected tag has not be found") + } + if res["testdiget3"] != "testtag3" { + t.Errorf("Expected tag has not be found") + } +} + +func TestGetPackageBundleTag(t *testing.T) { + tag := getPackageBundleTag("1.27") + if tag != "v1-27-latest" { + t.Errorf("Expected tag v1-27-latest, got %s", tag) + } +} + +func TestSetupDstRepo(t *testing.T) { + dst, err := remote.NewRepository("localhost:5000/hello-world") + if err != nil { + t.Error(err) + } + cpc := ©PackagesConfig{dstPlainHTTP: true, dstInsecure: true} + setUpDstRepo(dst, cpc) + if dst.PlainHTTP != true { + t.Errorf("Expect PlainHTTP to be true") + } + + if dst.Client.(*auth.Client).Client.Transport.(*http.Transport).TLSClientConfig.InsecureSkipVerify != true { + t.Errorf("Expect InsecureSkipVerify to be true") + } +} diff --git a/docs/content/en/docs/getting-started/airgapped/airgap-packages.md b/docs/content/en/docs/getting-started/airgapped/airgap-packages.md new file mode 100644 index 0000000000000..116df55df640e --- /dev/null +++ b/docs/content/en/docs/getting-started/airgapped/airgap-packages.md @@ -0,0 +1,17 @@ +--- +toc_hide: true +--- + +If your EKSA cluster is running in an airgapped environment and you set up a local registry mirror, you can copy curated packages from Amazon ECR to your local registry mirror with the following command. + +The `$REGISTRY_MIRROR_URL` value must have the same endpoint and port as of the values defined in `registryMirrorConfiguration` of your EKS Anywhere cluster specification. And `$KUBEVERSION` must equals to the `spec.kubernetesVersion` of your EKS Anywhere cluster specification. + +The `copy packages` command uses the credentials in your docker config file. So you must `docker login` the source registries and the destination registry before running the command. + +```bash +eksctl anywhere copy packages \ + ${REGISTRY_MIRROR_URL} + --kube-version $KUBEVERSION \ + --src-chart-registry public.ecr.aws/eks-anywhere \ + --src-image-registry 783794618700.dkr.ecr.us-west-2.amazonaws.com +``` \ No newline at end of file diff --git a/docs/content/en/docs/getting-started/airgapped/airgap-steps.md b/docs/content/en/docs/getting-started/airgapped/airgap-steps.md index f9ccd58f8c380..9b013f4b53490 100644 --- a/docs/content/en/docs/getting-started/airgapped/airgap-steps.md +++ b/docs/content/en/docs/getting-started/airgapped/airgap-steps.md @@ -31,14 +31,18 @@ toc_hide: true
Expand for curated packages instructions - If you are running in an airgapped environment and you set up a local registry mirror, you can copy curated packages from Amazon ECR to your local registry mirror with the following command. - The `$BUNDLE_RELEASE_YAML_PATH` should be set to the `eks-anywhere-downloads/bundle-release.yaml` location where you unpacked the tarball from the`eksctl anywhere download artifacts` command. The `$REGISTRY_MIRROR_CERT_PATH` and `$REGISTRY_MIRROR_URL` values must be the same as the `registryMirrorConfiguration` in your EKS Anywhere cluster specification. - - ```bash - eksctl anywhere copy packages \ - --bundle ${BUNDLE_RELEASE_YAML_PATH} \ - --dst-cert ${REGISTRY_MIRROR_CERT_PATH} \ - ${REGISTRY_MIRROR_URL} - ``` + If your EKSA cluster is running in an airgapped environment and you set up a local registry mirror, you can copy curated packages from Amazon ECR to your local registry mirror with the following command. + + `$KUBEVERSION` must equals to the `spec.kubernetesVersion` of your EKS Anywhere cluster specification. + + `copy packages` command uses the credentials in your docker config file. So you must `docker login` the source registries and the destination registry before running the command. + + ```bash + eksctl anywhere copy packages \ + ${REGISTRY_MIRROR_URL}/curated-packages \ + --kube-version $KUBEVERSION \ + --src-chart-registry public.ecr.aws/eks-anywhere \ + --src-image-registry 783794618700.dkr.ecr.us-west-2.amazonaws.com + ```
diff --git a/docs/content/en/docs/reference/eksctl/anywhere_copy.md b/docs/content/en/docs/reference/eksctl/anywhere_copy.md index 4c52c3d5a36ba..fee3f5e2079c2 100644 --- a/docs/content/en/docs/reference/eksctl/anywhere_copy.md +++ b/docs/content/en/docs/reference/eksctl/anywhere_copy.md @@ -26,5 +26,5 @@ Copy EKS Anywhere resources and artifacts ### SEE ALSO * [anywhere](../anywhere/) - Amazon EKS Anywhere -* [anywhere copy packages](../anywhere_copy_packages/) - Copy curated package images and charts from a source to a destination +* [anywhere copy packages](../anywhere_copy_packages/) - Copy curated package images and charts from source regisries to a destination registry diff --git a/docs/content/en/docs/reference/eksctl/anywhere_copy_packages.md b/docs/content/en/docs/reference/eksctl/anywhere_copy_packages.md index a525b697406b1..fd12a79b13140 100644 --- a/docs/content/en/docs/reference/eksctl/anywhere_copy_packages.md +++ b/docs/content/en/docs/reference/eksctl/anywhere_copy_packages.md @@ -5,11 +5,11 @@ linkTitle: "anywhere copy packages" ## anywhere copy packages -Copy curated package images and charts from a source to a destination +Copy curated package images and charts from source regisries to a destination registry ### Synopsis -Copy all the EKS Anywhere curated package images and helm charts from a source to a destination. +Copy all the EKS Anywhere curated package images and helm charts from source registries to a destination registry. Registry credentials are fetched from docker config. ``` anywhere copy packages [flags] @@ -18,13 +18,13 @@ anywhere copy packages [flags] ### Options ``` - --aws-region string Region to copy images from - -b, --bundle string EKS-A bundle file to read artifact dependencies from - --dry-run Dry run copy to print images that would be copied - --dst-cert string TLS certificate for destination registry - -h, --help help for packages - --insecure Skip TLS verification while copying images and charts - --src-cert string TLS certificate for source registry + --dry-run Dry run will not really copy the artifacts, but shows what artifacts would be copied + --dst-insecure Skip TLS verification against the destination registry + --dst-plain-http Whether to use plain http for destination registry + -h, --help help for packages + --kube-version string The kube version of the package bundle to copy + --src-chart-registry string The source registry that stores helm charts + --src-image-registry string The source registry that stores container images ``` ### Options inherited from parent commands diff --git a/docs/themes/docsy b/docs/themes/docsy index 033225e5174d5..891efb563039e 160000 --- a/docs/themes/docsy +++ b/docs/themes/docsy @@ -1 +1 @@ -Subproject commit 033225e5174d50828c565b66d992c7b5d55ba42a +Subproject commit 891efb563039e0def8e3030df1c5dd45b69e08c4 diff --git a/go.mod b/go.mod index b527fb172e8f2..43795dddc6b31 100644 --- a/go.mod +++ b/go.mod @@ -50,6 +50,7 @@ require ( gopkg.in/square/go-jose.v2 v2.6.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 + helm.sh/helm/v3 v3.11.3 k8s.io/api v0.26.2 k8s.io/apimachinery v0.26.2 k8s.io/apiserver v0.26.2 @@ -67,6 +68,8 @@ require ( sigs.k8s.io/yaml v1.3.0 ) +require github.com/Masterminds/semver/v3 v3.2.0 // indirect + require ( github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect diff --git a/go.sum b/go.sum index 7c2f864983dbf..45adcdcec8d9c 100644 --- a/go.sum +++ b/go.sum @@ -429,6 +429,8 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= @@ -933,6 +935,7 @@ github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDB github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= @@ -941,6 +944,7 @@ github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL9 github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -1577,6 +1581,7 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -1846,6 +1851,7 @@ go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= @@ -1898,6 +1904,8 @@ golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2222,6 +2230,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2234,6 +2244,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2252,6 +2264,7 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2657,6 +2670,10 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81 gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= +helm.sh/helm/v3 v3.11.3 h1:n1X5yaQTP5DYywlBOZMl2gX398Gp6YwFp/IAVj6+5D4= +helm.sh/helm/v3 v3.11.3/go.mod h1:S+sOdQc3BLvt09a9rSlKKVs9x0N/yx+No0y3qFw+FQ8= +helm.sh/helm/v3 v3.12.3 h1:5y1+Sbty12t48T/t/CGNYUIME5BJ0WKfmW/sobYqkFg= +helm.sh/helm/v3 v3.12.3/go.mod h1:KPKQiX9IP5HX7o5YnnhViMnNuKiL/lJBVQ47GHe1R0k= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2674,10 +2691,14 @@ k8s.io/api v0.25.0/go.mod h1:ttceV1GyV1i1rnmvzT3BST08N6nGt+dudGrquzVQWPk= k8s.io/api v0.26.1/go.mod h1:xd/GBNgR0f707+ATNyPmQ1oyKSgndzXij81FzWGsejg= k8s.io/api v0.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/api v0.27.3 h1:yR6oQXXnUEBWEWcvPWS0jQL575KoAboQPfJAuKNrw5Y= +k8s.io/api v0.27.3/go.mod h1:C4BNvZnQOF7JA/0Xed2S+aUyJSfTGkGFxLXz9MnpIpg= k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= k8s.io/apiextensions-apiserver v0.22.2/go.mod h1:2E0Ve/isxNl7tWLSUDgi6+cmwHi5fQRdwGVCxbC+KFA= k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI= k8s.io/apiextensions-apiserver v0.26.1/go.mod h1:AptjOSXDGuE0JICx/Em15PaoO7buLwTs0dGleIHixSM= +k8s.io/apiextensions-apiserver v0.27.3 h1:xAwC1iYabi+TDfpRhxh4Eapl14Hs2OftM2DN5MpgKX4= +k8s.io/apiextensions-apiserver v0.27.3/go.mod h1:BH3wJ5NsB9XE1w+R6SSVpKmYNyIiyIz9xAmBl8Mb+84= k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= @@ -2690,6 +2711,8 @@ k8s.io/apimachinery v0.25.0/go.mod h1:qMx9eAk0sZQGsXGu86fab8tZdffHbwUfsvzqKn4mfB k8s.io/apimachinery v0.26.1/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apimachinery v0.27.3 h1:Ubye8oBufD04l9QnNtW05idcOe9Z3GQN8+7PqmuVcUM= +k8s.io/apimachinery v0.27.3/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= @@ -2698,6 +2721,8 @@ k8s.io/apiserver v0.22.2/go.mod h1:vrpMmbyjWrgdyOvZTSpsusQq5iigKNWv9o9KlDAbBHI= k8s.io/apiserver v0.26.1/go.mod h1:wr75z634Cv+sifswE9HlAo5FQ7UoUauIICRlOE+5dCg= k8s.io/apiserver v0.26.2 h1:Pk8lmX4G14hYqJd1poHGC08G03nIHVqdJMR0SD3IH3o= k8s.io/apiserver v0.26.2/go.mod h1:GHcozwXgXsPuOJ28EnQ/jXEM9QeG6HT22YxSNmpYNh8= +k8s.io/apiserver v0.27.3 h1:AxLvq9JYtveYWK+D/Dz/uoPCfz8JC9asR5z7+I/bbQ4= +k8s.io/apiserver v0.27.3/go.mod h1:Y61+EaBMVWUBJtxD5//cZ48cHZbQD+yIyV/4iEBhhNA= k8s.io/cli-runtime v0.25.0/go.mod h1:bHOI5ZZInRHhbq12OdUiYZQN8ml8aKZLwQgt9QlLINw= k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= @@ -2709,6 +2734,8 @@ k8s.io/client-go v0.25.0/go.mod h1:lxykvypVfKilxhTklov0wz1FoaUZ8X4EwbhS6rpRfN8= k8s.io/client-go v0.26.1/go.mod h1:IWNSglg+rQ3OcvDkhY6+QLeasV4OYHDjdqeWkDQZwGE= k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/client-go v0.27.3 h1:7dnEGHZEJld3lYwxvLl7WoehK6lAq7GvgjxpA3nv1E8= +k8s.io/client-go v0.27.3/go.mod h1:2MBEKuTo6V1lbKy3z1euEGnhPfGZLKTS9tiJ2xodM48= k8s.io/cluster-bootstrap v0.25.0/go.mod h1:x/TCtY3EiuR/rODkA3SvVQT3uSssQLf9cXcmSjdDTe0= k8s.io/cluster-bootstrap v0.25.3 h1:Rwi4SLbpsRYa4n+dPlvyl+VpZH6idHzH5izRQrrFW1s= k8s.io/cluster-bootstrap v0.25.3/go.mod h1:C5NZX+WE7v/hEyUfMj2sjQfKHsOVAYLrSFLtPspVljM= @@ -2725,6 +2752,8 @@ k8s.io/component-base v0.25.0/go.mod h1:F2Sumv9CnbBlqrpdf7rKZTmmd2meJq0HizeyY/yA k8s.io/component-base v0.26.1/go.mod h1:VHrLR0b58oC035w6YQiBSbtsf0ThuSwXP+p5dD/kAWU= k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/component-base v0.27.3 h1:g078YmdcdTfrCE4fFobt7qmVXwS8J/3cI1XxRi/2+6k= +k8s.io/component-base v0.27.3/go.mod h1:JNiKYcGImpQ44iwSYs6dysxzR9SxIIgQalk4HaCNVUY= k8s.io/component-helpers v0.25.0/go.mod h1:auaFj2bvb5Zmy0mLk4WJNmwP0w4e7Zk+/Tu9FFBGA20= k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= @@ -2749,6 +2778,8 @@ k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kms v0.26.1/go.mod h1:ReC1IEGuxgfN+PDCIpR6w8+XMmDE7uJhxcCwMZFdIYc= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= @@ -2759,6 +2790,8 @@ k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHU k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kube-openapi v0.0.0-20221106113015-f73e7dbcfe29 h1:tya1+VIpw4iOtih5oB7B7nMINohQcyedmlTzdDwSHPA= k8s.io/kube-openapi v0.0.0-20221106113015-f73e7dbcfe29/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= k8s.io/kubectl v0.25.0/go.mod h1:n16ULWsOl2jmQpzt2o7Dud1t4o0+Y186ICb4O+GwKAU= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/metrics v0.25.0/go.mod h1:HZZrbhuRX+fsDcRc3u59o2FbrKhqD67IGnoFECNmovc= @@ -2804,6 +2837,7 @@ sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kind v0.11.1/go.mod h1:fRpgVhtqAWrtLB9ED7zQahUimpUXuG/iHT88xYqEGIA= sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s= sigs.k8s.io/kustomize/cmd/config v0.10.9/go.mod h1:T0s850zPV3wKfBALA0dyeP/K74jlJcoP8Pr9ZWwE3MQ=