1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

api: filters: return correct status on invalid filters

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2022-03-02 13:52:51 +01:00
parent a5be5801e9
commit 2d45b5ddbc
No known key found for this signature in database
GPG key ID: 76698F39D527CE8C
6 changed files with 21 additions and 10 deletions

View file

@ -721,7 +721,7 @@ func (s *containerRouter) postContainersPrune(ctx context.Context, w http.Respon
pruneFilters, err := filters.FromJSON(r.Form.Get("filters")) pruneFilters, err := filters.FromJSON(r.Form.Get("filters"))
if err != nil { if err != nil {
return errdefs.InvalidParameter(err) return err
} }
pruneReport, err := s.backend.ContainersPrune(ctx, pruneFilters) pruneReport, err := s.backend.ContainersPrune(ctx, pruneFilters)

View file

@ -30,7 +30,7 @@ func (n *networkRouter) getNetworksList(ctx context.Context, w http.ResponseWrit
} }
if err := network.ValidateFilters(filter); err != nil { if err := network.ValidateFilters(filter); err != nil {
return errdefs.InvalidParameter(err) return err
} }
var list []types.NetworkResource var list []types.NetworkResource

View file

@ -164,7 +164,7 @@ func (sr *swarmRouter) getServices(ctx context.Context, w http.ResponseWriter, r
} }
filter, err := filters.FromJSON(r.Form.Get("filters")) filter, err := filters.FromJSON(r.Form.Get("filters"))
if err != nil { if err != nil {
return errdefs.InvalidParameter(err) return err
} }
// the status query parameter is only support in API versions >= 1.41. If // the status query parameter is only support in API versions >= 1.41. If

View file

@ -21,7 +21,7 @@ func (v *volumeRouter) getVolumesList(ctx context.Context, w http.ResponseWriter
filters, err := filters.FromJSON(r.Form.Get("filters")) filters, err := filters.FromJSON(r.Form.Get("filters"))
if err != nil { if err != nil {
return errdefs.InvalidParameter(errors.Wrap(err, "error reading volume filters")) return errors.Wrap(err, "error reading volume filters")
} }
volumes, warnings, err := v.backend.List(ctx, filters) volumes, warnings, err := v.backend.List(ctx, filters)
if err != nil { if err != nil {

View file

@ -9,6 +9,7 @@ import (
"strings" "strings"
"github.com/docker/docker/api/types/versions" "github.com/docker/docker/api/types/versions"
"github.com/pkg/errors"
) )
// Args stores a mapping of keys to a set of multiple values. // Args stores a mapping of keys to a set of multiple values.
@ -97,7 +98,7 @@ func FromJSON(p string) (Args, error) {
// Fallback to parsing arguments in the legacy slice format // Fallback to parsing arguments in the legacy slice format
deprecated := map[string][]string{} deprecated := map[string][]string{}
if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil { if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil {
return args, err return args, invalidFilter{errors.Wrap(err, "invalid filter")}
} }
args.fields = deprecatedArgs(deprecated) args.fields = deprecatedArgs(deprecated)
@ -247,10 +248,10 @@ func (args Args) Contains(field string) bool {
return ok return ok
} }
type invalidFilter string type invalidFilter struct{ error }
func (e invalidFilter) Error() string { func (e invalidFilter) Error() string {
return "Invalid filter '" + string(e) + "'" return e.error.Error()
} }
func (invalidFilter) InvalidParameter() {} func (invalidFilter) InvalidParameter() {}
@ -260,7 +261,7 @@ func (invalidFilter) InvalidParameter() {}
func (args Args) Validate(accepted map[string]bool) error { func (args Args) Validate(accepted map[string]bool) error {
for name := range args.fields { for name := range args.fields {
if !accepted[name] { if !accepted[name] {
return invalidFilter(name) return invalidFilter{errors.New("invalid filter '" + name + "'")}
} }
} }
return nil return nil

View file

@ -69,9 +69,14 @@ func TestFromJSON(t *testing.T) {
} }
for _, invalid := range invalids { for _, invalid := range invalids {
if _, err := FromJSON(invalid); err == nil { _, err := FromJSON(invalid)
if err == nil {
t.Fatalf("Expected an error with %v, got nothing", invalid) t.Fatalf("Expected an error with %v, got nothing", invalid)
} }
var invalidFilterError invalidFilter
if !errors.As(err, &invalidFilterError) {
t.Fatalf("Expected an invalidFilter error, got %T", err)
}
} }
for expectedArgs, matchers := range valid { for expectedArgs, matchers := range valid {
@ -327,9 +332,14 @@ func TestValidate(t *testing.T) {
} }
f.Add("bogus", "running") f.Add("bogus", "running")
if err := f.Validate(valid); err == nil { err := f.Validate(valid)
if err == nil {
t.Fatal("Expected to return an error, got nil") t.Fatal("Expected to return an error, got nil")
} }
var invalidFilterError invalidFilter
if !errors.As(err, &invalidFilterError) {
t.Fatalf("Expected an invalidFilter error, got %T", err)
}
} }
func TestWalkValues(t *testing.T) { func TestWalkValues(t *testing.T) {