mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
Merge pull request #73595 from liggitt/authn-message
Preserve authentication webhook error message, deduplicate aggregated errors when printing
This commit is contained in:
commit
4992402fa5
@ -20,6 +20,7 @@ go_library(
|
|||||||
],
|
],
|
||||||
importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/errors",
|
importmap = "k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/errors",
|
||||||
importpath = "k8s.io/apimachinery/pkg/util/errors",
|
importpath = "k8s.io/apimachinery/pkg/util/errors",
|
||||||
|
deps = ["//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library"],
|
||||||
)
|
)
|
||||||
|
|
||||||
filegroup(
|
filegroup(
|
||||||
|
@ -19,6 +19,8 @@ package errors
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MessageCountMap contains occurrence for each error message.
|
// MessageCountMap contains occurrence for each error message.
|
||||||
@ -67,12 +69,38 @@ func (agg aggregate) Error() string {
|
|||||||
if len(agg) == 1 {
|
if len(agg) == 1 {
|
||||||
return agg[0].Error()
|
return agg[0].Error()
|
||||||
}
|
}
|
||||||
result := fmt.Sprintf("[%s", agg[0].Error())
|
seenerrs := sets.NewString()
|
||||||
for i := 1; i < len(agg); i++ {
|
result := ""
|
||||||
result += fmt.Sprintf(", %s", agg[i].Error())
|
agg.visit(func(err error) {
|
||||||
|
msg := err.Error()
|
||||||
|
if seenerrs.Has(msg) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
seenerrs.Insert(msg)
|
||||||
|
if len(seenerrs) > 1 {
|
||||||
|
result += ", "
|
||||||
|
}
|
||||||
|
result += msg
|
||||||
|
})
|
||||||
|
if len(seenerrs) == 1 {
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
return "[" + result + "]"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (agg aggregate) visit(f func(err error)) {
|
||||||
|
for _, err := range agg {
|
||||||
|
switch err := err.(type) {
|
||||||
|
case aggregate:
|
||||||
|
err.visit(f)
|
||||||
|
case Aggregate:
|
||||||
|
for _, nestedErr := range err.Errors() {
|
||||||
|
f(nestedErr)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
f(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
result += "]"
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Errors is part of the Aggregate interface.
|
// Errors is part of the Aggregate interface.
|
||||||
|
@ -147,6 +147,70 @@ func TestPluralAggregate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDedupeAggregate(t *testing.T) {
|
||||||
|
var slice []error = []error{fmt.Errorf("abc"), fmt.Errorf("abc")}
|
||||||
|
var agg Aggregate
|
||||||
|
|
||||||
|
agg = NewAggregate(slice)
|
||||||
|
if agg == nil {
|
||||||
|
t.Errorf("expected non-nil")
|
||||||
|
}
|
||||||
|
if s := agg.Error(); s != "abc" {
|
||||||
|
t.Errorf("expected 'abc', got %q", s)
|
||||||
|
}
|
||||||
|
if s := agg.Errors(); len(s) != 2 {
|
||||||
|
t.Errorf("expected two-elements slice, got %#v", s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDedupePluralAggregate(t *testing.T) {
|
||||||
|
var slice []error = []error{fmt.Errorf("abc"), fmt.Errorf("abc"), fmt.Errorf("123")}
|
||||||
|
var agg Aggregate
|
||||||
|
|
||||||
|
agg = NewAggregate(slice)
|
||||||
|
if agg == nil {
|
||||||
|
t.Errorf("expected non-nil")
|
||||||
|
}
|
||||||
|
if s := agg.Error(); s != "[abc, 123]" {
|
||||||
|
t.Errorf("expected '[abc, 123]', got %q", s)
|
||||||
|
}
|
||||||
|
if s := agg.Errors(); len(s) != 3 {
|
||||||
|
t.Errorf("expected three-elements slice, got %#v", s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenAndDedupeAggregate(t *testing.T) {
|
||||||
|
var slice []error = []error{fmt.Errorf("abc"), fmt.Errorf("abc"), NewAggregate([]error{fmt.Errorf("abc")})}
|
||||||
|
var agg Aggregate
|
||||||
|
|
||||||
|
agg = NewAggregate(slice)
|
||||||
|
if agg == nil {
|
||||||
|
t.Errorf("expected non-nil")
|
||||||
|
}
|
||||||
|
if s := agg.Error(); s != "abc" {
|
||||||
|
t.Errorf("expected 'abc', got %q", s)
|
||||||
|
}
|
||||||
|
if s := agg.Errors(); len(s) != 3 {
|
||||||
|
t.Errorf("expected three-elements slice, got %#v", s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFlattenAggregate(t *testing.T) {
|
||||||
|
var slice []error = []error{fmt.Errorf("abc"), fmt.Errorf("abc"), NewAggregate([]error{fmt.Errorf("abc"), fmt.Errorf("def"), NewAggregate([]error{fmt.Errorf("def"), fmt.Errorf("ghi")})})}
|
||||||
|
var agg Aggregate
|
||||||
|
|
||||||
|
agg = NewAggregate(slice)
|
||||||
|
if agg == nil {
|
||||||
|
t.Errorf("expected non-nil")
|
||||||
|
}
|
||||||
|
if s := agg.Error(); s != "[abc, def, ghi]" {
|
||||||
|
t.Errorf("expected '[abc, def, ghi]', got %q", s)
|
||||||
|
}
|
||||||
|
if s := agg.Errors(); len(s) != 3 {
|
||||||
|
t.Errorf("expected three-elements slice, got %#v", s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestFilterOut(t *testing.T) {
|
func TestFilterOut(t *testing.T) {
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
err error
|
err error
|
||||||
|
@ -19,6 +19,7 @@ package webhook
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
authentication "k8s.io/api/authentication/v1beta1"
|
authentication "k8s.io/api/authentication/v1beta1"
|
||||||
@ -120,7 +121,11 @@ func (w *WebhookTokenAuthenticator) AuthenticateToken(ctx context.Context, token
|
|||||||
|
|
||||||
r.Status = result.Status
|
r.Status = result.Status
|
||||||
if !r.Status.Authenticated {
|
if !r.Status.Authenticated {
|
||||||
return nil, false, nil
|
var err error
|
||||||
|
if len(r.Status.Error) != 0 {
|
||||||
|
err = errors.New(r.Status.Error)
|
||||||
|
}
|
||||||
|
return nil, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var extra map[string][]string
|
var extra map[string][]string
|
||||||
|
Loading…
Reference in New Issue
Block a user