From 266a475a19535ec1e742d45e0b35e1a7c71068ec Mon Sep 17 00:00:00 2001 From: caoyingjunz Date: Mon, 10 Jun 2024 22:21:29 +0800 Subject: [PATCH] Optimise plan config APIs (#419) --- api/server/router/plan/config_routes.go | 4 +- api/server/router/plan/plan.go | 3 +- pkg/controller/plan/deploy.go | 4 +- pkg/controller/plan/plan.go | 4 +- pkg/controller/plan/plan_config.go | 61 +++++++++++++++++-------- 5 files changed, 49 insertions(+), 27 deletions(-) diff --git a/api/server/router/plan/config_routes.go b/api/server/router/plan/config_routes.go index 9465bb73..242c9e88 100644 --- a/api/server/router/plan/config_routes.go +++ b/api/server/router/plan/config_routes.go @@ -92,14 +92,14 @@ func (t *planRouter) getPlanConfig(c *gin.Context) { r := httputils.NewResponse() var ( - opt planConfigMeta + opt planMeta err error ) if err = httputils.ShouldBindAny(c, nil, &opt, nil); err != nil { httputils.SetFailed(c, r, err) return } - if r.Result, err = t.c.Plan().GetConfig(c, opt.PlanId, opt.ConfigId); err != nil { + if r.Result, err = t.c.Plan().GetConfig(c, opt.PlanId); err != nil { httputils.SetFailed(c, r, err) return } diff --git a/api/server/router/plan/plan.go b/api/server/router/plan/plan.go index 071583de..80ba2806 100644 --- a/api/server/router/plan/plan.go +++ b/api/server/router/plan/plan.go @@ -59,12 +59,11 @@ func (t *planRouter) initRoutes(ginEngine *gin.Engine) { planRoute.POST("/:planId/configs", t.createPlanConfig) planRoute.PUT("/:planId/configs/:configId", t.updatePlanConfig) planRoute.DELETE("/:planId/configs/:configId", t.deletePlanConfig) - planRoute.GET("/:planId/configs/:configId", t.getPlanConfig) + planRoute.GET("/:planId/configs", t.getPlanConfig) // 执行指定任务 planRoute.POST("/:planId/tasks/:taskId", t.runTasks) // 查询任务列表 planRoute.POST("/:planId/tasks", t.listTasks) - } } diff --git a/pkg/controller/plan/deploy.go b/pkg/controller/plan/deploy.go index ad41c69a..0de52f17 100644 --- a/pkg/controller/plan/deploy.go +++ b/pkg/controller/plan/deploy.go @@ -20,6 +20,7 @@ import ( "context" "time" + "github.com/caoyingjunz/pixiu/pkg/db/model" "github.com/caoyingjunz/pixiu/pkg/util/container" ) @@ -63,7 +64,8 @@ type DeployChart struct { handlerTask } -func (b DeployChart) Name() string { return "部署基础组件" } +func (b DeployChart) Name() string { return "部署基础组件" } +func (b DeployChart) Step() model.PlanStep { return model.CompletedPlanStep } // Run 以容器的形式执行 BootStrap 任务,如果存在旧的容器,则先删除在执行 func (b DeployChart) Run() error { diff --git a/pkg/controller/plan/plan.go b/pkg/controller/plan/plan.go index 56c4568d..503dc246 100644 --- a/pkg/controller/plan/plan.go +++ b/pkg/controller/plan/plan.go @@ -51,10 +51,10 @@ type Interface interface { GetNode(ctx context.Context, pid int64, nodeId int64) (*types.PlanNode, error) ListNodes(ctx context.Context, pid int64) ([]types.PlanNode, error) - CreateConfig(ctx context.Context, pid int64, req *types.CreatePlanConfigRequest) error + CreateConfig(ctx context.Context, planId int64, req *types.CreatePlanConfigRequest) error UpdateConfig(ctx context.Context, pid int64, cfgId int64, req *types.UpdatePlanConfigRequest) error DeleteConfig(ctx context.Context, pid int64, cfgId int64) error - GetConfig(ctx context.Context, pid int64, cfgId int64) (*types.PlanConfig, error) + GetConfig(ctx context.Context, planId int64) (*types.PlanConfig, error) // Run 启动 worker 处理协程 Run(ctx context.Context, workers int) error diff --git a/pkg/controller/plan/plan_config.go b/pkg/controller/plan/plan_config.go index 09dc919a..08376c8a 100644 --- a/pkg/controller/plan/plan_config.go +++ b/pkg/controller/plan/plan_config.go @@ -18,6 +18,7 @@ package plan import ( "context" + "fmt" "k8s.io/klog/v2" @@ -26,29 +27,28 @@ import ( "github.com/caoyingjunz/pixiu/pkg/types" ) -func (p *plan) CreateConfig(ctx context.Context, pid int64, req *types.CreatePlanConfigRequest) error { - ks, err := req.Kubernetes.Marshal() - if err != nil { - return err +func (p *plan) preCreateConfig(ctx context.Context, planId int64, req *types.CreatePlanConfigRequest) error { + _, err := p.factory.Plan().GetConfigByPlan(ctx, planId) + if err == nil { + return fmt.Errorf("plan(%d) 配置已存在", planId) } - ns, err := req.Network.Marshal() - if err != nil { + + return nil +} + +func (p *plan) CreateConfig(ctx context.Context, pid int64, req *types.CreatePlanConfigRequest) error { + // 创建前检查 + if err := p.preCreateConfig(ctx, pid, req); err != nil { return err } - rs, err := req.Runtime.Marshal() + + planConfig, err := p.buildPlanConfig(ctx, req) if err != nil { return err } - - if _, err = p.factory.Plan().CreatConfig(ctx, &model.Config{ - Name: req.Name, - PlanId: pid, - Region: req.Region, - Kubernetes: ks, - Network: ns, - Runtime: rs, - Description: req.Description, - }); err != nil { + planConfig.PlanId = pid + // 创建配置 + if _, err = p.factory.Plan().CreatConfig(ctx, planConfig); err != nil { klog.Errorf("failed to create plan(%s) config(%d): %v", req.Name, pid, err) return err } @@ -71,16 +71,37 @@ func (p *plan) DeleteConfig(ctx context.Context, pid int64, cfgId int64) error { return nil } -func (p *plan) GetConfig(ctx context.Context, pid int64, cfgId int64) (*types.PlanConfig, error) { - object, err := p.factory.Plan().GetConfig(ctx, cfgId) +func (p *plan) GetConfig(ctx context.Context, pid int64) (*types.PlanConfig, error) { + object, err := p.factory.Plan().GetConfigByPlan(ctx, pid) if err != nil { - klog.Errorf("failed to get plan(%d) config(%d): %v", pid, cfgId, err) + klog.Errorf("failed to get plan(%d) config: %v", pid, err) return nil, errors.ErrServerInternal } return p.modelConfig2Type(object) } +func (p *plan) buildPlanConfig(ctx context.Context, req *types.CreatePlanConfigRequest) (*model.Config, error) { + kubeConfig, err := req.Kubernetes.Marshal() + if err != nil { + return nil, err + } + networkConfig, err := req.Network.Marshal() + if err != nil { + return nil, err + } + runtimeConfig, err := req.Runtime.Marshal() + if err != nil { + return nil, err + } + + return &model.Config{ + Kubernetes: kubeConfig, + Network: networkConfig, + Runtime: runtimeConfig, + }, nil +} + func (p *plan) modelConfig2Type(o *model.Config) (*types.PlanConfig, error) { ks := &types.KubernetesSpec{} if err := ks.Unmarshal(o.Kubernetes); err != nil {