allow config file to be passed to hauler store serve

This commit is contained in:
Josh Wolf
2021-11-01 14:06:22 -06:00
parent e5384251f2
commit 786e63f2ef
2 changed files with 44 additions and 17 deletions
+1 -1
View File
@@ -109,7 +109,7 @@ func addStoreServe() *cobra.Command {
return err
}
return store.ServeCmd(ctx, o, s.DataDir)
return store.ServeCmd(ctx, o, s)
},
}
o.AddFlags(cmd)
+43 -16
View File
@@ -4,44 +4,42 @@ import (
"context"
"fmt"
"net/http"
"os"
"github.com/distribution/distribution/v3/configuration"
"github.com/distribution/distribution/v3/registry"
"github.com/spf13/cobra"
"github.com/rancherfederal/hauler/pkg/log"
"github.com/rancherfederal/hauler/pkg/store"
)
type ServeOpts struct {
Port int
configFile string
ConfigFile string
storedir string
}
func (o *ServeOpts) AddFlags(cmd *cobra.Command) {
f := cmd.Flags()
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")
}
// ServeCmd does
func ServeCmd(ctx context.Context, o *ServeOpts, dir string) error {
func ServeCmd(ctx context.Context, o *ServeOpts, s *store.Store) error {
l := log.FromContext(ctx)
l.Debugf("running command `hauler store serve`")
cfg := &configuration.Configuration{
Version: "0.1",
Storage: configuration.Storage{
"cache": configuration.Parameters{"blobdescriptor": "inmemory"},
"filesystem": configuration.Parameters{"rootdirectory": dir},
// TODO: Ensure this is toggleable via cli arg if necessary
"maintenance": configuration.Parameters{"readonly.enabled": true},
},
}
cfg.Log.Level = "info"
cfg.HTTP.Addr = fmt.Sprintf(":%d", o.Port)
cfg.HTTP.Headers = http.Header{
"X-Content-Type-Options": []string{"nosniff"},
cfg := o.defaultConfig(s)
if o.ConfigFile != "" {
ucfg, err := loadConfig(o.ConfigFile)
if err != nil {
return err
}
cfg = ucfg
}
r, err := registry.NewRegistry(ctx, cfg)
@@ -56,3 +54,32 @@ func ServeCmd(ctx context.Context, o *ServeOpts, dir string) error {
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 *ServeOpts) defaultConfig(s *store.Store) *configuration.Configuration {
cfg := &configuration.Configuration{
Version: "0.1",
Storage: configuration.Storage{
"cache": configuration.Parameters{"blobdescriptor": "inmemory"},
"filesystem": configuration.Parameters{"rootdirectory": s.DataDir},
// TODO: Ensure this is toggleable via cli arg if necessary
"maintenance": configuration.Parameters{"readonly.enabled": true},
},
}
cfg.Log.Level = "info"
cfg.HTTP.Addr = fmt.Sprintf(":%d", o.Port)
cfg.HTTP.Headers = http.Header{
"X-Content-Type-Options": []string{"nosniff"},
}
return cfg
}