diff --git a/dynamic/client.go b/dynamic/client.go index 74fc74c4..a941189d 100644 --- a/dynamic/client.go +++ b/dynamic/client.go @@ -40,8 +40,42 @@ import ( "k8s.io/client-go/util/flowcontrol" ) -// Client is a Kubernetes client that allows you to access metadata +// Interface is a Kubernetes client that allows you to access metadata // and manipulate metadata of a Kubernetes API group. +type Interface interface { + // GetRateLimiter returns the rate limiter for this client. + GetRateLimiter() flowcontrol.RateLimiter + // Resource returns an API interface to the specified resource for this client's + // group and version. If resource is not a namespaced resource, then namespace + // is ignored. The ResourceInterface inherits the paramater codec of this client. + Resource(resource *metav1.APIResource, namespace string) ResourceInterface + // ParameterCodec returns a client with the provided parameter codec. + ParameterCodec(parameterCodec runtime.ParameterCodec) Interface +} + +// ResourceInterface is an API interface to a specific resource under a +// dynamic client. +type ResourceInterface interface { + // List returns a list of objects for this resource. + List(opts metav1.ListOptions) (runtime.Object, error) + // Get gets the resource with the specified name. + Get(name string, opts metav1.GetOptions) (*unstructured.Unstructured, error) + // Delete deletes the resource with the specified name. + Delete(name string, opts *metav1.DeleteOptions) error + // DeleteCollection deletes a collection of objects. + DeleteCollection(deleteOptions *metav1.DeleteOptions, listOptions metav1.ListOptions) error + // Create creates the provided resource. + Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) + // Update updates the provided resource. + Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) + // Watch returns a watch.Interface that watches the resource. + Watch(opts metav1.ListOptions) (watch.Interface, error) + // Patch patches the provided resource. + Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) +} + +// Client is a Kubernetes client that allows you to access metadata +// and manipulate metadata of a Kubernetes API group, and implements Interface. type Client struct { cl *restclient.RESTClient parameterCodec runtime.ParameterCodec @@ -84,8 +118,8 @@ func (c *Client) GetRateLimiter() flowcontrol.RateLimiter { // Resource returns an API interface to the specified resource for this client's // group and version. If resource is not a namespaced resource, then namespace -// is ignored. The ResourceClient inherits the parameter codec of c. -func (c *Client) Resource(resource *metav1.APIResource, namespace string) *ResourceClient { +// is ignored. The ResourceInterface inherits the parameter codec of c. +func (c *Client) Resource(resource *metav1.APIResource, namespace string) ResourceInterface { return &ResourceClient{ cl: c.cl, resource: resource, @@ -95,7 +129,7 @@ func (c *Client) Resource(resource *metav1.APIResource, namespace string) *Resou } // ParameterCodec returns a client with the provided parameter codec. -func (c *Client) ParameterCodec(parameterCodec runtime.ParameterCodec) *Client { +func (c *Client) ParameterCodec(parameterCodec runtime.ParameterCodec) Interface { return &Client{ cl: c.cl, parameterCodec: parameterCodec, @@ -103,7 +137,7 @@ func (c *Client) ParameterCodec(parameterCodec runtime.ParameterCodec) *Client { } // ResourceClient is an API interface to a specific resource under a -// dynamic client. +// dynamic client, and implements ResourceInterface. type ResourceClient struct { cl *restclient.RESTClient resource *metav1.APIResource diff --git a/dynamic/client_pool.go b/dynamic/client_pool.go index f4f2596a..277dad49 100644 --- a/dynamic/client_pool.go +++ b/dynamic/client_pool.go @@ -28,10 +28,10 @@ import ( type ClientPool interface { // ClientForGroupVersionKind returns a client configured for the specified groupVersionResource. // Resource may be empty. - ClientForGroupVersionResource(resource schema.GroupVersionResource) (*Client, error) + ClientForGroupVersionResource(resource schema.GroupVersionResource) (Interface, error) // ClientForGroupVersionKind returns a client configured for the specified groupVersionKind. // Kind may be empty. - ClientForGroupVersionKind(kind schema.GroupVersionKind) (*Client, error) + ClientForGroupVersionKind(kind schema.GroupVersionKind) (Interface, error) } // APIPathResolverFunc knows how to convert a groupVersion to its API path. The Kind field is @@ -79,7 +79,7 @@ func NewDynamicClientPool(cfg *restclient.Config) ClientPool { // ClientForGroupVersionResource uses the provided RESTMapper to identify the appropriate resource. Resource may // be empty. If no matching kind is found the underlying client for that group is still returned. -func (c *clientPoolImpl) ClientForGroupVersionResource(resource schema.GroupVersionResource) (*Client, error) { +func (c *clientPoolImpl) ClientForGroupVersionResource(resource schema.GroupVersionResource) (Interface, error) { kinds, err := c.mapper.KindsFor(resource) if err != nil { if meta.IsNoMatchError(err) { @@ -92,7 +92,7 @@ func (c *clientPoolImpl) ClientForGroupVersionResource(resource schema.GroupVers // ClientForGroupVersion returns a client for the specified groupVersion, creates one if none exists. Kind // in the GroupVersionKind may be empty. -func (c *clientPoolImpl) ClientForGroupVersionKind(kind schema.GroupVersionKind) (*Client, error) { +func (c *clientPoolImpl) ClientForGroupVersionKind(kind schema.GroupVersionKind) (Interface, error) { c.lock.Lock() defer c.lock.Unlock() diff --git a/dynamic/client_test.go b/dynamic/client_test.go index 67cdcef2..1459429c 100644 --- a/dynamic/client_test.go +++ b/dynamic/client_test.go @@ -58,7 +58,7 @@ func getObject(version, kind, name string) *unstructured.Unstructured { } } -func getClientServer(gv *schema.GroupVersion, h func(http.ResponseWriter, *http.Request)) (*Client, *httptest.Server, error) { +func getClientServer(gv *schema.GroupVersion, h func(http.ResponseWriter, *http.Request)) (Interface, *httptest.Server, error) { srv := httptest.NewServer(http.HandlerFunc(h)) cl, err := NewClient(&restclient.Config{ Host: srv.URL,