diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index eb332f96..630aa493 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -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", diff --git a/dynamic/fake/simple.go b/dynamic/fake/simple.go new file mode 100644 index 00000000..9aafb81a --- /dev/null +++ b/dynamic/fake/simple.go @@ -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 +} diff --git a/dynamic/simple.go b/dynamic/simple.go index 41e0360e..396ff876 100644 --- a/dynamic/simple.go +++ b/dynamic/simple.go @@ -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")