100 lines
2.4 KiB
Go
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
|
|
}
|