feat: K8s→Kubernetes命名统一 + 工具安装bug修复 + 资源可视化编辑器

1. 工具安装bug修复 (P0 critical):
   - 根因: ToolConfigHandler.InstallTool的goroutine只打了日志,
     从未调用实际安装逻辑
   - 修复: 注入ToolInstaller到handler, 新增ForceInstall方法绕过sync.Once
   - 影响: 流水线工具配置页「安装」按钮现在能真正触发下载安装

2. K8s→Kubernetes命名统一:
   - Dashboard/Prometheus/AIOpsAssistant等8个文件12处用户可见文案
   - 内部变量名/文件名/API group保持不变

3. 资源可视化编辑器 (新增ResourceVisualEditor.tsx):
   - ConfigMap: 键值对表格编辑器(增删改)
   - Secret: 键值对编辑器(自动Base64编解码)
   - Service: 端口/类型/选择器可视化配置
   - Ingress: Host/Path路由规则可视化编辑
   - PVC: 存储大小/访问模式/StorageClass配置
   - 双模式: 可视化编辑 ↔ YAML编辑一键切换
   - NamespaceResourcePage: 所有资源类型添加编辑按钮入口
This commit is contained in:
attacker committed 2026-06-25 01:32:10 +08:00
1 parent e29dfb5868
commit aaab923f4e
14 files changed
+748 -20

No files matched your search

+14 -3
View File
@@ -6,6 +6,7 @@ import (
"os/exec"
"ezops/internal/models"
"ezops/pkg/toolinstaller"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
@@ -15,12 +16,13 @@ import (
// ToolConfigHandler handles deploy tool configuration
type ToolConfigHandler struct {
db *gorm.DB
db *gorm.DB
installer *toolinstaller.ToolInstaller
}
// NewToolConfigHandler creates handler
func NewToolConfigHandler(db *gorm.DB) *ToolConfigHandler {
return &ToolConfigHandler{db: db}
func NewToolConfigHandler(db *gorm.DB, ti *toolinstaller.ToolInstaller) *ToolConfigHandler {
return &ToolConfigHandler{db: db, installer: ti}
}
// ListTools returns all configured tools
@@ -127,8 +129,17 @@ func (h *ToolConfigHandler) InstallTool(c *gin.Context) {
tool.DefaultVersion = version
}
// Mark as installing immediately
h.db.Model(&tool).Update("status", models.ToolInstalling)
// Background installation — actually call the installer
go func() {
log.Printf("[ToolConfig] Background install triggered for %s (version: %s)", tool.Name, version)
if err := h.installer.ForceInstall(tool.Name, version); err != nil {
log.Printf("[ToolConfig] ERROR installing %s: %v", tool.Name, err)
} else {
log.Printf("[ToolConfig] %s installed successfully", tool.Name)
}
}()
c.JSON(http.StatusOK, models.Response{Code: 200, Message: "安装已触发", Data: gin.H{"version": version}})
+1 -1
View File
@@ -558,7 +558,7 @@ func Register(r *gin.Engine, db *gorm.DB, log *zap.Logger, cfg *config.Config, c
}
// 工具配置路由(发布配置 Tab ④)// Logan.Li
toolConfigHandler := handlers.NewToolConfigHandler(db)
toolConfigHandler := handlers.NewToolConfigHandler(db, ti)
tools := authorized.Group("/deploy/tools")
{
tools.GET("", toolConfigHandler.ListTools)
+18
View File
@@ -45,6 +45,24 @@ func (ti *ToolInstaller) ensureOnce(name string) *sync.Once {
return o
}
// ForceInstall unconditionally installs a tool (bypasses sync.Once).
// Used by the manual "安装" button in the tool config UI.
// The version parameter overrides DefaultVersion if non-empty.
func (ti *ToolInstaller) ForceInstall(toolName string, version string) error {
var tool models.DeployTool
if err := ti.db.Where("name = ?", toolName).First(&tool).Error; err != nil {
return fmt.Errorf("tool %s not found in DB: %w", toolName, err)
}
// Override version if specified
if version != "" && version != tool.DefaultVersion {
ti.db.Model(&tool).Update("default_version", version)
tool.DefaultVersion = version
}
return ti.installTool(&tool)
}
// EnsureAvailable checks if a tool is available and installs it if configured for lazy loading.
// Returns nil if the tool is ready, or an error if installation failed.
func (ti *ToolInstaller) EnsureAvailable(toolName string) error {