Skip to content

Commit 3014f7a

Browse files
authored
[Feature] Unify errors (#1937)
1 parent 6b82a17 commit 3014f7a

File tree

5 files changed

+54
-44
lines changed

5 files changed

+54
-44
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- (Documentation) Add Required & Skip in Docs
99
- (Feature) (Platform) ECS Storage
1010
- (Bugfix) (Platform) Prevent NPE in case of missing Helm Release
11+
- (Feature) Unify Errors
1112

1213
## [1.2.50](https://github.com/arangodb/kube-arangodb/tree/1.2.50) (2025-07-04)
1314
- (Feature) (Platform) MetaV1 Integration Service

pkg/apis/deployment/v1/server_group_volume_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@ import (
2828
core "k8s.io/api/core/v1"
2929

3030
shared "github.com/arangodb/kube-arangodb/pkg/apis/shared"
31+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
3132
)
3233

3334
const (
@@ -192,12 +193,12 @@ func Test_Volume_Validation(t *testing.T) {
192193
if c.fail {
193194
require.Error(t, err)
194195

195-
mergedErr, ok := err.(shared.MergedErrors)
196+
mergedErr, ok := err.(errors.Array)
196197
require.True(t, ok, "Is not MergedError type")
197198

198-
require.Equal(t, len(mergedErr.Errors()), len(c.failedFields), "Count of expected fields and merged errors does not match")
199+
require.Equal(t, len(mergedErr), len(c.failedFields), "Count of expected fields and merged errors does not match")
199200

200-
for _, fieldError := range mergedErr.Errors() {
201+
for _, fieldError := range mergedErr {
201202
resourceErr, ok := fieldError.(shared.ResourceError)
202203
if !ok {
203204
resourceErr = shared.ResourceError{

pkg/apis/deployment/v2alpha1/server_group_volume_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//
22
// DISCLAIMER
33
//
4-
// Copyright 2016-2023 ArangoDB GmbH, Cologne, Germany
4+
// Copyright 2016-2025 ArangoDB GmbH, Cologne, Germany
55
//
66
// Licensed under the Apache License, Version 2.0 (the "License");
77
// you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@ import (
2828
core "k8s.io/api/core/v1"
2929

3030
shared "github.com/arangodb/kube-arangodb/pkg/apis/shared"
31+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
3132
)
3233

3334
const (
@@ -192,12 +193,12 @@ func Test_Volume_Validation(t *testing.T) {
192193
if c.fail {
193194
require.Error(t, err)
194195

195-
mergedErr, ok := err.(shared.MergedErrors)
196+
mergedErr, ok := err.(errors.Array)
196197
require.True(t, ok, "Is not MergedError type")
197198

198-
require.Equal(t, len(mergedErr.Errors()), len(c.failedFields), "Count of expected fields and merged errors does not match")
199+
require.Equal(t, len(mergedErr), len(c.failedFields), "Count of expected fields and merged errors does not match")
199200

200-
for _, fieldError := range mergedErr.Errors() {
201+
for _, fieldError := range mergedErr {
201202
resourceErr, ok := fieldError.(shared.ResourceError)
202203
if !ok {
203204
resourceErr = shared.ResourceError{

pkg/apis/shared/errors.go

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ package shared
2323
import (
2424
"fmt"
2525
"io"
26-
goStrings "strings"
26+
27+
"github.com/arangodb/kube-arangodb/pkg/util/errors"
2728
)
2829

2930
type ResourceError struct {
@@ -84,38 +85,16 @@ func PrefixResourceErrors(prefix string, errs ...error) error {
8485

8586
for _, err := range errs {
8687
switch errType := err.(type) {
87-
case MergedErrors:
88-
for _, subError := range errType.errors {
88+
case errors.Array:
89+
for _, subError := range errType {
8990
prefixed = append(prefixed, PrefixResourceError(prefix, subError))
9091
}
9192
default:
9293
prefixed = append(prefixed, PrefixResourceError(prefix, err))
9394
}
9495
}
9596

96-
return WithErrors(prefixed...)
97-
}
98-
99-
type MergedErrors struct {
100-
errors []error
101-
}
102-
103-
func (m MergedErrors) Error() string {
104-
errStrings := make([]string, 0, len(m.errors))
105-
106-
for _, err := range m.errors {
107-
if err == nil {
108-
continue
109-
}
110-
111-
errStrings = append(errStrings, err.Error())
112-
}
113-
114-
return fmt.Sprintf("Received %d errors: %s", len(errStrings), goStrings.Join(errStrings, ", "))
115-
}
116-
117-
func (m MergedErrors) Errors() []error {
118-
return m.errors
97+
return errors.Errors(prefixed...)
11998
}
12099

121100
// WithErrors filter out nil errors
@@ -128,18 +107,12 @@ func WithErrors(errs ...error) error {
128107
}
129108

130109
switch errType := err.(type) {
131-
case MergedErrors:
132-
filteredErrs = append(filteredErrs, errType.errors...)
110+
case errors.Array:
111+
filteredErrs = append(filteredErrs, errType...)
133112
default:
134113
filteredErrs = append(filteredErrs, err)
135114
}
136115
}
137116

138-
if len(filteredErrs) == 0 {
139-
return nil
140-
}
141-
142-
return MergedErrors{
143-
errors: filteredErrs,
144-
}
117+
return errors.Errors(filteredErrs...)
145118
}

pkg/util/errors/errors_array.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,25 @@
2121
package errors
2222

2323
import (
24+
"errors"
2425
"fmt"
26+
"io"
2527
goStrings "strings"
2628
)
2729

30+
func ExpandArray(err error) []error {
31+
if err == nil {
32+
return nil
33+
}
34+
35+
var v Array
36+
if errors.As(err, &v) {
37+
return v
38+
}
39+
40+
return []error{err}
41+
}
42+
2843
type Array []error
2944

3045
func (a Array) Error() string {
@@ -37,6 +52,25 @@ func (a Array) Error() string {
3752
return fmt.Sprintf("Received %d errors: %s", len(q), goStrings.Join(q, ", "))
3853
}
3954

55+
// Format formats error with verbs
56+
func (p Array) Format(s fmt.State, verb rune) {
57+
switch verb {
58+
case 'v':
59+
if s.Flag('+') {
60+
fmt.Fprintf(s, "%s\n", p.Error())
61+
for _, err := range p {
62+
fmt.Fprintf(s, "%+v\n", err)
63+
}
64+
return
65+
}
66+
fallthrough
67+
case 's':
68+
io.WriteString(s, p.Error())
69+
case 'q':
70+
fmt.Fprintf(s, "%q", p.Error())
71+
}
72+
}
73+
4074
func Errors(errs ...error) error {
4175
f := make(Array, 0, len(errs))
4276

@@ -45,7 +79,7 @@ func Errors(errs ...error) error {
4579
continue
4680
}
4781

48-
f = append(f, err)
82+
f = append(f, ExpandArray(err)...)
4983
}
5084

5185
if len(f) == 0 {

0 commit comments

Comments
 (0)