| @@ -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 | |||||
| if err := httpx.Parse(r, &req); err != nil { | |||||
| var req algorithm.CreateAlgorithmReq | |||||
| 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" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils" | |||||
| "gitlink.org.cn/JointCloud/pcm-modelarts/modelarts" | |||||
| "k8s.io/apimachinery/pkg/util/json" | |||||
| algorithm "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/ai" | |||||
| ) | ) | ||||
| 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) { | |||||
| modelartsReq := &modelarts.CreateAlgorithmReq{} | |||||
| err = copier.CopyWithOption(modelartsReq, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: utils.Converters}) | |||||
| ListAlgorithmsResp, err := l.svcCtx.ModelArtsRpc.CreateAlgorithm(l.ctx, modelartsReq) | |||||
| if err != nil { | |||||
| return nil, result.NewDefaultError(err.Error()) | |||||
| } | |||||
| marshal, err := json.Marshal(&ListAlgorithmsResp) | |||||
| if err != nil { | |||||
| return nil, result.NewDefaultError(err.Error()) | |||||
| func (l *CreateAlgorithmLogic) CreateAlgorithm(req *algorithm.CreateAlgorithmReq) (resp *algorithm.CreateAlgorithmResp, err error) { | |||||
| cluster := &types.GetClusterByIdResp{} | |||||
| tx := l.svcCtx.DbEngin.Raw("select * from t_cluster where id = ?", req.ClusterId).Scan(&cluster.ClusterInfo) | |||||
| if tx.Error != nil { | |||||
| logx.Errorf(tx.Error.Error()) | |||||
| return nil, errors.New("cluster create failed") | |||||
| } | } | ||||
| json.Unmarshal(marshal, &resp) | |||||
| err = copier.CopyWithOption(&resp, &ListAlgorithmsResp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: utils.Converters}) | |||||
| return resp, nil | |||||
| httpClient := resty.New().R() | |||||
| createAlgorithmResp := &algorithm.CreateAlgorithmResp{} | |||||
| _, err = httpClient.SetHeader("Content-Type", "application/json"). | |||||
| SetQueryParams(map[string]string{"pfId": cluster.ClusterInfo.Id}). | |||||
| SetBody(req). | |||||
| 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 | |||||
| } | |||||