From e104b5158af3e16b15a99bbb390a24967b4d700d Mon Sep 17 00:00:00 2001 From: zhangwei <894646498@qq.com> Date: Tue, 16 May 2023 09:36:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=BB=E5=8A=A1=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=B7=BB=E5=8A=A0json=E5=BD=A2=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Former-commit-id: 8398798a0d1d2ea803d15fe3a85f01935f89aed8 --- adaptor/PCM-CORE/api/desc/core/pcm-core.api | 21 +++++- adaptor/PCM-CORE/api/desc/pcm.api | 3 + .../handler/core/scheduletaskbyyamlhandler.go | 36 ++++++++++ .../handler/core/scheduletaskhandler.go | 20 ++---- .../PCM-CORE/api/internal/handler/routes.go | 5 ++ .../logic/core/scheduletaskbyyamllogic.go | 69 +++++++++++++++++++ adaptor/PCM-CORE/api/internal/types/types.go | 24 +++++-- 7 files changed, 156 insertions(+), 22 deletions(-) create mode 100644 adaptor/PCM-CORE/api/internal/handler/core/scheduletaskbyyamlhandler.go create mode 100644 adaptor/PCM-CORE/api/internal/logic/core/scheduletaskbyyamllogic.go diff --git a/adaptor/PCM-CORE/api/desc/core/pcm-core.api b/adaptor/PCM-CORE/api/desc/core/pcm-core.api index 9cd90058..2d212f59 100644 --- a/adaptor/PCM-CORE/api/desc/core/pcm-core.api +++ b/adaptor/PCM-CORE/api/desc/core/pcm-core.api @@ -171,21 +171,36 @@ type ( ) type ( - scheduleTaskReq { + scheduleTaskByYamlReq { Name string `yaml:"name"` synergy string `yaml:"synergy"` Description string `yaml:"description"` strategy string `yaml:"strategy"` - tasks []TaskInfo `yaml:"tasks"` + tasks []TaskYaml `yaml:"tasks"` } - TaskInfo { + TaskYaml { TaskId int64 `yaml:"taskId"` serviceName string `yaml:"serviceName"` metadata interface{} `yaml:"metadata"` } ) +type ( + scheduleTaskReq { + Name string `json:"name"` + synergy string `json:"synergy"` + Description string `json:"description"` + strategy string `json:"strategy"` + tasks []TaskInfo `json:"tasks"` + } + TaskInfo { + TaskId int64 `json:"taskId,optional"` + serviceName string `json:"serviceName"` + metadata interface{} `json:"metadata"` + } +) + type ( taskListResp { TotalCount int `json:"totalCount"` diff --git a/adaptor/PCM-CORE/api/desc/pcm.api b/adaptor/PCM-CORE/api/desc/pcm.api index 87e26394..80e4288d 100644 --- a/adaptor/PCM-CORE/api/desc/pcm.api +++ b/adaptor/PCM-CORE/api/desc/pcm.api @@ -21,6 +21,9 @@ info( group : core ) service pcm { + @handler scheduleTaskByYamlHandler + post /core/scheduleTaskByYaml (scheduleTaskByYamlReq) returns () + @handler scheduleTaskHandler post /core/scheduleTask (scheduleTaskReq) returns () diff --git a/adaptor/PCM-CORE/api/internal/handler/core/scheduletaskbyyamlhandler.go b/adaptor/PCM-CORE/api/internal/handler/core/scheduletaskbyyamlhandler.go new file mode 100644 index 00000000..711b2473 --- /dev/null +++ b/adaptor/PCM-CORE/api/internal/handler/core/scheduletaskbyyamlhandler.go @@ -0,0 +1,36 @@ +package core + +import ( + "PCM/common/result" + "PCM/common/tool" + "net/http" + + "PCM/adaptor/PCM-CORE/api/internal/logic/core" + "PCM/adaptor/PCM-CORE/api/internal/svc" + "PCM/adaptor/PCM-CORE/api/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" +) + +func ScheduleTaskByYamlHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.ScheduleTaskByYamlReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + // 解析yaml文件 + _, fileHeader, err := r.FormFile("file") + if err != nil { + result.HttpResult(r, w, nil, err) + return + } + err = tool.Yaml2struct(fileHeader, &req) + if err != nil { + result.HttpResult(r, w, nil, err) + return + } + l := core.NewScheduleTaskByYamlLogic(r.Context(), svcCtx) + err = l.ScheduleTaskByYaml(&req) + result.HttpResult(r, w, nil, err) + } +} diff --git a/adaptor/PCM-CORE/api/internal/handler/core/scheduletaskhandler.go b/adaptor/PCM-CORE/api/internal/handler/core/scheduletaskhandler.go index 04fb4954..2c075b8d 100644 --- a/adaptor/PCM-CORE/api/internal/handler/core/scheduletaskhandler.go +++ b/adaptor/PCM-CORE/api/internal/handler/core/scheduletaskhandler.go @@ -2,33 +2,25 @@ package core import ( "PCM/common/result" - "PCM/common/tool" + "github.com/zeromicro/go-zero/rest/httpx" + "io/ioutil" + "k8s.io/apimachinery/pkg/util/json" "net/http" "PCM/adaptor/PCM-CORE/api/internal/logic/core" "PCM/adaptor/PCM-CORE/api/internal/svc" "PCM/adaptor/PCM-CORE/api/internal/types" - "github.com/zeromicro/go-zero/rest/httpx" ) func ScheduleTaskHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req types.ScheduleTaskReq - if err := httpx.Parse(r, &req); err != nil { + bytes, err := ioutil.ReadAll(r.Body) + if err != nil { httpx.ErrorCtx(r.Context(), w, err) return } - // 解析yaml文件 - _, fileHeader, err := r.FormFile("file") - if err != nil { - result.HttpResult(r, w, nil, err) - return - } - err = tool.Yaml2struct(fileHeader, &req) - if err != nil { - result.HttpResult(r, w, nil, err) - return - } + json.Unmarshal(bytes, &req) l := core.NewScheduleTaskLogic(r.Context(), svcCtx) err = l.ScheduleTask(&req) result.HttpResult(r, w, nil, err) diff --git a/adaptor/PCM-CORE/api/internal/handler/routes.go b/adaptor/PCM-CORE/api/internal/handler/routes.go index 3e8de6a7..5c9bc8ef 100644 --- a/adaptor/PCM-CORE/api/internal/handler/routes.go +++ b/adaptor/PCM-CORE/api/internal/handler/routes.go @@ -17,6 +17,11 @@ import ( func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( []rest.Route{ + { + Method: http.MethodPost, + Path: "/core/scheduleTaskByYaml", + Handler: core.ScheduleTaskByYamlHandler(serverCtx), + }, { Method: http.MethodPost, Path: "/core/scheduleTask", diff --git a/adaptor/PCM-CORE/api/internal/logic/core/scheduletaskbyyamllogic.go b/adaptor/PCM-CORE/api/internal/logic/core/scheduletaskbyyamllogic.go new file mode 100644 index 00000000..1ea6e02c --- /dev/null +++ b/adaptor/PCM-CORE/api/internal/logic/core/scheduletaskbyyamllogic.go @@ -0,0 +1,69 @@ +package core + +import ( + "PCM/adaptor/PCM-CORE/model" + "context" + "k8s.io/apimachinery/pkg/util/json" + "time" + + "PCM/adaptor/PCM-CORE/api/internal/svc" + "PCM/adaptor/PCM-CORE/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type ScheduleTaskByYamlLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewScheduleTaskByYamlLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ScheduleTaskByYamlLogic { + return &ScheduleTaskByYamlLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *ScheduleTaskByYamlLogic) ScheduleTaskByYaml(req *types.ScheduleTaskByYamlReq) error { + + bytes, err := json.Marshal(req) + if err != nil { + return err + } + // construct task info + taskModel := model.Task{ + Status: "Saved", + Description: req.Description, + Name: req.Name, + YamlString: string(bytes), + StartTime: time.Now(), + CreatedTime: time.Now(), + UpdatedTime: time.Now(), + } + // save the task in mysql and return id + tx := l.svcCtx.DbEngin.Create(&taskModel) + if tx.Error != nil { + return tx.Error + } + + // push message into topic + for _, task := range req.Tasks { + task.TaskId = taskModel.Id + reqMessage, err := json.Marshal(task) + if err != nil { + logx.Error(err) + return err + } + switch task.ServiceName { + case "kubeNative": + l.svcCtx.ScheduleCloudClient.Push(string(reqMessage)) + case "ac", "th": + l.svcCtx.ScheduleHpcClient.Push(string(reqMessage)) + case "modelArts": + l.svcCtx.ScheduleAiClient.Push(string(reqMessage)) + } + } + return nil +} diff --git a/adaptor/PCM-CORE/api/internal/types/types.go b/adaptor/PCM-CORE/api/internal/types/types.go index 7a670817..ca97a648 100644 --- a/adaptor/PCM-CORE/api/internal/types/types.go +++ b/adaptor/PCM-CORE/api/internal/types/types.go @@ -152,20 +152,34 @@ type Region struct { RunningJobs int64 `json:"runningJobs"` } -type ScheduleTaskReq struct { +type ScheduleTaskByYamlReq struct { Name string `yaml:"name"` Synergy string `yaml:"synergy"` Description string `yaml:"description"` Strategy string `yaml:"strategy"` - Tasks []TaskInfo `yaml:"tasks"` + Tasks []TaskYaml `yaml:"tasks"` } -type TaskInfo struct { +type TaskYaml struct { TaskId int64 `yaml:"taskId"` ServiceName string `yaml:"serviceName"` Metadata interface{} `yaml:"metadata"` } +type ScheduleTaskReq struct { + Name string `json:"name"` + Synergy string `json:"synergy"` + Description string `json:"description"` + Strategy string `json:"strategy"` + Tasks []TaskInfo `json:"tasks"` +} + +type TaskInfo struct { + TaskId int64 `json:"taskId,optional"` + ServiceName string `json:"serviceName"` + Metadata interface{} `json:"metadata"` +} + type TaskListResp struct { TotalCount int `json:"totalCount"` CardTime float32 `json:"cardTime"` @@ -1570,8 +1584,8 @@ type NotebookResp struct { Volume VolumeRes `json:"volume,omitempty" copier:"Volume"` WorkspaceId string `json:"workspace_id,omitempty" copier:"WorkspaceId"` Feature string `json:"feature,omitempty" copier:"Feature"` - CreateAt int64 `json:"create_at,omitempty" copier:"CreateAt"` // * - Hooks Hooks `json:"hooks,omitempty" copier:"Hooks"` + CreateAt int64 `json:"create_at,omitempty" copier:"CreateAt"` // * + Hooks Hooks `json:"hooks,omitempty" copier:"Hooks"` // * Tags []string `json:"tags,omitempty" copier:"Tags"` // * UpdateAt int64 `json:"update_at,omitempty" copier:"UpdateAt"` // * UserNotebookResp UserNotebookResp `json:"user,omitempty" copier:"UserNotebookResp"` // *