diff --git a/README.md b/README.md index 3cfb221..37da585 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,11 @@ For more information, please review the **[Hauler Documentation](https://hauler. ## Recent Changes +### In Hauler v2.0.0... + +- Removed support for `apiVersion` of `v1alpha` and removed the automated conversion functionality to `v1`. + - Please note that notices have been provided in this `README`, the `docs`, and in `cli` warnings since Hauler `v1.2.x`. + ### In Hauler v1.4.0... - Added a notice to `hauler store sync --products/--product-registry` to warn users the default registry will be updated in a future release. @@ -21,13 +26,6 @@ For more information, please review the **[Hauler Documentation](https://hauler. ### From older releases... -- Upgraded the `apiVersion` to `v1` from `v1alpha1` - - Users are able to use `v1` and `v1alpha1`, but `v1alpha1` is now deprecated and will be removed in a future release. We will update the community when we fully deprecate and remove the functionality of `v1alpha1` - - Users will see logging notices when using the old `apiVersion` such as... - - `!!! DEPRECATION WARNING !!! apiVersion [v1alpha1] will be removed in a future release...` - ---- - - Updated the behavior of `hauler store load` to default to loading a `haul` with the name of `haul.tar.zst` and requires the flag of `--filename/-f` to load a `haul` with a different name - Users can load multiple `hauls` by specifying multiple flags of `--filename/-f` - updated command usage: `hauler store load --filename hauling-hauls.tar.zst` diff --git a/cmd/hauler/cli/store/sync.go b/cmd/hauler/cli/store/sync.go index 9e0ab69..47504ee 100644 --- a/cmd/hauler/cli/store/sync.go +++ b/cmd/hauler/cli/store/sync.go @@ -15,11 +15,7 @@ import ( "k8s.io/apimachinery/pkg/util/yaml" "hauler.dev/go/hauler/internal/flags" - 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" "hauler.dev/go/hauler/pkg/content" "hauler.dev/go/hauler/pkg/cosign" @@ -169,23 +165,6 @@ func processContent(ctx context.Context, fi *os.File, o *flags.SyncOpts, s *stor case consts.FilesContentKind: switch gvk.Version { - case "v1alpha1": - l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release...", gvk.Version) - - 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 { @@ -198,151 +177,11 @@ func processContent(ctx context.Context, fi *os.File, o *flags.SyncOpts, s *stor } default: - return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1 and v1alpha1]", gvk.Version, gvk.Kind) + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1]", gvk.Version, gvk.Kind) } case consts.ImagesContentKind: switch gvk.Version { - case "v1alpha1": - l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release...", gvk.Version) - - 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() - } - - hasAnnotationIdentityOptions := a[consts.ImageAnnotationCertIdentityRegexp] != "" || a[consts.ImageAnnotationCertIdentity] != "" - hasCliIdentityOptions := o.CertIdentityRegexp != "" || o.CertIdentity != "" - hasImageIdentityOptions := i.CertIdentityRegexp != "" || i.CertIdentity != "" - - needsKeylessVerificaton := hasAnnotationIdentityOptions || hasCliIdentityOptions || hasImageIdentityOptions - needsPubKeyVerification := a[consts.ImageAnnotationKey] != "" || o.Key != "" || i.Key != "" - if needsPubKeyVerification { - 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) - - tlog := o.Tlog - if !o.Tlog && a[consts.ImageAnnotationTlog] == "true" { - tlog = true - } - if i.Tlog { - tlog = i.Tlog - } - l.Debugf("transparency log for verification [%b]", tlog) - - if err := cosign.VerifySignature(ctx, key, tlog, 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) - } else if needsKeylessVerificaton { //Keyless signature verification - certIdentityRegexp := o.CertIdentityRegexp - if o.CertIdentityRegexp == "" && a[consts.ImageAnnotationCertIdentityRegexp] != "" { - certIdentityRegexp = a[consts.ImageAnnotationCertIdentityRegexp] - } - if i.CertIdentityRegexp != "" { - certIdentityRegexp = i.CertIdentityRegexp - } - l.Debugf("certIdentityRegexp for image [%s]", certIdentityRegexp) - - certIdentity := o.CertIdentity - if o.CertIdentity == "" && a[consts.ImageAnnotationCertIdentity] != "" { - certIdentity = a[consts.ImageAnnotationCertIdentity] - } - if i.CertIdentity != "" { - certIdentity = i.CertIdentity - } - l.Debugf("certIdentity for image [%s]", certIdentity) - - certOidcIssuer := o.CertOidcIssuer - if o.CertOidcIssuer == "" && a[consts.ImageAnnotationCertOidcIssuer] != "" { - certOidcIssuer = a[consts.ImageAnnotationCertOidcIssuer] - } - if i.CertOidcIssuer != "" { - certOidcIssuer = i.CertOidcIssuer - } - l.Debugf("certOidcIssuer for image [%s]", certOidcIssuer) - - certOidcIssuerRegexp := o.CertOidcIssuerRegexp - if o.CertOidcIssuerRegexp == "" && a[consts.ImageAnnotationCertOidcIssuerRegexp] != "" { - certOidcIssuerRegexp = a[consts.ImageAnnotationCertOidcIssuerRegexp] - } - if i.CertOidcIssuerRegexp != "" { - certOidcIssuerRegexp = i.CertOidcIssuerRegexp - } - l.Debugf("certOidcIssuerRegexp for image [%s]", certOidcIssuerRegexp) - - certGithubWorkflowRepository := o.CertGithubWorkflowRepository - if o.CertGithubWorkflowRepository == "" && a[consts.ImageAnnotationCertGithubWorkflowRepository] != "" { - certGithubWorkflowRepository = a[consts.ImageAnnotationCertGithubWorkflowRepository] - } - if i.CertGithubWorkflowRepository != "" { - certGithubWorkflowRepository = i.CertGithubWorkflowRepository - } - l.Debugf("certGithubWorkflowRepository for image [%s]", certGithubWorkflowRepository) - - // Keyless (Fulcio) certs expire after ~10 min; tlog is always - // required to prove the cert was valid at signing time. - if err := cosign.VerifyKeylessSignature(ctx, certIdentity, certIdentityRegexp, certOidcIssuer, certOidcIssuerRegexp, certGithubWorkflowRepository, i.Name, rso, ro); err != nil { - l.Errorf("signature verification failed for image [%s]... skipping...\n%v", i.Name, err) - continue - } - l.Infof("keyless 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 - } - - rewrite := "" - if i.Rewrite != "" { - rewrite = i.Rewrite - } - - if err := storeImage(ctx, s, i, platform, rso, ro, rewrite); err != nil { - return err - } - } - s.CopyAll(ctx, s.OCI, nil) - case "v1": var cfg v1.Images if err := yaml.Unmarshal(doc, &cfg); err != nil { @@ -477,37 +316,11 @@ func processContent(ctx context.Context, fi *os.File, o *flags.SyncOpts, s *stor 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) + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1]", gvk.Version, gvk.Kind) } case consts.ChartsContentKind: switch gvk.Version { - case "v1alpha1": - l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release...", gvk.Version) - - 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, - &flags.AddChartOpts{ - ChartOpts: &action.ChartPathOptions{ - RepoURL: ch.RepoURL, - Version: ch.Version, - }, - }, - rso, ro, - "", - ); err != nil { - return err - } - } - case "v1": var cfg v1.Charts if err := yaml.Unmarshal(doc, &cfg); err != nil { @@ -541,107 +354,11 @@ func processContent(ctx context.Context, fi *os.File, o *flags.SyncOpts, s *stor } default: - return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1 and v1alpha1]", gvk.Version, gvk.Kind) - } - - case consts.ChartsCollectionKind: - switch gvk.Version { - case "v1alpha1": - l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release...", gvk.Version) - - var alphaCfg v1alpha1.ThickCharts - if err := yaml.Unmarshal(doc, &alphaCfg); err != nil { - return err - } - 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.AddArtifactCollection(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.AddArtifactCollection(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: - switch gvk.Version { - case "v1alpha1": - l.Warnf("!!! DEPRECATION WARNING !!! apiVersion [%s] will be removed in a future release...", gvk.Version) - - 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.AddArtifactCollection(ctx, it); err != nil { - return fmt.Errorf("add ImageTxt %s to store: %v", v1Cfg.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.AddArtifactCollection(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) + return fmt.Errorf("unsupported version [%s] for kind [%s]... valid versions are [v1]", gvk.Version, gvk.Kind) } default: - return fmt.Errorf("unsupported kind [%s]... valid kinds are [Files, Images, Charts, ThickCharts, ImageTxts]", gvk.Kind) + return fmt.Errorf("unsupported kind [%s]... valid kinds are [Files, Images, Charts]", gvk.Kind) } } return nil diff --git a/go.mod b/go.mod index 1cf20a1..ef35f94 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,6 @@ require ( gopkg.in/yaml.v3 v3.0.1 helm.sh/helm/v3 v3.19.0 k8s.io/apimachinery v0.35.1 - k8s.io/client-go v0.35.1 ) require ( @@ -335,6 +334,7 @@ require ( k8s.io/apiextensions-apiserver v0.34.0 // indirect k8s.io/apiserver v0.34.0 // indirect k8s.io/cli-runtime v0.34.0 // indirect + k8s.io/client-go v0.35.1 // indirect k8s.io/component-base v0.34.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect diff --git a/pkg/apis/hauler.cattle.io/convert/convert.go b/pkg/apis/hauler.cattle.io/convert/convert.go deleted file mode 100644 index ca3e1cc..0000000 --- a/pkg/apis/hauler.cattle.io/convert/convert.go +++ /dev/null @@ -1,121 +0,0 @@ -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 index 5c8b6ac..b80de7b 100644 --- a/pkg/apis/hauler.cattle.io/v1/chart.go +++ b/pkg/apis/hauler.cattle.io/v1/chart.go @@ -24,23 +24,3 @@ type Chart struct { AddImages bool `json:"add-images,omitempty"` AddDependencies bool `json:"add-dependencies,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/imagetxt.go b/pkg/apis/hauler.cattle.io/v1/imagetxt.go deleted file mode 100644 index 31e73f4..0000000 --- a/pkg/apis/hauler.cattle.io/v1/imagetxt.go +++ /dev/null @@ -1,26 +0,0 @@ -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/chart.go b/pkg/apis/hauler.cattle.io/v1alpha1/chart.go deleted file mode 100644 index fdf1748..0000000 --- a/pkg/apis/hauler.cattle.io/v1alpha1/chart.go +++ /dev/null @@ -1,42 +0,0 @@ -package v1alpha1 - -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/v1alpha1/driver.go b/pkg/apis/hauler.cattle.io/v1alpha1/driver.go deleted file mode 100644 index 62a5b51..0000000 --- a/pkg/apis/hauler.cattle.io/v1alpha1/driver.go +++ /dev/null @@ -1,17 +0,0 @@ -package v1alpha1 - -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/v1alpha1/file.go b/pkg/apis/hauler.cattle.io/v1alpha1/file.go deleted file mode 100644 index 6bd9e74..0000000 --- a/pkg/apis/hauler.cattle.io/v1alpha1/file.go +++ /dev/null @@ -1,25 +0,0 @@ -package v1alpha1 - -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/v1alpha1/groupversion_info.go b/pkg/apis/hauler.cattle.io/v1alpha1/groupversion_info.go deleted file mode 100644 index 0519314..0000000 --- a/pkg/apis/hauler.cattle.io/v1alpha1/groupversion_info.go +++ /dev/null @@ -1,12 +0,0 @@ -package v1alpha1 - -import ( - "k8s.io/apimachinery/pkg/runtime/schema" - - "hauler.dev/go/hauler/pkg/consts" -) - -var ( - ContentGroupVersion = schema.GroupVersion{Group: consts.ContentGroup, Version: "v1alpha1"} - CollectionGroupVersion = schema.GroupVersion{Group: consts.CollectionGroup, Version: "v1alpha1"} -) diff --git a/pkg/apis/hauler.cattle.io/v1alpha1/image.go b/pkg/apis/hauler.cattle.io/v1alpha1/image.go deleted file mode 100644 index a171b5d..0000000 --- a/pkg/apis/hauler.cattle.io/v1alpha1/image.go +++ /dev/null @@ -1,41 +0,0 @@ -package v1alpha1 - -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"` - - // Path is the path to the cosign public key used for verifying image signatures - //Tlog string `json:"use-tlog-verify,omitempty"` - Tlog bool `json:"use-tlog-verify"` - - // cosign keyless validation options - CertIdentity string `json:"certificate-identity"` - CertIdentityRegexp string `json:"certificate-identity-regexp"` - CertOidcIssuer string `json:"certificate-oidc-issuer"` - CertOidcIssuerRegexp string `json:"certificate-oidc-issuer-regexp"` - CertGithubWorkflowRepository string `json:"certificate-github-workflow-repository"` - - // Platform of the image to be pulled. If not specified, all platforms will be pulled. - //Platform string `json:"key,omitempty"` - Platform string `json:"platform"` - Rewrite string `json:"rewrite"` -} diff --git a/pkg/apis/hauler.cattle.io/v1alpha1/imagetxt.go b/pkg/apis/hauler.cattle.io/v1alpha1/imagetxt.go deleted file mode 100644 index 85e5e37..0000000 --- a/pkg/apis/hauler.cattle.io/v1alpha1/imagetxt.go +++ /dev/null @@ -1,26 +0,0 @@ -package v1alpha1 - -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/artifacts/image/image.go b/pkg/artifacts/image/image.go index 6c27849..993ca8e 100644 --- a/pkg/artifacts/image/image.go +++ b/pkg/artifacts/image/image.go @@ -71,10 +71,10 @@ func IsMultiArchImage(name string, opts ...remote.Option) (bool, error) { _, err = desc.ImageIndex() if err != nil { - // If the descriptor could not be converted to an image index, it's not a multi-arch image + // if the descriptor could not be converted to an image index... it's not a multi-arch image return false, nil } - // If the descriptor could be converted to an image index, it's a multi-arch image + // if the descriptor could be converted to an image index... it's a multi-arch image return true, nil } diff --git a/pkg/collection/chart/chart.go b/pkg/collection/chart/chart.go deleted file mode 100644 index 9543b49..0000000 --- a/pkg/collection/chart/chart.go +++ /dev/null @@ -1,107 +0,0 @@ -package chart - -import ( - "helm.sh/helm/v3/pkg/action" - - "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" - "hauler.dev/go/hauler/pkg/reference" -) - -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 v1.ThickChart - - computed bool - contents map[string]artifacts.OCI -} - -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 - } - - return &tchart{ - chart: o, - config: cfg, - contents: make(map[string]artifacts.OCI), - }, nil -} - -func (c *tchart) Contents() (map[string]artifacts.OCI, error) { - if err := c.compute(); err != nil { - return nil, err - } - return c.contents, nil -} - -func (c *tchart) compute() error { - if c.computed { - return nil - } - - if err := c.dependentImages(); err != nil { - return err - } - if err := c.chartContents(); err != nil { - return err - } - if err := c.extraImages(); err != nil { - return err - } - - c.computed = true - return nil -} - -func (c *tchart) chartContents() error { - ch, err := c.chart.Load() - if err != nil { - return err - } - - ref, err := reference.NewTagged(ch.Name(), ch.Metadata.Version) - if err != nil { - return err - } - c.contents[ref.Name()] = c.chart - return nil -} - -func (c *tchart) dependentImages() error { - ch, err := c.chart.Load() - if err != nil { - return err - } - - imgs, err := ImagesInChart(ch) - if err != nil { - return err - } - - for _, img := range imgs.Spec.Images { - i, err := image.NewImage(img.Name) - if err != nil { - return err - } - c.contents[img.Name] = i - } - return nil -} - -func (c *tchart) extraImages() error { - for _, img := range c.config.ExtraImages { - i, err := image.NewImage(img.Reference) - if err != nil { - return err - } - c.contents[img.Reference] = i - } - return nil -} diff --git a/pkg/collection/chart/dependents.go b/pkg/collection/chart/dependents.go deleted file mode 100644 index 14261f3..0000000 --- a/pkg/collection/chart/dependents.go +++ /dev/null @@ -1,129 +0,0 @@ -package chart - -import ( - "bufio" - "bytes" - "io" - "strings" - - "helm.sh/helm/v3/pkg/action" - helmchart "helm.sh/helm/v3/pkg/chart" - "helm.sh/helm/v3/pkg/chartutil" - "helm.sh/helm/v3/pkg/kube/fake" - "helm.sh/helm/v3/pkg/storage" - "helm.sh/helm/v3/pkg/storage/driver" - "k8s.io/apimachinery/pkg/util/yaml" - "k8s.io/client-go/util/jsonpath" - - "hauler.dev/go/hauler/pkg/apis/hauler.cattle.io/v1" -) - -var defaultKnownImagePaths = []string{ - // Deployments & DaemonSets - "{.spec.template.spec.initContainers[*].image}", - "{.spec.template.spec.containers[*].image}", - - // Pods - "{.spec.initContainers[*].image}", - "{.spec.containers[*].image}", -} - -// ImagesInChart will render a chart and identify all dependent images from it -func ImagesInChart(c *helmchart.Chart) (v1.Images, error) { - docs, err := template(c) - if err != nil { - return v1.Images{}, err - } - - var images []v1.Image - reader := yaml.NewYAMLReader(bufio.NewReader(strings.NewReader(docs))) - for { - raw, err := reader.Read() - if err == io.EOF { - break - } - if err != nil { - return v1.Images{}, err - } - - found := find(raw, defaultKnownImagePaths...) - for _, f := range found { - images = append(images, v1.Image{Name: f}) - } - } - - ims := v1.Images{ - Spec: v1.ImageSpec{ - Images: images, - }, - } - return ims, nil -} - -func template(c *helmchart.Chart) (string, error) { - s := storage.Init(driver.NewMemory()) - - templateCfg := &action.Configuration{ - RESTClientGetter: nil, - Releases: s, - KubeClient: &fake.PrintingKubeClient{Out: io.Discard}, - Capabilities: chartutil.DefaultCapabilities, - Log: func(format string, v ...interface{}) {}, - } - - // TODO: Do we need values if we're claiming this is best effort image detection? - // Justification being: if users are relying on us to get images from their values, they could just add images to the []ImagesInChart spec of the Store api - vals := make(map[string]interface{}) - - client := action.NewInstall(templateCfg) - client.ReleaseName = "dry" - client.DryRun = true - client.Replace = true - client.ClientOnly = true - client.IncludeCRDs = true - - release, err := client.Run(c, vals) - if err != nil { - return "", err - } - - return release.Manifest, nil -} - -func find(data []byte, paths ...string) []string { - var ( - pathMatches []string - obj interface{} - ) - - if err := yaml.Unmarshal(data, &obj); err != nil { - return nil - } - j := jsonpath.New("") - j.AllowMissingKeys(true) - - for _, p := range paths { - r, err := parseJSONPath(obj, j, p) - if err != nil { - continue - } - - pathMatches = append(pathMatches, r...) - } - return pathMatches -} - -func parseJSONPath(data interface{}, parser *jsonpath.JSONPath, template string) ([]string, error) { - buf := new(bytes.Buffer) - if err := parser.Parse(template); err != nil { - return nil, err - } - - if err := parser.Execute(buf, data); err != nil { - return nil, err - } - - f := func(s rune) bool { return s == ' ' } - r := strings.FieldsFunc(buf.String(), f) - return r, nil -} diff --git a/pkg/collection/imagetxt/imagetxt.go b/pkg/collection/imagetxt/imagetxt.go deleted file mode 100644 index 60f25dc..0000000 --- a/pkg/collection/imagetxt/imagetxt.go +++ /dev/null @@ -1,232 +0,0 @@ -package imagetxt - -import ( - "bufio" - "context" - "fmt" - "io" - "os" - "strings" - "sync" - - "github.com/google/go-containerregistry/pkg/name" - - artifact "hauler.dev/go/hauler/pkg/artifacts" - "hauler.dev/go/hauler/pkg/artifacts/image" - "hauler.dev/go/hauler/pkg/getter" - "hauler.dev/go/hauler/pkg/log" -) - -type ImageTxt struct { - Ref string - IncludeSources map[string]bool - ExcludeSources map[string]bool - - lock *sync.Mutex - client *getter.Client - computed bool - contents map[string]artifact.OCI -} - -var _ artifact.OCICollection = (*ImageTxt)(nil) - -type Option interface { - Apply(*ImageTxt) error -} - -type withIncludeSources []string - -func (o withIncludeSources) Apply(it *ImageTxt) error { - if it.IncludeSources == nil { - it.IncludeSources = make(map[string]bool) - } - for _, s := range o { - it.IncludeSources[s] = true - } - return nil -} - -func WithIncludeSources(include ...string) Option { - return withIncludeSources(include) -} - -type withExcludeSources []string - -func (o withExcludeSources) Apply(it *ImageTxt) error { - if it.ExcludeSources == nil { - it.ExcludeSources = make(map[string]bool) - } - for _, s := range o { - it.ExcludeSources[s] = true - } - return nil -} - -func WithExcludeSources(exclude ...string) Option { - return withExcludeSources(exclude) -} - -func New(ref string, opts ...Option) (*ImageTxt, error) { - it := &ImageTxt{ - Ref: ref, - - client: getter.NewClient(getter.ClientOptions{}), - lock: &sync.Mutex{}, - } - - for i, o := range opts { - if err := o.Apply(it); err != nil { - return nil, fmt.Errorf("invalid option %d: %v", i, err) - } - } - - return it, nil -} - -func (it *ImageTxt) Contents() (map[string]artifact.OCI, error) { - it.lock.Lock() - defer it.lock.Unlock() - if !it.computed { - if err := it.compute(); err != nil { - return nil, fmt.Errorf("compute OCI layout: %v", err) - } - it.computed = true - } - return it.contents, nil -} - -func (it *ImageTxt) compute() error { - // TODO - pass in logger from context - l := log.NewLogger(os.Stdout) - - it.contents = make(map[string]artifact.OCI) - - ctx := context.TODO() - - rc, err := it.client.ContentFrom(ctx, it.Ref) - if err != nil { - return fmt.Errorf("fetch image.txt ref %s: %w", it.Ref, err) - } - defer rc.Close() - - entries, err := splitImagesTxt(rc) - if err != nil { - return fmt.Errorf("parse image.txt ref %s: %v", it.Ref, err) - } - - foundSources := make(map[string]bool) - for _, e := range entries { - for s := range e.Sources { - foundSources[s] = true - } - } - - var pullAll bool - targetSources := make(map[string]bool) - - if len(foundSources) == 0 || (len(it.IncludeSources) == 0 && len(it.ExcludeSources) == 0) { - // pull all found images - pullAll = true - - if len(foundSources) == 0 { - l.Infof("image txt file appears to have no sources; pulling all found images") - if len(it.IncludeSources) != 0 || len(it.ExcludeSources) != 0 { - l.Warnf("ImageTxt provided include or exclude sources; ignoring") - } - } else if len(it.IncludeSources) == 0 && len(it.ExcludeSources) == 0 { - l.Infof("image-sources txt file not filtered; pulling all found images") - } - } else { - // determine sources to pull - if len(it.IncludeSources) != 0 && len(it.ExcludeSources) != 0 { - l.Warnf("ImageTxt provided include and exclude sources; using only include sources") - } - - if len(it.IncludeSources) != 0 { - targetSources = it.IncludeSources - } else { - for s := range foundSources { - targetSources[s] = true - } - for s := range it.ExcludeSources { - delete(targetSources, s) - } - } - var targetSourcesArr []string - for s := range targetSources { - targetSourcesArr = append(targetSourcesArr, s) - } - l.Infof("pulling images covering sources %s", strings.Join(targetSourcesArr, ", ")) - } - - for _, e := range entries { - var matchesSourceFilter bool - if pullAll { - l.Infof("pulling image %s", e.Reference) - } else { - for s := range e.Sources { - if targetSources[s] { - matchesSourceFilter = true - l.Infof("pulling image %s (matched source %s)", e.Reference, s) - break - } - } - } - - if pullAll || matchesSourceFilter { - curImage, err := image.NewImage(e.Reference.String()) - if err != nil { - return fmt.Errorf("pull image %s: %v", e.Reference, err) - } - it.contents[e.Reference.String()] = curImage - } - } - - return nil -} - -type imageTxtEntry struct { - Reference name.Reference - Sources map[string]bool -} - -func splitImagesTxt(r io.Reader) ([]imageTxtEntry, error) { - var entries []imageTxtEntry - scanner := bufio.NewScanner(r) - for scanner.Scan() { - curEntry := imageTxtEntry{ - Sources: make(map[string]bool), - } - - lineContent := scanner.Text() - if lineContent == "" || strings.HasPrefix(lineContent, "#") { - // skip past empty and commented lines - continue - } - splitContent := strings.Split(lineContent, " ") - if len(splitContent) > 2 { - return nil, fmt.Errorf( - "invalid image.txt format: must contain only an image reference and sources separated by space; invalid line: %q", - lineContent) - } - - curRef, err := name.ParseReference(splitContent[0]) - if err != nil { - return nil, fmt.Errorf("invalid reference %s: %v", splitContent[0], err) - } - curEntry.Reference = curRef - - if len(splitContent) == 2 { - for _, source := range strings.Split(splitContent[1], ",") { - curEntry.Sources[source] = true - } - } - - entries = append(entries, curEntry) - } - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("scan contents: %v", err) - } - - return entries, nil -} diff --git a/pkg/collection/imagetxt/imagetxt_test.go b/pkg/collection/imagetxt/imagetxt_test.go deleted file mode 100644 index 04264c4..0000000 --- a/pkg/collection/imagetxt/imagetxt_test.go +++ /dev/null @@ -1,209 +0,0 @@ -package imagetxt - -import ( - "errors" - "fmt" - "net/http" - "net/http/httptest" - "os" - "testing" - - "hauler.dev/go/hauler/pkg/artifacts" - "hauler.dev/go/hauler/pkg/artifacts/image" -) - -var ( - ErrRefNotFound = errors.New("ref not found") - ErrRefNotImage = errors.New("ref is not image") - ErrExtraRefsFound = errors.New("extra refs found in contents") -) - -var ( - testServer *httptest.Server -) - -func TestMain(m *testing.M) { - setup() - code := m.Run() - teardown() - os.Exit(code) -} - -func setup() { - dir := http.Dir("./testdata/http/") - h := http.FileServer(dir) - testServer = httptest.NewServer(h) -} - -func teardown() { - if testServer != nil { - testServer.Close() - } -} - -type failKind string - -const ( - failKindNew = failKind("New") - failKindContents = failKind("Contents") -) - -func checkError(checkedFailKind failKind) func(*testing.T, error, bool, failKind) { - return func(cet *testing.T, err error, testShouldFail bool, testFailKind failKind) { - if err != nil { - // if error should not have happened at all OR error should have happened - // at a different point, test failed - if !testShouldFail || testFailKind != checkedFailKind { - cet.Fatalf("unexpected error at %s: %v", checkedFailKind, err) - } - // test should fail at this point, test passed - return - } - // if no error occurred but error should have happened at this point, test - // failed - if testShouldFail && testFailKind == checkedFailKind { - cet.Fatalf("unexpected nil error at %s", checkedFailKind) - } - } -} - -func TestImageTxtCollection(t *testing.T) { - type testEntry struct { - Name string - Ref string - IncludeSources []string - ExcludeSources []string - ExpectedImages []string - ShouldFail bool - FailKind failKind - } - tt := []testEntry{ - { - Name: "http ref basic", - Ref: fmt.Sprintf("%s/images-http.txt", testServer.URL), - ExpectedImages: []string{ - "busybox", - "nginx:1.19", - "rancher/hyperkube:v1.21.7-rancher1", - "docker.io/rancher/klipper-lb:v0.3.4", - "quay.io/jetstack/cert-manager-controller:v1.6.1", - }, - }, - { - Name: "http ref sources format pull all", - Ref: fmt.Sprintf("%s/images-src-http.txt", testServer.URL), - ExpectedImages: []string{ - "busybox", - "nginx:1.19", - "rancher/hyperkube:v1.21.7-rancher1", - "docker.io/rancher/klipper-lb:v0.3.4", - "quay.io/jetstack/cert-manager-controller:v1.6.1", - }, - }, - { - Name: "http ref sources format include sources A", - Ref: fmt.Sprintf("%s/images-src-http.txt", testServer.URL), - IncludeSources: []string{ - "core", "rke", - }, - ExpectedImages: []string{ - "busybox", - "nginx:1.19", - "rancher/hyperkube:v1.21.7-rancher1", - }, - }, - { - Name: "http ref sources format include sources B", - Ref: fmt.Sprintf("%s/images-src-http.txt", testServer.URL), - IncludeSources: []string{ - "nginx", "rancher", "cert-manager", - }, - ExpectedImages: []string{ - "nginx:1.19", - "rancher/hyperkube:v1.21.7-rancher1", - "docker.io/rancher/klipper-lb:v0.3.4", - "quay.io/jetstack/cert-manager-controller:v1.6.1", - }, - }, - { - Name: "http ref sources format exclude sources A", - Ref: fmt.Sprintf("%s/images-src-http.txt", testServer.URL), - ExcludeSources: []string{ - "cert-manager", - }, - ExpectedImages: []string{ - "busybox", - "nginx:1.19", - "rancher/hyperkube:v1.21.7-rancher1", - "docker.io/rancher/klipper-lb:v0.3.4", - }, - }, - { - Name: "http ref sources format exclude sources B", - Ref: fmt.Sprintf("%s/images-src-http.txt", testServer.URL), - ExcludeSources: []string{ - "core", - }, - ExpectedImages: []string{ - "nginx:1.19", - "rancher/hyperkube:v1.21.7-rancher1", - "docker.io/rancher/klipper-lb:v0.3.4", - "quay.io/jetstack/cert-manager-controller:v1.6.1", - }, - }, - { - Name: "local file ref", - Ref: "./testdata/images-file.txt", - ExpectedImages: []string{ - "busybox", - "nginx:1.19", - "rancher/hyperkube:v1.21.7-rancher1", - "docker.io/rancher/klipper-lb:v0.3.4", - "quay.io/jetstack/cert-manager-controller:v1.6.1", - }, - }, - } - - checkErrorNew := checkError(failKindNew) - checkErrorContents := checkError(failKindContents) - - for _, curTest := range tt { - t.Run(curTest.Name, func(innerT *testing.T) { - curImageTxt, err := New(curTest.Ref, - WithIncludeSources(curTest.IncludeSources...), - WithExcludeSources(curTest.ExcludeSources...), - ) - checkErrorNew(innerT, err, curTest.ShouldFail, curTest.FailKind) - - ociContents, err := curImageTxt.Contents() - checkErrorContents(innerT, err, curTest.ShouldFail, curTest.FailKind) - - if err := checkImages(ociContents, curTest.ExpectedImages); err != nil { - innerT.Fatal(err) - } - }) - } -} - -func checkImages(content map[string]artifacts.OCI, refs []string) error { - contentCopy := make(map[string]artifacts.OCI, len(content)) - for k, v := range content { - contentCopy[k] = v - } - for _, ref := range refs { - target, ok := content[ref] - if !ok { - return fmt.Errorf("ref %s: %w", ref, ErrRefNotFound) - } - if _, ok := target.(*image.Image); !ok { - return fmt.Errorf("got underlying type %T: %w", target, ErrRefNotImage) - } - delete(contentCopy, ref) - } - - if len(contentCopy) != 0 { - return ErrExtraRefsFound - } - - return nil -} diff --git a/pkg/collection/imagetxt/testdata/http/images-http.txt b/pkg/collection/imagetxt/testdata/http/images-http.txt deleted file mode 100644 index 0ae5fa8..0000000 --- a/pkg/collection/imagetxt/testdata/http/images-http.txt +++ /dev/null @@ -1,5 +0,0 @@ -busybox -nginx:1.19 -rancher/hyperkube:v1.21.7-rancher1 -docker.io/rancher/klipper-lb:v0.3.4 -quay.io/jetstack/cert-manager-controller:v1.6.1 diff --git a/pkg/collection/imagetxt/testdata/http/images-src-http.txt b/pkg/collection/imagetxt/testdata/http/images-src-http.txt deleted file mode 100644 index 013abe6..0000000 --- a/pkg/collection/imagetxt/testdata/http/images-src-http.txt +++ /dev/null @@ -1,5 +0,0 @@ -busybox core -nginx:1.19 core,nginx -rancher/hyperkube:v1.21.7-rancher1 rancher,rke -docker.io/rancher/klipper-lb:v0.3.4 rancher,k3s -quay.io/jetstack/cert-manager-controller:v1.6.1 cert-manager diff --git a/pkg/collection/imagetxt/testdata/images-file.txt b/pkg/collection/imagetxt/testdata/images-file.txt deleted file mode 100644 index 0ae5fa8..0000000 --- a/pkg/collection/imagetxt/testdata/images-file.txt +++ /dev/null @@ -1,5 +0,0 @@ -busybox -nginx:1.19 -rancher/hyperkube:v1.21.7-rancher1 -docker.io/rancher/klipper-lb:v0.3.4 -quay.io/jetstack/cert-manager-controller:v1.6.1 diff --git a/pkg/consts/consts.go b/pkg/consts/consts.go index 884dbb0..60fe7fe 100644 --- a/pkg/consts/consts.go +++ b/pkg/consts/consts.go @@ -74,12 +74,10 @@ const ( ImageAnnotationCertGithubWorkflowRepository = "hauler.dev/certificate-github-workflow-repository" // content kinds - ImagesContentKind = "Images" - ChartsContentKind = "Charts" - FilesContentKind = "Files" - DriverContentKind = "Driver" - ImageTxtsContentKind = "ImageTxts" - ChartsCollectionKind = "ThickCharts" + ImagesContentKind = "Images" + ChartsContentKind = "Charts" + FilesContentKind = "Files" + // DriverContentKind = "Driver" // content groups ContentGroup = "content.hauler.cattle.io" diff --git a/pkg/content/content.go b/pkg/content/content.go index 321c13b..9a24887 100644 --- a/pkg/content/content.go +++ b/pkg/content/content.go @@ -8,7 +8,6 @@ import ( "k8s.io/apimachinery/pkg/util/yaml" 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) { @@ -26,12 +25,10 @@ func Load(data []byte) (schema.ObjectKind, error) { } gv := tm.GroupVersionKind().GroupVersion() - // allow v1 and v1alpha1 content/collection + // allow v1 content and collections 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) + gv != v1.CollectionGroupVersion { + return nil, fmt.Errorf("unrecognized content or 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 dc1051d..bfb8158 100755 --- a/testdata/hauler-manifest-pipeline.yaml +++ b/testdata/hauler-manifest-pipeline.yaml @@ -1,4 +1,5 @@ -# v1 manifests +# hauler manifests +# api version of v1 apiVersion: content.hauler.cattle.io/v1 kind: Images metadata: @@ -50,53 +51,3 @@ spec: - 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: - name: hauler-content-images-example -spec: - images: - - name: ghcr.io/hauler-dev/library/busybox - - name: ghcr.io/hauler-dev/library/busybox:stable - platform: linux/amd64 - - name: gcr.io/distroless/base@sha256:7fa7445dfbebae4f4b7ab0e6ef99276e96075ae42584af6286ba080750d6dfe5 ---- -apiVersion: content.hauler.cattle.io/v1alpha1 -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: testdata ---- -apiVersion: content.hauler.cattle.io/v1alpha1 -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 diff --git a/testdata/hauler-manifest.yaml b/testdata/hauler-manifest.yaml index 4c7d013..71f53a6 100755 --- a/testdata/hauler-manifest.yaml +++ b/testdata/hauler-manifest.yaml @@ -1,4 +1,5 @@ -# v1 manifests +# hauler manifest +# api version of v1 apiVersion: content.hauler.cattle.io/v1 kind: Images metadata: @@ -31,37 +32,3 @@ spec: - path: https://get.rke2.io name: install.sh - path: testdata/hauler-manifest.yaml ---- -# v1alpha1 manifests -apiVersion: content.hauler.cattle.io/v1alpha1 -kind: Images -metadata: - name: hauler-content-images-example -spec: - images: - - name: ghcr.io/hauler-dev/library/busybox - - name: ghcr.io/hauler-dev/library/busybox:stable - platform: linux/amd64 - - name: gcr.io/distroless/base@sha256:7fa7445dfbebae4f4b7ab0e6ef99276e96075ae42584af6286ba080750d6dfe5 ---- -apiVersion: content.hauler.cattle.io/v1alpha1 -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/v1alpha1 -kind: Files -metadata: - name: hauler-content-files-example -spec: - files: - - path: https://get.rke2.io - name: install.sh - - path: testdata/hauler-manifest.yaml