This is an automated email from the ASF dual-hosted git repository.

zhongxjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git


The following commit(s) were added to refs/heads/master by this push:
     new 34c4f97c [operator] informer factorylogic and other logic
34c4f97c is described below

commit 34c4f97c398ddfd5cc6210a91a86d32a293f2314
Author: mfordjody <[email protected]>
AuthorDate: Wed Dec 18 13:30:18 2024 +0800

    [operator] informer factorylogic and other logic
---
 pkg/kube/client.go                  | 39 ++++++++++++++++++++++++++++++-------
 pkg/kube/client_factory.go          | 32 ++++++++++++++++++++++++++++++
 pkg/kube/informerfactory/factory.go | 24 +++++++++++++++++++++++
 3 files changed, 88 insertions(+), 7 deletions(-)

diff --git a/pkg/kube/client.go b/pkg/kube/client.go
index 780b6ed0..2c354fee 100644
--- a/pkg/kube/client.go
+++ b/pkg/kube/client.go
@@ -5,11 +5,13 @@ import (
        "github.com/apache/dubbo-kubernetes/operator/pkg/config"
        "github.com/apache/dubbo-kubernetes/pkg/kube/collections"
        apiextensionsv1 
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
+       "k8s.io/apimachinery/pkg/api/meta"
        "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
        "k8s.io/apimachinery/pkg/runtime"
        "k8s.io/apimachinery/pkg/runtime/schema"
        "k8s.io/apimachinery/pkg/runtime/serializer"
        utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+       "k8s.io/client-go/discovery"
        "k8s.io/client-go/dynamic"
        kubescheme "k8s.io/client-go/kubernetes/scheme"
        "k8s.io/client-go/rest"
@@ -17,11 +19,13 @@ import (
 )
 
 type client struct {
-       dynamic    dynamic.Interface
-       config     *rest.Config
-       revision   string
-       factory    *clientFactory
-       restClient *rest.RESTClient
+       dynamic         dynamic.Interface
+       config          *rest.Config
+       revision        string
+       factory         *clientFactory
+       restClient      *rest.RESTClient
+       discoveryClient discovery.CachedDiscoveryInterface
+       mapper          meta.ResettableRESTMapper
 }
 
 type Client interface {
@@ -50,6 +54,20 @@ func newInternalClient(factory *clientFactory, opts 
...ClientOption) (CLIClient,
        for _, opt := range opts {
                opt(&c)
        }
+       c.restClient, err = factory.RestClient()
+       if err != nil {
+               return nil, err
+       }
+       c.discoveryClient, err = factory.ToDiscoveryClient()
+       if err != nil {
+               return nil, err
+       }
+       c.mapper, err = factory.mapper.Get()
+       if err != nil {
+               return nil, err
+       }
+
+       c.factory = informerfactory
 
        return nil, err
 }
@@ -89,8 +107,15 @@ func (c *client) bestEffortToGVR(gvk 
schema.GroupVersionKind, obj *unstructured.
                gvr.Version = gvk.Version
                return gvr, !s.IsClusterScoped()
        }
-
-       return schema.GroupVersionResource{}, false
+       if c.mapper != nil {
+               mapping, err := c.mapper.RESTMapping(gvk.GroupKind(), 
gvk.Version)
+               if err == nil {
+                       return mapping.Resource, mapping.Scope.Name() == 
meta.RESTScopeNameNamespace
+               }
+       }
+       gvr, _ := meta.UnsafeGuessKindToResource(gvk)
+       namespaced := (obj != nil && obj.GetNamespace() != "") || namespace != 
""
+       return gvr, namespaced
 }
 
 func WithRevision(revision string) ClientOption {
diff --git a/pkg/kube/client_factory.go b/pkg/kube/client_factory.go
index 58f06193..0ed87376 100644
--- a/pkg/kube/client_factory.go
+++ b/pkg/kube/client_factory.go
@@ -6,6 +6,7 @@ import (
        "k8s.io/client-go/discovery"
        diskcached "k8s.io/client-go/discovery/cached/disk"
        "k8s.io/client-go/discovery/cached/memory"
+       "k8s.io/client-go/dynamic"
        "k8s.io/client-go/rest"
        "k8s.io/client-go/restmapper"
        "k8s.io/client-go/tools/clientcmd"
@@ -23,6 +24,13 @@ type clientFactory struct {
        discoveryClient laziness.Laziness[discovery.CachedDiscoveryInterface]
 }
 
+type restClientGetter interface {
+       ToRestConfig() (*rest.Config, error)
+       ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error)
+       ToRestMapper() (meta.RESTMapper, error)
+       ToRawKubeConfigLoader() clientcmd.ClientConfig
+}
+
 func newClientFactory(clientConfig clientcmd.ClientConfig, diskCache bool) 
*clientFactory {
        cf := &clientFactory{
                clientConfig: clientConfig,
@@ -69,6 +77,14 @@ func (c *clientFactory) ToDiscoveryClient() 
(discovery.CachedDiscoveryInterface,
        return c.discoveryClient.Get()
 }
 
+func (c *clientFactory) RestClient() (*rest.RESTClient, error) {
+       clientConfig, err := c.ToRestConfig()
+       if err != nil {
+               return nil, err
+       }
+       return rest.RESTClientFor(clientConfig)
+}
+
 func (c *clientFactory) ToRestConfig() (*rest.Config, error) {
        restConfig, err := c.clientConfig.ClientConfig()
        if err != nil {
@@ -77,6 +93,22 @@ func (c *clientFactory) ToRestConfig() (*rest.Config, error) 
{
        return SetRestDefaults(restConfig), nil
 }
 
+func (c *clientFactory) ToRestMapper() (meta.RESTMapper, error) {
+       return c.expander.Get()
+}
+
+func (c *clientFactory) DynamicClient() (dynamic.Interface, error) {
+       restConfig, err := c.ToRestConfig()
+       if err != nil {
+               return nil, err
+       }
+       return dynamic.NewForConfig(restConfig)
+}
+
+func (c *clientFactory) ToRawKubeConfigLoader() clientcmd.ClientConfig {
+       return c.clientConfig
+}
+
 var overlyCautiousIllegalFileCharacters = regexp.MustCompile(`[^(\w/.)]`)
 
 func computeDiscoverCacheDir(dir, host string) string {
diff --git a/pkg/kube/informerfactory/factory.go 
b/pkg/kube/informerfactory/factory.go
new file mode 100644
index 00000000..5252f448
--- /dev/null
+++ b/pkg/kube/informerfactory/factory.go
@@ -0,0 +1,24 @@
+package informerfactory
+
+import (
+       "k8s.io/apimachinery/pkg/runtime/schema"
+       "k8s.io/client-go/tools/cache"
+)
+
+type NewInformerFunc func() cache.SharedIndexInformer
+
+type StartableInformer struct {
+       Informer cache.SharedIndexInformer
+       start    func(stopCh <-chan struct{})
+}
+
+type InformerFactory interface {
+       Start(stopCh <-chan struct{})
+       InformerFor(resource schema.GroupVersionResource, opts 
kubetypes.InformerOptions, newFunc NewInformerFunc) StartableInformer
+       WaitForCacheSync(stopCh <-chan struct{}) bool
+       Shutdown()
+}
+
+func (s StartableInformer) Start(stopCh <-chan struct{}) {
+       s.start(stopCh)
+}

Reply via email to