mirror of https://github.com/k3s-io/k3s
682 lines
17 KiB
Go
682 lines
17 KiB
Go
/*
|
|
Copyright 2015 The Kubernetes Authors.
|
|
|
|
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 testing
|
|
|
|
import (
|
|
"fmt"
|
|
"path"
|
|
"strings"
|
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/fields"
|
|
"k8s.io/apimachinery/pkg/labels"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
)
|
|
|
|
func NewRootGetAction(resource schema.GroupVersionResource, name string) GetActionImpl {
|
|
action := GetActionImpl{}
|
|
action.Verb = "get"
|
|
action.Resource = resource
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewGetAction(resource schema.GroupVersionResource, namespace, name string) GetActionImpl {
|
|
action := GetActionImpl{}
|
|
action.Verb = "get"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewGetSubresourceAction(resource schema.GroupVersionResource, namespace, subresource, name string) GetActionImpl {
|
|
action := GetActionImpl{}
|
|
action.Verb = "get"
|
|
action.Resource = resource
|
|
action.Subresource = subresource
|
|
action.Namespace = namespace
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootGetSubresourceAction(resource schema.GroupVersionResource, subresource, name string) GetActionImpl {
|
|
action := GetActionImpl{}
|
|
action.Verb = "get"
|
|
action.Resource = resource
|
|
action.Subresource = subresource
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootListAction(resource schema.GroupVersionResource, kind schema.GroupVersionKind, opts interface{}) ListActionImpl {
|
|
action := ListActionImpl{}
|
|
action.Verb = "list"
|
|
action.Resource = resource
|
|
action.Kind = kind
|
|
labelSelector, fieldSelector, _ := ExtractFromListOptions(opts)
|
|
action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector}
|
|
|
|
return action
|
|
}
|
|
|
|
func NewListAction(resource schema.GroupVersionResource, kind schema.GroupVersionKind, namespace string, opts interface{}) ListActionImpl {
|
|
action := ListActionImpl{}
|
|
action.Verb = "list"
|
|
action.Resource = resource
|
|
action.Kind = kind
|
|
action.Namespace = namespace
|
|
labelSelector, fieldSelector, _ := ExtractFromListOptions(opts)
|
|
action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector}
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootCreateAction(resource schema.GroupVersionResource, object runtime.Object) CreateActionImpl {
|
|
action := CreateActionImpl{}
|
|
action.Verb = "create"
|
|
action.Resource = resource
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
|
|
func NewCreateAction(resource schema.GroupVersionResource, namespace string, object runtime.Object) CreateActionImpl {
|
|
action := CreateActionImpl{}
|
|
action.Verb = "create"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource string, object runtime.Object) CreateActionImpl {
|
|
action := CreateActionImpl{}
|
|
action.Verb = "create"
|
|
action.Resource = resource
|
|
action.Subresource = subresource
|
|
action.Name = name
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
|
|
func NewCreateSubresourceAction(resource schema.GroupVersionResource, name, subresource, namespace string, object runtime.Object) CreateActionImpl {
|
|
action := CreateActionImpl{}
|
|
action.Verb = "create"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
action.Subresource = subresource
|
|
action.Name = name
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootUpdateAction(resource schema.GroupVersionResource, object runtime.Object) UpdateActionImpl {
|
|
action := UpdateActionImpl{}
|
|
action.Verb = "update"
|
|
action.Resource = resource
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
|
|
func NewUpdateAction(resource schema.GroupVersionResource, namespace string, object runtime.Object) UpdateActionImpl {
|
|
action := UpdateActionImpl{}
|
|
action.Verb = "update"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootPatchAction(resource schema.GroupVersionResource, name string, pt types.PatchType, patch []byte) PatchActionImpl {
|
|
action := PatchActionImpl{}
|
|
action.Verb = "patch"
|
|
action.Resource = resource
|
|
action.Name = name
|
|
action.PatchType = pt
|
|
action.Patch = patch
|
|
|
|
return action
|
|
}
|
|
|
|
func NewPatchAction(resource schema.GroupVersionResource, namespace string, name string, pt types.PatchType, patch []byte) PatchActionImpl {
|
|
action := PatchActionImpl{}
|
|
action.Verb = "patch"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
action.Name = name
|
|
action.PatchType = pt
|
|
action.Patch = patch
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootPatchSubresourceAction(resource schema.GroupVersionResource, name string, pt types.PatchType, patch []byte, subresources ...string) PatchActionImpl {
|
|
action := PatchActionImpl{}
|
|
action.Verb = "patch"
|
|
action.Resource = resource
|
|
action.Subresource = path.Join(subresources...)
|
|
action.Name = name
|
|
action.PatchType = pt
|
|
action.Patch = patch
|
|
|
|
return action
|
|
}
|
|
|
|
func NewPatchSubresourceAction(resource schema.GroupVersionResource, namespace, name string, pt types.PatchType, patch []byte, subresources ...string) PatchActionImpl {
|
|
action := PatchActionImpl{}
|
|
action.Verb = "patch"
|
|
action.Resource = resource
|
|
action.Subresource = path.Join(subresources...)
|
|
action.Namespace = namespace
|
|
action.Name = name
|
|
action.PatchType = pt
|
|
action.Patch = patch
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootUpdateSubresourceAction(resource schema.GroupVersionResource, subresource string, object runtime.Object) UpdateActionImpl {
|
|
action := UpdateActionImpl{}
|
|
action.Verb = "update"
|
|
action.Resource = resource
|
|
action.Subresource = subresource
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
func NewUpdateSubresourceAction(resource schema.GroupVersionResource, subresource string, namespace string, object runtime.Object) UpdateActionImpl {
|
|
action := UpdateActionImpl{}
|
|
action.Verb = "update"
|
|
action.Resource = resource
|
|
action.Subresource = subresource
|
|
action.Namespace = namespace
|
|
action.Object = object
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootDeleteAction(resource schema.GroupVersionResource, name string) DeleteActionImpl {
|
|
action := DeleteActionImpl{}
|
|
action.Verb = "delete"
|
|
action.Resource = resource
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootDeleteSubresourceAction(resource schema.GroupVersionResource, subresource string, name string) DeleteActionImpl {
|
|
action := DeleteActionImpl{}
|
|
action.Verb = "delete"
|
|
action.Resource = resource
|
|
action.Subresource = subresource
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewDeleteAction(resource schema.GroupVersionResource, namespace, name string) DeleteActionImpl {
|
|
action := DeleteActionImpl{}
|
|
action.Verb = "delete"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewDeleteSubresourceAction(resource schema.GroupVersionResource, subresource, namespace, name string) DeleteActionImpl {
|
|
action := DeleteActionImpl{}
|
|
action.Verb = "delete"
|
|
action.Resource = resource
|
|
action.Subresource = subresource
|
|
action.Namespace = namespace
|
|
action.Name = name
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootDeleteCollectionAction(resource schema.GroupVersionResource, opts interface{}) DeleteCollectionActionImpl {
|
|
action := DeleteCollectionActionImpl{}
|
|
action.Verb = "delete-collection"
|
|
action.Resource = resource
|
|
labelSelector, fieldSelector, _ := ExtractFromListOptions(opts)
|
|
action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector}
|
|
|
|
return action
|
|
}
|
|
|
|
func NewDeleteCollectionAction(resource schema.GroupVersionResource, namespace string, opts interface{}) DeleteCollectionActionImpl {
|
|
action := DeleteCollectionActionImpl{}
|
|
action.Verb = "delete-collection"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
labelSelector, fieldSelector, _ := ExtractFromListOptions(opts)
|
|
action.ListRestrictions = ListRestrictions{labelSelector, fieldSelector}
|
|
|
|
return action
|
|
}
|
|
|
|
func NewRootWatchAction(resource schema.GroupVersionResource, opts interface{}) WatchActionImpl {
|
|
action := WatchActionImpl{}
|
|
action.Verb = "watch"
|
|
action.Resource = resource
|
|
labelSelector, fieldSelector, resourceVersion := ExtractFromListOptions(opts)
|
|
action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, resourceVersion}
|
|
|
|
return action
|
|
}
|
|
|
|
func ExtractFromListOptions(opts interface{}) (labelSelector labels.Selector, fieldSelector fields.Selector, resourceVersion string) {
|
|
var err error
|
|
switch t := opts.(type) {
|
|
case metav1.ListOptions:
|
|
labelSelector, err = labels.Parse(t.LabelSelector)
|
|
if err != nil {
|
|
panic(fmt.Errorf("invalid selector %q: %v", t.LabelSelector, err))
|
|
}
|
|
fieldSelector, err = fields.ParseSelector(t.FieldSelector)
|
|
if err != nil {
|
|
panic(fmt.Errorf("invalid selector %q: %v", t.FieldSelector, err))
|
|
}
|
|
resourceVersion = t.ResourceVersion
|
|
default:
|
|
panic(fmt.Errorf("expect a ListOptions %T", opts))
|
|
}
|
|
if labelSelector == nil {
|
|
labelSelector = labels.Everything()
|
|
}
|
|
if fieldSelector == nil {
|
|
fieldSelector = fields.Everything()
|
|
}
|
|
return labelSelector, fieldSelector, resourceVersion
|
|
}
|
|
|
|
func NewWatchAction(resource schema.GroupVersionResource, namespace string, opts interface{}) WatchActionImpl {
|
|
action := WatchActionImpl{}
|
|
action.Verb = "watch"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
labelSelector, fieldSelector, resourceVersion := ExtractFromListOptions(opts)
|
|
action.WatchRestrictions = WatchRestrictions{labelSelector, fieldSelector, resourceVersion}
|
|
|
|
return action
|
|
}
|
|
|
|
func NewProxyGetAction(resource schema.GroupVersionResource, namespace, scheme, name, port, path string, params map[string]string) ProxyGetActionImpl {
|
|
action := ProxyGetActionImpl{}
|
|
action.Verb = "get"
|
|
action.Resource = resource
|
|
action.Namespace = namespace
|
|
action.Scheme = scheme
|
|
action.Name = name
|
|
action.Port = port
|
|
action.Path = path
|
|
action.Params = params
|
|
return action
|
|
}
|
|
|
|
type ListRestrictions struct {
|
|
Labels labels.Selector
|
|
Fields fields.Selector
|
|
}
|
|
type WatchRestrictions struct {
|
|
Labels labels.Selector
|
|
Fields fields.Selector
|
|
ResourceVersion string
|
|
}
|
|
|
|
type Action interface {
|
|
GetNamespace() string
|
|
GetVerb() string
|
|
GetResource() schema.GroupVersionResource
|
|
GetSubresource() string
|
|
Matches(verb, resource string) bool
|
|
|
|
// DeepCopy is used to copy an action to avoid any risk of accidental mutation. Most people never need to call this
|
|
// because the invocation logic deep copies before calls to storage and reactors.
|
|
DeepCopy() Action
|
|
}
|
|
|
|
type GenericAction interface {
|
|
Action
|
|
GetValue() interface{}
|
|
}
|
|
|
|
type GetAction interface {
|
|
Action
|
|
GetName() string
|
|
}
|
|
|
|
type ListAction interface {
|
|
Action
|
|
GetListRestrictions() ListRestrictions
|
|
}
|
|
|
|
type CreateAction interface {
|
|
Action
|
|
GetObject() runtime.Object
|
|
}
|
|
|
|
type UpdateAction interface {
|
|
Action
|
|
GetObject() runtime.Object
|
|
}
|
|
|
|
type DeleteAction interface {
|
|
Action
|
|
GetName() string
|
|
}
|
|
|
|
type DeleteCollectionAction interface {
|
|
Action
|
|
GetListRestrictions() ListRestrictions
|
|
}
|
|
|
|
type PatchAction interface {
|
|
Action
|
|
GetName() string
|
|
GetPatchType() types.PatchType
|
|
GetPatch() []byte
|
|
}
|
|
|
|
type WatchAction interface {
|
|
Action
|
|
GetWatchRestrictions() WatchRestrictions
|
|
}
|
|
|
|
type ProxyGetAction interface {
|
|
Action
|
|
GetScheme() string
|
|
GetName() string
|
|
GetPort() string
|
|
GetPath() string
|
|
GetParams() map[string]string
|
|
}
|
|
|
|
type ActionImpl struct {
|
|
Namespace string
|
|
Verb string
|
|
Resource schema.GroupVersionResource
|
|
Subresource string
|
|
}
|
|
|
|
func (a ActionImpl) GetNamespace() string {
|
|
return a.Namespace
|
|
}
|
|
func (a ActionImpl) GetVerb() string {
|
|
return a.Verb
|
|
}
|
|
func (a ActionImpl) GetResource() schema.GroupVersionResource {
|
|
return a.Resource
|
|
}
|
|
func (a ActionImpl) GetSubresource() string {
|
|
return a.Subresource
|
|
}
|
|
func (a ActionImpl) Matches(verb, resource string) bool {
|
|
// Stay backwards compatible.
|
|
if !strings.Contains(resource, "/") {
|
|
return strings.EqualFold(verb, a.Verb) &&
|
|
strings.EqualFold(resource, a.Resource.Resource)
|
|
}
|
|
|
|
parts := strings.SplitN(resource, "/", 2)
|
|
topresource, subresource := parts[0], parts[1]
|
|
|
|
return strings.EqualFold(verb, a.Verb) &&
|
|
strings.EqualFold(topresource, a.Resource.Resource) &&
|
|
strings.EqualFold(subresource, a.Subresource)
|
|
}
|
|
func (a ActionImpl) DeepCopy() Action {
|
|
ret := a
|
|
return ret
|
|
}
|
|
|
|
type GenericActionImpl struct {
|
|
ActionImpl
|
|
Value interface{}
|
|
}
|
|
|
|
func (a GenericActionImpl) GetValue() interface{} {
|
|
return a.Value
|
|
}
|
|
|
|
func (a GenericActionImpl) DeepCopy() Action {
|
|
return GenericActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
// TODO this is wrong, but no worse than before
|
|
Value: a.Value,
|
|
}
|
|
}
|
|
|
|
type GetActionImpl struct {
|
|
ActionImpl
|
|
Name string
|
|
}
|
|
|
|
func (a GetActionImpl) GetName() string {
|
|
return a.Name
|
|
}
|
|
|
|
func (a GetActionImpl) DeepCopy() Action {
|
|
return GetActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
Name: a.Name,
|
|
}
|
|
}
|
|
|
|
type ListActionImpl struct {
|
|
ActionImpl
|
|
Kind schema.GroupVersionKind
|
|
Name string
|
|
ListRestrictions ListRestrictions
|
|
}
|
|
|
|
func (a ListActionImpl) GetKind() schema.GroupVersionKind {
|
|
return a.Kind
|
|
}
|
|
|
|
func (a ListActionImpl) GetListRestrictions() ListRestrictions {
|
|
return a.ListRestrictions
|
|
}
|
|
|
|
func (a ListActionImpl) DeepCopy() Action {
|
|
return ListActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
Kind: a.Kind,
|
|
Name: a.Name,
|
|
ListRestrictions: ListRestrictions{
|
|
Labels: a.ListRestrictions.Labels.DeepCopySelector(),
|
|
Fields: a.ListRestrictions.Fields.DeepCopySelector(),
|
|
},
|
|
}
|
|
}
|
|
|
|
type CreateActionImpl struct {
|
|
ActionImpl
|
|
Name string
|
|
Object runtime.Object
|
|
}
|
|
|
|
func (a CreateActionImpl) GetObject() runtime.Object {
|
|
return a.Object
|
|
}
|
|
|
|
func (a CreateActionImpl) DeepCopy() Action {
|
|
return CreateActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
Name: a.Name,
|
|
Object: a.Object.DeepCopyObject(),
|
|
}
|
|
}
|
|
|
|
type UpdateActionImpl struct {
|
|
ActionImpl
|
|
Object runtime.Object
|
|
}
|
|
|
|
func (a UpdateActionImpl) GetObject() runtime.Object {
|
|
return a.Object
|
|
}
|
|
|
|
func (a UpdateActionImpl) DeepCopy() Action {
|
|
return UpdateActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
Object: a.Object.DeepCopyObject(),
|
|
}
|
|
}
|
|
|
|
type PatchActionImpl struct {
|
|
ActionImpl
|
|
Name string
|
|
PatchType types.PatchType
|
|
Patch []byte
|
|
}
|
|
|
|
func (a PatchActionImpl) GetName() string {
|
|
return a.Name
|
|
}
|
|
|
|
func (a PatchActionImpl) GetPatch() []byte {
|
|
return a.Patch
|
|
}
|
|
|
|
func (a PatchActionImpl) GetPatchType() types.PatchType {
|
|
return a.PatchType
|
|
}
|
|
|
|
func (a PatchActionImpl) DeepCopy() Action {
|
|
patch := make([]byte, len(a.Patch))
|
|
copy(patch, a.Patch)
|
|
return PatchActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
Name: a.Name,
|
|
PatchType: a.PatchType,
|
|
Patch: patch,
|
|
}
|
|
}
|
|
|
|
type DeleteActionImpl struct {
|
|
ActionImpl
|
|
Name string
|
|
}
|
|
|
|
func (a DeleteActionImpl) GetName() string {
|
|
return a.Name
|
|
}
|
|
|
|
func (a DeleteActionImpl) DeepCopy() Action {
|
|
return DeleteActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
Name: a.Name,
|
|
}
|
|
}
|
|
|
|
type DeleteCollectionActionImpl struct {
|
|
ActionImpl
|
|
ListRestrictions ListRestrictions
|
|
}
|
|
|
|
func (a DeleteCollectionActionImpl) GetListRestrictions() ListRestrictions {
|
|
return a.ListRestrictions
|
|
}
|
|
|
|
func (a DeleteCollectionActionImpl) DeepCopy() Action {
|
|
return DeleteCollectionActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
ListRestrictions: ListRestrictions{
|
|
Labels: a.ListRestrictions.Labels.DeepCopySelector(),
|
|
Fields: a.ListRestrictions.Fields.DeepCopySelector(),
|
|
},
|
|
}
|
|
}
|
|
|
|
type WatchActionImpl struct {
|
|
ActionImpl
|
|
WatchRestrictions WatchRestrictions
|
|
}
|
|
|
|
func (a WatchActionImpl) GetWatchRestrictions() WatchRestrictions {
|
|
return a.WatchRestrictions
|
|
}
|
|
|
|
func (a WatchActionImpl) DeepCopy() Action {
|
|
return WatchActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
WatchRestrictions: WatchRestrictions{
|
|
Labels: a.WatchRestrictions.Labels.DeepCopySelector(),
|
|
Fields: a.WatchRestrictions.Fields.DeepCopySelector(),
|
|
ResourceVersion: a.WatchRestrictions.ResourceVersion,
|
|
},
|
|
}
|
|
}
|
|
|
|
type ProxyGetActionImpl struct {
|
|
ActionImpl
|
|
Scheme string
|
|
Name string
|
|
Port string
|
|
Path string
|
|
Params map[string]string
|
|
}
|
|
|
|
func (a ProxyGetActionImpl) GetScheme() string {
|
|
return a.Scheme
|
|
}
|
|
|
|
func (a ProxyGetActionImpl) GetName() string {
|
|
return a.Name
|
|
}
|
|
|
|
func (a ProxyGetActionImpl) GetPort() string {
|
|
return a.Port
|
|
}
|
|
|
|
func (a ProxyGetActionImpl) GetPath() string {
|
|
return a.Path
|
|
}
|
|
|
|
func (a ProxyGetActionImpl) GetParams() map[string]string {
|
|
return a.Params
|
|
}
|
|
|
|
func (a ProxyGetActionImpl) DeepCopy() Action {
|
|
params := map[string]string{}
|
|
for k, v := range a.Params {
|
|
params[k] = v
|
|
}
|
|
return ProxyGetActionImpl{
|
|
ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl),
|
|
Scheme: a.Scheme,
|
|
Name: a.Name,
|
|
Port: a.Port,
|
|
Path: a.Path,
|
|
Params: params,
|
|
}
|
|
}
|