Merge pull request #63253 from deads2k/client-05-dynamic-update

Automatic merge from submit-queue (batch tested with PRs 63152, 63253). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>.

make dynamic client slightly easier to use and add fakes

Tweaks the dynamic client to make it more "normal" for resources to namespaces.  Adds a fake dynamic client.

@kubernetes/sig-api-machinery-pr-reviews
/assign @hzxuzhonghu
/assign @sttts

```release-note
NONE
```

Kubernetes-commit: 8e99d621e95c38d6e773a631c7179915ed952a2f
This commit is contained in:
Kubernetes Publisher 2018-05-01 07:36:12 -07:00
commit 01d6a1350d
3 changed files with 331 additions and 88 deletions

164
Godeps/Godeps.json generated
View File

@ -252,331 +252,331 @@
},
{
"ImportPath": "k8s.io/api/admissionregistration/v1alpha1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/admissionregistration/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/apps/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/apps/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/apps/v1beta2",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/authentication/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/authentication/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/authorization/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/authorization/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/autoscaling/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/autoscaling/v2beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/batch/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/batch/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/batch/v2alpha1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/certificates/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/core/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/events/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/extensions/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/imagepolicy/v1alpha1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/networking/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/policy/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/rbac/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/rbac/v1alpha1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/rbac/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/scheduling/v1alpha1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/settings/v1alpha1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/storage/v1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/storage/v1alpha1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/api/storage/v1beta1",
"Rev": "c416ded332245f3aa810919a74cc5b561142696c"
"Rev": "b7d77fa220f5130ec63c2ca7167dd9653449c64d"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/equality",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/errors",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/meta",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/resource",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/testing",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/testing/fuzzer",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/api/testing/roundtrip",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apimachinery",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apimachinery/announced",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/conversion",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/fields",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/labels",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/schema",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/selection",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/types",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/cache",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/clock",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/diff",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/errors",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/framer",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/httpstream",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/intstr",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/json",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/net",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/runtime",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/sets",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/validation",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/validation/field",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/wait",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/util/yaml",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/version",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/pkg/watch",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect",
"Rev": "2ad92c37230c7d04408c333e1d1db20450abdc7e"
"Rev": "b54e2be8c5c22805a615d4e84c3cbffcdca8654f"
},
{
"ImportPath": "k8s.io/kube-openapi/pkg/util/proto",

236
dynamic/fake/simple.go Normal file
View File

@ -0,0 +1,236 @@
/*
Copyright 2018 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 fake
import (
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/testing"
)
func NewSimpleDynamicClient(scheme *runtime.Scheme, objects ...runtime.Object) *FakeDynamicClient {
codecs := serializer.NewCodecFactory(scheme)
o := testing.NewObjectTracker(scheme, codecs.UniversalDecoder())
for _, obj := range objects {
if err := o.Add(obj); err != nil {
panic(err)
}
}
cs := &FakeDynamicClient{}
cs.AddReactor("*", "*", testing.ObjectReaction(o))
cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) {
gvr := action.GetResource()
ns := action.GetNamespace()
watch, err := o.Watch(gvr, ns)
if err != nil {
return false, nil, err
}
return true, watch, nil
})
return cs
}
// Clientset implements clientset.Interface. Meant to be embedded into a
// struct to get a default implementation. This makes faking out just the method
// you want to test easier.
type FakeDynamicClient struct {
testing.Fake
scheme *runtime.Scheme
}
type dynamicResourceClient struct {
client *FakeDynamicClient
namespace string
resource schema.GroupVersionResource
subresource string
}
var _ dynamic.DynamicInterface = &FakeDynamicClient{}
func (c *FakeDynamicClient) Resource(resource schema.GroupVersionResource) dynamic.NamespaceableDynamicResourceInterface {
return &dynamicResourceClient{client: c, resource: resource}
}
// Deprecated, this isn't how we want to do it
func (c *FakeDynamicClient) ClusterSubresource(resource schema.GroupVersionResource, subresource string) dynamic.DynamicResourceInterface {
return &dynamicResourceClient{client: c, resource: resource, subresource: subresource}
}
// Deprecated, this isn't how we want to do it
func (c *FakeDynamicClient) NamespacedSubresource(resource schema.GroupVersionResource, subresource, namespace string) dynamic.DynamicResourceInterface {
return &dynamicResourceClient{client: c, resource: resource, namespace: namespace, subresource: subresource}
}
func (c *dynamicResourceClient) Namespace(ns string) dynamic.DynamicResourceInterface {
ret := *c
ret.namespace = ns
return &ret
}
func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
uncastRet, err := c.client.Fake.
Invokes(testing.NewCreateAction(c.resource, c.namespace, obj), obj)
if err != nil {
return nil, err
}
if uncastRet == nil {
return nil, err
}
ret := &unstructured.Unstructured{}
if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil {
return nil, err
}
return ret, err
}
func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
uncastRet, err := c.client.Fake.
Invokes(testing.NewUpdateAction(c.resource, c.namespace, obj), obj)
if err != nil {
return nil, err
}
if uncastRet == nil {
return nil, err
}
ret := &unstructured.Unstructured{}
if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil {
return nil, err
}
return ret, err
}
func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
uncastRet, err := c.client.Fake.
Invokes(testing.NewUpdateSubresourceAction(c.resource, "status", c.namespace, obj), obj)
if err != nil {
return nil, err
}
if uncastRet == nil {
return nil, err
}
ret := &unstructured.Unstructured{}
if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil {
return nil, err
}
return ret, err
}
func (c *dynamicResourceClient) Delete(name string, opts *metav1.DeleteOptions) error {
_, err := c.client.Fake.
Invokes(testing.NewDeleteAction(c.resource, c.namespace, name), &metav1.Status{Status: "dynamic delete fail"})
return err
}
func (c *dynamicResourceClient) DeleteCollection(opts *metav1.DeleteOptions, listOptions metav1.ListOptions) error {
action := testing.NewDeleteCollectionAction(c.resource, c.namespace, listOptions)
_, err := c.client.Fake.Invokes(action, &metav1.Status{Status: "dynamic deletecollection fail"})
return err
}
func (c *dynamicResourceClient) Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) {
uncastRet, err := c.client.Fake.
Invokes(testing.NewGetAction(c.resource, c.namespace, name), &metav1.Status{Status: "dynamic get fail"})
if err != nil {
return nil, err
}
if uncastRet == nil {
return nil, err
}
ret := &unstructured.Unstructured{}
if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil {
return nil, err
}
return ret, err
}
func (c *dynamicResourceClient) List(opts metav1.ListOptions) (*unstructured.UnstructuredList, error) {
obj, err := c.client.Fake.
Invokes(testing.NewListAction(c.resource, schema.GroupVersionKind{Version: "v1", Kind: "List"}, c.namespace, opts), &metav1.Status{Status: "dynamic list fail"})
if obj == nil {
return nil, err
}
label, _, _ := testing.ExtractFromListOptions(opts)
if label == nil {
label = labels.Everything()
}
retUnstructured := &unstructured.Unstructured{}
if err := c.client.scheme.Convert(obj, retUnstructured, nil); err != nil {
return nil, err
}
entireList, err := retUnstructured.ToList()
if err != nil {
return nil, err
}
list := &unstructured.UnstructuredList{}
for _, item := range entireList.Items {
metadata, err := meta.Accessor(item)
if err != nil {
return nil, err
}
if label.Matches(labels.Set(metadata.GetLabels())) {
list.Items = append(list.Items, item)
}
}
return list, nil
}
func (c *dynamicResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
return c.client.Fake.
InvokesWatch(testing.NewWatchAction(c.resource, c.namespace, opts))
}
func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error) {
uncastRet, err := c.client.Fake.
Invokes(testing.NewPatchSubresourceAction(c.resource, c.namespace, name, data, subresources...), &metav1.Status{Status: "dynamic patch fail"})
if err != nil {
return nil, err
}
if uncastRet == nil {
return nil, err
}
ret := &unstructured.Unstructured{}
if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil {
return nil, err
}
return ret, err
}

View File

@ -32,8 +32,7 @@ import (
)
type DynamicInterface interface {
ClusterResource(resource schema.GroupVersionResource) DynamicResourceInterface
NamespacedResource(resource schema.GroupVersionResource, namespace string) DynamicResourceInterface
Resource(resource schema.GroupVersionResource) NamespaceableDynamicResourceInterface
// Deprecated, this isn't how we want to do it
ClusterSubresource(resource schema.GroupVersionResource, subresource string) DynamicResourceInterface
@ -53,6 +52,11 @@ type DynamicResourceInterface interface {
Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error)
}
type NamespaceableDynamicResourceInterface interface {
Namespace(string) DynamicResourceInterface
DynamicResourceInterface
}
type dynamicClient struct {
client *rest.RESTClient
}
@ -86,12 +90,9 @@ type dynamicResourceClient struct {
subresource string
}
func (c *dynamicClient) ClusterResource(resource schema.GroupVersionResource) DynamicResourceInterface {
func (c *dynamicClient) Resource(resource schema.GroupVersionResource) NamespaceableDynamicResourceInterface {
return &dynamicResourceClient{client: c, resource: resource}
}
func (c *dynamicClient) NamespacedResource(resource schema.GroupVersionResource, namespace string) DynamicResourceInterface {
return &dynamicResourceClient{client: c, resource: resource, namespace: namespace}
}
func (c *dynamicClient) ClusterSubresource(resource schema.GroupVersionResource, subresource string) DynamicResourceInterface {
return &dynamicResourceClient{client: c, resource: resource, subresource: subresource}
@ -100,6 +101,12 @@ func (c *dynamicClient) NamespacedSubresource(resource schema.GroupVersionResour
return &dynamicResourceClient{client: c, resource: resource, namespace: namespace, subresource: subresource}
}
func (c *dynamicResourceClient) Namespace(ns string) DynamicResourceInterface {
ret := *c
ret.namespace = ns
return &ret
}
func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) {
if len(c.subresource) > 0 {
return nil, fmt.Errorf("create not supported for subresources")