From 13551239ff445beb140c538cccab1a6b59eef1eb Mon Sep 17 00:00:00 2001 From: devad Date: Tue, 2 Jan 2024 20:03:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A0=E9=99=A4app?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: devad Former-commit-id: f40f21e1420a89cd879d196ed8add71525e954e1 --- api/desc/core/pcm-core.api | 13 ++++ api/desc/pcm.api | 20 +++++ .../handler/apps/deleteappbyappnamehandler.go | 28 +++++++ .../handler/apps/pauseappbyappnamehandler.go | 28 +++++++ .../apps/restartappbyappnamehandler.go | 28 +++++++ .../handler/apps/startappbyappnamehandler.go | 28 +++++++ .../handler/apps/updateappbyappnamehandler.go | 28 +++++++ api/internal/handler/routes.go | 25 ++++++ .../logic/apps/deleteappbyappnamelogic.go | 78 +++++++++++++++++++ .../logic/apps/pauseappbyappnamelogic.go | 30 +++++++ .../logic/apps/restartappbyappnamelogic.go | 30 +++++++ .../logic/apps/startappbyappnamelogic.go | 30 +++++++ .../logic/apps/updateappbyappnamelogic.go | 30 +++++++ api/internal/types/types.go | 11 +++ pkg/utils/convert.go | 15 ++++ 15 files changed, 422 insertions(+) create mode 100644 api/internal/handler/apps/deleteappbyappnamehandler.go create mode 100644 api/internal/handler/apps/pauseappbyappnamehandler.go create mode 100644 api/internal/handler/apps/restartappbyappnamehandler.go create mode 100644 api/internal/handler/apps/startappbyappnamehandler.go create mode 100644 api/internal/handler/apps/updateappbyappnamehandler.go create mode 100644 api/internal/logic/apps/deleteappbyappnamelogic.go create mode 100644 api/internal/logic/apps/pauseappbyappnamelogic.go create mode 100644 api/internal/logic/apps/restartappbyappnamelogic.go create mode 100644 api/internal/logic/apps/startappbyappnamelogic.go create mode 100644 api/internal/logic/apps/updateappbyappnamelogic.go diff --git a/api/desc/core/pcm-core.api b/api/desc/core/pcm-core.api index b1dcdaea..5eb13b9d 100644 --- a/api/desc/core/pcm-core.api +++ b/api/desc/core/pcm-core.api @@ -649,3 +649,16 @@ type ( data interface{} `json:"data"` } ) + +type ( + DeleteAppReq { + Name string `form:"name"` + NsID string `form:"nsID"` + } + + DeleteAppResp { + Code int `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + Data interface{} `json:"data,omitempty"` + } +) \ No newline at end of file diff --git a/api/desc/pcm.api b/api/desc/pcm.api index f20836a0..6e786ba3 100644 --- a/api/desc/pcm.api +++ b/api/desc/pcm.api @@ -546,4 +546,24 @@ service pcm { @doc "获取应用详情" @handler GetAppByAppName get /apps/getAppByAppName/:appName (AppDetailReq) returns (AppTaskResp) + + @doc "删除应用" + @handler DeleteAppByAppName + get /apps/deleteApp (DeleteAppReq) returns (DeleteAppResp) + + @doc "更新应用" + @handler UpdateAppByAppName + get /apps/updateApp (DeleteAppReq) returns (AppTaskResp) + + @doc "重启应用" + @handler RestartAppByAppName + get /apps/restartApp (DeleteAppReq) returns (AppTaskResp) + + @doc "暂停应用" + @handler PauseAppByAppName + get /apps/pauseApp (DeleteAppReq) returns (AppTaskResp) + + @doc "启动应用" + @handler StartAppByAppName + get /apps/startApp (DeleteAppReq) returns (AppTaskResp) } \ No newline at end of file diff --git a/api/internal/handler/apps/deleteappbyappnamehandler.go b/api/internal/handler/apps/deleteappbyappnamehandler.go new file mode 100644 index 00000000..1219566a --- /dev/null +++ b/api/internal/handler/apps/deleteappbyappnamehandler.go @@ -0,0 +1,28 @@ +package apps + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/apps" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" +) + +func DeleteAppByAppNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteAppReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := apps.NewDeleteAppByAppNameLogic(r.Context(), svcCtx) + resp, err := l.DeleteAppByAppName(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/api/internal/handler/apps/pauseappbyappnamehandler.go b/api/internal/handler/apps/pauseappbyappnamehandler.go new file mode 100644 index 00000000..976ba2a1 --- /dev/null +++ b/api/internal/handler/apps/pauseappbyappnamehandler.go @@ -0,0 +1,28 @@ +package apps + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/apps" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" +) + +func PauseAppByAppNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteAppReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := apps.NewPauseAppByAppNameLogic(r.Context(), svcCtx) + resp, err := l.PauseAppByAppName(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/api/internal/handler/apps/restartappbyappnamehandler.go b/api/internal/handler/apps/restartappbyappnamehandler.go new file mode 100644 index 00000000..4af34ccd --- /dev/null +++ b/api/internal/handler/apps/restartappbyappnamehandler.go @@ -0,0 +1,28 @@ +package apps + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/apps" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" +) + +func RestartAppByAppNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteAppReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := apps.NewRestartAppByAppNameLogic(r.Context(), svcCtx) + resp, err := l.RestartAppByAppName(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/api/internal/handler/apps/startappbyappnamehandler.go b/api/internal/handler/apps/startappbyappnamehandler.go new file mode 100644 index 00000000..5a10a4f4 --- /dev/null +++ b/api/internal/handler/apps/startappbyappnamehandler.go @@ -0,0 +1,28 @@ +package apps + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/apps" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" +) + +func StartAppByAppNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteAppReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := apps.NewStartAppByAppNameLogic(r.Context(), svcCtx) + resp, err := l.StartAppByAppName(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/api/internal/handler/apps/updateappbyappnamehandler.go b/api/internal/handler/apps/updateappbyappnamehandler.go new file mode 100644 index 00000000..2cdad9a1 --- /dev/null +++ b/api/internal/handler/apps/updateappbyappnamehandler.go @@ -0,0 +1,28 @@ +package apps + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/logic/apps" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" +) + +func UpdateAppByAppNameHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.DeleteAppReq + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := apps.NewUpdateAppByAppNameLogic(r.Context(), svcCtx) + resp, err := l.UpdateAppByAppName(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/api/internal/handler/routes.go b/api/internal/handler/routes.go index 7d5182e6..6960624b 100644 --- a/api/internal/handler/routes.go +++ b/api/internal/handler/routes.go @@ -659,6 +659,31 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/apps/getAppByAppName/:appName", Handler: apps.GetAppByAppNameHandler(serverCtx), }, + { + Method: http.MethodGet, + Path: "/apps/deleteApp", + Handler: apps.DeleteAppByAppNameHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/apps/updateApp", + Handler: apps.UpdateAppByAppNameHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/apps/restartApp", + Handler: apps.RestartAppByAppNameHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/apps/pauseApp", + Handler: apps.PauseAppByAppNameHandler(serverCtx), + }, + { + Method: http.MethodGet, + Path: "/apps/startApp", + Handler: apps.StartAppByAppNameHandler(serverCtx), + }, }, rest.WithPrefix("/pcm/v1"), ) diff --git a/api/internal/logic/apps/deleteappbyappnamelogic.go b/api/internal/logic/apps/deleteappbyappnamelogic.go new file mode 100644 index 00000000..b73c2fb0 --- /dev/null +++ b/api/internal/logic/apps/deleteappbyappnamelogic.go @@ -0,0 +1,78 @@ +package apps + +import ( + "context" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/pkg/utils" + "gitlink.org.cn/jcce-pcm/pcm-participant-kubernetes/kubernetes" + "gorm.io/gorm" + + "github.com/zeromicro/go-zero/core/logx" +) + +type DeleteAppByAppNameLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewDeleteAppByAppNameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteAppByAppNameLogic { + return &DeleteAppByAppNameLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +type Cloud struct { + Id int64 `db:"id"` // id + TaskId int64 `db:"task_id"` // 任务id + ParticipantId int64 `db:"participant_id"` // 集群静态信息id + ApiVersion string `db:"api_version"` //api版本 + Name string `db:"name"` // 名称 + Namespace string `db:"namespace"` // 命名空间 + Kind string `db:"kind"` // 种类 + Status string `db:"status"` // 状态 + StartTime string `db:"start_time"` // 开始时间 + RunningTime int64 `db:"running_time"` // 运行时长 + DeletedAt gorm.DeletedAt `gorm:"index"` + YamlString string `db:"yaml_string"` + Result string `db:"result"` // 运行结果 + NsID string `db:"ns_id"` + Replica int32 `db:"replica"` +} + +func (l *DeleteAppByAppNameLogic) DeleteAppByAppName(req *types.DeleteAppReq) (resp *types.DeleteAppResp, err error) { + resp = &types.DeleteAppResp{} + var task = &Task{} + //查询应用的yamlString + l.svcCtx.DbEngin.Raw(`select * from task where ns_id= ? and name= ? `, req.NsID, req.Name).Scan(&task) + if task.Id == 0 { + resp.Code = 500 + resp.Msg = "App not fount" + return resp, err + } + var clouds []Cloud + l.svcCtx.DbEngin.Raw(`select * from cloud where task_id= ? `, task.Id).Scan(&clouds) + for _, cloud := range clouds { + toYaml := utils.StringToYaml(cloud.YamlString) + //调用p端接口查询应用详情 + _, err = l.svcCtx.K8sRpc.DeleteYaml(context.Background(), &kubernetes.ApplyReq{ + YamlString: *toYaml, + }) + } + + if err != nil { + logx.Errorf("调用p端接口删除应用失败,err:%v", err) + resp.Code = 500 + resp.Msg = err.Error() + return resp, nil + } + //删除task跟cloud表数据 + l.svcCtx.DbEngin.Delete(&Task{}, task.Id) + l.svcCtx.DbEngin.Delete(&Cloud{}, task.Id).Where("task_id = ?", task.Id) + resp.Code = 200 + resp.Msg = "succeed" + return +} diff --git a/api/internal/logic/apps/pauseappbyappnamelogic.go b/api/internal/logic/apps/pauseappbyappnamelogic.go new file mode 100644 index 00000000..07106ee3 --- /dev/null +++ b/api/internal/logic/apps/pauseappbyappnamelogic.go @@ -0,0 +1,30 @@ +package apps + +import ( + "context" + + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type PauseAppByAppNameLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewPauseAppByAppNameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PauseAppByAppNameLogic { + return &PauseAppByAppNameLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *PauseAppByAppNameLogic) PauseAppByAppName(req *types.DeleteAppReq) (resp *types.AppTaskResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/api/internal/logic/apps/restartappbyappnamelogic.go b/api/internal/logic/apps/restartappbyappnamelogic.go new file mode 100644 index 00000000..bf1f7521 --- /dev/null +++ b/api/internal/logic/apps/restartappbyappnamelogic.go @@ -0,0 +1,30 @@ +package apps + +import ( + "context" + + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type RestartAppByAppNameLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewRestartAppByAppNameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RestartAppByAppNameLogic { + return &RestartAppByAppNameLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *RestartAppByAppNameLogic) RestartAppByAppName(req *types.DeleteAppReq) (resp *types.AppTaskResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/api/internal/logic/apps/startappbyappnamelogic.go b/api/internal/logic/apps/startappbyappnamelogic.go new file mode 100644 index 00000000..deca3677 --- /dev/null +++ b/api/internal/logic/apps/startappbyappnamelogic.go @@ -0,0 +1,30 @@ +package apps + +import ( + "context" + + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type StartAppByAppNameLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewStartAppByAppNameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *StartAppByAppNameLogic { + return &StartAppByAppNameLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *StartAppByAppNameLogic) StartAppByAppName(req *types.DeleteAppReq) (resp *types.AppTaskResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/api/internal/logic/apps/updateappbyappnamelogic.go b/api/internal/logic/apps/updateappbyappnamelogic.go new file mode 100644 index 00000000..431df67e --- /dev/null +++ b/api/internal/logic/apps/updateappbyappnamelogic.go @@ -0,0 +1,30 @@ +package apps + +import ( + "context" + + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/svc" + "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types" + + "github.com/zeromicro/go-zero/core/logx" +) + +type UpdateAppByAppNameLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +func NewUpdateAppByAppNameLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateAppByAppNameLogic { + return &UpdateAppByAppNameLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *UpdateAppByAppNameLogic) UpdateAppByAppName(req *types.DeleteAppReq) (resp *types.AppTaskResp, err error) { + // todo: add your logic here and delete this line + + return +} diff --git a/api/internal/types/types.go b/api/internal/types/types.go index 2f4db910..acbcc582 100644 --- a/api/internal/types/types.go +++ b/api/internal/types/types.go @@ -612,6 +612,17 @@ type AppTaskResp struct { Data interface{} `json:"data"` } +type DeleteAppReq struct { + Name string `form:"name"` + NsID string `form:"nsID"` +} + +type DeleteAppResp struct { + Code int `json:"code,omitempty"` + Msg string `json:"msg,omitempty"` + Data interface{} `json:"data,omitempty"` +} + type Job struct { SlurmVersion string `json:"slurmVersion"` Name string `json:"name"` diff --git a/pkg/utils/convert.go b/pkg/utils/convert.go index 1a7ceeba..50d5310e 100644 --- a/pkg/utils/convert.go +++ b/pkg/utils/convert.go @@ -115,3 +115,18 @@ func ConvertStructToMap(in interface{}) map[string]string { } return out } + +func StringToYaml(in string) *string { + // 将Go字符串转换为字节数组 + byteArray := []byte(in) + // 解析YAML数据 + var yamlData map[string]interface{} + err := yaml.Unmarshal(byteArray, &yamlData) + // 将解析后的数据转换为YAML格式 + yamlString, err := yaml.Marshal(yamlData) + if err != nil { + fmt.Println(err) + } + resp := string(yamlString) + return &resp +}