From ce45a82346623d19168b0b85cbba5ba4ff164417 Mon Sep 17 00:00:00 2001 From: Jiahui Feng Date: Thu, 25 Apr 2024 17:59:32 -0700 Subject: [PATCH] make Err wrap one or zero error. --- .../apiserver/pkg/admission/plugin/cel/compile.go | 12 ++++++------ .../apiserver/pkg/admission/plugin/cel/filter.go | 8 ++++---- .../plugin/policy/validating/validator_test.go | 2 +- staging/src/k8s.io/apiserver/pkg/cel/errors.go | 10 +++++----- staging/src/k8s.io/apiserver/pkg/cel/errors_test.go | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/compile.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/compile.go index 4e85e0c8927..06035f6b9e9 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/compile.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/compile.go @@ -163,12 +163,12 @@ type variableDeclEnvs map[OptionalVariableDeclarations]*environment.EnvSet // CompileCELExpression returns a compiled CEL expression. // perCallLimit was added for testing purpose only. Callers should always use const PerCallLimit from k8s.io/apiserver/pkg/apis/cel/config.go as input. func (c compiler) CompileCELExpression(expressionAccessor ExpressionAccessor, options OptionalVariableDeclarations, envType environment.Type) CompilationResult { - resultError := func(errorString string, errType apiservercel.ErrorType, errors ...error) CompilationResult { + resultError := func(errorString string, errType apiservercel.ErrorType, cause error) CompilationResult { return CompilationResult{ Error: &apiservercel.Error{ Type: errType, Detail: errorString, - Errors: errors, + Cause: cause, }, ExpressionAccessor: expressionAccessor, } @@ -176,7 +176,7 @@ func (c compiler) CompileCELExpression(expressionAccessor ExpressionAccessor, op env, err := c.varEnvs[options].Env(envType) if err != nil { - return resultError(fmt.Sprintf("unexpected error loading CEL environment: %v", err), apiservercel.ErrorTypeInternal) + return resultError(fmt.Sprintf("unexpected error loading CEL environment: %v", err), apiservercel.ErrorTypeInternal, nil) } ast, issues := env.Compile(expressionAccessor.GetExpression()) @@ -199,19 +199,19 @@ func (c compiler) CompileCELExpression(expressionAccessor ExpressionAccessor, op reason = fmt.Sprintf("must evaluate to one of %v", returnTypes) } - return resultError(reason, apiservercel.ErrorTypeInvalid) + return resultError(reason, apiservercel.ErrorTypeInvalid, nil) } _, err = cel.AstToCheckedExpr(ast) if err != nil { // should be impossible since env.Compile returned no issues - return resultError("unexpected compilation error: "+err.Error(), apiservercel.ErrorTypeInternal) + return resultError("unexpected compilation error: "+err.Error(), apiservercel.ErrorTypeInternal, nil) } prog, err := env.Program(ast, cel.InterruptCheckFrequency(celconfig.CheckFrequency), ) if err != nil { - return resultError("program instantiation failed: "+err.Error(), apiservercel.ErrorTypeInternal) + return resultError("program instantiation failed: "+err.Error(), apiservercel.ErrorTypeInternal, nil) } return CompilationResult{ Program: prog, diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/filter.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/filter.go index 1f773bfd088..216a474d23e 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/filter.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/cel/filter.go @@ -192,7 +192,7 @@ func (f *filter) ForInput(ctx context.Context, versionedAttr *admission.Versione evaluation.Error = &cel.Error{ Type: cel.ErrorTypeInvalid, Detail: fmt.Sprintf("compilation error: %v", compilationResult.Error), - Errors: []error{compilationResult.Error}, + Cause: compilationResult.Error, } continue } @@ -212,7 +212,7 @@ func (f *filter) ForInput(ctx context.Context, versionedAttr *admission.Versione return nil, -1, &cel.Error{ Type: cel.ErrorTypeInvalid, Detail: fmt.Sprintf("validation failed due to running out of cost budget, no further validation rules will be run"), - Errors: []error{cel.ErrOutOfBudget}, + Cause: cel.ErrOutOfBudget, } } remainingBudget -= compositionCost @@ -230,14 +230,14 @@ func (f *filter) ForInput(ctx context.Context, versionedAttr *admission.Versione return nil, -1, &cel.Error{ Type: cel.ErrorTypeInvalid, Detail: fmt.Sprintf("runtime cost could not be calculated for expression: %v, no further expression will be run", compilationResult.ExpressionAccessor.GetExpression()), - Errors: []error{cel.ErrOutOfBudget}, + Cause: cel.ErrOutOfBudget, } } else { if *rtCost > math.MaxInt64 || int64(*rtCost) > remainingBudget { return nil, -1, &cel.Error{ Type: cel.ErrorTypeInvalid, Detail: fmt.Sprintf("validation failed due to running out of cost budget, no further validation rules will be run"), - Errors: []error{cel.ErrOutOfBudget}, + Cause: cel.ErrOutOfBudget, } } remainingBudget -= int64(*rtCost) diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/policy/validating/validator_test.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/policy/validating/validator_test.go index 3d6680ccca9..44d79e60f88 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/policy/validating/validator_test.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/policy/validating/validator_test.go @@ -53,7 +53,7 @@ func (f *fakeCelFilter) ForInput(ctx context.Context, versionedAttr *admission.V return nil, -1, &apiservercel.Error{ Type: apiservercel.ErrorTypeInvalid, Detail: fmt.Sprintf("validation failed due to running out of cost budget, no further validation rules will be run"), - Errors: []error{apiservercel.ErrOutOfBudget}, + Cause: apiservercel.ErrOutOfBudget, } } if f.throwError { diff --git a/staging/src/k8s.io/apiserver/pkg/cel/errors.go b/staging/src/k8s.io/apiserver/pkg/cel/errors.go index bd3c0773167..d7b052fc9e7 100644 --- a/staging/src/k8s.io/apiserver/pkg/cel/errors.go +++ b/staging/src/k8s.io/apiserver/pkg/cel/errors.go @@ -53,9 +53,9 @@ type Error struct { Type ErrorType Detail string - // Errors are optional wrapped errors that can be useful to + // Cause is an optional wrapped errors that can be useful to // programmatically retrieve detailed errors. - Errors []error + Cause error } var _ error = &Error{} @@ -77,9 +77,9 @@ func (v *Error) Is(err error) bool { return false } -// Unwrap returns wrapped errors. -func (v *Error) Unwrap() []error { - return v.Errors +// Unwrap returns the wrapped Cause. +func (v *Error) Unwrap() error { + return v.Cause } // ErrorType is a machine-readable value providing more detail about why diff --git a/staging/src/k8s.io/apiserver/pkg/cel/errors_test.go b/staging/src/k8s.io/apiserver/pkg/cel/errors_test.go index 40a0d6a9a1d..2822aaab714 100644 --- a/staging/src/k8s.io/apiserver/pkg/cel/errors_test.go +++ b/staging/src/k8s.io/apiserver/pkg/cel/errors_test.go @@ -27,7 +27,7 @@ func TestOutOfBudgetError(t *testing.T) { err := &Error{ Type: ErrorTypeInvalid, Detail: "expression out of budget", - Errors: []error{ErrOutOfBudget}, + Cause: ErrOutOfBudget, } if !errors.Is(err, ErrOutOfBudget) { t.Errorf("unexpected %v is not %v", err, ErrOutOfBudget) @@ -45,7 +45,7 @@ func TestCompilationError(t *testing.T) { err := &Error{ Type: ErrorTypeInvalid, Detail: "fake compilation failed", - Errors: []error{NewCompilationError(issues)}, + Cause: NewCompilationError(issues), } if !errors.Is(err, ErrCompilation) { t.Errorf("unexpected %v is not %v", err, ErrCompilation)