diff --git a/cmd/hauler/cli/completion.go b/cmd/hauler/cli/completion.go index 67929a9..af62177 100644 --- a/cmd/hauler/cli/completion.go +++ b/cmd/hauler/cli/completion.go @@ -2,24 +2,24 @@ package cli import ( "fmt" - "os" "github.com/spf13/cobra" + "os" ) func addCompletion(parent *cobra.Command) { cmd := &cobra.Command{ - Use: "completion", - Short: "Generates completion scripts for various shells", + Use: "completion", + Short: "Generates completion scripts for various shells", Long: `The completion sub-command generates completion scripts for various shells.`, } - + cmd.AddCommand( addCompletionZsh(), addCompletionBash(), addCompletionFish(), addCompletionPowershell(), ) - + parent.AddCommand(cmd) } @@ -120,4 +120,4 @@ func addCompletionPowershell() *cobra.Command { }, } return cmd -} \ No newline at end of file +} diff --git a/cmd/hauler/cli/login.go b/cmd/hauler/cli/login.go index 0f28c64..b7ae14c 100644 --- a/cmd/hauler/cli/login.go +++ b/cmd/hauler/cli/login.go @@ -2,11 +2,11 @@ package cli import ( "context" - "strings" - "os" - "io" "fmt" "github.com/spf13/cobra" + "io" + "os" + "strings" "oras.land/oras-go/pkg/content" @@ -14,8 +14,8 @@ import ( ) type Opts struct { - Username string - Password string + Username string + Password string PasswordStdin bool } @@ -35,7 +35,7 @@ func addLogin(parent *cobra.Command) { Example: ` # Log in to reg.example.com hauler login reg.example.com -u bob -p haulin`, - Args: cobra.ExactArgs(1), + Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, arg []string) error { ctx := cmd.Context() @@ -47,7 +47,7 @@ hauler login reg.example.com -u bob -p haulin`, o.Password = strings.TrimSuffix(string(contents), "\n") o.Password = strings.TrimSuffix(o.Password, "\r") } - + if o.Username == "" && o.Password == "" { return fmt.Errorf("username and password required") } @@ -62,14 +62,14 @@ hauler login reg.example.com -u bob -p haulin`, func login(ctx context.Context, o *Opts, registry string) error { ropts := content.RegistryOptions{ - Username: o.Username, - Password: o.Password, + Username: o.Username, + Password: o.Password, } err := cosign.RegistryLogin(ctx, nil, registry, ropts) if err != nil { return err } - + return nil -} \ No newline at end of file +} diff --git a/cmd/hauler/cli/store.go b/cmd/hauler/cli/store.go index 9985bb1..66fcf04 100644 --- a/cmd/hauler/cli/store.go +++ b/cmd/hauler/cli/store.go @@ -1,9 +1,9 @@ package cli import ( + "fmt" "github.com/spf13/cobra" "helm.sh/helm/v3/pkg/action" - "fmt" "github.com/rancherfederal/hauler/cmd/hauler/cli/store" ) @@ -125,11 +125,11 @@ func addStoreServe() *cobra.Command { // RegistryCmd serves the embedded registry func addStoreServeRegistry() *cobra.Command { - o := &store.ServeRegistryOpts{RootOpts: rootStoreOpts} + o := &store.ServeRegistryOpts{RootOpts: rootStoreOpts} cmd := &cobra.Command{ - Use: "registry", - Short: "Serve the embedded registry", - RunE: func(cmd *cobra.Command, args []string) error { + Use: "registry", + Short: "Serve the embedded registry", + RunE: func(cmd *cobra.Command, args []string) error { ctx := cmd.Context() s, err := o.Store(ctx) @@ -138,21 +138,21 @@ func addStoreServeRegistry() *cobra.Command { } return store.ServeRegistryCmd(ctx, o, s) - }, - } + }, + } - o.AddFlags(cmd) + o.AddFlags(cmd) - return cmd + return cmd } // FileServerCmd serves the file server func addStoreServeFiles() *cobra.Command { - o := &store.ServeFilesOpts{RootOpts: rootStoreOpts} + o := &store.ServeFilesOpts{RootOpts: rootStoreOpts} cmd := &cobra.Command{ - Use: "fileserver", - Short: "Serve the file server", - RunE: func(cmd *cobra.Command, args []string) error { + Use: "fileserver", + Short: "Serve the file server", + RunE: func(cmd *cobra.Command, args []string) error { ctx := cmd.Context() s, err := o.Store(ctx) @@ -161,12 +161,12 @@ func addStoreServeFiles() *cobra.Command { } return store.ServeFilesCmd(ctx, o, s) - }, - } + }, + } - o.AddFlags(cmd) + o.AddFlags(cmd) - return cmd + return cmd } func addStoreSave() *cobra.Command { @@ -210,7 +210,7 @@ func addStoreInfo() *cobra.Command { if err != nil { return err } - + for _, allowed := range allowedValues { if o.TypeFilter == allowed { return store.InfoCmd(ctx, o, s) diff --git a/cmd/hauler/cli/store/add.go b/cmd/hauler/cli/store/add.go index 6d45e98..ed0f26d 100644 --- a/cmd/hauler/cli/store/add.go +++ b/cmd/hauler/cli/store/add.go @@ -103,7 +103,7 @@ func storeImage(ctx context.Context, s *store.Layout, i v1alpha1.Image, platform if err != nil { return err } - + err = cosign.SaveImage(ctx, s, r.Name(), platform) if err != nil { return err @@ -147,7 +147,7 @@ func AddChartCmd(ctx context.Context, o *AddChartOpts, s *store.Layout, chartNam func storeChart(ctx context.Context, s *store.Layout, cfg v1alpha1.Chart, opts *action.ChartPathOptions) error { l := log.FromContext(ctx) l.Infof("adding 'chart' [%s] to the store", cfg.Name) - + // TODO: This shouldn't be necessary opts.RepoURL = cfg.RepoURL opts.Version = cfg.Version diff --git a/cmd/hauler/cli/store/copy.go b/cmd/hauler/cli/store/copy.go index d70fe1e..e77296f 100644 --- a/cmd/hauler/cli/store/copy.go +++ b/cmd/hauler/cli/store/copy.go @@ -55,7 +55,7 @@ func CopyCmd(ctx context.Context, o *CopyOpts, s *store.Layout, targetRef string Insecure: o.Insecure, PlainHTTP: o.PlainHTTP, } - + if ropts.Username != "" { err := cosign.RegistryLogin(ctx, s, components[1], ropts) if err != nil { diff --git a/cmd/hauler/cli/store/extract.go b/cmd/hauler/cli/store/extract.go index 3d9630d..2276052 100644 --- a/cmd/hauler/cli/store/extract.go +++ b/cmd/hauler/cli/store/extract.go @@ -2,9 +2,9 @@ package store import ( "context" - "strings" "encoding/json" "fmt" + "strings" ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/spf13/cobra" @@ -37,7 +37,7 @@ func ExtractCmd(ctx context.Context, o *ExtractOpts, s *store.Layout, ref string found := false if err := s.Walk(func(reference string, desc ocispec.Descriptor) error { - + if !strings.Contains(reference, r.Name()) { return nil } diff --git a/cmd/hauler/cli/store/info.go b/cmd/hauler/cli/store/info.go index 57a788c..45c1816 100644 --- a/cmd/hauler/cli/store/info.go +++ b/cmd/hauler/cli/store/info.go @@ -47,7 +47,7 @@ func InfoCmd(ctx context.Context, o *InfoOpts, s *store.Layout) error { } defer rc.Close() - // handle multi-arch images + // handle multi-arch images if desc.MediaType == consts.OCIImageIndexSchema || desc.MediaType == consts.DockerManifestListSchema2 { var idx ocispec.Index if err := json.NewDecoder(rc).Decode(&idx); err != nil { @@ -72,13 +72,13 @@ func InfoCmd(ctx context.Context, o *InfoOpts, s *store.Layout) error { items = append(items, i) } } - // handle "non" multi-arch images + // handle "non" multi-arch images } else if desc.MediaType == consts.DockerManifestSchema2 || desc.MediaType == consts.OCIManifestSchema1 { var m ocispec.Manifest if err := json.NewDecoder(rc).Decode(&m); err != nil { return err } - + rc, err := s.FetchManifest(ctx, m) if err != nil { return err @@ -90,7 +90,7 @@ func InfoCmd(ctx context.Context, o *InfoOpts, s *store.Layout) error { if err := json.NewDecoder(rc).Decode(&internalManifest); err != nil { return err } - + if internalManifest.Architecture != "" { i := newItem(s, desc, m, fmt.Sprintf("%s/%s", internalManifest.OS, internalManifest.Architecture), o) var emptyItem item @@ -104,8 +104,8 @@ func InfoCmd(ctx context.Context, o *InfoOpts, s *store.Layout) error { items = append(items, i) } } - // handle the rest - } else { + // handle the rest + } else { var m ocispec.Manifest if err := json.NewDecoder(rc).Decode(&m); err != nil { return err @@ -144,7 +144,7 @@ func buildTable(items ...item) { table.SetHeaderAlignment(tablewriter.ALIGN_LEFT) table.SetRowLine(false) table.SetAutoMergeCellsByColumnIndex([]int{0}) - + totalSize := int64(0) for _, i := range items { if i.Type != "" { @@ -173,11 +173,11 @@ func buildJson(item ...item) string { } type item struct { - Reference string - Type string - Platform string - Layers int - Size int64 + Reference string + Type string + Platform string + Layers int + Size int64 } type byReferenceAndArch []item @@ -227,7 +227,7 @@ func newItem(s *store.Layout, desc ocispec.Descriptor, m ocispec.Manifest, plat case "dev.cosignproject.cosign/sboms": ctype = "sbom" } - + ref, err := reference.Parse(desc.Annotations[ocispec.AnnotationRefName]) if err != nil { return item{} @@ -238,11 +238,11 @@ func newItem(s *store.Layout, desc ocispec.Descriptor, m ocispec.Manifest, plat } return item{ - Reference: ref.Name(), - Type: ctype, - Platform: plat, - Layers: len(m.Layers), - Size: size, + Reference: ref.Name(), + Type: ctype, + Platform: plat, + Layers: len(m.Layers), + Size: size, } } diff --git a/cmd/hauler/cli/store/sync.go b/cmd/hauler/cli/store/sync.go index d2b8260..dfbfe15 100644 --- a/cmd/hauler/cli/store/sync.go +++ b/cmd/hauler/cli/store/sync.go @@ -27,11 +27,11 @@ import ( type SyncOpts struct { *RootOpts - ContentFiles []string - Key string - Products []string - Platform string - Registry string + ContentFiles []string + Key string + Products []string + Platform string + Registry string ProductRegistry string } @@ -70,7 +70,7 @@ func SyncCmd(ctx context.Context, o *SyncOpts, s *store.Layout) error { if err != nil { return err } - err = ExtractCmd(ctx, &ExtractOpts{RootOpts: o.RootOpts}, s, fmt.Sprintf("hauler/%s-manifest.yaml:%s", parts[0],tag)) + err = ExtractCmd(ctx, &ExtractOpts{RootOpts: o.RootOpts}, s, fmt.Sprintf("hauler/%s-manifest.yaml:%s", parts[0], tag)) if err != nil { return err } @@ -151,19 +151,19 @@ func processContent(ctx context.Context, fi *os.File, o *SyncOpts, s *store.Layo } a := cfg.GetAnnotations() for _, i := range cfg.Spec.Images { - + // 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) - + 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) + newRef, err = reference.Relocate(i.Name, newReg) if err != nil { return err } @@ -189,7 +189,7 @@ func processContent(ctx context.Context, fi *os.File, o *SyncOpts, s *store.Layo } } l.Debugf("key for image [%s]", key) - + // verify signature using the provided key. err := cosign.VerifySignature(ctx, s, key, i.Name) if err != nil { @@ -209,7 +209,7 @@ func processContent(ctx context.Context, fi *os.File, o *SyncOpts, s *store.Layo if i.Platform != "" { platform = i.Platform } - + err = storeImage(ctx, s, i, platform) if err != nil { return err diff --git a/internal/mapper/filestore.go b/internal/mapper/filestore.go index 119108b..c633b4f 100644 --- a/internal/mapper/filestore.go +++ b/internal/mapper/filestore.go @@ -15,7 +15,8 @@ import ( ) // NewMapperFileStore creates a new file store that uses mapper functions for each detected descriptor. -// This extends content.File, and differs in that it allows much more functionality into how each descriptor is written. +// +// This extends content.File, and differs in that it allows much more functionality into how each descriptor is written. func NewMapperFileStore(root string, mapper map[string]Fn) *store { fs := content.NewFile(root) return &store{ diff --git a/internal/server/registry.go b/internal/server/registry.go index 6e2f3dc..9f27b6d 100644 --- a/internal/server/registry.go +++ b/internal/server/registry.go @@ -47,7 +47,7 @@ func NewTempRegistry(ctx context.Context, root string) *tmpRegistryServer { } // Add validation configuration cfg.Validation.Manifests.URLs.Allow = []string{".+"} - + cfg.Log.Level = "error" cfg.HTTP.Headers = http.Header{ "X-Content-Type-Options": []string{"nosniff"}, diff --git a/internal/version/version.go b/internal/version/version.go index 96e07b2..86de4f1 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -226,4 +226,4 @@ func (i *Info) CheckFontName(fontName string) bool { fmt.Fprintln(os.Stderr, "font not valid, using default") return false -} \ No newline at end of file +} diff --git a/pkg/apis/hauler.cattle.io/v1alpha1/image.go b/pkg/apis/hauler.cattle.io/v1alpha1/image.go index 0b894e2..23fb3c1 100644 --- a/pkg/apis/hauler.cattle.io/v1alpha1/image.go +++ b/pkg/apis/hauler.cattle.io/v1alpha1/image.go @@ -20,7 +20,7 @@ type ImageSpec struct { 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"` diff --git a/pkg/artifacts/image/image.go b/pkg/artifacts/image/image.go index e3bd20a..5cd87e2 100644 --- a/pkg/artifacts/image/image.go +++ b/pkg/artifacts/image/image.go @@ -54,27 +54,27 @@ func NewImage(name string, opts ...remote.Option) (*Image, error) { } func IsMultiArchImage(name string, opts ...remote.Option) (bool, error) { - ref, err := gname.ParseReference(name) - if err != nil { - return false, fmt.Errorf("parsing reference %q: %v", name, err) - } + ref, err := gname.ParseReference(name) + if err != nil { + return false, fmt.Errorf("parsing reference %q: %v", name, err) + } defaultOpts := []remote.Option{ remote.WithAuthFromKeychain(authn.DefaultKeychain), } opts = append(opts, defaultOpts...) - desc, err := remote.Get(ref, opts...) - if err != nil { - return false, fmt.Errorf("getting image %q: %v", name, err) - } + desc, err := remote.Get(ref, opts...) + if err != nil { + return false, fmt.Errorf("getting image %q: %v", name, err) + } - _, err = desc.ImageIndex() - if err != nil { - // If the descriptor could not be converted to an image index, it's not a multi-arch image - return false, nil - } + _, err = desc.ImageIndex() + if err != nil { + // 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 - return true, nil -} \ No newline at end of file + // If the descriptor could be converted to an image index, it's a multi-arch image + return true, nil +} diff --git a/pkg/artifacts/ocis.go b/pkg/artifacts/ocis.go index c1fe25b..fa432b1 100644 --- a/pkg/artifacts/ocis.go +++ b/pkg/artifacts/ocis.go @@ -3,8 +3,9 @@ package artifacts import "github.com/google/go-containerregistry/pkg/v1" // OCI is the bare minimum we need to represent an artifact in an oci layout -// At a high level, it is not constrained by an Image's config, manifests, and layer ordinality -// This specific implementation fully encapsulates v1.Layer's within a more generic form +// +// At a high level, it is not constrained by an Image's config, manifests, and layer ordinality +// This specific implementation fully encapsulates v1.Layer's within a more generic form type OCI interface { MediaType() string diff --git a/pkg/consts/consts.go b/pkg/consts/consts.go index a3853e2..1c1d951 100644 --- a/pkg/consts/consts.go +++ b/pkg/consts/consts.go @@ -50,8 +50,8 @@ const ( KindAnnotationName = "kind" KindAnnotation = "dev.cosignproject.cosign/image" - CarbideRegistry = "rgcrprod.azurecr.us" - ImageAnnotationKey = "hauler.dev/key" + CarbideRegistry = "rgcrprod.azurecr.us" + ImageAnnotationKey = "hauler.dev/key" ImageAnnotationPlatform = "hauler.dev/platform" ImageAnnotationRegistry = "hauler.dev/registry" ) diff --git a/pkg/cosign/cosign.go b/pkg/cosign/cosign.go index 442c340..4a33b2d 100644 --- a/pkg/cosign/cosign.go +++ b/pkg/cosign/cosign.go @@ -276,4 +276,4 @@ func getCosignPath() (string, error) { binaryPath := filepath.Join(haulerDir, binaryName) return binaryPath, nil -} \ No newline at end of file +} diff --git a/pkg/log/log.go b/pkg/log/log.go index b99e9a7..82de3b2 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -30,13 +30,13 @@ type Fields map[string]string // NewLogger returns a new Logger func NewLogger(out io.Writer) Logger { - customTimeFormat := "2006-01-02 15:04:05" - zerolog.TimeFieldFormat = customTimeFormat - output := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: customTimeFormat} - l := log.Output(output) - return &logger{ - zl: l.With().Timestamp().Logger(), - } + customTimeFormat := "2006-01-02 15:04:05" + zerolog.TimeFieldFormat = customTimeFormat + output := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: customTimeFormat} + l := log.Output(output) + return &logger{ + zl: l.With().Timestamp().Logger(), + } } // FromContext returns a Logger from a context if it exists diff --git a/pkg/reference/reference.go b/pkg/reference/reference.go index 22fb8a9..5f00771 100644 --- a/pkg/reference/reference.go +++ b/pkg/reference/reference.go @@ -1,7 +1,7 @@ // Package reference provides general types to represent oci content within a registry or local oci layout // Grammar (stolen mostly from containerd's grammar) // -// reference := +// reference := package reference import (