first-commit
This commit is contained in:
113
modules/k8s/controller/manager.go
Normal file
113
modules/k8s/controller/manager.go
Normal file
@@ -0,0 +1,113 @@
|
||||
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)
|
||||
}
|
Reference in New Issue
Block a user