diff --git a/pkg/api/errors/validation.go b/pkg/api/errors/validation.go index bd9ac72d53c..cda5ae1b0f9 100644 --- a/pkg/api/errors/validation.go +++ b/pkg/api/errors/validation.go @@ -20,6 +20,7 @@ import ( "fmt" "strings" + "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/golang/glog" ) @@ -105,30 +106,11 @@ func NewFieldNotFound(field string, value interface{}) ValidationError { // interface to avoid confusion where an empty ErrorList would still be an // error (non-nil). To produce a single error instance from an ErrorList, use // the ToError() method, which will return nil for an empty ErrorList. -type ErrorList []error - -// This helper implements the error interface for ErrorList, but prevents -// accidental conversion of ErrorList to error. -type errorListInternal ErrorList - -// Error is part of the error interface. -func (list errorListInternal) Error() string { - if len(list) == 0 { - return "" - } - sl := make([]string, len(list)) - for i := range list { - sl[i] = list[i].Error() - } - return strings.Join(sl, "; ") -} +type ErrorList util.ErrorList // ToError converts an ErrorList into a "normal" error, or nil if the list is empty. func (list ErrorList) ToError() error { - if len(list) == 0 { - return nil - } - return errorListInternal(list) + return util.ErrorList(list).ToError() } // Prefix adds a prefix to the Field of every ValidationError in the list. Returns diff --git a/pkg/api/errors/validation_test.go b/pkg/api/errors/validation_test.go index 7e95b308034..a1c513a158c 100644 --- a/pkg/api/errors/validation_test.go +++ b/pkg/api/errors/validation_test.go @@ -17,7 +17,6 @@ limitations under the License. package errors import ( - "fmt" "strings" "testing" ) @@ -64,44 +63,6 @@ func TestValidationError(t *testing.T) { } } -func TestErrorList(t *testing.T) { - errList := ErrorList{} - if a := errList.ToError(); a != nil { - t.Errorf("unexpected non-nil error for empty list: %v", a) - } - if a := errorListInternal(errList).Error(); a != "" { - t.Errorf("expected empty string, got %v", a) - } - errList = append(errList, NewFieldInvalid("field", "value")) - // The fact that this compiles is the test. -} - -func TestErrorListToError(t *testing.T) { - errList := ErrorList{} - err := errList.ToError() - if err != nil { - t.Errorf("expected nil, got %v", err) - } - - testCases := []struct { - errs ErrorList - expected string - }{ - {ErrorList{fmt.Errorf("abc")}, "abc"}, - {ErrorList{fmt.Errorf("abc"), fmt.Errorf("123")}, "abc; 123"}, - } - for _, testCase := range testCases { - err := testCase.errs.ToError() - if err == nil { - t.Errorf("expected an error, got nil: ErrorList=%v", testCase) - continue - } - if err.Error() != testCase.expected { - t.Errorf("expected %q, got %q", testCase.expected, err.Error()) - } - } -} - func TestErrListPrefix(t *testing.T) { testCases := []struct { Err ValidationError diff --git a/pkg/util/error_list.go b/pkg/util/error_list.go new file mode 100644 index 00000000000..ef147b9eb72 --- /dev/null +++ b/pkg/util/error_list.go @@ -0,0 +1,55 @@ +/* +Copyright 2014 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" +) + +// ErrorList is a collection of errors. This does not implement the error +// interface to avoid confusion where an empty ErrorList would still be an +// error (non-nil). To produce a single error instance from an ErrorList, use +// the ToError() method, which will return nil for an empty ErrorList. +type ErrorList []error + +// This helper implements the error interface for ErrorList, but prevents +// accidental conversion of ErrorList to error. +type errorListInternal ErrorList + +// Error is part of the error interface. +func (list errorListInternal) Error() string { + if len(list) == 0 { + return "" + } + if len(list) == 1 { + return list[0].Error() + } + result := fmt.Sprintf("[%s", list[0].Error()) + for i := 1; i < len(list); i++ { + result += fmt.Sprintf(", %s", list[i].Error()) + } + result += "]" + return result +} + +// ToError converts an ErrorList into a "normal" error, or nil if the list is empty. +func (list ErrorList) ToError() error { + if len(list) == 0 { + return nil + } + return errorListInternal(list) +} diff --git a/pkg/util/error_list_test.go b/pkg/util/error_list_test.go new file mode 100644 index 00000000000..542d725dd10 --- /dev/null +++ b/pkg/util/error_list_test.go @@ -0,0 +1,51 @@ +/* +Copyright 2014 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + "testing" +) + +func TestErrorList(t *testing.T) { + errList := ErrorList{} + err := errList.ToError() + if err != nil { + t.Errorf("expected nil, got %v", err) + } + if a := errorListInternal(errList).Error(); a != "" { + t.Errorf("expected empty string, got %q", a) + } + + testCases := []struct { + errs ErrorList + expected string + }{ + {ErrorList{fmt.Errorf("abc")}, "abc"}, + {ErrorList{fmt.Errorf("abc"), fmt.Errorf("123")}, "[abc, 123]"}, + } + for _, testCase := range testCases { + err := testCase.errs.ToError() + if err == nil { + t.Errorf("expected an error, got nil: %v", testCase) + continue + } + if err.Error() != testCase.expected { + t.Errorf("expected %q, got %q", testCase.expected, err.Error()) + } + } +}