mirror of
https://github.com/kubernetes/client-go.git
synced 2025-06-23 05:37:13 +00:00
[client-go] Add dynamic.Interface
This adds an interface form of dynamic.Client and dynamic.ResourceClient, making those two follow the general client conventions: `Interface` is an interface, and `Client` is the concrete implementation. `ClientPool` retains it's interface status. This allows us to create a fake implemenation of dyanmic.Interface, dynamic.ResourceInterface, and dynamic.ClientPool for testing. Kubernetes-commit: f78d61e7c263392f31560b90c08c57765ceae482
This commit is contained in:
parent
54d90de185
commit
cb42486a30
@ -40,8 +40,42 @@ import (
|
|||||||
"k8s.io/client-go/util/flowcontrol"
|
"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.
|
// 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 {
|
type Client struct {
|
||||||
cl *restclient.RESTClient
|
cl *restclient.RESTClient
|
||||||
parameterCodec runtime.ParameterCodec
|
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
|
// 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
|
// group and version. If resource is not a namespaced resource, then namespace
|
||||||
// is ignored. The ResourceClient inherits the parameter codec of c.
|
// is ignored. The ResourceInterface inherits the parameter codec of c.
|
||||||
func (c *Client) Resource(resource *metav1.APIResource, namespace string) *ResourceClient {
|
func (c *Client) Resource(resource *metav1.APIResource, namespace string) ResourceInterface {
|
||||||
return &ResourceClient{
|
return &ResourceClient{
|
||||||
cl: c.cl,
|
cl: c.cl,
|
||||||
resource: resource,
|
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.
|
// 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{
|
return &Client{
|
||||||
cl: c.cl,
|
cl: c.cl,
|
||||||
parameterCodec: parameterCodec,
|
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
|
// ResourceClient is an API interface to a specific resource under a
|
||||||
// dynamic client.
|
// dynamic client, and implements ResourceInterface.
|
||||||
type ResourceClient struct {
|
type ResourceClient struct {
|
||||||
cl *restclient.RESTClient
|
cl *restclient.RESTClient
|
||||||
resource *metav1.APIResource
|
resource *metav1.APIResource
|
||||||
|
@ -28,10 +28,10 @@ import (
|
|||||||
type ClientPool interface {
|
type ClientPool interface {
|
||||||
// ClientForGroupVersionKind returns a client configured for the specified groupVersionResource.
|
// ClientForGroupVersionKind returns a client configured for the specified groupVersionResource.
|
||||||
// Resource may be empty.
|
// 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.
|
// ClientForGroupVersionKind returns a client configured for the specified groupVersionKind.
|
||||||
// Kind may be empty.
|
// 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
|
// 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
|
// 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.
|
// 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)
|
kinds, err := c.mapper.KindsFor(resource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if meta.IsNoMatchError(err) {
|
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
|
// ClientForGroupVersion returns a client for the specified groupVersion, creates one if none exists. Kind
|
||||||
// in the GroupVersionKind may be empty.
|
// 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()
|
c.lock.Lock()
|
||||||
defer c.lock.Unlock()
|
defer c.lock.Unlock()
|
||||||
|
|
||||||
|
@ -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))
|
srv := httptest.NewServer(http.HandlerFunc(h))
|
||||||
cl, err := NewClient(&restclient.Config{
|
cl, err := NewClient(&restclient.Config{
|
||||||
Host: srv.URL,
|
Host: srv.URL,
|
||||||
|
Loading…
Reference in New Issue
Block a user