diff --git a/cmd/ks-apiserver/app/options/options.go b/cmd/ks-apiserver/app/options/options.go index 91e4b23f1..bb14c5012 100644 --- a/cmd/ks-apiserver/app/options/options.go +++ b/cmd/ks-apiserver/app/options/options.go @@ -20,6 +20,7 @@ import ( "crypto/tls" "flag" "fmt" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "kubesphere.io/kubesphere/pkg/apiserver/authentication/token" @@ -209,6 +210,11 @@ func (s *ServerRunOptions) NewAPIServer(stopCh <-chan struct{}) (*apiserver.APIS apiServer.AlertingClient = alertingClient } + if s.Config.MultiClusterOptions.Enable { + cc := clusterclient.NewClusterClient(informerFactory.KubeSphereSharedInformerFactory().Cluster().V1alpha1().Clusters()) + apiServer.ClusterClient = cc + } + server := &http.Server{ Addr: fmt.Sprintf(":%d", s.GenericServerRunOptions.InsecurePort), } @@ -240,6 +246,8 @@ func (s *ServerRunOptions) NewAPIServer(stopCh <-chan struct{}) (*apiserver.APIS klog.Fatalf("unable to create controller runtime client: %v", err) } + //apiServer.ClusterClients = + apiServer.Issuer, err = token.NewIssuer(s.AuthenticationOptions) if err != nil { klog.Fatalf("unable to create issuer: %v", err) diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index 5566df5ff..29207e03e 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "fmt" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "net/http" rt "runtime" "strconv" @@ -164,6 +165,8 @@ type APIServer struct { // controller-runtime client RuntimeClient runtimeclient.Client + + ClusterClient clusterclient.ClusterClients } func (s *APIServer) PrepareRun(stopCh <-chan struct{}) error { @@ -223,17 +226,17 @@ func (s *APIServer) installKubeSphereAPIs(stopCh <-chan struct{}) { urlruntime.Must(configv1alpha2.AddToContainer(s.container, s.Config)) urlruntime.Must(resourcev1alpha3.AddToContainer(s.container, s.InformerFactory, s.RuntimeCache)) - urlruntime.Must(monitoringv1alpha3.AddToContainer(s.container, s.KubernetesClient.Kubernetes(), s.MonitoringClient, s.MetricsClient, s.InformerFactory, s.KubernetesClient.KubeSphere(), s.Config.OpenPitrixOptions, s.RuntimeClient, stopCh)) - urlruntime.Must(meteringv1alpha1.AddToContainer(s.container, s.KubernetesClient.Kubernetes(), s.MonitoringClient, s.InformerFactory, s.KubernetesClient.KubeSphere(), s.RuntimeCache, s.Config.MeteringOptions, nil, s.RuntimeClient, stopCh)) - urlruntime.Must(openpitrixv1.AddToContainer(s.container, s.InformerFactory, s.KubernetesClient.KubeSphere(), s.Config.OpenPitrixOptions, stopCh)) + urlruntime.Must(monitoringv1alpha3.AddToContainer(s.container, s.KubernetesClient.Kubernetes(), s.MonitoringClient, s.MetricsClient, s.InformerFactory, s.KubernetesClient.KubeSphere(), s.Config.OpenPitrixOptions, s.RuntimeClient, s.ClusterClient, stopCh)) + urlruntime.Must(meteringv1alpha1.AddToContainer(s.container, s.KubernetesClient.Kubernetes(), s.MonitoringClient, s.InformerFactory, s.KubernetesClient.KubeSphere(), s.RuntimeCache, s.Config.MeteringOptions, nil, s.RuntimeClient, s.ClusterClient, stopCh)) + urlruntime.Must(openpitrixv1.AddToContainer(s.container, s.InformerFactory, s.KubernetesClient.KubeSphere(), s.Config.OpenPitrixOptions, s.ClusterClient, stopCh)) urlruntime.Must(openpitrixv2alpha1.AddToContainer(s.container, s.InformerFactory, s.KubernetesClient.KubeSphere(), s.Config.OpenPitrixOptions)) urlruntime.Must(operationsv1alpha2.AddToContainer(s.container, s.KubernetesClient.Kubernetes())) urlruntime.Must(resourcesv1alpha2.AddToContainer(s.container, s.KubernetesClient.Kubernetes(), s.InformerFactory, s.KubernetesClient.Master())) urlruntime.Must(tenantv1alpha2.AddToContainer(s.container, s.InformerFactory, s.KubernetesClient.Kubernetes(), - s.KubernetesClient.KubeSphere(), s.EventsClient, s.LoggingClient, s.AuditingClient, amOperator, rbacAuthorizer, s.MonitoringClient, s.RuntimeCache, s.Config.MeteringOptions, stopCh)) + s.KubernetesClient.KubeSphere(), s.EventsClient, s.LoggingClient, s.AuditingClient, amOperator, rbacAuthorizer, s.MonitoringClient, s.RuntimeCache, s.Config.MeteringOptions, s.ClusterClient, stopCh)) urlruntime.Must(tenantv1alpha3.AddToContainer(s.container, s.InformerFactory, s.KubernetesClient.Kubernetes(), - s.KubernetesClient.KubeSphere(), s.EventsClient, s.LoggingClient, s.AuditingClient, amOperator, rbacAuthorizer, s.MonitoringClient, s.RuntimeCache, s.Config.MeteringOptions, stopCh)) + s.KubernetesClient.KubeSphere(), s.EventsClient, s.LoggingClient, s.AuditingClient, amOperator, rbacAuthorizer, s.MonitoringClient, s.RuntimeCache, s.Config.MeteringOptions, s.ClusterClient, stopCh)) urlruntime.Must(terminalv1alpha2.AddToContainer(s.container, s.KubernetesClient.Kubernetes(), rbacAuthorizer, s.KubernetesClient.Config(), s.Config.TerminalOptions)) urlruntime.Must(clusterkapisv1alpha1.AddToContainer(s.container, s.KubernetesClient.KubeSphere(), @@ -346,7 +349,7 @@ func (s *APIServer) buildHandlerChain(stopCh <-chan struct{}) { handler = filters.WithAuthorization(handler, authorizers) if s.Config.MultiClusterOptions.Enable { - clusterDispatcher := dispatch.NewClusterDispatch(s.InformerFactory.KubeSphereSharedInformerFactory().Cluster().V1alpha1().Clusters()) + clusterDispatcher := dispatch.NewClusterDispatch(s.ClusterClient) handler = filters.WithMultipleClusterDispatcher(handler, clusterDispatcher) } diff --git a/pkg/apiserver/dispatch/dispatch.go b/pkg/apiserver/dispatch/dispatch.go index f2ffe9d05..6b1373915 100644 --- a/pkg/apiserver/dispatch/dispatch.go +++ b/pkg/apiserver/dispatch/dispatch.go @@ -30,7 +30,6 @@ import ( clusterv1alpha1 "kubesphere.io/api/cluster/v1alpha1" "kubesphere.io/kubesphere/pkg/apiserver/request" - clusterinformer "kubesphere.io/kubesphere/pkg/client/informers/externalversions/cluster/v1alpha1" "kubesphere.io/kubesphere/pkg/utils/clusterclient" ) @@ -47,8 +46,8 @@ type clusterDispatch struct { clusterclient.ClusterClients } -func NewClusterDispatch(clusterInformer clusterinformer.ClusterInformer) Dispatcher { - return &clusterDispatch{clusterclient.NewClusterClient(clusterInformer)} +func NewClusterDispatch(cc clusterclient.ClusterClients) Dispatcher { + return &clusterDispatch{cc} } // Dispatch dispatch requests to designated cluster diff --git a/pkg/kapis/metering/v1alpha1/handler.go b/pkg/kapis/metering/v1alpha1/handler.go index 4a5afb846..61946db04 100644 --- a/pkg/kapis/metering/v1alpha1/handler.go +++ b/pkg/kapis/metering/v1alpha1/handler.go @@ -21,6 +21,7 @@ package v1alpha1 import ( "github.com/emicklei/go-restful" "k8s.io/client-go/kubernetes" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" openpitrixoptions "kubesphere.io/kubesphere/pkg/simple/client/openpitrix" @@ -47,6 +48,6 @@ type meterHandler interface { HandlePVCMeterQuery(req *restful.Request, resp *restful.Response) } -func newHandler(k kubernetes.Interface, m monitoring.Interface, f informers.InformerFactory, ksClient versioned.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, meteringOptions *meteringclient.Options, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, stopCh <-chan struct{}) meterHandler { - return monitorhle.NewHandler(k, m, nil, f, ksClient, resourceGetter, meteringOptions, opOptions, rtClient, stopCh) +func newHandler(k kubernetes.Interface, m monitoring.Interface, f informers.InformerFactory, ksClient versioned.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, meteringOptions *meteringclient.Options, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, cc clusterclient.ClusterClients, stopCh <-chan struct{}) meterHandler { + return monitorhle.NewHandler(k, m, nil, f, ksClient, resourceGetter, meteringOptions, opOptions, rtClient, cc, stopCh) } diff --git a/pkg/kapis/metering/v1alpha1/register.go b/pkg/kapis/metering/v1alpha1/register.go index a589474c8..639c5998c 100644 --- a/pkg/kapis/metering/v1alpha1/register.go +++ b/pkg/kapis/metering/v1alpha1/register.go @@ -18,6 +18,7 @@ package v1alpha1 import ( + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "net/http" openpitrixoptions "kubesphere.io/kubesphere/pkg/simple/client/openpitrix" @@ -49,10 +50,10 @@ const ( var GroupVersion = schema.GroupVersion{Group: groupName, Version: "v1alpha1"} -func AddToContainer(c *restful.Container, k8sClient kubernetes.Interface, meteringClient monitoring.Interface, factory informers.InformerFactory, ksClient versioned.Interface, cache cache.Cache, meteringOptions *meteringclient.Options, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, stopCh <-chan struct{}) error { +func AddToContainer(c *restful.Container, k8sClient kubernetes.Interface, meteringClient monitoring.Interface, factory informers.InformerFactory, ksClient versioned.Interface, cache cache.Cache, meteringOptions *meteringclient.Options, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, cc clusterclient.ClusterClients, stopCh <-chan struct{}) error { ws := runtime.NewWebService(GroupVersion) - h := newHandler(k8sClient, meteringClient, factory, ksClient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, opOptions, rtClient, stopCh) + h := newHandler(k8sClient, meteringClient, factory, ksClient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, opOptions, rtClient, cc, stopCh) ws.Route(ws.GET("/cluster"). To(h.HandleClusterMeterQuery). diff --git a/pkg/kapis/monitoring/v1alpha3/handler.go b/pkg/kapis/monitoring/v1alpha3/handler.go index 662dc0d22..c2bb7a288 100644 --- a/pkg/kapis/monitoring/v1alpha3/handler.go +++ b/pkg/kapis/monitoring/v1alpha3/handler.go @@ -22,6 +22,7 @@ import ( "context" "errors" "io/ioutil" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "net/http" "net/url" "regexp" @@ -60,7 +61,7 @@ type handler struct { rtClient runtimeclient.Client } -func NewHandler(k kubernetes.Interface, monitoringClient monitoring.Interface, metricsClient monitoring.Interface, f informers.InformerFactory, ksClient versioned.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, meteringOptions *meteringclient.Options, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, stopCh <-chan struct{}) *handler { +func NewHandler(k kubernetes.Interface, monitoringClient monitoring.Interface, metricsClient monitoring.Interface, f informers.InformerFactory, ksClient versioned.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, meteringOptions *meteringclient.Options, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, cc clusterclient.ClusterClients, stopCh <-chan struct{}) *handler { var opRelease openpitrix.Interface var s3Client s3.Interface if opOptions != nil && opOptions.S3Options != nil && len(opOptions.S3Options.Endpoint) != 0 { @@ -71,7 +72,7 @@ func NewHandler(k kubernetes.Interface, monitoringClient monitoring.Interface, m } } if ksClient != nil { - opRelease = openpitrix.NewOpenpitrixOperator(f, ksClient, s3Client, stopCh) + opRelease = openpitrix.NewOpenpitrixOperator(f, ksClient, s3Client, cc, stopCh) } if meteringOptions == nil || meteringOptions.RetentionDay == "" { meteringOptions = &meteringclient.DefaultMeteringOption diff --git a/pkg/kapis/monitoring/v1alpha3/register.go b/pkg/kapis/monitoring/v1alpha3/register.go index 97fae3715..870262628 100644 --- a/pkg/kapis/monitoring/v1alpha3/register.go +++ b/pkg/kapis/monitoring/v1alpha3/register.go @@ -18,6 +18,7 @@ package v1alpha3 import ( + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "net/http" monitoringdashboardv1alpha2 "kubesphere.io/monitoring-dashboard/api/v1alpha2" @@ -47,10 +48,10 @@ const ( var GroupVersion = schema.GroupVersion{Group: groupName, Version: "v1alpha3"} -func AddToContainer(c *restful.Container, k8sClient kubernetes.Interface, monitoringClient monitoring.Interface, metricsClient monitoring.Interface, factory informers.InformerFactory, ksClient versioned.Interface, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, stopCh <-chan struct{}) error { +func AddToContainer(c *restful.Container, k8sClient kubernetes.Interface, monitoringClient monitoring.Interface, metricsClient monitoring.Interface, factory informers.InformerFactory, ksClient versioned.Interface, opOptions *openpitrixoptions.Options, rtClient runtimeclient.Client, cc clusterclient.ClusterClients, stopCh <-chan struct{}) error { ws := runtime.NewWebService(GroupVersion) - h := NewHandler(k8sClient, monitoringClient, metricsClient, factory, ksClient, nil, nil, opOptions, rtClient, stopCh) + h := NewHandler(k8sClient, monitoringClient, metricsClient, factory, ksClient, nil, nil, opOptions, rtClient, cc, stopCh) ws.Route(ws.GET("/kubesphere"). To(h.handleKubeSphereMetricsQuery). diff --git a/pkg/kapis/openpitrix/v1/handler.go b/pkg/kapis/openpitrix/v1/handler.go index d84c6c67f..be2401d48 100644 --- a/pkg/kapis/openpitrix/v1/handler.go +++ b/pkg/kapis/openpitrix/v1/handler.go @@ -17,6 +17,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "math" "net/url" "strconv" @@ -50,7 +51,7 @@ type openpitrixHandler struct { openpitrix openpitrix.Interface } -func newOpenpitrixHandler(ksInformers informers.InformerFactory, ksClient versioned.Interface, option *openpitrixoptions.Options, stopCh <-chan struct{}) *openpitrixHandler { +func newOpenpitrixHandler(ksInformers informers.InformerFactory, ksClient versioned.Interface, option *openpitrixoptions.Options, cc clusterclient.ClusterClients, stopCh <-chan struct{}) *openpitrixHandler { var s3Client s3.Interface if option != nil && option.S3Options != nil && len(option.S3Options.Endpoint) != 0 { var err error @@ -61,7 +62,7 @@ func newOpenpitrixHandler(ksInformers informers.InformerFactory, ksClient versio } return &openpitrixHandler{ - openpitrix.NewOpenpitrixOperator(ksInformers, ksClient, s3Client, stopCh), + openpitrix.NewOpenpitrixOperator(ksInformers, ksClient, s3Client, cc, stopCh), } } diff --git a/pkg/kapis/openpitrix/v1/register.go b/pkg/kapis/openpitrix/v1/register.go index 9515a19c5..9da4f54d0 100644 --- a/pkg/kapis/openpitrix/v1/register.go +++ b/pkg/kapis/openpitrix/v1/register.go @@ -14,6 +14,7 @@ limitations under the License. package v1 import ( + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "net/http" restful "github.com/emicklei/go-restful" @@ -38,11 +39,11 @@ const ( var GroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} -func AddToContainer(c *restful.Container, ksInfomrers informers.InformerFactory, ksClient versioned.Interface, options *openpitrixoptions.Options, stopCh <-chan struct{}) error { +func AddToContainer(c *restful.Container, ksInfomrers informers.InformerFactory, ksClient versioned.Interface, options *openpitrixoptions.Options, cc clusterclient.ClusterClients, stopCh <-chan struct{}) error { mimePatch := []string{restful.MIME_JSON, runtime.MimeJsonPatchJson, runtime.MimeMergePatchJson} webservice := runtime.NewWebService(GroupVersion) - handler := newOpenpitrixHandler(ksInfomrers, ksClient, options, stopCh) + handler := newOpenpitrixHandler(ksInfomrers, ksClient, options, cc, stopCh) webservice.Route(webservice.POST("/repos"). To(handler.CreateRepo). diff --git a/pkg/kapis/tenant/v1alpha2/handler.go b/pkg/kapis/tenant/v1alpha2/handler.go index 5460b78fb..7bd32eeec 100644 --- a/pkg/kapis/tenant/v1alpha2/handler.go +++ b/pkg/kapis/tenant/v1alpha2/handler.go @@ -19,6 +19,7 @@ package v1alpha2 import ( "encoding/json" "fmt" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "github.com/emicklei/go-restful" corev1 "k8s.io/api/core/v1" @@ -60,14 +61,14 @@ func NewTenantHandler(factory informers.InformerFactory, k8sclient kubernetes.In evtsClient events.Client, loggingClient logging.Client, auditingclient auditing.Client, am am.AccessManagementInterface, authorizer authorizer.Authorizer, monitoringclient monitoringclient.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, - meteringOptions *meteringclient.Options, stopCh <-chan struct{}) *tenantHandler { + meteringOptions *meteringclient.Options, cc clusterclient.ClusterClients, stopCh <-chan struct{}) *tenantHandler { if meteringOptions == nil || meteringOptions.RetentionDay == "" { meteringOptions = &meteringclient.DefaultMeteringOption } return &tenantHandler{ - tenant: tenant.New(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourceGetter, stopCh), + tenant: tenant.New(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourceGetter, cc, stopCh), meteringOptions: meteringOptions, } } diff --git a/pkg/kapis/tenant/v1alpha2/register.go b/pkg/kapis/tenant/v1alpha2/register.go index 58317cf86..85b75cd69 100644 --- a/pkg/kapis/tenant/v1alpha2/register.go +++ b/pkg/kapis/tenant/v1alpha2/register.go @@ -17,6 +17,7 @@ limitations under the License. package v1alpha2 import ( + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "net/http" "github.com/emicklei/go-restful" @@ -64,11 +65,11 @@ func Resource(resource string) schema.GroupResource { func AddToContainer(c *restful.Container, factory informers.InformerFactory, k8sclient kubernetes.Interface, ksclient kubesphere.Interface, evtsClient events.Client, loggingClient logging.Client, auditingclient auditing.Client, am am.AccessManagementInterface, authorizer authorizer.Authorizer, - monitoringclient monitoringclient.Interface, cache cache.Cache, meteringOptions *meteringclient.Options, stopCh <-chan struct{}) error { + monitoringclient monitoringclient.Interface, cache cache.Cache, meteringOptions *meteringclient.Options, cc clusterclient.ClusterClients, stopCh <-chan struct{}) error { mimePatch := []string{restful.MIME_JSON, runtime.MimeMergePatchJson, runtime.MimeJsonPatchJson} ws := runtime.NewWebService(GroupVersion) - handler := NewTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, stopCh) + handler := NewTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, cc, stopCh) ws.Route(ws.GET("/clusters"). To(handler.ListClusters). diff --git a/pkg/kapis/tenant/v1alpha3/handler.go b/pkg/kapis/tenant/v1alpha3/handler.go index 383c98268..70667d762 100644 --- a/pkg/kapis/tenant/v1alpha3/handler.go +++ b/pkg/kapis/tenant/v1alpha3/handler.go @@ -18,6 +18,7 @@ package v1alpha3 import ( "fmt" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "github.com/emicklei/go-restful" "k8s.io/apimachinery/pkg/api/errors" @@ -49,14 +50,14 @@ func newTenantHandler(factory informers.InformerFactory, k8sclient kubernetes.In evtsClient events.Client, loggingClient logging.Client, auditingclient auditing.Client, am am.AccessManagementInterface, authorizer authorizer.Authorizer, monitoringclient monitoringclient.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, - meteringOptions *meteringclient.Options, stopCh <-chan struct{}) *tenantHandler { + meteringOptions *meteringclient.Options, cc clusterclient.ClusterClients, stopCh <-chan struct{}) *tenantHandler { if meteringOptions == nil || meteringOptions.RetentionDay == "" { meteringOptions = &meteringclient.DefaultMeteringOption } return &tenantHandler{ - tenant: tenant.New(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourceGetter, stopCh), + tenant: tenant.New(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourceGetter, cc, stopCh), meteringOptions: meteringOptions, } } diff --git a/pkg/kapis/tenant/v1alpha3/register.go b/pkg/kapis/tenant/v1alpha3/register.go index ce2f7849e..7503be6c0 100644 --- a/pkg/kapis/tenant/v1alpha3/register.go +++ b/pkg/kapis/tenant/v1alpha3/register.go @@ -17,6 +17,7 @@ limitations under the License. package v1alpha3 import ( + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "net/http" "github.com/emicklei/go-restful" @@ -59,12 +60,13 @@ func Resource(resource string) schema.GroupResource { func AddToContainer(c *restful.Container, factory informers.InformerFactory, k8sclient kubernetes.Interface, ksclient kubesphere.Interface, evtsClient events.Client, loggingClient logging.Client, auditingclient auditing.Client, am am.AccessManagementInterface, authorizer authorizer.Authorizer, - monitoringclient monitoringclient.Interface, cache cache.Cache, meteringOptions *meteringclient.Options, stopCh <-chan struct{}) error { + monitoringclient monitoringclient.Interface, cache cache.Cache, meteringOptions *meteringclient.Options, + cc clusterclient.ClusterClients, stopCh <-chan struct{}) error { mimePatch := []string{restful.MIME_JSON, runtime.MimeMergePatchJson, runtime.MimeJsonPatchJson} ws := runtime.NewWebService(GroupVersion) - v1alpha2Handler := v1alpha2.NewTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, stopCh) - handler := newTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, stopCh) + v1alpha2Handler := v1alpha2.NewTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, cc, stopCh) + handler := newTenantHandler(factory, k8sclient, ksclient, evtsClient, loggingClient, auditingclient, am, authorizer, monitoringclient, resourcev1alpha3.NewResourceGetter(factory, cache), meteringOptions, cc, stopCh) ws.Route(ws.POST("/workspacetemplates"). To(v1alpha2Handler.CreateWorkspaceTemplate). diff --git a/pkg/models/openpitrix/interface.go b/pkg/models/openpitrix/interface.go index 516b82b0d..e72e44c7b 100644 --- a/pkg/models/openpitrix/interface.go +++ b/pkg/models/openpitrix/interface.go @@ -17,6 +17,7 @@ limitations under the License. package openpitrix import ( + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "sync" "k8s.io/client-go/tools/cache" @@ -54,7 +55,7 @@ func init() { cachedReposData = reposcache.NewReposCache() } -func NewOpenpitrixOperator(ksInformers ks_informers.InformerFactory, ksClient versioned.Interface, s3Client s3.Interface, stopCh <-chan struct{}) Interface { +func NewOpenpitrixOperator(ksInformers ks_informers.InformerFactory, ksClient versioned.Interface, s3Client s3.Interface, cc clusterclient.ClusterClients, stopCh <-chan struct{}) Interface { once.Do(func() { klog.Infof("start helm repo informer") helmReposInformer = ksInformers.KubeSphereSharedInformerFactory().Application().V1alpha1().HelmRepos().Informer() @@ -90,7 +91,7 @@ func NewOpenpitrixOperator(ksInformers ks_informers.InformerFactory, ksClient ve AttachmentInterface: newAttachmentOperator(s3Client), ApplicationInterface: newApplicationOperator(cachedReposData, ksInformers.KubeSphereSharedInformerFactory(), ksClient, s3Client), RepoInterface: newRepoOperator(cachedReposData, ksInformers.KubeSphereSharedInformerFactory(), ksClient), - ReleaseInterface: newReleaseOperator(cachedReposData, ksInformers.KubernetesSharedInformerFactory(), ksInformers.KubeSphereSharedInformerFactory(), ksClient), + ReleaseInterface: newReleaseOperator(cachedReposData, ksInformers.KubernetesSharedInformerFactory(), ksInformers.KubeSphereSharedInformerFactory(), ksClient, cc), CategoryInterface: newCategoryOperator(cachedReposData, ksInformers.KubeSphereSharedInformerFactory(), ksClient), } } diff --git a/pkg/models/openpitrix/release.go b/pkg/models/openpitrix/release.go index 99eb2c01c..1753b8af5 100644 --- a/pkg/models/openpitrix/release.go +++ b/pkg/models/openpitrix/release.go @@ -70,13 +70,13 @@ type releaseOperator struct { clusterClients clusterclient.ClusterClients } -func newReleaseOperator(cached reposcache.ReposCache, k8sFactory informers.SharedInformerFactory, ksFactory externalversions.SharedInformerFactory, ksClient versioned.Interface) ReleaseInterface { +func newReleaseOperator(cached reposcache.ReposCache, k8sFactory informers.SharedInformerFactory, ksFactory externalversions.SharedInformerFactory, ksClient versioned.Interface, cc clusterclient.ClusterClients) ReleaseInterface { c := &releaseOperator{ informers: k8sFactory, rlsClient: ksClient.ApplicationV1alpha1().HelmReleases(), rlsLister: ksFactory.Application().V1alpha1().HelmReleases().Lister(), cachedRepos: cached, - clusterClients: clusterclient.NewClusterClient(ksFactory.Cluster().V1alpha1().Clusters()), + clusterClients: cc, appVersionLister: ksFactory.Application().V1alpha1().HelmApplicationVersions().Lister(), } diff --git a/pkg/models/tenant/tenant.go b/pkg/models/tenant/tenant.go index 7d2c395c6..bd11e859e 100644 --- a/pkg/models/tenant/tenant.go +++ b/pkg/models/tenant/tenant.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" "io" + "kubesphere.io/kubesphere/pkg/utils/clusterclient" "strings" "time" @@ -114,10 +115,10 @@ type tenantOperator struct { opRelease openpitrix.ReleaseInterface } -func New(informers informers.InformerFactory, k8sclient kubernetes.Interface, ksclient kubesphere.Interface, evtsClient eventsclient.Client, loggingClient loggingclient.Client, auditingclient auditingclient.Client, am am.AccessManagementInterface, authorizer authorizer.Authorizer, monitoringclient monitoringclient.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, stopCh <-chan struct{}) Interface { +func New(informers informers.InformerFactory, k8sclient kubernetes.Interface, ksclient kubesphere.Interface, evtsClient eventsclient.Client, loggingClient loggingclient.Client, auditingclient auditingclient.Client, am am.AccessManagementInterface, authorizer authorizer.Authorizer, monitoringclient monitoringclient.Interface, resourceGetter *resourcev1alpha3.ResourceGetter, cc clusterclient.ClusterClients, stopCh <-chan struct{}) Interface { var openpitrixRelease openpitrix.ReleaseInterface if ksclient != nil { - openpitrixRelease = openpitrix.NewOpenpitrixOperator(informers, ksclient, nil, stopCh) + openpitrixRelease = openpitrix.NewOpenpitrixOperator(informers, ksclient, nil, cc, stopCh) } return &tenantOperator{ diff --git a/pkg/utils/clusterclient/clusterclient.go b/pkg/utils/clusterclient/clusterclient.go index e3f88c260..fdf7c874c 100644 --- a/pkg/utils/clusterclient/clusterclient.go +++ b/pkg/utils/clusterclient/clusterclient.go @@ -56,33 +56,26 @@ type ClusterClients interface { GetInnerCluster(string) *innerCluster } -var ( - once sync.Once - c *clusterClients -) - func NewClusterClient(clusterInformer clusterinformer.ClusterInformer) ClusterClients { - once.Do(func() { - c = &clusterClients{ - innerClusters: make(map[string]*innerCluster), - clusterLister: clusterInformer.Lister(), - } + c := &clusterClients{ + innerClusters: make(map[string]*innerCluster), + clusterLister: clusterInformer.Lister(), + } - clusterInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ - AddFunc: func(obj interface{}) { - c.addCluster(obj) - }, - UpdateFunc: func(oldObj, newObj interface{}) { - oldCluster := oldObj.(*clusterv1alpha1.Cluster) - newCluster := newObj.(*clusterv1alpha1.Cluster) - if !reflect.DeepEqual(oldCluster.Spec, newCluster.Spec) { - c.addCluster(newObj) - } - }, - DeleteFunc: func(obj interface{}) { - c.removeCluster(obj) - }, - }) + clusterInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + c.addCluster(obj) + }, + UpdateFunc: func(oldObj, newObj interface{}) { + oldCluster := oldObj.(*clusterv1alpha1.Cluster) + newCluster := newObj.(*clusterv1alpha1.Cluster) + if !reflect.DeepEqual(oldCluster.Spec, newCluster.Spec) { + c.addCluster(newObj) + } + }, + DeleteFunc: func(obj interface{}) { + c.removeCluster(obj) + }, }) return c } diff --git a/tools/cmd/doc-gen/main.go b/tools/cmd/doc-gen/main.go index c1d78e186..eef53d1c6 100644 --- a/tools/cmd/doc-gen/main.go +++ b/tools/cmd/doc-gen/main.go @@ -121,14 +121,14 @@ func generateSwaggerJson() []byte { informerFactory.KubeSphereSharedInformerFactory(), "", "", "")) urlruntime.Must(kapisdevops.AddToContainer(container, "")) urlruntime.Must(iamv1alpha2.AddToContainer(container, nil, nil, group.New(informerFactory, clientsets.KubeSphere(), clientsets.Kubernetes()), nil)) - urlruntime.Must(monitoringv1alpha3.AddToContainer(container, clientsets.Kubernetes(), nil, nil, informerFactory, nil, nil, nil, nil)) - urlruntime.Must(openpitrixv1.AddToContainer(container, informerFactory, fake.NewSimpleClientset(), nil, nil)) + urlruntime.Must(monitoringv1alpha3.AddToContainer(container, clientsets.Kubernetes(), nil, nil, informerFactory, nil, nil, nil, nil, nil)) + urlruntime.Must(openpitrixv1.AddToContainer(container, informerFactory, fake.NewSimpleClientset(), nil, nil, nil)) urlruntime.Must(openpitrixv2.AddToContainer(container, informerFactory, fake.NewSimpleClientset(), nil)) urlruntime.Must(operationsv1alpha2.AddToContainer(container, clientsets.Kubernetes())) urlruntime.Must(resourcesv1alpha2.AddToContainer(container, clientsets.Kubernetes(), informerFactory, "")) urlruntime.Must(resourcesv1alpha3.AddToContainer(container, informerFactory, nil)) - urlruntime.Must(tenantv1alpha2.AddToContainer(container, informerFactory, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)) - urlruntime.Must(tenantv1alpha3.AddToContainer(container, informerFactory, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)) + urlruntime.Must(tenantv1alpha2.AddToContainer(container, informerFactory, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)) + urlruntime.Must(tenantv1alpha3.AddToContainer(container, informerFactory, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)) urlruntime.Must(terminalv1alpha2.AddToContainer(container, clientsets.Kubernetes(), nil, nil, nil)) urlruntime.Must(metricsv1alpha2.AddToContainer(nil, container, clientsets.Kubernetes(), nil)) urlruntime.Must(networkv1alpha2.AddToContainer(container, ""))