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