diff --git a/cmd/hauler/cli/store/add.go b/cmd/hauler/cli/store/add.go index b4a22d6..42efbe5 100644 --- a/cmd/hauler/cli/store/add.go +++ b/cmd/hauler/cli/store/add.go @@ -8,7 +8,7 @@ import ( "helm.sh/helm/v3/pkg/action" "hauler.dev/go/hauler/internal/flags" - "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + v1 "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1" "hauler.dev/go/hauler/pkg/artifacts/file" "hauler.dev/go/hauler/pkg/artifacts/file/getter" "hauler.dev/go/hauler/pkg/consts" @@ -20,7 +20,7 @@ import ( ) func AddFileCmd(ctx context.Context, o *flags.AddFileOpts, s *store.Layout, reference string) error { - cfg := v1alpha1.File{ + cfg := v1.File{ Path: reference, } if len(o.Name) > 0 { @@ -29,7 +29,7 @@ func AddFileCmd(ctx context.Context, o *flags.AddFileOpts, s *store.Layout, refe return storeFile(ctx, s, cfg) } -func storeFile(ctx context.Context, s *store.Layout, fi v1alpha1.File) error { +func storeFile(ctx context.Context, s *store.Layout, fi v1.File) error { l := log.FromContext(ctx) copts := getter.ClientOptions{ @@ -56,7 +56,7 @@ func storeFile(ctx context.Context, s *store.Layout, fi v1alpha1.File) error { func AddImageCmd(ctx context.Context, o *flags.AddImageOpts, s *store.Layout, reference string, rso *flags.StoreRootOpts, ro *flags.CliRootOpts) error { l := log.FromContext(ctx) - cfg := v1alpha1.Image{ + cfg := v1.Image{ Name: reference, } @@ -73,7 +73,7 @@ func AddImageCmd(ctx context.Context, o *flags.AddImageOpts, s *store.Layout, re return storeImage(ctx, s, cfg, o.Platform, rso, ro) } -func storeImage(ctx context.Context, s *store.Layout, i v1alpha1.Image, platform string, rso *flags.StoreRootOpts, ro *flags.CliRootOpts) error { +func storeImage(ctx context.Context, s *store.Layout, i v1.Image, platform string, rso *flags.StoreRootOpts, ro *flags.CliRootOpts) error { l := log.FromContext(ctx) if !ro.IgnoreErrors { @@ -112,8 +112,7 @@ func storeImage(ctx context.Context, s *store.Layout, i v1alpha1.Image, platform } func AddChartCmd(ctx context.Context, o *flags.AddChartOpts, s *store.Layout, chartName string) error { - // TODO: Reduce duplicates between api chart and upstream helm opts - cfg := v1alpha1.Chart{ + cfg := v1.Chart{ Name: chartName, RepoURL: o.ChartOpts.RepoURL, Version: o.ChartOpts.Version, @@ -122,7 +121,7 @@ func AddChartCmd(ctx context.Context, o *flags.AddChartOpts, s *store.Layout, ch return storeChart(ctx, s, cfg, o.ChartOpts) } -func storeChart(ctx context.Context, s *store.Layout, cfg v1alpha1.Chart, opts *action.ChartPathOptions) error { +func storeChart(ctx context.Context, s *store.Layout, cfg v1.Chart, opts *action.ChartPathOptions) error { l := log.FromContext(ctx) l.Infof("adding 'chart' [%s] to the store", cfg.Name) diff --git a/cmd/hauler/cli/store/sync.go b/cmd/hauler/cli/store/sync.go index a4e913c..14dd540 100644 --- a/cmd/hauler/cli/store/sync.go +++ b/cmd/hauler/cli/store/sync.go @@ -13,7 +13,9 @@ import ( "k8s.io/apimachinery/pkg/util/yaml" "hauler.dev/go/hauler/internal/flags" - "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + convert "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/convert" + v1 "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1" + v1alpha1 "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" tchart "hauler.dev/go/hauler/pkg/collection/chart" "hauler.dev/go/hauler/pkg/collection/imagetxt" "hauler.dev/go/hauler/pkg/consts" @@ -29,7 +31,7 @@ func SyncCmd(ctx context.Context, o *flags.SyncOpts, s *store.Layout, rso *flags // if passed products, check for a remote manifest to retrieve and use. for _, product := range o.Products { - l.Infof("processing content file for product [%s]", product) + l.Infof("processing content for product [%s]", product) parts := strings.Split(product, "=") tag := strings.ReplaceAll(parts[1], "+", "-") @@ -41,7 +43,7 @@ func SyncCmd(ctx context.Context, o *flags.SyncOpts, s *store.Layout, rso *flags manifestLoc := fmt.Sprintf("%s/hauler/%s-manifest.yaml:%s", ProductRegistry, parts[0], tag) l.Infof("retrieving product manifest from [%s]", manifestLoc) - img := v1alpha1.Image{ + img := v1.Image{ Name: manifestLoc, } err := storeImage(ctx, s, img, o.Platform, rso, ro) @@ -66,7 +68,7 @@ func SyncCmd(ctx context.Context, o *flags.SyncOpts, s *store.Layout, rso *flags // if passed a local manifest, process it for _, filename := range o.ContentFiles { - l.Debugf("processing content file: [%s]", filename) + l.Infof("processing content [%s]", filename) fi, err := os.Open(filename) if err != nil { return err @@ -94,164 +96,321 @@ func processContent(ctx context.Context, fi *os.File, o *flags.SyncOpts, s *stor if err != nil { return err } - docs = append(docs, raw) } for _, doc := range docs { obj, err := content.Load(doc) if err != nil { - l.Debugf("skipping sync of unknown content") + l.Warnf("skipping syncing due to %v", err) continue } - l.Infof("syncing [%s] to store", obj.GroupVersionKind().String()) + gvk := obj.GroupVersionKind() + l.Infof("syncing content [%s] with [kind=%s] to store [%s]", gvk.GroupVersion(), gvk.Kind, o.StoreDir) + + switch gvk.Kind { - // TODO: Should type switch instead... - switch obj.GroupVersionKind().Kind { case consts.FilesContentKind: - var cfg v1alpha1.Files - if err := yaml.Unmarshal(doc, &cfg); err != nil { - return err - } + switch gvk.Version { + case "v1alpha1": + l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release !!! DEPRECATION WARNING !!!", gvk.Version) - for _, f := range cfg.Spec.Files { - err := storeFile(ctx, s, f) - if err != nil { + var alphaCfg v1alpha1.Files + if err := yaml.Unmarshal(doc, &alphaCfg); err != nil { return err } + var v1Cfg v1.Files + if err := convert.ConvertFiles(&alphaCfg, &v1Cfg); err != nil { + return err + } + for _, f := range v1Cfg.Spec.Files { + if err := storeFile(ctx, s, f); err != nil { + return err + } + } + + case "v1": + var cfg v1.Files + if err := yaml.Unmarshal(doc, &cfg); err != nil { + return err + } + for _, f := range cfg.Spec.Files { + if err := storeFile(ctx, s, f); err != nil { + return err + } + } + + default: + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1 and v1alpha1]", gvk.Version, gvk.Kind) } case consts.ImagesContentKind: - var cfg v1alpha1.Images - if err := yaml.Unmarshal(doc, &cfg); err != nil { - return err - } - a := cfg.GetAnnotations() - for _, i := range cfg.Spec.Images { + switch gvk.Version { + case "v1alpha1": + l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release !!! DEPRECATION WARNING !!!", gvk.Version) - // Check if the user provided a registry. If a registry is provided in the annotation, use it for the images that don't have a registry in their ref name. - if a[consts.ImageAnnotationRegistry] != "" || o.Registry != "" { - newRef, _ := reference.Parse(i.Name) - - newReg := o.Registry // cli flag - // if no cli flag but there was an annotation, use the annotation. - if o.Registry == "" && a[consts.ImageAnnotationRegistry] != "" { - newReg = a[consts.ImageAnnotationRegistry] - } - - if newRef.Context().RegistryStr() == "" { - newRef, err = reference.Relocate(i.Name, newReg) - if err != nil { - return err - } - } - i.Name = newRef.Name() - } - - // Check if the user provided a key. The flag from the CLI takes precedence over the annotation. The individual image key takes precedence over both. - if a[consts.ImageAnnotationKey] != "" || o.Key != "" || i.Key != "" { - key := o.Key // cli flag - // if no cli flag but there was an annotation, use the annotation. - if o.Key == "" && a[consts.ImageAnnotationKey] != "" { - key, err = homedir.Expand(a[consts.ImageAnnotationKey]) - if err != nil { - return err - } - } - // the individual image key trumps all - if i.Key != "" { - key, err = homedir.Expand(i.Key) - if err != nil { - return err - } - } - l.Debugf("key for image [%s]", key) - - // verify signature using the provided key. - err := cosign.VerifySignature(ctx, s, key, i.Name, rso, ro) - if err != nil { - l.Errorf("signature verification failed for image [%s]. ** hauler will skip adding this image to the store **:\n%v", i.Name, err) - continue - } - l.Infof("signature verified for image [%s]", i.Name) - } - - // Check if the user provided a platform. The flag from the CLI takes precedence over the annotation. The individual image platform takes precedence over both. - platform := o.Platform // cli flag - // if no cli flag but there was an annotation, use the annotation. - if o.Platform == "" && a[consts.ImageAnnotationPlatform] != "" { - platform = a[consts.ImageAnnotationPlatform] - } - // the individual image platform trumps all - if i.Platform != "" { - platform = i.Platform - } - - err = storeImage(ctx, s, i, platform, rso, ro) - if err != nil { + var alphaCfg v1alpha1.Images + if err := yaml.Unmarshal(doc, &alphaCfg); err != nil { return err } + var v1Cfg v1.Images + if err := convert.ConvertImages(&alphaCfg, &v1Cfg); err != nil { + return err + } + + a := v1Cfg.GetAnnotations() + for _, i := range v1Cfg.Spec.Images { + + if a[consts.ImageAnnotationRegistry] != "" || o.Registry != "" { + newRef, _ := reference.Parse(i.Name) + newReg := o.Registry + if o.Registry == "" && a[consts.ImageAnnotationRegistry] != "" { + newReg = a[consts.ImageAnnotationRegistry] + } + if newRef.Context().RegistryStr() == "" { + newRef, err = reference.Relocate(i.Name, newReg) + if err != nil { + return err + } + } + i.Name = newRef.Name() + } + + if a[consts.ImageAnnotationKey] != "" || o.Key != "" || i.Key != "" { + key := o.Key + if o.Key == "" && a[consts.ImageAnnotationKey] != "" { + key, err = homedir.Expand(a[consts.ImageAnnotationKey]) + if err != nil { + return err + } + } + if i.Key != "" { + key, err = homedir.Expand(i.Key) + if err != nil { + return err + } + } + l.Debugf("key for image [%s]", key) + + if err := cosign.VerifySignature(ctx, s, key, i.Name, rso, ro); err != nil { + l.Errorf("signature verification failed for image [%s]... skipping...\n%v", i.Name, err) + continue + } + l.Infof("signature verified for image [%s]", i.Name) + } + + platform := o.Platform + if o.Platform == "" && a[consts.ImageAnnotationPlatform] != "" { + platform = a[consts.ImageAnnotationPlatform] + } + if i.Platform != "" { + platform = i.Platform + } + + if err := storeImage(ctx, s, i, platform, rso, ro); err != nil { + return err + } + } + s.CopyAll(ctx, s.OCI, nil) + + case "v1": + var cfg v1.Images + if err := yaml.Unmarshal(doc, &cfg); err != nil { + return err + } + + a := cfg.GetAnnotations() + for _, i := range cfg.Spec.Images { + + if a[consts.ImageAnnotationRegistry] != "" || o.Registry != "" { + newRef, _ := reference.Parse(i.Name) + newReg := o.Registry + if o.Registry == "" && a[consts.ImageAnnotationRegistry] != "" { + newReg = a[consts.ImageAnnotationRegistry] + } + if newRef.Context().RegistryStr() == "" { + newRef, err = reference.Relocate(i.Name, newReg) + if err != nil { + return err + } + } + i.Name = newRef.Name() + } + + if a[consts.ImageAnnotationKey] != "" || o.Key != "" || i.Key != "" { + key := o.Key + if o.Key == "" && a[consts.ImageAnnotationKey] != "" { + key, err = homedir.Expand(a[consts.ImageAnnotationKey]) + if err != nil { + return err + } + } + if i.Key != "" { + key, err = homedir.Expand(i.Key) + if err != nil { + return err + } + } + l.Debugf("key for image [%s]", key) + + if err := cosign.VerifySignature(ctx, s, key, i.Name, rso, ro); err != nil { + l.Errorf("signature verification failed for image [%s]... skipping...\n%v", i.Name, err) + continue + } + l.Infof("signature verified for image [%s]", i.Name) + } + + platform := o.Platform + if o.Platform == "" && a[consts.ImageAnnotationPlatform] != "" { + platform = a[consts.ImageAnnotationPlatform] + } + if i.Platform != "" { + platform = i.Platform + } + + if err := storeImage(ctx, s, i, platform, rso, ro); err != nil { + return err + } + } + s.CopyAll(ctx, s.OCI, nil) + + default: + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1 and v1alpha1]", gvk.Version, gvk.Kind) } - // sync with local index - s.CopyAll(ctx, s.OCI, nil) case consts.ChartsContentKind: - var cfg v1alpha1.Charts - if err := yaml.Unmarshal(doc, &cfg); err != nil { - return err - } + switch gvk.Version { + case "v1alpha1": + l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release !!! DEPRECATION WARNING !!!", gvk.Version) - for _, ch := range cfg.Spec.Charts { - // TODO: Provide a way to configure syncs - err := storeChart(ctx, s, ch, &action.ChartPathOptions{}) - if err != nil { + var alphaCfg v1alpha1.Charts + if err := yaml.Unmarshal(doc, &alphaCfg); err != nil { return err } + var v1Cfg v1.Charts + if err := convert.ConvertCharts(&alphaCfg, &v1Cfg); err != nil { + return err + } + for _, ch := range v1Cfg.Spec.Charts { + if err := storeChart(ctx, s, ch, &action.ChartPathOptions{}); err != nil { + return err + } + } + + case "v1": + var cfg v1.Charts + if err := yaml.Unmarshal(doc, &cfg); err != nil { + return err + } + for _, ch := range cfg.Spec.Charts { + if err := storeChart(ctx, s, ch, &action.ChartPathOptions{}); err != nil { + return err + } + } + + default: + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1 and v1alpha1]", gvk.Version, gvk.Kind) } case consts.ChartsCollectionKind: - var cfg v1alpha1.ThickCharts - if err := yaml.Unmarshal(doc, &cfg); err != nil { - return err - } + switch gvk.Version { + case "v1alpha1": + l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release !!! DEPRECATION WARNING !!!", gvk.Version) - for _, cfg := range cfg.Spec.Charts { - tc, err := tchart.NewThickChart(cfg, &action.ChartPathOptions{ - RepoURL: cfg.RepoURL, - Version: cfg.Version, - }) - if err != nil { + var alphaCfg v1alpha1.ThickCharts + if err := yaml.Unmarshal(doc, &alphaCfg); err != nil { return err } - - if _, err := s.AddOCICollection(ctx, tc); err != nil { + var v1Cfg v1.ThickCharts + if err := convert.ConvertThickCharts(&alphaCfg, &v1Cfg); err != nil { return err } + for _, chObj := range v1Cfg.Spec.Charts { + tc, err := tchart.NewThickChart(chObj, &action.ChartPathOptions{ + RepoURL: chObj.RepoURL, + Version: chObj.Version, + }) + if err != nil { + return err + } + if _, err := s.AddOCICollection(ctx, tc); err != nil { + return err + } + } + + case "v1": + var cfg v1.ThickCharts + if err := yaml.Unmarshal(doc, &cfg); err != nil { + return err + } + for _, chObj := range cfg.Spec.Charts { + tc, err := tchart.NewThickChart(chObj, &action.ChartPathOptions{ + RepoURL: chObj.RepoURL, + Version: chObj.Version, + }) + if err != nil { + return err + } + if _, err := s.AddOCICollection(ctx, tc); err != nil { + return err + } + } + + default: + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1 and v1alpha1]", gvk.Version, gvk.Kind) } case consts.ImageTxtsContentKind: - var cfg v1alpha1.ImageTxts - if err := yaml.Unmarshal(doc, &cfg); err != nil { - return err - } + switch gvk.Version { + case "v1alpha1": + l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release !!! DEPRECATION WARNING !!!", gvk.Version) - for _, cfgIt := range cfg.Spec.ImageTxts { - it, err := imagetxt.New(cfgIt.Ref, - imagetxt.WithIncludeSources(cfgIt.Sources.Include...), - imagetxt.WithExcludeSources(cfgIt.Sources.Exclude...), - ) - if err != nil { - return fmt.Errorf("convert ImageTxt %s: %v", cfg.Name, err) + var alphaCfg v1alpha1.ImageTxts + if err := yaml.Unmarshal(doc, &alphaCfg); err != nil { + return err + } + var v1Cfg v1.ImageTxts + if err := convert.ConvertImageTxts(&alphaCfg, &v1Cfg); err != nil { + return err + } + for _, cfgIt := range v1Cfg.Spec.ImageTxts { + it, err := imagetxt.New(cfgIt.Ref, + imagetxt.WithIncludeSources(cfgIt.Sources.Include...), + imagetxt.WithExcludeSources(cfgIt.Sources.Exclude...), + ) + if err != nil { + return fmt.Errorf("convert ImageTxt %s: %v", v1Cfg.Name, err) + } + if _, err := s.AddOCICollection(ctx, it); err != nil { + return fmt.Errorf("add ImageTxt %s to store: %v", v1Cfg.Name, err) + } } - if _, err := s.AddOCICollection(ctx, it); err != nil { - return fmt.Errorf("add ImageTxt %s to store: %v", cfg.Name, err) + case "v1": + var cfg v1.ImageTxts + if err := yaml.Unmarshal(doc, &cfg); err != nil { + return err } + for _, cfgIt := range cfg.Spec.ImageTxts { + it, err := imagetxt.New(cfgIt.Ref, + imagetxt.WithIncludeSources(cfgIt.Sources.Include...), + imagetxt.WithExcludeSources(cfgIt.Sources.Exclude...), + ) + if err != nil { + return fmt.Errorf("convert ImageTxt %s: %v", cfg.Name, err) + } + if _, err := s.AddOCICollection(ctx, it); err != nil { + return fmt.Errorf("add ImageTxt %s to store: %v", cfg.Name, err) + } + } + + default: + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1 and v1alpha1]", gvk.Version, gvk.Kind) } default: - return fmt.Errorf("unrecognized content or collection type: %s", obj.GroupVersionKind().String()) + return fmt.Errorf("unsupported kind [%s]... valid kinds are [Files, Images, Charts, ThickCharts, ImageTxts]", gvk.Kind) } } return nil diff --git a/go.mod b/go.mod index 5630db0..6d665fb 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,14 @@ module hauler.dev/go/hauler -go 1.23 +go 1.23.0 -toolchain go1.23.4 +toolchain go1.23.5 replace github.com/sigstore/cosign/v2 => github.com/hauler-dev/cosign/v2 v2.4.2-0.20250126162449-3b34bda542a5 require ( github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be - github.com/containerd/containerd v1.7.23 + github.com/containerd/containerd v1.7.24 github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 github.com/google/go-containerregistry v0.20.2 github.com/gorilla/handlers v1.5.1 @@ -26,16 +26,16 @@ require ( github.com/spf13/cobra v1.8.1 golang.org/x/sync v0.10.0 gopkg.in/yaml.v3 v3.0.1 - helm.sh/helm/v3 v3.16.3 - k8s.io/apimachinery v0.31.3 - k8s.io/client-go v0.31.3 + helm.sh/helm/v3 v3.17.0 + k8s.io/apimachinery v0.32.1 + k8s.io/client-go v0.32.1 oras.land/oras-go v1.2.5 ) require ( cloud.google.com/go/auth v0.9.3 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/compute/metadata v0.5.0 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect cuelabs.dev/go/oci/ociregistry v0.0.0-20240404174027-a39bec0462d2 // indirect cuelang.org/go v0.9.2 // indirect dario.cat/mergo v1.0.1 // indirect @@ -52,7 +52,7 @@ require ( github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.3.0 // indirect @@ -118,19 +118,19 @@ require ( 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/containerd/stargz-snapshotter/estargz v0.14.3 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect github.com/coreos/go-oidc/v3 v3.11.0 // indirect github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 // indirect - github.com/cyphar/filepath-securejoin v0.3.4 // indirect + github.com/cyphar/filepath-securejoin v0.3.6 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/cli v27.1.1+incompatible // indirect + github.com/docker/cli v27.5.0+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v25.0.6+incompatible // indirect - github.com/docker/docker-credential-helpers v0.8.0 // indirect + github.com/docker/docker v27.5.0+incompatible // indirect + github.com/docker/docker-credential-helpers v0.8.2 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect github.com/docker/go-metrics v0.0.1 // indirect @@ -193,7 +193,6 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect github.com/huandu/xstrings v1.5.0 // indirect - github.com/imdario/mergo v0.3.16 // indirect github.com/in-toto/attestation v1.1.0 // indirect github.com/in-toto/in-toto-golang v0.9.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -246,8 +245,8 @@ require ( github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect - github.com/rubenv/sql-migrate v1.7.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rubenv/sql-migrate v1.7.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect @@ -280,7 +279,7 @@ require ( github.com/tjfoc/gmsm v1.4.1 // indirect github.com/transparency-dev/merkle v0.0.2 // indirect github.com/ulikunitz/xz v0.5.12 // indirect - github.com/vbatts/tar-split v0.11.5 // indirect + github.com/vbatts/tar-split v0.11.6 // indirect github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/go-gitlab v0.109.0 // indirect @@ -295,21 +294,22 @@ require ( github.com/zeebo/errs v1.3.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.29.0 // indirect - go.opentelemetry.io/otel/sdk v1.29.0 // indirect - go.opentelemetry.io/otel/trace v1.29.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect + go.opentelemetry.io/otel v1.33.0 // indirect + go.opentelemetry.io/otel/metric v1.33.0 // indirect + go.opentelemetry.io/otel/sdk v1.33.0 // indirect + go.opentelemetry.io/otel/trace v1.33.0 // indirect go.step.sm/crypto v0.51.2 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go4.org v0.0.0-20230225012048-214862532bf5 // indirect golang.org/x/crypto v0.31.0 // indirect - golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect - golang.org/x/mod v0.20.0 // indirect + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect + golang.org/x/mod v0.22.0 // indirect golang.org/x/net v0.33.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/oauth2 v0.25.0 // indirect + golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.27.0 // indirect golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.7.0 // indirect @@ -317,24 +317,24 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/grpc v1.66.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + google.golang.org/protobuf v1.36.3 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - k8s.io/api v0.31.3 // indirect - k8s.io/apiextensions-apiserver v0.31.3 // indirect - k8s.io/apiserver v0.31.3 // indirect - k8s.io/cli-runtime v0.31.3 // indirect - k8s.io/component-base v0.31.3 // indirect + k8s.io/api v0.32.1 // indirect + k8s.io/apiextensions-apiserver v0.32.0 // indirect + k8s.io/apiserver v0.32.0 // indirect + k8s.io/cli-runtime v0.32.0 // indirect + k8s.io/component-base v0.32.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 // indirect - k8s.io/kubectl v0.31.3 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/kubectl v0.32.0 // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/kustomize/api v0.18.0 // indirect sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect sigs.k8s.io/release-utils v0.8.4 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index 0624f78..a85a78e 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,8 @@ cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= -cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/iam v1.2.0 h1:kZKMKVNk/IsSSc/udOb83K0hL/Yh/Gcqpz+oAkoIFN8= cloud.google.com/go/iam v1.2.0/go.mod h1:zITGuWgsLZxd8OwAlX+eMFgZDXzBm7icj1PVTYG766Q= @@ -83,8 +83,8 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= @@ -281,8 +281,8 @@ github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ= -github.com/containerd/containerd v1.7.23/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw= +github.com/containerd/containerd v1.7.24 h1:zxszGrGjrra1yYJW/6rhm9cJ1ZQ8rkKBR48brqsa7nA= +github.com/containerd/containerd v1.7.24/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= @@ -291,8 +291,8 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= -github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= -github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= +github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -301,10 +301,10 @@ github.com/creack/pty v1.1.19 h1:tUN6H7LWqNx4hQVxomd0CVsDwaDr9gaRQaI4GpSmrsA= github.com/creack/pty v1.1.19/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 h1:2Dx4IHfC1yHWI12AxQDJM1QbRCDfk6M+blLzlZCXdrc= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= -github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= -github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= -github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= -github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= +github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM= +github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= +github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -328,14 +328,14 @@ github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aB github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2/go.mod h1:WHNsWjnIn2V1LYOrME7e8KxSeKunYHsxEm4am0BUtcI= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v27.1.1+incompatible h1:goaZxOqs4QKxznZjjBWKONQci/MywhtRv2oNn0GkeZE= -github.com/docker/cli v27.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v27.5.0+incompatible h1:aMphQkcGtpHixwwhAXJT1rrK/detk2JIvDaFkLctbGM= +github.com/docker/cli v27.5.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v25.0.6+incompatible h1:5cPwbwriIcsua2REJe8HqQV+6WlWc1byg2QSXzBxBGg= -github.com/docker/docker v25.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= -github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/docker v27.5.0+incompatible h1:um++2NcQtGRTz5eEgO6aJimo6/JxrTXC941hd05JO6U= +github.com/docker/docker v27.5.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.2 h1:bX3YxiGzFP5sOXWc3bTPEXdEaZSeVMrFgOr3T+zrFAo= +github.com/docker/docker-credential-helpers v0.8.2/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= @@ -519,8 +519,8 @@ github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OI github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= -github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= @@ -593,8 +593,6 @@ github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/in-toto/attestation v1.1.0 h1:oRWzfmZPDSctChD0VaQV7MJrywKOzyNrtpENQFq//2Q= github.com/in-toto/attestation v1.1.0/go.mod h1:DB59ytd3z7cIHgXxwpSX2SABrU6WJUKg/grpdgHVgVs= github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU= @@ -737,14 +735,14 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= -github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +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.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= -github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +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/open-policy-agent/opa v0.68.0 h1:Jl3U2vXRjwk7JrHmS19U3HZO5qxQRinQbJ2eCJYSqJQ= github.com/open-policy-agent/opa v0.68.0/go.mod h1:5E5SvaPwTpwt2WM177I9Z3eT7qUpmOGjk1ZdHs+TZ4w= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -801,13 +799,13 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= -github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE= +github.com/rubenv/sql-migrate v1.7.1 h1:f/o0WgfO/GqNuVg+6801K/KW3WdDSupzSjDYODmiUq4= +github.com/rubenv/sql-migrate v1.7.1/go.mod h1:Ob2Psprc0/3ggbM6wCzyYVFFuc6FyZrb2AS+ezLDFb4= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= @@ -896,8 +894,9 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= @@ -922,8 +921,8 @@ github.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXG github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts= -github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= +github.com/vbatts/tar-split v0.11.6 h1:4SjTW5+PU11n6fZenf2IPoV8/tz3AaYHMWjf23envGs= +github.com/vbatts/tar-split v0.11.6/go.mod h1:dqKNtesIOr2j2Qv3W/cHjnvk9I8+G7oAkFDFN6TCBEI= github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 h1:+dBg5k7nuTE38VVdoroRsT0Z88fmvdYrI2EjzJst35I= github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1/go.mod h1:nmuySobZb4kFgFy6BptpXp/BBw+xFSyvVPP6auoJB4k= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -975,22 +974,24 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= -go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +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.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= +go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= -go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= -go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= -go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= -go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= -go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= -go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= +go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= +go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= +go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM= +go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM= +go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= +go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.step.sm/crypto v0.51.2 h1:5EiCGIMg7IvQTGmJrwRosbXeprtT80OhoS/PJarg60o= @@ -1031,8 +1032,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= -golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1053,8 +1054,8 @@ 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1097,8 +1098,8 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= +golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1156,8 +1157,8 @@ golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1220,8 +1221,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= 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= @@ -1285,8 +1286,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1316,35 +1317,35 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -helm.sh/helm/v3 v3.16.3 h1:kb8bSxMeRJ+knsK/ovvlaVPfdis0X3/ZhYCSFRP+YmY= -helm.sh/helm/v3 v3.16.3/go.mod h1:zeVWGDR4JJgiRbT3AnNsjYaX8OTJlIE9zC+Q7F7iUSU= +helm.sh/helm/v3 v3.17.0 h1:DUD4AGdNVn7PSTYfxe1gmQG7s18QeWv/4jI9TubnhT0= +helm.sh/helm/v3 v3.17.0/go.mod h1:Mo7eGyKPPHlS0Ml67W8z/lbkox/gD9Xt1XpD6bxvZZA= 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= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= -k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= -k8s.io/apiextensions-apiserver v0.31.3 h1:+GFGj2qFiU7rGCsA5o+p/rul1OQIq6oYpQw4+u+nciE= -k8s.io/apiextensions-apiserver v0.31.3/go.mod h1:2DSpFhUZZJmn/cr/RweH1cEVVbzFw9YBu4T+U3mf1e4= -k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= -k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/apiserver v0.31.3 h1:+1oHTtCB+OheqFEz375D0IlzHZ5VeQKX1KGXnx+TTuY= -k8s.io/apiserver v0.31.3/go.mod h1:PrxVbebxrxQPFhJk4powDISIROkNMKHibTg9lTRQ0Qg= -k8s.io/cli-runtime v0.31.3 h1:fEQD9Xokir78y7pVK/fCJN090/iYNrLHpFbGU4ul9TI= -k8s.io/cli-runtime v0.31.3/go.mod h1:Q2jkyTpl+f6AtodQvgDI8io3jrfr+Z0LyQBPJJ2Btq8= -k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= -k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= -k8s.io/component-base v0.31.3 h1:DMCXXVx546Rfvhj+3cOm2EUxhS+EyztH423j+8sOwhQ= -k8s.io/component-base v0.31.3/go.mod h1:xME6BHfUOafRgT0rGVBGl7TuSg8Z9/deT7qq6w7qjIU= +k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc= +k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k= +k8s.io/apiextensions-apiserver v0.32.0 h1:S0Xlqt51qzzqjKPxfgX1xh4HBZE+p8KKBq+k2SWNOE0= +k8s.io/apiextensions-apiserver v0.32.0/go.mod h1:86hblMvN5yxMvZrZFX2OhIHAuFIMJIZ19bTvzkP+Fmw= +k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs= +k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.32.0 h1:VJ89ZvQZ8p1sLeiWdRJpRD6oLozNZD2+qVSLi+ft5Qs= +k8s.io/apiserver v0.32.0/go.mod h1:HFh+dM1/BE/Hm4bS4nTXHVfN6Z6tFIZPi649n83b4Ag= +k8s.io/cli-runtime v0.32.0 h1:dP+OZqs7zHPpGQMCGAhectbHU2SNCuZtIimRKTv2T1c= +k8s.io/cli-runtime v0.32.0/go.mod h1:Mai8ht2+esoDRK5hr861KRy6z0zHsSTYttNVJXgP3YQ= +k8s.io/client-go v0.32.1 h1:otM0AxdhdBIaQh7l1Q0jQpmo7WOFIk5FFa4bg6YMdUU= +k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg= +k8s.io/component-base v0.32.0 h1:d6cWHZkCiiep41ObYQS6IcgzOUQUNpywm39KVYaUqzU= +k8s.io/component-base v0.32.0/go.mod h1:JLG2W5TUxUu5uDyKiH2R/7NnxJo1HlPoRIIbVLkK5eM= 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-20240827152857-f7e401e7b4c2 h1:GKE9U8BH16uynoxQii0auTjmmmuZ3O0LFMN6S0lPPhI= -k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= -k8s.io/kubectl v0.31.3 h1:3r111pCjPsvnR98oLLxDMwAeM6OPGmPty6gSKaLTQes= -k8s.io/kubectl v0.31.3/go.mod h1:lhMECDCbJN8He12qcKqs2QfmVo9Pue30geovBVpH5fs= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/kubectl v0.32.0 h1:rpxl+ng9qeG79YA4Em9tLSfX0G8W0vfaiPVrc/WR7Xw= +k8s.io/kubectl v0.32.0/go.mod h1:qIjSX+QgPQUgdy8ps6eKsYNF+YmFOAO3WygfucIqFiE= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -1358,8 +1359,8 @@ sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo= sigs.k8s.io/release-utils v0.8.4 h1:4QVr3UgbyY/d9p74LBhg0njSVQofUsAZqYOzVZBhdBw= sigs.k8s.io/release-utils v0.8.4/go.mod h1:m1bHfscTemQp+z+pLCZnkXih9n0+WukIUU70n6nFnU0= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= diff --git a/internal/flags/store.go b/internal/flags/store.go index c2dd6ce..892384c 100644 --- a/internal/flags/store.go +++ b/internal/flags/store.go @@ -41,6 +41,8 @@ func (o *StoreRootOpts) Store(ctx context.Context) (*store.Layout, error) { return nil, err } + o.StoreDir = abs + l.Debugf("using store at [%s]", abs) if _, err := os.Stat(abs); errors.Is(err, os.ErrNotExist) { diff --git a/pkg/apis/hauler.cattle.io/convert/convert.go b/pkg/apis/hauler.cattle.io/convert/convert.go new file mode 100644 index 0000000..ca3e1cc --- /dev/null +++ b/pkg/apis/hauler.cattle.io/convert/convert.go @@ -0,0 +1,121 @@ +package v1alpha1 + +import ( + "fmt" + + v1 "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1" + v1alpha1 "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" +) + +// converts v1alpha1.Files -> v1.Files +func ConvertFiles(in *v1alpha1.Files, out *v1.Files) error { + out.TypeMeta = in.TypeMeta + out.ObjectMeta = in.ObjectMeta + out.Spec.Files = make([]v1.File, len(in.Spec.Files)) + for i := range in.Spec.Files { + out.Spec.Files[i].Name = in.Spec.Files[i].Name + out.Spec.Files[i].Path = in.Spec.Files[i].Path + } + return nil +} + +// converts v1alpha1.Images -> v1.Images +func ConvertImages(in *v1alpha1.Images, out *v1.Images) error { + out.TypeMeta = in.TypeMeta + out.ObjectMeta = in.ObjectMeta + out.Spec.Images = make([]v1.Image, len(in.Spec.Images)) + for i := range in.Spec.Images { + out.Spec.Images[i].Name = in.Spec.Images[i].Name + out.Spec.Images[i].Platform = in.Spec.Images[i].Platform + out.Spec.Images[i].Key = in.Spec.Images[i].Key + } + return nil +} + +// converts v1alpha1.Charts -> v1.Charts +func ConvertCharts(in *v1alpha1.Charts, out *v1.Charts) error { + out.TypeMeta = in.TypeMeta + out.ObjectMeta = in.ObjectMeta + out.Spec.Charts = make([]v1.Chart, len(in.Spec.Charts)) + for i := range in.Spec.Charts { + out.Spec.Charts[i].Name = in.Spec.Charts[i].Name + out.Spec.Charts[i].RepoURL = in.Spec.Charts[i].RepoURL + out.Spec.Charts[i].Version = in.Spec.Charts[i].Version + } + return nil +} + +// converts v1alpha1.ThickCharts -> v1.ThickCharts +func ConvertThickCharts(in *v1alpha1.ThickCharts, out *v1.ThickCharts) error { + out.TypeMeta = in.TypeMeta + out.ObjectMeta = in.ObjectMeta + out.Spec.Charts = make([]v1.ThickChart, len(in.Spec.Charts)) + for i := range in.Spec.Charts { + out.Spec.Charts[i].Chart.Name = in.Spec.Charts[i].Chart.Name + out.Spec.Charts[i].Chart.RepoURL = in.Spec.Charts[i].Chart.RepoURL + out.Spec.Charts[i].Chart.Version = in.Spec.Charts[i].Chart.Version + } + return nil +} + +// converts v1alpha1.ImageTxts -> v1.ImageTxts +func ConvertImageTxts(in *v1alpha1.ImageTxts, out *v1.ImageTxts) error { + out.TypeMeta = in.TypeMeta + out.ObjectMeta = in.ObjectMeta + out.Spec.ImageTxts = make([]v1.ImageTxt, len(in.Spec.ImageTxts)) + for i := range in.Spec.ImageTxts { + out.Spec.ImageTxts[i].Ref = in.Spec.ImageTxts[i].Ref + out.Spec.ImageTxts[i].Sources.Include = append( + out.Spec.ImageTxts[i].Sources.Include, + in.Spec.ImageTxts[i].Sources.Include..., + ) + out.Spec.ImageTxts[i].Sources.Exclude = append( + out.Spec.ImageTxts[i].Sources.Exclude, + in.Spec.ImageTxts[i].Sources.Exclude..., + ) + } + return nil +} + +// convert v1alpha1 object to v1 object +func ConvertObject(in interface{}) (interface{}, error) { + switch src := in.(type) { + + case *v1alpha1.Files: + dst := &v1.Files{} + if err := ConvertFiles(src, dst); err != nil { + return nil, err + } + return dst, nil + + case *v1alpha1.Images: + dst := &v1.Images{} + if err := ConvertImages(src, dst); err != nil { + return nil, err + } + return dst, nil + + case *v1alpha1.Charts: + dst := &v1.Charts{} + if err := ConvertCharts(src, dst); err != nil { + return nil, err + } + return dst, nil + + case *v1alpha1.ThickCharts: + dst := &v1.ThickCharts{} + if err := ConvertThickCharts(src, dst); err != nil { + return nil, err + } + return dst, nil + + case *v1alpha1.ImageTxts: + dst := &v1.ImageTxts{} + if err := ConvertImageTxts(src, dst); err != nil { + return nil, err + } + return dst, nil + } + + return nil, fmt.Errorf("unsupported object type [%T]", in) +} diff --git a/pkg/apis/hauler.cattle.io/v1/chart.go b/pkg/apis/hauler.cattle.io/v1/chart.go new file mode 100644 index 0000000..897e07a --- /dev/null +++ b/pkg/apis/hauler.cattle.io/v1/chart.go @@ -0,0 +1,42 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type Charts struct { + *metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ChartSpec `json:"spec,omitempty"` +} + +type ChartSpec struct { + Charts []Chart `json:"charts,omitempty"` +} + +type Chart struct { + Name string `json:"name,omitempty"` + RepoURL string `json:"repoURL,omitempty"` + Version string `json:"version,omitempty"` +} + +type ThickCharts struct { + *metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ThickChartSpec `json:"spec,omitempty"` +} + +type ThickChartSpec struct { + Charts []ThickChart `json:"charts,omitempty"` +} + +type ThickChart struct { + Chart `json:",inline,omitempty"` + ExtraImages []ChartImage `json:"extraImages,omitempty"` +} + +type ChartImage struct { + Reference string `json:"ref"` +} diff --git a/pkg/apis/hauler.cattle.io/v1/driver.go b/pkg/apis/hauler.cattle.io/v1/driver.go new file mode 100644 index 0000000..c8b98a8 --- /dev/null +++ b/pkg/apis/hauler.cattle.io/v1/driver.go @@ -0,0 +1,17 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type Driver struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec DriverSpec `json:"spec"` +} + +type DriverSpec struct { + Type string `json:"type"` + Version string `json:"version"` +} diff --git a/pkg/apis/hauler.cattle.io/v1/file.go b/pkg/apis/hauler.cattle.io/v1/file.go new file mode 100644 index 0000000..6abc47f --- /dev/null +++ b/pkg/apis/hauler.cattle.io/v1/file.go @@ -0,0 +1,25 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type Files struct { + *metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec FileSpec `json:"spec,omitempty"` +} + +type FileSpec struct { + Files []File `json:"files,omitempty"` +} + +type File struct { + // Path is the path to the file contents, can be a local or remote path + Path string `json:"path"` + + // Name is an optional field specifying the name of the file when specified, + // it will override any dynamic name discovery from Path + Name string `json:"name,omitempty"` +} diff --git a/pkg/apis/hauler.cattle.io/v1/groupversion_info.go b/pkg/apis/hauler.cattle.io/v1/groupversion_info.go new file mode 100644 index 0000000..1fa9339 --- /dev/null +++ b/pkg/apis/hauler.cattle.io/v1/groupversion_info.go @@ -0,0 +1,12 @@ +package v1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + + "hauler.dev/go/hauler/pkg/consts" +) + +var ( + ContentGroupVersion = schema.GroupVersion{Group: consts.ContentGroup, Version: "v1"} + CollectionGroupVersion = schema.GroupVersion{Group: consts.CollectionGroup, Version: "v1"} +) diff --git a/pkg/apis/hauler.cattle.io/v1/image.go b/pkg/apis/hauler.cattle.io/v1/image.go new file mode 100644 index 0000000..b1df3fd --- /dev/null +++ b/pkg/apis/hauler.cattle.io/v1/image.go @@ -0,0 +1,29 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type Images struct { + *metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ImageSpec `json:"spec,omitempty"` +} + +type ImageSpec struct { + Images []Image `json:"images,omitempty"` +} + +type Image struct { + // Name is the full location for the image, can be referenced by tags or digests + Name string `json:"name"` + + // Path is the path to the cosign public key used for verifying image signatures + //Key string `json:"key,omitempty"` + Key string `json:"key"` + + // Platform of the image to be pulled. If not specified, all platforms will be pulled. + //Platform string `json:"key,omitempty"` + Platform string `json:"platform"` +} diff --git a/pkg/apis/hauler.cattle.io/v1/imagetxt.go b/pkg/apis/hauler.cattle.io/v1/imagetxt.go new file mode 100644 index 0000000..31e73f4 --- /dev/null +++ b/pkg/apis/hauler.cattle.io/v1/imagetxt.go @@ -0,0 +1,26 @@ +package v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type ImageTxts struct { + *metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec ImageTxtsSpec `json:"spec,omitempty"` +} + +type ImageTxtsSpec struct { + ImageTxts []ImageTxt `json:"imageTxts,omitempty"` +} + +type ImageTxt struct { + Ref string `json:"ref,omitempty"` + Sources ImageTxtSources `json:"sources,omitempty"` +} + +type ImageTxtSources struct { + Include []string `json:"include,omitempty"` + Exclude []string `json:"exclude,omitempty"` +} diff --git a/pkg/apis/hauler.cattle.io/v1alpha1/groupversion_info.go b/pkg/apis/hauler.cattle.io/v1alpha1/groupversion_info.go index 5190d44..0519314 100644 --- a/pkg/apis/hauler.cattle.io/v1alpha1/groupversion_info.go +++ b/pkg/apis/hauler.cattle.io/v1alpha1/groupversion_info.go @@ -7,6 +7,6 @@ import ( ) var ( - ContentGroupVersion = schema.GroupVersion{Group: consts.ContentGroup, Version: consts.APIVersion} - CollectionGroupVersion = schema.GroupVersion{Group: consts.CollectionGroup, Version: consts.APIVersion} + ContentGroupVersion = schema.GroupVersion{Group: consts.ContentGroup, Version: "v1alpha1"} + CollectionGroupVersion = schema.GroupVersion{Group: consts.CollectionGroup, Version: "v1alpha1"} ) diff --git a/pkg/collection/chart/chart.go b/pkg/collection/chart/chart.go index 991591f..9543b49 100644 --- a/pkg/collection/chart/chart.go +++ b/pkg/collection/chart/chart.go @@ -3,7 +3,7 @@ package chart import ( "helm.sh/helm/v3/pkg/action" - "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1" "hauler.dev/go/hauler/pkg/artifacts" "hauler.dev/go/hauler/pkg/artifacts/image" "hauler.dev/go/hauler/pkg/content/chart" @@ -15,13 +15,13 @@ var _ artifacts.OCICollection = (*tchart)(nil) // tchart is a thick chart that includes all the dependent images as well as the chart itself type tchart struct { chart *chart.Chart - config v1alpha1.ThickChart + config v1.ThickChart computed bool contents map[string]artifacts.OCI } -func NewThickChart(cfg v1alpha1.ThickChart, opts *action.ChartPathOptions) (artifacts.OCICollection, error) { +func NewThickChart(cfg v1.ThickChart, opts *action.ChartPathOptions) (artifacts.OCICollection, error) { o, err := chart.NewChart(cfg.Chart.Name, opts) if err != nil { return nil, err diff --git a/pkg/collection/chart/dependents.go b/pkg/collection/chart/dependents.go index 7fd1ca7..14261f3 100644 --- a/pkg/collection/chart/dependents.go +++ b/pkg/collection/chart/dependents.go @@ -15,7 +15,7 @@ import ( "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/util/jsonpath" - "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1" ) var defaultKnownImagePaths = []string{ @@ -29,13 +29,13 @@ var defaultKnownImagePaths = []string{ } // ImagesInChart will render a chart and identify all dependent images from it -func ImagesInChart(c *helmchart.Chart) (v1alpha1.Images, error) { +func ImagesInChart(c *helmchart.Chart) (v1.Images, error) { docs, err := template(c) if err != nil { - return v1alpha1.Images{}, err + return v1.Images{}, err } - var images []v1alpha1.Image + var images []v1.Image reader := yaml.NewYAMLReader(bufio.NewReader(strings.NewReader(docs))) for { raw, err := reader.Read() @@ -43,17 +43,17 @@ func ImagesInChart(c *helmchart.Chart) (v1alpha1.Images, error) { break } if err != nil { - return v1alpha1.Images{}, err + return v1.Images{}, err } found := find(raw, defaultKnownImagePaths...) for _, f := range found { - images = append(images, v1alpha1.Image{Name: f}) + images = append(images, v1.Image{Name: f}) } } - ims := v1alpha1.Images{ - Spec: v1alpha1.ImageSpec{ + ims := v1.Images{ + Spec: v1.ImageSpec{ Images: images, }, } diff --git a/pkg/consts/consts.go b/pkg/consts/consts.go index df2231b..5b888bf 100644 --- a/pkg/consts/consts.go +++ b/pkg/consts/consts.go @@ -73,7 +73,6 @@ const ( // other constraints CarbideRegistry = "rgcrprod.azurecr.us" - APIVersion = "v1alpha1" DefaultNamespace = "hauler" DefaultTag = "latest" DefaultStoreName = "store" diff --git a/pkg/content/chart/chart.go b/pkg/content/chart/chart.go index c6e6060..b01c1db 100644 --- a/pkg/content/chart/chart.go +++ b/pkg/content/chart/chart.go @@ -40,7 +40,7 @@ type Chart struct { annotations map[string]string } -// NewChart is a helper method that returns NewLocalChart or NewRemoteChart depending on v1alpha1.Chart contents +// NewChart is a helper method that returns NewLocalChart or NewRemoteChart depending on chart contents func NewChart(name string, opts *action.ChartPathOptions) (*Chart, error) { chartRef := name actionConfig := new(action.Configuration) diff --git a/pkg/content/content.go b/pkg/content/content.go index c42de16..321c13b 100644 --- a/pkg/content/content.go +++ b/pkg/content/content.go @@ -7,17 +7,31 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/yaml" - "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" + v1 "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1" + v1alpha1 "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1alpha1" ) func Load(data []byte) (schema.ObjectKind, error) { var tm metav1.TypeMeta if err := yaml.Unmarshal(data, &tm); err != nil { - return nil, err + return nil, fmt.Errorf("failed to parse manifest: %w", err) } - if tm.GroupVersionKind().GroupVersion() != v1alpha1.ContentGroupVersion && tm.GroupVersionKind().GroupVersion() != v1alpha1.CollectionGroupVersion { - return nil, fmt.Errorf("unrecognized content/collection type: %s", tm.GroupVersionKind().String()) + if tm.APIVersion == "" { + return nil, fmt.Errorf("missing required manifest field [apiVersion]") + } + + if tm.Kind == "" { + return nil, fmt.Errorf("missing required manifest field [kind]") + } + + gv := tm.GroupVersionKind().GroupVersion() + // allow v1 and v1alpha1 content/collection + if gv != v1.ContentGroupVersion && + gv != v1.CollectionGroupVersion && + gv != v1alpha1.ContentGroupVersion && + gv != v1alpha1.CollectionGroupVersion { + return nil, fmt.Errorf("unrecognized content/collection [%s] with [kind=%s]", tm.APIVersion, tm.Kind) } return &tm, nil diff --git a/testdata/hauler-manifest-pipeline.yaml b/testdata/hauler-manifest-pipeline.yaml index bafab15..0bbecf1 100755 --- a/testdata/hauler-manifest-pipeline.yaml +++ b/testdata/hauler-manifest-pipeline.yaml @@ -1,3 +1,54 @@ +# v1 manifests +apiVersion: content.hauler.cattle.io/v1 +kind: Images +metadata: + name: hauler-content-images-example +spec: + images: + - name: busybox + - name: busybox:stable + platform: linux/amd64 + - name: gcr.io/distroless/base@sha256:7fa7445dfbebae4f4b7ab0e6ef99276e96075ae42584af6286ba080750d6dfe5 +--- +apiVersion: content.hauler.cattle.io/v1 +kind: Charts +metadata: + name: hauler-content-charts-example +spec: + charts: + - name: rancher + repoURL: https://releases.rancher.com/server-charts/stable + - name: rancher + repoURL: https://releases.rancher.com/server-charts/stable + version: 2.8.4 + - name: rancher + repoURL: https://releases.rancher.com/server-charts/stable + version: 2.8.3 + - name: hauler-helm + repoURL: oci://ghcr.io/hauler-dev + - name: hauler-helm + repoURL: oci://ghcr.io/hauler-dev + version: 1.0.6 + - name: hauler-helm + repoURL: oci://ghcr.io/hauler-dev + version: 1.0.4 + - name: rancher-cluster-templates-0.5.2.tgz + repoURL: . +--- +apiVersion: content.hauler.cattle.io/v1 +kind: Files +metadata: + name: hauler-content-files-example +spec: + files: + - path: https://get.rke2.io/install.sh + - path: https://get.rke2.io/install.sh + name: rke2-install.sh + - path: testdata/hauler-manifest.yaml + - path: testdata/hauler-manifest.yaml + name: hauler-manifest-local.yaml +--- +# v1alpha1 manifests apiVersion: content.hauler.cattle.io/v1alpha1 kind: Images metadata: diff --git a/testdata/hauler-manifest.yaml b/testdata/hauler-manifest.yaml index e489990..4691779 100755 --- a/testdata/hauler-manifest.yaml +++ b/testdata/hauler-manifest.yaml @@ -1,3 +1,38 @@ +# v1 manifests +apiVersion: content.hauler.cattle.io/v1 +kind: Images +metadata: + name: hauler-content-images-example +spec: + images: + - name: busybox + - name: busybox:stable + platform: linux/amd64 + - name: gcr.io/distroless/base@sha256:7fa7445dfbebae4f4b7ab0e6ef99276e96075ae42584af6286ba080750d6dfe5 +--- +apiVersion: content.hauler.cattle.io/v1 +kind: Charts +metadata: + name: hauler-content-charts-example +spec: + charts: + - name: rancher + repoURL: https://releases.rancher.com/server-charts/stable + version: 2.8.5 + - name: hauler-helm + repoURL: oci://ghcr.io/hauler-dev +--- +apiVersion: content.hauler.cattle.io/v1 +kind: Files +metadata: + name: hauler-content-files-example +spec: + files: + - path: https://get.rke2.io + name: install.sh + - path: testdata/hauler-manifest.yaml +--- +# v1alpha1 manifests apiVersion: content.hauler.cattle.io/v1alpha1 kind: Images metadata: