create algorithm #520
|
@ -1,18 +1,26 @@
|
||||||
package ai
|
package ai
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/zeromicro/go-zero/rest/httpx"
|
"encoding/json"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/logic/ai"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/logic/ai"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
|
algorithm "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/ai"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result"
|
||||||
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateAlgorithmHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
func CreateAlgorithmHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
var req types.CreateAlgorithmReq
|
var req algorithm.CreateAlgorithmReq
|
||||||
if err := httpx.Parse(r, &req); err != nil {
|
|
||||||
|
body, err := io.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
result.ParamErrorResult(r, w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = json.Unmarshal(body, &req); err != nil {
|
||||||
result.ParamErrorResult(r, w, err)
|
result.ParamErrorResult(r, w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,7 +98,7 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
||||||
{
|
{
|
||||||
// 创建算法
|
// 创建算法
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
Path: "/ai/CreateAlgorithm/:projectId",
|
Path: "/ai/CreateAlgorithm",
|
||||||
Handler: ai.CreateAlgorithmHandler(serverCtx),
|
Handler: ai.CreateAlgorithmHandler(serverCtx),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,14 +16,12 @@ package ai
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/jinzhu/copier"
|
"errors"
|
||||||
|
"github.com/go-resty/resty/v2"
|
||||||
"github.com/zeromicro/go-zero/core/logx"
|
"github.com/zeromicro/go-zero/core/logx"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
|
"gitlink.org.cn/JointCloud/pcm-coordinator/internal/types"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result"
|
algorithm "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/ai"
|
||||||
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
|
|
||||||
"gitlink.org.cn/JointCloud/pcm-modelarts/modelarts"
|
|
||||||
"k8s.io/apimachinery/pkg/util/json"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateAlgorithmLogic struct {
|
type CreateAlgorithmLogic struct {
|
||||||
|
@ -40,18 +38,21 @@ func NewCreateAlgorithmLogic(ctx context.Context, svcCtx *svc.ServiceContext) *C
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *CreateAlgorithmLogic) CreateAlgorithm(req *types.CreateAlgorithmReq) (resp *types.CreateAlgorithmResp, err error) {
|
func (l *CreateAlgorithmLogic) CreateAlgorithm(req *algorithm.CreateAlgorithmReq) (resp *algorithm.CreateAlgorithmResp, err error) {
|
||||||
modelartsReq := &modelarts.CreateAlgorithmReq{}
|
|
||||||
err = copier.CopyWithOption(modelartsReq, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: utils.Converters})
|
cluster := &types.GetClusterByIdResp{}
|
||||||
ListAlgorithmsResp, err := l.svcCtx.ModelArtsRpc.CreateAlgorithm(l.ctx, modelartsReq)
|
tx := l.svcCtx.DbEngin.Raw("select * from t_cluster where id = ?", req.ClusterId).Scan(&cluster.ClusterInfo)
|
||||||
if err != nil {
|
if tx.Error != nil {
|
||||||
return nil, result.NewDefaultError(err.Error())
|
logx.Errorf(tx.Error.Error())
|
||||||
|
return nil, errors.New("cluster create failed")
|
||||||
}
|
}
|
||||||
marshal, err := json.Marshal(&ListAlgorithmsResp)
|
|
||||||
if err != nil {
|
httpClient := resty.New().R()
|
||||||
return nil, result.NewDefaultError(err.Error())
|
createAlgorithmResp := &algorithm.CreateAlgorithmResp{}
|
||||||
}
|
_, err = httpClient.SetHeader("Content-Type", "application/json").
|
||||||
json.Unmarshal(marshal, &resp)
|
SetQueryParams(map[string]string{"pfId": cluster.ClusterInfo.Id}).
|
||||||
err = copier.CopyWithOption(&resp, &ListAlgorithmsResp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: utils.Converters})
|
SetBody(req).
|
||||||
return resp, nil
|
SetResult(&createAlgorithmResp).
|
||||||
|
Post(cluster.ClusterInfo.Server + "/ai/algorithm/create")
|
||||||
|
return createAlgorithmResp, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
package algorithm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type CreateParameter interface {
|
||||||
|
AlgorithmCreateParam()
|
||||||
|
}
|
||||||
|
|
||||||
|
type Source struct {
|
||||||
|
Jcs JcsBase `json:"jcs,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type JcsBase struct {
|
||||||
|
UserID int `json:"userID" binding:"required"`
|
||||||
|
PackageId int `json:"packageId" binding:"required"`
|
||||||
|
BucketID int `json:"bucketID" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateAlgorithmReq struct {
|
||||||
|
Name string `json:"name" binding:"required"`
|
||||||
|
ClusterId string `json:"clusterId"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
Src Source `json:"src,omitempty"`
|
||||||
|
Param CreateParameter `json:"param,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateAlgorithmResp struct {
|
||||||
|
Code int32 `json:"code,omitempty" copier:"Code"`
|
||||||
|
Msg string `json:"msg,omitempty" copier:"Msg"`
|
||||||
|
ErrorMsg string `json:"errorMsg,omitempty" copier:"ErrorMsg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type OpenI struct {
|
||||||
|
BootFile string `json:"bootFile,omitempty"`
|
||||||
|
DefaultBranch string `json:"defaultBranch,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *OpenI) AlgorithmCreateParam() {
|
||||||
|
}
|
||||||
|
|
||||||
|
type Octopus struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Octopus) AlgorithmCreateParam() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cp *CreateAlgorithmReq) UnmarshalJSON(data []byte) error {
|
||||||
|
// 临时结构体:用于捕获原始 JSON 中的 param 字段数据
|
||||||
|
type TempCreateParam struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
ClusterId string `json:"clusterId"`
|
||||||
|
Desc string `json:"desc"`
|
||||||
|
Src Source `json:"src,omitempty"`
|
||||||
|
Param json.RawMessage `json:"param,omitempty"` // 捕获原始 JSON 数据
|
||||||
|
}
|
||||||
|
var temp TempCreateParam
|
||||||
|
if err := json.Unmarshal(data, &temp); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将临时结构体的字段赋值给原结构体(除 Param 外)
|
||||||
|
cp.Name = temp.Name
|
||||||
|
cp.ClusterId = temp.ClusterId
|
||||||
|
cp.Desc = temp.Desc
|
||||||
|
cp.Src = temp.Src
|
||||||
|
|
||||||
|
// 解析 param 字段的原始数据为具体类型
|
||||||
|
if temp.Param != nil {
|
||||||
|
// 尝试解析为 OpenI 类型
|
||||||
|
var openi OpenI
|
||||||
|
if err := json.Unmarshal(temp.Param, &openi); err != nil {
|
||||||
|
// 打印详细错误(如字段不匹配、类型错误等)
|
||||||
|
fmt.Printf("解析 OpenI 失败: %v\n", err) // 关键调试日志
|
||||||
|
} else {
|
||||||
|
cp.Param = &openi
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 新增:尝试解析为 Octopus 类型
|
||||||
|
var octopus Octopus
|
||||||
|
if err := json.Unmarshal(temp.Param, &octopus); err == nil {
|
||||||
|
cp.Param = &octopus
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("unsupported param type in CreateParam")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue