114 lines
2.9 KiB
Go
114 lines
2.9 KiB
Go
package controller
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
|
|
applicationv1 "code.gitea.io/gitea/modules/k8s/api/application/v1" // 新增
|
|
devcontainerv1 "code.gitea.io/gitea/modules/k8s/api/devcontainer/v1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
|
|
"k8s.io/apimachinery/pkg/util/sets"
|
|
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
|
"k8s.io/klog/v2"
|
|
"sigs.k8s.io/controller-runtime/pkg/healthz"
|
|
"sigs.k8s.io/controller-runtime/pkg/manager"
|
|
|
|
// 添加Istio网络资源类型导入
|
|
istionetworkingv1 "istio.io/client-go/pkg/apis/networking/v1"
|
|
)
|
|
|
|
var (
|
|
// Scheme 是所有 API 类型的 scheme
|
|
Scheme = runtime.NewScheme()
|
|
|
|
// 控制器注册表
|
|
Controllers = map[string]Controller{}
|
|
controllerLock sync.Mutex
|
|
controllerSet = sets.NewString()
|
|
)
|
|
|
|
func init() {
|
|
utilruntime.Must(clientgoscheme.AddToScheme(Scheme))
|
|
// 注册 devcontainer API
|
|
utilruntime.Must(devcontainerv1.AddToScheme(Scheme))
|
|
// 注册 application API
|
|
utilruntime.Must(applicationv1.AddToScheme(Scheme))
|
|
// 注册 Istio 网络资源类型
|
|
utilruntime.Must(istionetworkingv1.AddToScheme(Scheme))
|
|
}
|
|
|
|
// Controller 是控制器接口
|
|
type Controller interface {
|
|
// Name 返回控制器名称
|
|
Name() string
|
|
// Init 初始化控制器
|
|
Init(mgr manager.Manager) error
|
|
}
|
|
|
|
// Manager 是控制器管理器
|
|
type Manager struct {
|
|
Manager manager.Manager
|
|
IsControllerEnabled func(name string) bool
|
|
}
|
|
|
|
// Start 启动控制器管理器
|
|
func (m *Manager) Start(ctx context.Context) error {
|
|
klog.InfoS("Starting DevStar controller manager")
|
|
|
|
// 添加健康检查
|
|
if err := m.Manager.AddHealthzCheck("health", healthz.Ping); err != nil {
|
|
return fmt.Errorf("unable to set up health check: %w", err)
|
|
}
|
|
|
|
if err := m.Manager.AddReadyzCheck("ready", healthz.Ping); err != nil {
|
|
return fmt.Errorf("unable to set up ready check: %w", err)
|
|
}
|
|
|
|
// 初始化所有启用的控制器
|
|
controllerLock.Lock()
|
|
defer controllerLock.Unlock()
|
|
|
|
for name, c := range Controllers {
|
|
if !m.IsControllerEnabled(name) {
|
|
klog.InfoS("Controller disabled", "name", name)
|
|
continue
|
|
}
|
|
|
|
klog.InfoS("Initializing controller", "name", name)
|
|
if err := c.Init(m.Manager); err != nil {
|
|
return fmt.Errorf("error initializing controller %q: %w", name, err)
|
|
}
|
|
}
|
|
|
|
// 启动管理器
|
|
klog.InfoS("Starting controllers")
|
|
return m.Manager.Start(ctx)
|
|
}
|
|
|
|
// Register 注册一个控制器到控制器管理器
|
|
func Register(c Controller) error {
|
|
controllerLock.Lock()
|
|
defer controllerLock.Unlock()
|
|
|
|
name := c.Name()
|
|
if _, found := Controllers[name]; found {
|
|
return fmt.Errorf("controller %q was registered twice", name)
|
|
}
|
|
|
|
Controllers[name] = c
|
|
controllerSet.Insert(name)
|
|
klog.InfoS("Registered controller", "name", name)
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetAllControllers 返回所有已注册控制器的名称
|
|
func GetAllControllers() sets.String {
|
|
controllerLock.Lock()
|
|
defer controllerLock.Unlock()
|
|
|
|
return controllerSet.Union(nil)
|
|
}
|