Files
devstar-create-from-template/modules/k8s/controller/manager.go
2025-08-25 15:46:12 +08:00

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)
}