diff --git a/README.md b/README.md index ebc16d2..aa15031 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,3 @@ brew install hauler * [go-containerregistry](https://github.com/google/go-containerregistry) * [oras cli](https://github.com/oras-project/oras) * [cosign](https://github.com/sigstore/cosign) - -## Notices -**WARNING - Upcoming Deprecated Command(s):** - -`hauler download` (alternatively, `dl`) and `hauler serve` (_not_ `hauler store serve`) commands are deprecated and will be removed in a future release. diff --git a/cmd/hauler/cli/cli.go b/cmd/hauler/cli/cli.go index 934d8a9..0ae0190 100644 --- a/cmd/hauler/cli/cli.go +++ b/cmd/hauler/cli/cli.go @@ -31,10 +31,8 @@ func New() *cobra.Command { pf.StringVarP(&ro.logLevel, "log-level", "l", "info", "") // Add subcommands - addDownload(cmd) addLogin(cmd) addStore(cmd) - addServe(cmd) addVersion(cmd) addCompletion(cmd) diff --git a/cmd/hauler/cli/download.go b/cmd/hauler/cli/download.go deleted file mode 100644 index 08fee84..0000000 --- a/cmd/hauler/cli/download.go +++ /dev/null @@ -1,45 +0,0 @@ -package cli - -import ( - "github.com/spf13/cobra" - - "github.com/rancherfederal/hauler/cmd/hauler/cli/download" -) - -func addDownload(parent *cobra.Command) { - o := &download.Opts{} - - cmd := &cobra.Command{ - Use: "download", - Short: "Download OCI content from a registry and populate it on disk", - Long: `*** WARNING: Deprecated Command *** -The 'download (dl)' command is deprecated and will be removed in a future release of Hauler. - -Locate OCI content based on it's reference in a compatible registry and download the contents to disk. - -Note that the content type determines it's format on disk. Hauler's built in content types act as follows: - - - File: as a file named after the pushed contents source name (ex: my-file.yaml:latest --> my-file.yaml) - - Image: as a .tar named after the image (ex: alpine:latest --> alpine:latest.tar) - - Chart: as a .tar.gz named after the chart (ex: loki:2.0.2 --> loki-2.0.2.tar.gz)`, - Example: ` -# Download a file -hauler dl localhost:5000/my-file.yaml:latest - -# Download an image -hauler dl localhost:5000/rancher/k3s:v1.22.2-k3s2 - -# Download a chart -hauler dl localhost:5000/hauler/longhorn:1.2.0`, - Aliases: []string{"dl"}, - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, arg []string) error { - ctx := cmd.Context() - - return download.Cmd(ctx, o, arg[0]) - }, - } - o.AddArgs(cmd) - - parent.AddCommand(cmd) -} diff --git a/cmd/hauler/cli/download/download.go b/cmd/hauler/cli/download/download.go deleted file mode 100644 index d63f1f6..0000000 --- a/cmd/hauler/cli/download/download.go +++ /dev/null @@ -1,87 +0,0 @@ -package download - -import ( - "context" - "encoding/json" - - "github.com/google/go-containerregistry/pkg/authn" - "github.com/google/go-containerregistry/pkg/v1/remote" - ocispec "github.com/opencontainers/image-spec/specs-go/v1" - "github.com/spf13/cobra" - "oras.land/oras-go/pkg/content" - "oras.land/oras-go/pkg/oras" - - "github.com/rancherfederal/hauler/pkg/consts" - - "github.com/rancherfederal/hauler/internal/mapper" - "github.com/rancherfederal/hauler/pkg/log" - "github.com/rancherfederal/hauler/pkg/reference" -) - -type Opts struct { - DestinationDir string - - Username string - Password string - Insecure bool - PlainHTTP bool -} - -func (o *Opts) AddArgs(cmd *cobra.Command) { - f := cmd.Flags() - - f.StringVarP(&o.DestinationDir, "output", "o", "", "Directory to save contents to (defaults to current directory)") - f.StringVarP(&o.Username, "username", "u", "", "Username when copying to an authenticated remote registry") - f.StringVarP(&o.Password, "password", "p", "", "Password when copying to an authenticated remote registry") - f.BoolVar(&o.Insecure, "insecure", false, "Toggle allowing insecure connections when copying to a remote registry") - f.BoolVar(&o.PlainHTTP, "plain-http", false, "Toggle allowing plain http connections when copying to a remote registry") -} - -func Cmd(ctx context.Context, o *Opts, ref string) error { - l := log.FromContext(ctx) - - ropts := content.RegistryOptions{ - Username: o.Username, - Password: o.Password, - Insecure: o.Insecure, - PlainHTTP: o.PlainHTTP, - } - rs, err := content.NewRegistry(ropts) - if err != nil { - return err - } - - r, err := reference.Parse(ref) - if err != nil { - return err - } - - desc, err := remote.Get(r, remote.WithAuthFromKeychain(authn.DefaultKeychain), remote.WithContext(ctx)) - if err != nil { - return err - } - - manifestData, err := desc.RawManifest() - if err != nil { - return err - } - - var manifest ocispec.Manifest - if err := json.Unmarshal(manifestData, &manifest); err != nil { - return err - } - - mapperStore, err := mapper.FromManifest(manifest, o.DestinationDir) - if err != nil { - return err - } - - pushedDesc, err := oras.Copy(ctx, rs, r.Name(), mapperStore, "", - oras.WithAdditionalCachedMediaTypes(consts.DockerManifestSchema2)) - if err != nil { - return err - } - - l.Infof("downloaded [%s] with digest [%s]", pushedDesc.MediaType, pushedDesc.Digest.String()) - return nil -} diff --git a/cmd/hauler/cli/serve.go b/cmd/hauler/cli/serve.go deleted file mode 100644 index e85d472..0000000 --- a/cmd/hauler/cli/serve.go +++ /dev/null @@ -1,57 +0,0 @@ -package cli - -import ( - "github.com/spf13/cobra" - - "github.com/rancherfederal/hauler/cmd/hauler/cli/serve" -) - -func addServe(parent *cobra.Command) { - cmd := &cobra.Command{ - Use: "serve", - Short: "Run one or more of hauler's embedded servers types", - Long: `*** WARNING: Deprecated Command *** -The 'serve' command is deprecated and will be removed in a future release of Hauler.`, - RunE: func(cmd *cobra.Command, args []string) error { - return cmd.Help() - }, - } - - cmd.AddCommand( - addServeFiles(), - addServeRegistry(), - ) - - parent.AddCommand(cmd) -} - -func addServeFiles() *cobra.Command { - o := &serve.FilesOpts{} - cmd := &cobra.Command{ - Use: "files", - Short: "Start a fileserver", - RunE: func(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - return serve.FilesCmd(ctx, o) - }, - } - o.AddFlags(cmd) - - return cmd -} - -func addServeRegistry() *cobra.Command { - o := &serve.RegistryOpts{} - - cmd := &cobra.Command{ - Use: "registry", - Short: "Start a registry", - RunE: func(cmd *cobra.Command, args []string) error { - ctx := cmd.Context() - return serve.RegistryCmd(ctx, o) - }, - } - o.AddFlags(cmd) - - return cmd -} diff --git a/cmd/hauler/cli/serve/files.go b/cmd/hauler/cli/serve/files.go deleted file mode 100644 index 164f5d1..0000000 --- a/cmd/hauler/cli/serve/files.go +++ /dev/null @@ -1,37 +0,0 @@ -package serve - -import ( - "context" - - "github.com/spf13/cobra" - - "github.com/rancherfederal/hauler/internal/server" -) - -type FilesOpts struct { - Root string - Port int -} - -func (o *FilesOpts) AddFlags(cmd *cobra.Command) { - f := cmd.Flags() - f.StringVarP(&o.Root, "root", "r", ".", "Path to root of the directory to serve") - f.IntVarP(&o.Port, "port", "p", 8080, "Port to listen on") -} - -func FilesCmd(ctx context.Context, o *FilesOpts) error { - cfg := server.FileConfig{ - Root: o.Root, - Port: o.Port, - } - - s, err := server.NewFile(ctx, cfg) - if err != nil { - return err - } - - if err := s.ListenAndServe(); err != nil { - return err - } - return nil -} diff --git a/cmd/hauler/cli/serve/registry.go b/cmd/hauler/cli/serve/registry.go deleted file mode 100644 index 99218bd..0000000 --- a/cmd/hauler/cli/serve/registry.go +++ /dev/null @@ -1,81 +0,0 @@ -package serve - -import ( - "context" - "fmt" - "net/http" - "os" - - "github.com/distribution/distribution/v3/configuration" - dcontext "github.com/distribution/distribution/v3/context" - "github.com/distribution/distribution/v3/version" - "github.com/spf13/cobra" - - "github.com/rancherfederal/hauler/internal/server" -) - -type RegistryOpts struct { - Root string - Port int - ConfigFile string -} - -func (o *RegistryOpts) AddFlags(cmd *cobra.Command) { - f := cmd.Flags() - f.StringVarP(&o.Root, "root", "r", ".", "Path to root of the directory to serve") - f.IntVarP(&o.Port, "port", "p", 5000, "Port to listen on") - f.StringVarP(&o.ConfigFile, "config", "c", "", "Path to a config file, will override all other configs") -} - -func RegistryCmd(ctx context.Context, o *RegistryOpts) error { - ctx = dcontext.WithVersion(ctx, version.Version) - - cfg := o.defaultConfig() - if o.ConfigFile != "" { - ucfg, err := loadConfig(o.ConfigFile) - if err != nil { - return err - } - cfg = ucfg - } - - s, err := server.NewRegistry(ctx, cfg) - if err != nil { - return err - } - - if err := s.ListenAndServe(); err != nil { - return err - } - return nil -} - -func loadConfig(filename string) (*configuration.Configuration, error) { - f, err := os.Open(filename) - if err != nil { - return nil, err - } - - return configuration.Parse(f) -} - -func (o *RegistryOpts) defaultConfig() *configuration.Configuration { - cfg := &configuration.Configuration{ - Version: "0.1", - Storage: configuration.Storage{ - "cache": configuration.Parameters{"blobdescriptor": "inmemory"}, - "filesystem": configuration.Parameters{"rootdirectory": o.Root}, - - // TODO: Ensure this is toggleable via cli arg if necessary - // "maintenance": configuration.Parameters{"readonly.enabled": false}, - }, - } - cfg.Log.Level = "info" - cfg.HTTP.Addr = fmt.Sprintf(":%d", o.Port) - cfg.HTTP.Headers = http.Header{ - "X-Content-Type-Options": []string{"nosniff"}, - "Accept": []string{"application/vnd.dsse.envelope.v1+json, application/json"}, - } - - return cfg -}