Merge pull request #100939 from wzshiming/feat/subresource-match

Feature support FakeClientset match subresource

Kubernetes-commit: 5c137f1af94e23a71e7a7a3dad037f1193147778
This commit is contained in:
Kubernetes Publisher 2021-06-04 02:25:26 -07:00
commit 742abf77bc
2 changed files with 109 additions and 17 deletions

View File

@ -20,6 +20,7 @@ import (
"fmt" "fmt"
"reflect" "reflect"
"sort" "sort"
"strings"
"sync" "sync"
jsonpatch "github.com/evanphx/json-patch" jsonpatch "github.com/evanphx/json-patch"
@ -509,12 +510,8 @@ func (r *SimpleReactor) Handles(action Action) bool {
if !verbCovers { if !verbCovers {
return false return false
} }
resourceCovers := r.Resource == "*" || r.Resource == action.GetResource().Resource
if !resourceCovers {
return false
}
return true return resourceCovers(r.Resource, action)
} }
func (r *SimpleReactor) React(action Action) (bool, runtime.Object, error) { func (r *SimpleReactor) React(action Action) (bool, runtime.Object, error) {
@ -530,12 +527,7 @@ type SimpleWatchReactor struct {
} }
func (r *SimpleWatchReactor) Handles(action Action) bool { func (r *SimpleWatchReactor) Handles(action Action) bool {
resourceCovers := r.Resource == "*" || r.Resource == action.GetResource().Resource return resourceCovers(r.Resource, action)
if !resourceCovers {
return false
}
return true
} }
func (r *SimpleWatchReactor) React(action Action) (bool, watch.Interface, error) { func (r *SimpleWatchReactor) React(action Action) (bool, watch.Interface, error) {
@ -551,14 +543,27 @@ type SimpleProxyReactor struct {
} }
func (r *SimpleProxyReactor) Handles(action Action) bool { func (r *SimpleProxyReactor) Handles(action Action) bool {
resourceCovers := r.Resource == "*" || r.Resource == action.GetResource().Resource return resourceCovers(r.Resource, action)
if !resourceCovers {
return false
}
return true
} }
func (r *SimpleProxyReactor) React(action Action) (bool, restclient.ResponseWrapper, error) { func (r *SimpleProxyReactor) React(action Action) (bool, restclient.ResponseWrapper, error) {
return r.Reaction(action) return r.Reaction(action)
} }
func resourceCovers(resource string, action Action) bool {
if resource == "*" {
return true
}
if resource == action.GetResource().Resource {
return true
}
if index := strings.Index(resource, "/"); index != -1 &&
resource[:index] == action.GetResource().Resource &&
resource[index+1:] == action.GetSubresource() {
return true
}
return false
}

View File

@ -322,3 +322,90 @@ func TestGetWithExactMatch(t *testing.T) {
errNotFound = errors.NewNotFound(gvr.GroupResource(), "pod") errNotFound = errors.NewNotFound(gvr.GroupResource(), "pod")
assert.EqualError(t, err, errNotFound.Error()) assert.EqualError(t, err, errNotFound.Error())
} }
func Test_resourceCovers(t *testing.T) {
type args struct {
resource string
action Action
}
tests := []struct {
name string
args args
want bool
}{
{
args: args{
resource: "*",
action: ActionImpl{},
},
want: true,
},
{
args: args{
resource: "serviceaccounts",
action: ActionImpl{},
},
want: false,
},
{
args: args{
resource: "serviceaccounts",
action: ActionImpl{
Resource: schema.GroupVersionResource{
Resource: "serviceaccounts",
},
},
},
want: true,
},
{
args: args{
resource: "serviceaccounts/token",
action: ActionImpl{
Resource: schema.GroupVersionResource{},
},
},
want: false,
},
{
args: args{
resource: "serviceaccounts/token",
action: ActionImpl{
Resource: schema.GroupVersionResource{
Resource: "serviceaccounts",
},
},
},
want: false,
},
{
args: args{
resource: "serviceaccounts/token",
action: ActionImpl{
Resource: schema.GroupVersionResource{},
Subresource: "token",
},
},
want: false,
},
{
args: args{
resource: "serviceaccounts/token",
action: ActionImpl{
Resource: schema.GroupVersionResource{
Resource: "serviceaccounts",
},
Subresource: "token",
},
},
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := resourceCovers(tt.args.resource, tt.args.action); got != tt.want {
t.Errorf("resourceCovers() = %v, want %v", got, tt.want)
}
})
}
}