From 0729996957151830f59ba8c7e2e0325257e6c674 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Mon, 4 Nov 2024 19:12:38 +0100 Subject: [PATCH 1/2] priority for CLI registration options --- .../extensions/blobhandler/registration.go | 3 + .../common/options/downloaderoption/option.go | 2 +- .../options/downloaderoption/option_test.go | 80 +++++++++++++++++++ .../options/downloaderoption/suite_test.go | 13 +++ .../common/options/optutils/registration.go | 41 +++++++--- .../common/options/uploaderoption/option.go | 2 +- .../options/uploaderoption/option_test.go | 80 +++++++++++++++++++ .../options/uploaderoption/uploader_test.go | 4 +- docs/reference/ocm_add_componentversions.md | 2 +- docs/reference/ocm_download_resources.md | 2 +- .../ocm_transfer_commontransportarchive.md | 2 +- .../ocm_transfer_componentversions.md | 2 +- 12 files changed, 216 insertions(+), 17 deletions(-) create mode 100644 cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option_test.go create mode 100644 cmds/ocm/commands/ocmcmds/common/options/downloaderoption/suite_test.go create mode 100644 cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option_test.go diff --git a/api/ocm/extensions/blobhandler/registration.go b/api/ocm/extensions/blobhandler/registration.go index 83a1763517..308a06765c 100644 --- a/api/ocm/extensions/blobhandler/registration.go +++ b/api/ocm/extensions/blobhandler/registration.go @@ -4,8 +4,11 @@ import ( "fmt" "ocm.software/ocm/api/ocm/cpi" + "ocm.software/ocm/api/ocm/internal" ) +const DEFAULT_BLOBHANDLER_PRIO = internal.DEFAULT_BLOBHANDLER_PRIO + func RegisterHandlerByName(ctx cpi.ContextProvider, name string, config HandlerConfig, opts ...HandlerOption) error { o, err := For(ctx).RegisterByName(name, ctx.OCMContext(), config, opts...) if err != nil { diff --git a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go index 3c214aa4b7..641a1c87d4 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go @@ -31,7 +31,7 @@ type Option struct { func (o *Option) Register(ctx ocm.ContextProvider) error { for _, s := range o.Registrations { err := download.RegisterHandlerByName(ctx.OCMContext(), s.Name, s.Config, - download.ForArtifactType(s.ArtifactType), download.ForMimeType(s.MediaType)) + download.ForArtifactType(s.ArtifactType), download.ForMimeType(s.MediaType), download.WithPrio(s.GetPriority(download.DEFAULT_BLOBHANDLER_PRIO*2))) if err != nil { return err } diff --git a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option_test.go b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option_test.go new file mode 100644 index 0000000000..6cdfa5a10c --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option_test.go @@ -0,0 +1,80 @@ +package downloaderoption_test + +import ( + . "github.com/mandelsoft/goutils/testutils" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/mandelsoft/goutils/generics" + "github.com/spf13/pflag" + + "ocm.software/ocm/api/ocm" + me "ocm.software/ocm/cmds/ocm/commands/ocmcmds/common/options/downloaderoption" +) + +var _ = Describe("Downloader Option Test Environment", func() { + var o *me.Option + var fs *pflag.FlagSet + + BeforeEach(func() { + o = me.New(ocm.DefaultContext()) + fs = &pflag.FlagSet{} + o.AddFlags(fs) + }) + + It("handles all parts", func() { + MustBeSuccessful(fs.Parse([]string{"--downloader", `bla/blub:a:b:10={"k":"v"}`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(Equal(generics.Pointer(10))) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("a")) + Expect(o.Registrations[0].MediaType).To(Equal("b")) + Expect(o.Registrations[0].Config).To(Equal([]byte(`{"k":"v"}`))) + Expect("").To(Equal("")) + }) + + It("handles empty parts", func() { + MustBeSuccessful(fs.Parse([]string{"--downloader", `bla/blub:::10={"k":"v"}`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(Equal(generics.Pointer(10))) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("")) + Expect(o.Registrations[0].MediaType).To(Equal("")) + Expect(o.Registrations[0].Config).To(Equal([]byte(`{"k":"v"}`))) + }) + + It("handles art/media/config", func() { + MustBeSuccessful(fs.Parse([]string{"--downloader", `bla/blub:a:b={"k":"v"}`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(BeNil()) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("a")) + Expect(o.Registrations[0].MediaType).To(Equal("b")) + Expect(o.Registrations[0].Config).To(Equal([]byte(`{"k":"v"}`))) + }) + + It("handles art/media/empty config", func() { + MustBeSuccessful(fs.Parse([]string{"--downloader", `bla/blub:a:b`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(BeNil()) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("a")) + Expect(o.Registrations[0].MediaType).To(Equal("b")) + Expect(o.Registrations[0].Config).To(BeNil()) + }) + + It("handles empty config", func() { + MustBeSuccessful(fs.Parse([]string{"--downloader", `bla/blub`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(BeNil()) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("")) + Expect(o.Registrations[0].MediaType).To(Equal("")) + Expect(o.Registrations[0].Config).To(BeNil()) + }) +}) diff --git a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/suite_test.go b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/suite_test.go new file mode 100644 index 0000000000..7774df74a1 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/suite_test.go @@ -0,0 +1,13 @@ +package downloaderoption_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestConfig(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "downloader option Test Suite") +} diff --git a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go index a83fe2b1fd..0d9c008fef 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go +++ b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go @@ -3,9 +3,11 @@ package optutils import ( "encoding/json" "fmt" + "strconv" "strings" "github.com/mandelsoft/goutils/errors" + "github.com/mandelsoft/goutils/generics" "github.com/spf13/pflag" "sigs.k8s.io/yaml" @@ -18,9 +20,17 @@ type Registration struct { Name string ArtifactType string MediaType string + Prio *int Config interface{} } +func (r *Registration) GetPriority(def int) int { + if r.Prio != nil { + return *r.Prio + } + return def +} + func NewRegistrationOption(name, short, desc, usage string) RegistrationOption { return RegistrationOption{name: name, short: short, desc: desc, usage: usage} } @@ -34,7 +44,7 @@ type RegistrationOption struct { Registrations []*Registration } -const RegistrationFormat = "[:[:]]== 0 { art = nam[i+1:] nam = nam[:i] - i = strings.Index(art, ":") - if i >= 0 { - med = art[i+1:] - art = art[:i] - i = strings.Index(med, ":") - if i >= 0 { - return fmt.Errorf("invalid %s registration %s must be of %s", o.name, n, RegistrationFormat) - } + } + i = strings.Index(art, ":") + if i >= 0 { + med = art[i+1:] + art = art[:i] + } + i = strings.Index(med, ":") + if i >= 0 { + p := med[i+1:] + med = med[:i] + + v, err := strconv.ParseInt(p, 10, 32) + if err != nil { + return fmt.Errorf("invalid %s registration %s (invalid priority) must be of %s", o.name, n, RegistrationFormat) } + prio = generics.Pointer(int(v)) + } + i = strings.Index(med, ":") + if i >= 0 { + return fmt.Errorf("invalid %s registration %s must be of %s", o.name, n, RegistrationFormat) } var data interface{} @@ -93,6 +115,7 @@ func (o *RegistrationOption) Configure(ctx clictx.Context) error { Name: nam, ArtifactType: art, MediaType: med, + Prio: prio, Config: data, }) } diff --git a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go index 4386201744..b8ad85c3ad 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go +++ b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go @@ -29,7 +29,7 @@ type Option struct { func (o *Option) Register(ctx ocm.ContextProvider) error { for _, s := range o.Registrations { err := blobhandler.RegisterHandlerByName(ctx.OCMContext(), s.Name, s.Config, - blobhandler.ForArtifactType(s.ArtifactType), blobhandler.ForMimeType(s.MediaType)) + blobhandler.ForArtifactType(s.ArtifactType), blobhandler.ForMimeType(s.MediaType), blobhandler.WithPrio(s.GetPriority(blobhandler.DEFAULT_BLOBHANDLER_PRIO*2))) if err != nil { return err } diff --git a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option_test.go b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option_test.go new file mode 100644 index 0000000000..91a4fd78c9 --- /dev/null +++ b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option_test.go @@ -0,0 +1,80 @@ +package uploaderoption_test + +import ( + . "github.com/mandelsoft/goutils/testutils" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "github.com/mandelsoft/goutils/generics" + "github.com/spf13/pflag" + + "ocm.software/ocm/api/ocm" + me "ocm.software/ocm/cmds/ocm/commands/ocmcmds/common/options/uploaderoption" +) + +var _ = Describe("Downloader Option Test Environment", func() { + var o *me.Option + var fs *pflag.FlagSet + + BeforeEach(func() { + o = me.New(ocm.DefaultContext()) + fs = &pflag.FlagSet{} + o.AddFlags(fs) + }) + + It("handles all parts", func() { + MustBeSuccessful(fs.Parse([]string{"--uploader", `bla/blub:a:b:10={"k":"v"}`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(Equal(generics.Pointer(10))) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("a")) + Expect(o.Registrations[0].MediaType).To(Equal("b")) + Expect(o.Registrations[0].Config).To(Equal([]byte(`{"k":"v"}`))) + Expect("").To(Equal("")) + }) + + It("handles empty parts", func() { + MustBeSuccessful(fs.Parse([]string{"--uploader", `bla/blub:::10={"k":"v"}`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(Equal(generics.Pointer(10))) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("")) + Expect(o.Registrations[0].MediaType).To(Equal("")) + Expect(o.Registrations[0].Config).To(Equal([]byte(`{"k":"v"}`))) + }) + + It("handles art/media/config", func() { + MustBeSuccessful(fs.Parse([]string{"--uploader", `bla/blub:a:b={"k":"v"}`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(BeNil()) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("a")) + Expect(o.Registrations[0].MediaType).To(Equal("b")) + Expect(o.Registrations[0].Config).To(Equal([]byte(`{"k":"v"}`))) + }) + + It("handles art/media/empty config", func() { + MustBeSuccessful(fs.Parse([]string{"--uploader", `bla/blub:a:b`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(BeNil()) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("a")) + Expect(o.Registrations[0].MediaType).To(Equal("b")) + Expect(o.Registrations[0].Config).To(BeNil()) + }) + + It("handles empty config", func() { + MustBeSuccessful(fs.Parse([]string{"--uploader", `bla/blub`})) + MustBeSuccessful(o.Configure(nil)) + Expect(len(o.Registrations)).To(Equal(1)) + Expect(o.Registrations[0].Prio).To(BeNil()) + Expect(o.Registrations[0].Name).To(Equal("bla/blub")) + Expect(o.Registrations[0].ArtifactType).To(Equal("")) + Expect(o.Registrations[0].MediaType).To(Equal("")) + Expect(o.Registrations[0].Config).To(BeNil()) + }) +}) diff --git a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go index fbc5e9f99d..5942457560 100644 --- a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go +++ b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/uploader_test.go @@ -84,7 +84,7 @@ var _ = Describe("uploader option", func() { }) It("fails", func() { - MustBeSuccessful(flags.Parse([]string{`--uploader`, `plugin/name:::=Name`})) - MustFailWithMessage(opt.Configure(ctx), "invalid uploader registration plugin/name::: must be of "+optutils.RegistrationFormat) + MustBeSuccessful(flags.Parse([]string{`--uploader`, `plugin/name:::0:=Name`})) + MustFailWithMessage(opt.Configure(ctx), "invalid uploader registration plugin/name:::0: (invalid priority) must be of "+optutils.RegistrationFormat) }) }) diff --git a/docs/reference/ocm_add_componentversions.md b/docs/reference/ocm_add_componentversions.md index 91ae988a4a..71e00997ec 100644 --- a/docs/reference/ocm_add_componentversions.md +++ b/docs/reference/ocm_add_componentversions.md @@ -31,7 +31,7 @@ componentversions, componentversion, cv, components, component, comps, comp, c -s, --settings stringArray settings file with variable settings (yaml) --templater string templater to use (go, none, spiff, subst) (default "subst") -t, --type string archive format (directory, tar, tgz) (default "directory") - --uploader = repository uploader ([:[:]]== repository uploader ([:[:[:]]]=) (default []) -v, --version string default version for components ``` diff --git a/docs/reference/ocm_download_resources.md b/docs/reference/ocm_download_resources.md index 1e81643411..cecd4e8654 100644 --- a/docs/reference/ocm_download_resources.md +++ b/docs/reference/ocm_download_resources.md @@ -18,7 +18,7 @@ resources, resource, res, r --check-verified enable verification store -c, --constraints constraints version constraint -d, --download-handlers use download handler if possible - --downloader = artifact downloader ([:[:]]== artifact downloader ([:[:[:]]]=) (default []) -x, --executable download executable for local platform -h, --help help for resources --latest restrict component versions to latest diff --git a/docs/reference/ocm_transfer_commontransportarchive.md b/docs/reference/ocm_transfer_commontransportarchive.md index 17ec4d89e6..f873bc8275 100644 --- a/docs/reference/ocm_transfer_commontransportarchive.md +++ b/docs/reference/ocm_transfer_commontransportarchive.md @@ -29,7 +29,7 @@ commontransportarchive, ctf -s, --scriptFile string filename of transfer handler script -E, --stop-on-existing stop on existing component version in target repository -t, --type string archive format (directory, tar, tgz) (default "directory") - --uploader = repository uploader ([:[:]]== repository uploader ([:[:[:]]]=) (default []) ``` ### Description diff --git a/docs/reference/ocm_transfer_componentversions.md b/docs/reference/ocm_transfer_componentversions.md index f335ae5629..8f40c50eb5 100644 --- a/docs/reference/ocm_transfer_componentversions.md +++ b/docs/reference/ocm_transfer_componentversions.md @@ -34,7 +34,7 @@ componentversions, componentversion, cv, components, component, comps, comp, c -s, --scriptFile string filename of transfer handler script -E, --stop-on-existing stop on existing component version in target repository -t, --type string archive format (directory, tar, tgz) (default "directory") - --uploader = repository uploader ([:[:]]== repository uploader ([:[:[:]]]=) (default []) ``` ### Description From 5aebb57e5fa95f2404c46491337537c0579f9943 Mon Sep 17 00:00:00 2001 From: Uwe Krueger Date: Tue, 5 Nov 2024 10:20:29 +0100 Subject: [PATCH 2/2] provide doc + layered prios --- api/ocm/extensions/blobhandler/config/type.go | 13 ++++++++++--- api/ocm/extensions/download/config/type.go | 13 ++++++++++--- .../common/options/downloaderoption/option.go | 2 +- .../ocmcmds/common/options/optutils/reg_test.go | 2 +- .../ocmcmds/common/options/optutils/registration.go | 2 +- .../ocmcmds/common/options/uploaderoption/option.go | 2 +- docs/reference/ocm_add_componentversions.md | 2 +- docs/reference/ocm_configfile.md | 6 ++++-- docs/reference/ocm_download_resources.md | 2 +- .../ocm_transfer_commontransportarchive.md | 2 +- docs/reference/ocm_transfer_componentversions.md | 2 +- 11 files changed, 32 insertions(+), 16 deletions(-) diff --git a/api/ocm/extensions/blobhandler/config/type.go b/api/ocm/extensions/blobhandler/config/type.go index 211108164c..01a2054412 100644 --- a/api/ocm/extensions/blobhandler/config/type.go +++ b/api/ocm/extensions/blobhandler/config/type.go @@ -64,7 +64,13 @@ func (a *Config) ApplyTo(ctx cfgcpi.Context, target interface{}) error { } reg := blobhandler.For(t) for _, h := range a.Registrations { - accepted, err := reg.RegisterByName(h.Name, t, h.Config, &h.HandlerOptions) + opts := h.HandlerOptions + if opts.Priority == 0 { + // config objects have higher prio than builtin defaults + // CLI options get even higher prio. + opts.Priority = blobhandler.DEFAULT_BLOBHANDLER_PRIO * 2 + } + accepted, err := reg.RegisterByName(h.Name, t, h.Config, &opts) if err != nil { return errors.Wrapf(err, "registering upload handler %q[%s]", h.Name, h.Description) } @@ -75,9 +81,10 @@ func (a *Config) ApplyTo(ctx cfgcpi.Context, target interface{}) error { return nil } -const usage = ` +var usage = ` The config type ` + ConfigType + ` can be used to define a list -of preconfigured upload handler registrations (see ocm ocm-uploadhandlers): +of preconfigured upload handler registrations (see ocm ocm-uploadhandlers), +the default priority is ` + fmt.Sprintf("%d", download.DEFAULT_BLOBHANDLER_PRIO*2) + `:
     type: ` + ConfigType + `
diff --git a/api/ocm/extensions/download/config/type.go b/api/ocm/extensions/download/config/type.go
index c29fa3eeee..868fe46a28 100644
--- a/api/ocm/extensions/download/config/type.go
+++ b/api/ocm/extensions/download/config/type.go
@@ -63,7 +63,13 @@ func (a *Config) ApplyTo(ctx cfgcpi.Context, target interface{}) error {
 	}
 	reg := download.For(t)
 	for _, h := range a.Registrations {
-		accepted, err := reg.RegisterByName(h.Name, t, h.Config, &h.HandlerOptions)
+		opts := h.HandlerOptions
+		if opts.Priority == 0 {
+			// config objects have higher prio than builtin defaults
+			// CLI options get even higher prio.
+			opts.Priority = download.DEFAULT_BLOBHANDLER_PRIO * 2
+		}
+		accepted, err := reg.RegisterByName(h.Name, t, h.Config, &opts)
 		if err != nil {
 			return errors.Wrapf(err, "registering download handler %q[%s]", h.Name, h.Description)
 		}
@@ -74,9 +80,10 @@ func (a *Config) ApplyTo(ctx cfgcpi.Context, target interface{}) error {
 	return nil
 }
 
-const usage = `
+var usage = `
 The config type ` + ConfigType + ` can be used to define a list
-of preconfigured download handler registrations (see ocm ocm-downloadhandlers):
+of preconfigured download handler registrations (see ocm ocm-downloadhandlers),
+the default priority is ` + fmt.Sprintf("%d", download.DEFAULT_BLOBHANDLER_PRIO*2) + `:
 
 
     type: ` + ConfigType + `
diff --git a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go
index 641a1c87d4..0552c854c1 100644
--- a/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go
+++ b/cmds/ocm/commands/ocmcmds/common/options/downloaderoption/option.go
@@ -31,7 +31,7 @@ type Option struct {
 func (o *Option) Register(ctx ocm.ContextProvider) error {
 	for _, s := range o.Registrations {
 		err := download.RegisterHandlerByName(ctx.OCMContext(), s.Name, s.Config,
-			download.ForArtifactType(s.ArtifactType), download.ForMimeType(s.MediaType), download.WithPrio(s.GetPriority(download.DEFAULT_BLOBHANDLER_PRIO*2)))
+			download.ForArtifactType(s.ArtifactType), download.ForMimeType(s.MediaType), download.WithPrio(s.GetPriority(download.DEFAULT_BLOBHANDLER_PRIO*3)))
 		if err != nil {
 			return err
 		}
diff --git a/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go b/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go
index cb15c02251..829b42c17e 100644
--- a/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go
+++ b/cmds/ocm/commands/ocmcmds/common/options/optutils/reg_test.go
@@ -105,6 +105,6 @@ var _ = Describe("registration options", func() {
 
 	It("fails", func() {
 		MustBeSuccessful(flags.Parse([]string{`--test`, `plugin/name:::=Name`}))
-		MustFailWithMessage(opt.Configure(ctx), "invalid test registration plugin/name::: must be of "+optutils.RegistrationFormat)
+		MustFailWithMessage(opt.Configure(ctx), "invalid test registration plugin/name::: (invalid priority) must be of "+optutils.RegistrationFormat)
 	})
 })
diff --git a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go
index 0d9c008fef..44b0da8344 100644
--- a/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go
+++ b/cmds/ocm/commands/ocmcmds/common/options/optutils/registration.go
@@ -44,7 +44,7 @@ type RegistrationOption struct {
 	Registrations []*Registration
 }
 
-const RegistrationFormat = "[:[:[:]]]="
+const RegistrationFormat = "[:[:[:]]]="
 
 func (o *RegistrationOption) AddFlags(fs *pflag.FlagSet) {
 	flag.StringToStringVarP(fs, &o.spec, o.name, o.short, nil, fmt.Sprintf("%s (%s)", o.desc, RegistrationFormat))
diff --git a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go
index b8ad85c3ad..a5fa584f05 100644
--- a/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go
+++ b/cmds/ocm/commands/ocmcmds/common/options/uploaderoption/option.go
@@ -29,7 +29,7 @@ type Option struct {
 func (o *Option) Register(ctx ocm.ContextProvider) error {
 	for _, s := range o.Registrations {
 		err := blobhandler.RegisterHandlerByName(ctx.OCMContext(), s.Name, s.Config,
-			blobhandler.ForArtifactType(s.ArtifactType), blobhandler.ForMimeType(s.MediaType), blobhandler.WithPrio(s.GetPriority(blobhandler.DEFAULT_BLOBHANDLER_PRIO*2)))
+			blobhandler.ForArtifactType(s.ArtifactType), blobhandler.ForMimeType(s.MediaType), blobhandler.WithPrio(s.GetPriority(blobhandler.DEFAULT_BLOBHANDLER_PRIO*3)))
 		if err != nil {
 			return err
 		}
diff --git a/docs/reference/ocm_add_componentversions.md b/docs/reference/ocm_add_componentversions.md
index 71e00997ec..b95988d4ac 100644
--- a/docs/reference/ocm_add_componentversions.md
+++ b/docs/reference/ocm_add_componentversions.md
@@ -31,7 +31,7 @@ componentversions, componentversion, cv, components, component, comps, comp, c
   -s, --settings stringArray      settings file with variable settings (yaml)
       --templater string          templater to use (go, none, spiff, subst) (default "subst")
   -t, --type string               archive format (directory, tar, tgz) (default "directory")
-      --uploader =   repository uploader ([:[:[:]]]=) (default [])
+      --uploader =   repository uploader ([:[:[:]]]=) (default [])
   -v, --version string            default version for components
 ```
 
diff --git a/docs/reference/ocm_configfile.md b/docs/reference/ocm_configfile.md
index e92a1ba5e6..ae9e51920d 100644
--- a/docs/reference/ocm_configfile.md
+++ b/docs/reference/ocm_configfile.md
@@ -61,7 +61,8 @@ The following configuration types are supported:
   
- downloader.ocm.config.ocm.software The config type downloader.ocm.config.ocm.software can be used to define a list - of preconfigured download handler registrations (see [ocm ocm-downloadhandlers](ocm_ocm-downloadhandlers.md)): + of preconfigured download handler registrations (see [ocm ocm-downloadhandlers](ocm_ocm-downloadhandlers.md)), + the default priority is 200:
       type: downloader.ocm.config.ocm.software
@@ -314,7 +315,8 @@ The following configuration types are supported:
   
- uploader.ocm.config.ocm.software The config type uploader.ocm.config.ocm.software can be used to define a list - of preconfigured upload handler registrations (see [ocm ocm-uploadhandlers](ocm_ocm-uploadhandlers.md)): + of preconfigured upload handler registrations (see [ocm ocm-uploadhandlers](ocm_ocm-uploadhandlers.md)), + the default priority is 200:
       type: uploader.ocm.config.ocm.software
diff --git a/docs/reference/ocm_download_resources.md b/docs/reference/ocm_download_resources.md
index cecd4e8654..fd14528178 100644
--- a/docs/reference/ocm_download_resources.md
+++ b/docs/reference/ocm_download_resources.md
@@ -18,7 +18,7 @@ resources, resource, res, r
       --check-verified              enable verification store
   -c, --constraints constraints     version constraint
   -d, --download-handlers           use download handler if possible
-      --downloader =   artifact downloader ([:[:[:]]]=) (default [])
+      --downloader =   artifact downloader ([:[:[:]]]=) (default [])
   -x, --executable                  download executable for local platform
   -h, --help                        help for resources
       --latest                      restrict component versions to latest
diff --git a/docs/reference/ocm_transfer_commontransportarchive.md b/docs/reference/ocm_transfer_commontransportarchive.md
index f873bc8275..799b4d1d35 100644
--- a/docs/reference/ocm_transfer_commontransportarchive.md
+++ b/docs/reference/ocm_transfer_commontransportarchive.md
@@ -29,7 +29,7 @@ commontransportarchive, ctf
   -s, --scriptFile string           filename of transfer handler script
   -E, --stop-on-existing            stop on existing component version in target repository
   -t, --type string                 archive format (directory, tar, tgz) (default "directory")
-      --uploader =     repository uploader ([:[:[:]]]=) (default [])
+      --uploader =     repository uploader ([:[:[:]]]=) (default [])
 ```
 
 ### Description
diff --git a/docs/reference/ocm_transfer_componentversions.md b/docs/reference/ocm_transfer_componentversions.md
index 8f40c50eb5..86af0d1002 100644
--- a/docs/reference/ocm_transfer_componentversions.md
+++ b/docs/reference/ocm_transfer_componentversions.md
@@ -34,7 +34,7 @@ componentversions, componentversion, cv, components, component, comps, comp, c
   -s, --scriptFile string           filename of transfer handler script
   -E, --stop-on-existing            stop on existing component version in target repository
   -t, --type string                 archive format (directory, tar, tgz) (default "directory")
-      --uploader =     repository uploader ([:[:[:]]]=) (default [])
+      --uploader =     repository uploader ([:[:[:]]]=) (default [])
 ```
 
 ### Description