Files
kubesphere/pkg/controller/manager.go
2025-04-30 15:53:51 +08:00

100 lines
2.4 KiB
Go

/*
* Copyright 2024 the KubeSphere Authors.
* Please refer to the LICENSE file in the root directory of the project.
* https://github.com/kubesphere/kubesphere/blob/master/LICENSE
*/
package controller
import (
"context"
"fmt"
"sort"
"github.com/Masterminds/semver/v3"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/manager"
"kubesphere.io/kubesphere/pkg/controller/options"
"kubesphere.io/kubesphere/pkg/simple/client/k8s"
"kubesphere.io/kubesphere/pkg/utils/clusterclient"
)
const (
SyncFailed = "SyncFailed"
Synced = "Synced"
MessageResourceSynced = "Synced successfully"
)
type Controller interface {
Name() string
SetupWithManager(mgr *Manager) error
}
type Hideable interface {
Hidden() bool
}
type ClusterSelector interface {
Enabled(clusterRole string) bool
}
type Manager struct {
options.Options
manager.Manager
K8sClient k8s.Client
IsControllerEnabled
ClusterClient clusterclient.Interface
K8sVersion *semver.Version
}
type IsControllerEnabled func(controllerName string) bool
func (mgr *Manager) Run(ctx context.Context, registry Registry) error {
for name, ctr := range registry {
if mgr.IsControllerEnabled(name) {
if clusterSelector, ok := ctr.(ClusterSelector); ok &&
!clusterSelector.Enabled(mgr.MultiClusterOptions.ClusterRole) {
klog.Infof("%s controller is enabled but is not going to run due to its dependent component being disabled.", name)
continue
}
if err := ctr.SetupWithManager(mgr); err != nil {
return fmt.Errorf("unable to setup %s controller: %v", name, err)
} else {
klog.Infof("%s controller is enabled and added successfully.", name)
}
} else {
klog.Infof("%s controller is disabled by controller selectors.", name)
}
}
klog.V(0).Info("Starting the controllers.")
if err := mgr.Manager.Start(ctx); err != nil {
return fmt.Errorf("unable to start the controller manager: %v", err)
}
return nil
}
func Register(controller Controller) error {
if _, exist := Controllers[controller.Name()]; exist {
return fmt.Errorf("controller %s already exists", controller.Name())
}
Controllers[controller.Name()] = controller
return nil
}
var Controllers = make(Registry)
type Registry map[string]Controller
func (r Registry) Keys() []string {
var keys []string
for k, v := range r {
if hidden, ok := v.(Hideable); ok && hidden.Hidden() {
continue
}
keys = append(keys, k)
}
sort.Strings(keys)
return keys
}