skip informer creating when corresponding crd not exists

This commit is contained in:
Jeff
2019-09-29 11:55:56 +08:00
committed by zryfish
parent 7ad77c32fc
commit d2b1bf4ba0
2 changed files with 55 additions and 15 deletions

View File

@@ -177,6 +177,25 @@ func CreateClientSet(conf *apiserverconfig.Config, stopCh <-chan struct{}) error
func WaitForResourceSync(stopCh <-chan struct{}) error { func WaitForResourceSync(stopCh <-chan struct{}) error {
klog.V(0).Info("Start cache objects") klog.V(0).Info("Start cache objects")
discoveryClient := client.ClientSets().K8s().Discovery()
apiResourcesList, err := discoveryClient.ServerResources()
if err != nil {
return err
}
isResourceExists := func(resource schema.GroupVersionResource) bool {
for _, apiResource := range apiResourcesList {
if apiResource.GroupVersion == resource.GroupVersion().String() {
for _, rsc := range apiResource.APIResources {
if rsc.Name == resource.Resource {
return true
}
}
}
}
return false
}
informerFactory := informers.SharedInformerFactory() informerFactory := informers.SharedInformerFactory()
// resources we have to create informer first // resources we have to create informer first
@@ -212,12 +231,16 @@ func WaitForResourceSync(stopCh <-chan struct{}) error {
} }
for _, gvr := range k8sGVRs { for _, gvr := range k8sGVRs {
if !isResourceExists(gvr) {
klog.Warningf("resource %s not exists in the cluster", gvr)
} else {
_, err := informerFactory.ForResource(gvr) _, err := informerFactory.ForResource(gvr)
if err != nil { if err != nil {
klog.Errorf("cannot create informer for %s", gvr) klog.Errorf("cannot create informer for %s", gvr)
return err return err
} }
} }
}
informerFactory.Start(stopCh) informerFactory.Start(stopCh)
informerFactory.WaitForCacheSync(stopCh) informerFactory.WaitForCacheSync(stopCh)
@@ -231,11 +254,15 @@ func WaitForResourceSync(stopCh <-chan struct{}) error {
} }
for _, gvr := range s2iGVRs { for _, gvr := range s2iGVRs {
if !isResourceExists(gvr) {
klog.Warningf("resource %s not exists in the cluster", gvr)
} else {
_, err := s2iInformerFactory.ForResource(gvr) _, err := s2iInformerFactory.ForResource(gvr)
if err != nil { if err != nil {
return err return err
} }
} }
}
s2iInformerFactory.Start(stopCh) s2iInformerFactory.Start(stopCh)
s2iInformerFactory.WaitForCacheSync(stopCh) s2iInformerFactory.WaitForCacheSync(stopCh)
@@ -251,11 +278,15 @@ func WaitForResourceSync(stopCh <-chan struct{}) error {
} }
for _, gvr := range ksGVRs { for _, gvr := range ksGVRs {
if !isResourceExists(gvr) {
klog.Warningf("resource %s not exists in the cluster", gvr)
} else {
_, err := ksInformerFactory.ForResource(gvr) _, err := ksInformerFactory.ForResource(gvr)
if err != nil { if err != nil {
return err return err
} }
} }
}
ksInformerFactory.Start(stopCh) ksInformerFactory.Start(stopCh)
ksInformerFactory.WaitForCacheSync(stopCh) ksInformerFactory.WaitForCacheSync(stopCh)

View File

@@ -2,6 +2,7 @@ package k8s
import ( import (
s2i "github.com/kubesphere/s2ioperator/pkg/client/clientset/versioned" s2i "github.com/kubesphere/s2ioperator/pkg/client/clientset/versioned"
"k8s.io/client-go/discovery"
"k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
@@ -12,6 +13,9 @@ type KubernetesClient struct {
// kubernetes client interface // kubernetes client interface
k8s *kubernetes.Clientset k8s *kubernetes.Clientset
// discovery client
discoveryClient *discovery.DiscoveryClient
// generated clientset // generated clientset
ks *kubesphere.Clientset ks *kubesphere.Clientset
@@ -34,6 +38,7 @@ func NewKubernetesClientOrDie(options *KubernetesOptions) *KubernetesClient {
k := &KubernetesClient{ k := &KubernetesClient{
k8s: kubernetes.NewForConfigOrDie(config), k8s: kubernetes.NewForConfigOrDie(config),
discoveryClient: discovery.NewDiscoveryClientForConfigOrDie(config),
ks: kubesphere.NewForConfigOrDie(config), ks: kubesphere.NewForConfigOrDie(config),
s2i: s2i.NewForConfigOrDie(config), s2i: s2i.NewForConfigOrDie(config),
master: config.Host, master: config.Host,
@@ -83,6 +88,10 @@ func (k *KubernetesClient) Kubernetes() kubernetes.Interface {
return k.k8s return k.k8s
} }
func (k *KubernetesClient) Discovery() discovery.DiscoveryInterface {
return k.discoveryClient
}
func (k *KubernetesClient) KubeSphere() kubesphere.Interface { func (k *KubernetesClient) KubeSphere() kubesphere.Interface {
return k.ks return k.ks
} }