diff --git a/kubernetes/client/typed/typed.go b/kubernetes/client/typed/typed.go index 8217f25..9a08ed3 100644 --- a/kubernetes/client/typed/typed.go +++ b/kubernetes/client/typed/typed.go @@ -16,9 +16,9 @@ import ( type typedClient struct { client client.Reader + scheme *runtime.Scheme gvk schema.GroupVersionKind - obj runtime.Object - listObj runtime.Object + listGVK schema.GroupVersionKind } // NewTypedClient returns a new Client implementation. @@ -46,27 +46,15 @@ func NewTypedClient(gvk schema.GroupVersionKind, opts ...func(*options)) (Client o.cache = cache } - var ( - obj runtime.Object - listObj runtime.Object - ) - if o.scheme.Recognizes(gvk) { - obj, _ = o.scheme.New(gvk) - } - listGVK := schema.GroupVersionKind{ - Group: gvk.Group, - Version: gvk.Version, - Kind: gvk.Kind + "List", - } - if o.scheme.Recognizes(listGVK) { - listObj, _ = o.scheme.New(listGVK) - } - return &typedClient{ - client: o.cache, - gvk: gvk, - obj: obj, - listObj: listObj, + client: o.cache, + scheme: o.scheme, + gvk: gvk, + listGVK: schema.GroupVersionKind{ + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind + "List", + }, }, nil } @@ -74,26 +62,34 @@ var resourceNotRegisteredError = "kind %s is not registered in scheme" // Get retrieves an object for the given object key. func (t *typedClient) Get(ctx context.Context, key types.NamespacedName, opts ...client.GetOption) (client.Object, error) { - if t.obj == nil { + if !t.scheme.Recognizes(t.gvk) { return nil, fmt.Errorf(resourceNotRegisteredError, t.gvk.String()) } - obj := t.obj.(client.Object) - if err := t.client.Get(ctx, key, obj, opts...); err != nil { + obj, err := t.scheme.New(t.gvk) + if err != nil { return nil, err } - return obj, nil + clientObj := obj.(client.Object) + if err = t.client.Get(ctx, key, clientObj, opts...); err != nil { + return nil, err + } + return clientObj, nil } // List retrieves list of objects for a given namespace and list options. func (t *typedClient) List(ctx context.Context, namespace string, opts ...client.ListOption) (client.ObjectList, error) { - if t.listObj == nil { + if !t.scheme.Recognizes(t.listGVK) { return nil, fmt.Errorf(resourceNotRegisteredError, t.gvk.String()) } - listObj := t.listObj.(client.ObjectList) - if err := t.client.List(ctx, listObj, append(opts, client.InNamespace(namespace))...); err != nil { + listObj, err := t.scheme.New(t.listGVK) + if err != nil { + return nil, err + } + clientObj := listObj.(client.ObjectList) + if err = t.client.List(ctx, clientObj, append(opts, client.InNamespace(namespace))...); err != nil { return nil, err } - return listObj, nil + return clientObj, nil } diff --git a/kubernetes/client/typed/unstructured.go b/kubernetes/client/typed/unstructured.go index beb09cd..bb90ecb 100644 --- a/kubernetes/client/typed/unstructured.go +++ b/kubernetes/client/typed/unstructured.go @@ -4,7 +4,6 @@ import ( "context" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/rest" @@ -16,8 +15,7 @@ import ( type unstructuredTypedClient struct { client client.Reader gvk schema.GroupVersionKind - obj runtime.Object - listObj runtime.Object + listGVK schema.GroupVersionKind } // NewUnstructuredTypedClient returns a new Client implementation that returns all objects as Unstructured objects. @@ -42,27 +40,21 @@ func NewUnstructuredTypedClient(gvk schema.GroupVersionKind, opts ...func(*optio o.cache = cache } - obj := &unstructured.Unstructured{} - obj.SetGroupVersionKind(gvk) - - listObj := &unstructured.UnstructuredList{} - listObj.SetGroupVersionKind(schema.GroupVersionKind{ - Group: gvk.Group, - Version: gvk.Version, - Kind: gvk.Kind + "List", - }) - return &unstructuredTypedClient{ - client: o.cache, - gvk: gvk, - obj: obj, - listObj: listObj, + client: o.cache, + gvk: gvk, + listGVK: schema.GroupVersionKind{ + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind + "List", + }, }, nil } // Get retrieves an object for the given object key. func (t *unstructuredTypedClient) Get(ctx context.Context, key types.NamespacedName, opts ...client.GetOption) (client.Object, error) { - obj := t.obj.(client.Object) + obj := &unstructured.Unstructured{} + obj.SetGroupVersionKind(t.gvk) if err := t.client.Get(ctx, key, obj, opts...); err != nil { return nil, err } @@ -71,7 +63,8 @@ func (t *unstructuredTypedClient) Get(ctx context.Context, key types.NamespacedN // List retrieves list of objects for a given namespace and list options. func (t *unstructuredTypedClient) List(ctx context.Context, namespace string, opts ...client.ListOption) (client.ObjectList, error) { - listObj := t.listObj.(client.ObjectList) + listObj := &unstructured.UnstructuredList{} + listObj.SetGroupVersionKind(t.listGVK) if err := t.client.List(ctx, listObj, append(opts, client.InNamespace(namespace))...); err != nil { return nil, err } diff --git a/kubernetes/client/typed/unstructured_test.go b/kubernetes/client/typed/unstructured_test.go index 150ea9c..a8835b0 100644 --- a/kubernetes/client/typed/unstructured_test.go +++ b/kubernetes/client/typed/unstructured_test.go @@ -100,7 +100,8 @@ func TestUnstructuredList(t *testing.T) { if tt.isErr { return } - pods := got.(*unstructured.UnstructuredList) + pods := &corev1.PodList{} + _ = unstructuredutils.ConvertToTyped(got.(*unstructured.UnstructuredList), pods) if len(pods.Items) != tt.wanted { t.Errorf("List() = %v, want %v", len(pods.Items), tt.wanted) }