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)
+}