client-go: factor the dynamic client similarly to others

All other clients:

 - expose a New() method that takes a rest.Interface
 - expose their RESTClient()
 - return pointers to the type, not instances of an interface that the
   type implements

For code that is generic over all Kubernetes clients, and for general
developer experience, it's best to make sure that this client adheres to
these common practices.

Signed-off-by: Steve Kuznetsov <skuznets@redhat.com>

Kubernetes-commit: 74af6f1e7d9057bfcb64f4d875063c14041937e5
This commit is contained in:
Steve Kuznetsov
2022-09-28 08:57:22 -06:00
committed by Kubernetes Publisher
parent b28f6c94f4
commit 34e8a5d862

View File

@@ -31,11 +31,11 @@ import (
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
) )
type dynamicClient struct { type DynamicClient struct {
client *rest.RESTClient client rest.Interface
} }
var _ Interface = &dynamicClient{} var _ Interface = &DynamicClient{}
// ConfigFor returns a copy of the provided config with the // ConfigFor returns a copy of the provided config with the
// appropriate dynamic client defaults set. // appropriate dynamic client defaults set.
@@ -50,9 +50,14 @@ func ConfigFor(inConfig *rest.Config) *rest.Config {
return config return config
} }
// NewForConfigOrDie creates a new Interface for the given config and // New creates a new DynamicClient for the given RESTClient.
func New(c rest.Interface) *DynamicClient {
return &DynamicClient{client: c}
}
// NewForConfigOrDie creates a new DynamicClient for the given config and
// panics if there is an error in the config. // panics if there is an error in the config.
func NewForConfigOrDie(c *rest.Config) Interface { func NewForConfigOrDie(c *rest.Config) *DynamicClient {
ret, err := NewForConfig(c) ret, err := NewForConfig(c)
if err != nil { if err != nil {
panic(err) panic(err)
@@ -63,7 +68,7 @@ func NewForConfigOrDie(c *rest.Config) Interface {
// NewForConfig creates a new dynamic client or returns an error. // NewForConfig creates a new dynamic client or returns an error.
// NewForConfig is equivalent to NewForConfigAndClient(c, httpClient), // NewForConfig is equivalent to NewForConfigAndClient(c, httpClient),
// where httpClient was generated with rest.HTTPClientFor(c). // where httpClient was generated with rest.HTTPClientFor(c).
func NewForConfig(inConfig *rest.Config) (Interface, error) { func NewForConfig(inConfig *rest.Config) (*DynamicClient, error) {
config := ConfigFor(inConfig) config := ConfigFor(inConfig)
httpClient, err := rest.HTTPClientFor(config) httpClient, err := rest.HTTPClientFor(config)
@@ -75,7 +80,7 @@ func NewForConfig(inConfig *rest.Config) (Interface, error) {
// NewForConfigAndClient creates a new dynamic client for the given config and http client. // NewForConfigAndClient creates a new dynamic client for the given config and http client.
// Note the http client provided takes precedence over the configured transport values. // Note the http client provided takes precedence over the configured transport values.
func NewForConfigAndClient(inConfig *rest.Config, h *http.Client) (Interface, error) { func NewForConfigAndClient(inConfig *rest.Config, h *http.Client) (*DynamicClient, error) {
config := ConfigFor(inConfig) config := ConfigFor(inConfig)
// for serializing the options // for serializing the options
config.GroupVersion = &schema.GroupVersion{} config.GroupVersion = &schema.GroupVersion{}
@@ -85,16 +90,16 @@ func NewForConfigAndClient(inConfig *rest.Config, h *http.Client) (Interface, er
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &dynamicClient{client: restClient}, nil return &DynamicClient{client: restClient}, nil
} }
type dynamicResourceClient struct { type dynamicResourceClient struct {
client *dynamicClient client *DynamicClient
namespace string namespace string
resource schema.GroupVersionResource resource schema.GroupVersionResource
} }
func (c *dynamicClient) Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface { func (c *DynamicClient) Resource(resource schema.GroupVersionResource) NamespaceableResourceInterface {
return &dynamicResourceClient{client: c, resource: resource} return &dynamicResourceClient{client: c, resource: resource}
} }