| @@ -6,6 +6,7 @@ type Options struct { | |||
| } | |||
| type Client interface { | |||
| Task(TaskOptions) (Task, error) | |||
| Notice(NoticeOptions) (Notice, error) | |||
| } | |||
| func NewClient(options Options) (Client, error) { | |||
| @@ -19,6 +19,11 @@ func (c *client) Task(options TaskOptions) (Task, error) { | |||
| return task, nil | |||
| } | |||
| func (c *client) Notice(options NoticeOptions) (Notice, error) { | |||
| notice, _ := newNotice(c, &options) | |||
| return notice, nil | |||
| } | |||
| func newClient(options Options) (Client, error) { | |||
| //init dbEngine | |||
| dbEngin, _ := gorm.Open(mysql.Open(options.DataSource), &gorm.Config{ | |||
| @@ -0,0 +1,9 @@ | |||
| package client | |||
| type NoticeOptions struct { | |||
| pushNoticeReq PushNoticeReq | |||
| } | |||
| type Notice interface { | |||
| PushNotice(pushNoticeReq PushNoticeReq) (*PushNoticeResp, error) | |||
| } | |||
| @@ -0,0 +1,46 @@ | |||
| package client | |||
| import ( | |||
| "io/ioutil" | |||
| "k8s.io/apimachinery/pkg/util/json" | |||
| "log" | |||
| "net/http" | |||
| "strings" | |||
| "sync" | |||
| ) | |||
| type notice struct { | |||
| sync.RWMutex | |||
| client *client | |||
| options *NoticeOptions | |||
| log log.Logger | |||
| } | |||
| func newNotice(client *client, options *NoticeOptions) (*notice, error) { | |||
| notice := ¬ice{ | |||
| RWMutex: sync.RWMutex{}, | |||
| client: client, | |||
| options: options, | |||
| log: log.Logger{}, | |||
| } | |||
| return notice, nil | |||
| } | |||
| func (n *notice) PushNotice(pushNoticeReq PushNoticeReq) (*PushNoticeResp, error) { | |||
| url := n.client.url + "/pcm/v1/core/pushNotice" | |||
| method := "GET" | |||
| jsonStr, _ := json.Marshal(pushNoticeReq) | |||
| payload := strings.NewReader(string(jsonStr)) | |||
| client := &http.Client{} | |||
| req, _ := http.NewRequest(method, url, payload) | |||
| req.Header.Add("Content-Type", "application/json") | |||
| res, _ := client.Do(req) | |||
| defer res.Body.Close() | |||
| body, _ := ioutil.ReadAll(res.Body) | |||
| var resp PushNoticeResp | |||
| json.Unmarshal(body, &resp) | |||
| return &resp, nil | |||
| } | |||
| @@ -25,8 +25,8 @@ type PushTaskInfoReq struct { | |||
| } | |||
| type PushTaskInfoResp struct { | |||
| Code int64 | |||
| Msg string | |||
| Code int64 `json:"code"` | |||
| Msg string `json:"msg"` | |||
| } | |||
| type PushResourceInfoReq struct { | |||
| @@ -35,9 +35,38 @@ type PushResourceInfoReq struct { | |||
| } | |||
| type PushResourceInfoResp struct { | |||
| Code int64 | |||
| Msg string | |||
| Code int64 `json:"code"` | |||
| Msg string `json:"msg"` | |||
| } | |||
| type NoticeInfo struct { | |||
| AdapterId int64 `json:"adapterId"` | |||
| AdapterName string `json:"adapterName"` | |||
| ClusterId int64 `json:"clusterId"` | |||
| ClusterName string `json:"clusterName"` | |||
| NoticeType string `json:"noticeType"` | |||
| TaskName string `json:"taskName"` | |||
| Incident string `json:"incident"` | |||
| CreatedTime time.Time `json:"createdTime"` | |||
| } | |||
| type ListNoticeReq struct { | |||
| } | |||
| type ListNoticeResp struct { | |||
| Code int64 `json:"code"` | |||
| Msg string `json:"msg"` | |||
| Data []NoticeInfo `json:"data"` | |||
| } | |||
| type PushNoticeReq struct { | |||
| NoticeInfo NoticeInfo `json:"noticeInfo"` | |||
| } | |||
| type PushNoticeResp struct { | |||
| Code int64 `json:"code"` | |||
| Msg string `json:"msg"` | |||
| } | |||
| type HpcInfo struct { | |||
| Id int64 `json:"id"` // id | |||
| TaskId int64 `json:"task_id"` // 任务id | |||
| @@ -1,159 +0,0 @@ | |||
| syntax = "v1" | |||
| info( | |||
| title: "type title here" | |||
| desc: "type desc here" | |||
| author: "type author here" | |||
| email: "type email here" | |||
| version: "type version here" | |||
| ) | |||
| type PullTaskInfoReq { | |||
| AdapterId int64 `form:"adapterId"` | |||
| } | |||
| type PullTaskInfoResp { | |||
| HpcInfoList []*HpcInfo `json:"HpcInfoList,omitempty"` | |||
| CloudInfoList []*CloudInfo `json:"CloudInfoList,omitempty"` | |||
| AiInfoList []*AiInfo `json:"AiInfoList,omitempty"` | |||
| VmInfoList []*VmInfo `json:"VmInfoList,omitempty"` | |||
| } | |||
| type HpcInfo { | |||
| Id int64 `json:"id"` // id | |||
| TaskId int64 `json:"task_id"` // 任务id | |||
| JobId string `json:"job_id"` // 作业id(在第三方系统中的作业id) | |||
| AdapterId int64 `json:"adapter_id"` // 执行任务的适配器id | |||
| ClusterId int64 `json:"cluster_id"` // 执行任务的集群id | |||
| ClusterType string `json:"cluster_type"` // 执行任务的集群类型 | |||
| Name string `json:"name"` // 名称 | |||
| Status string `json:"status"` // 状态 | |||
| CmdScript string `json:"cmd_script"` | |||
| StartTime string `json:"start_time"` // 开始时间 | |||
| RunningTime int64 `json:"running_time"` // 运行时间 | |||
| DerivedEs string `json:"derived_es"` | |||
| Cluster string `json:"cluster"` | |||
| BlockId int64 `json:"block_id"` | |||
| AllocNodes int64 `json:"alloc_nodes"` | |||
| AllocCpu int64 `json:"alloc_cpu"` | |||
| CardCount int64 `json:"card_count"` // 卡数 | |||
| Version string `json:"version"` | |||
| Account string `json:"account"` | |||
| WorkDir string `json:"work_dir"` // 工作路径 | |||
| AssocId int64 `json:"assoc_id"` | |||
| ExitCode int64 `json:"exit_code"` | |||
| WallTime string `json:"wall_time"` // 最大运行时间 | |||
| Result string `json:"result"` // 运行结果 | |||
| DeletedAt string `json:"deleted_at"` // 删除时间 | |||
| YamlString string `json:"yaml_string"` | |||
| AppType string `json:"app_type"` // 应用类型 | |||
| AppName string `json:"app_name"` // 应用名称 | |||
| Queue string `json:"queue"` // 队列名称 | |||
| SubmitType string `json:"submit_type"` // cmd(命令行模式) | |||
| NNode string `json:"n_node"` // 节点个数(当指定该参数时,GAP_NODE_STRING必须为"") | |||
| StdOutFile string `json:"std_out_file"` // 工作路径/std.err.%j | |||
| StdErrFile string `json:"std_err_file"` // 工作路径/std.err.%j | |||
| StdInput string `json:"std_input"` | |||
| Environment string `json:"environment"` | |||
| DeletedFlag int64 `json:"deleted_flag"` // 是否删除(0-否,1-是) | |||
| CreatedBy int64 `json:"created_by"` // 创建人 | |||
| CreatedTime string `json:"created_time"` // 创建时间 | |||
| UpdatedBy int64 `json:"updated_by"` // 更新人 | |||
| UpdatedTime string `json:"updated_time"` // 更新时间 | |||
| } | |||
| type CloudInfo { | |||
| Participant int64 `json:"participant,omitempty"` | |||
| Id int64 `json:"id,omitempty"` | |||
| TaskId int64 `json:"taskId,omitempty"` | |||
| ApiVersion string `json:"apiVersion,omitempty"` | |||
| Kind string `json:"kind,omitempty"` | |||
| Namespace string `json:"namespace,omitempty"` | |||
| Name string `json:"name,omitempty"` | |||
| Status string `json:"status,omitempty"` | |||
| StartTime string `json:"startTime,omitempty"` | |||
| RunningTime int64 `json:"runningTime,omitempty"` | |||
| Result string `json:"result,omitempty"` | |||
| YamlString string `json:"yamlString,omitempty"` | |||
| } | |||
| type AiInfo { | |||
| ParticipantId int64 `json:"participantId,omitempty"` | |||
| TaskId int64 `json:"taskId,omitempty"` | |||
| ProjectId string `json:"project_id,omitempty"` | |||
| Name string `json:"name,omitempty"` | |||
| Status string `json:"status,omitempty"` | |||
| StartTime string `json:"startTime,omitempty"` | |||
| RunningTime int64 `json:"runningTime,omitempty"` | |||
| Result string `json:"result,omitempty"` | |||
| JobId string `json:"jobId,omitempty"` | |||
| CreateTime string `json:"createTime,omitempty"` | |||
| ImageUrl string `json:"imageUrl,omitempty"` | |||
| Command string `json:"command,omitempty"` | |||
| FlavorId string `json:"flavorId,omitempty"` | |||
| SubscriptionId string `json:"subscriptionId,omitempty"` | |||
| ItemVersionId string `json:"itemVersionId,omitempty"` | |||
| } | |||
| type VmInfo { | |||
| ParticipantId int64 `json:"participantId,omitempty"` | |||
| TaskId int64 `json:"taskId,omitempty"` | |||
| Name string `json:"name,omitempty"` | |||
| FlavorRef string `json:"flavor_ref,omitempty"` | |||
| ImageRef string `json:"image_ref,omitempty"` | |||
| NetworkUuid string `json:"network_uuid,omitempty"` | |||
| BlockUuid string `json:"block_uuid,omitempty"` | |||
| SourceType string `json:"source_type,omitempty"` | |||
| DeleteOnTermination bool `json:"delete_on_termination,omitempty"` | |||
| Status string `json:"status,omitempty"` | |||
| MinCount string `json:"min_count,omitempty"` | |||
| Platform string `json:"platform,omitempty"` | |||
| Uuid string `json:"uuid,omitempty"` | |||
| } | |||
| type PushTaskInfoReq { | |||
| AdapterId int64 `json:"adapterId"` | |||
| HpcInfoList []*HpcInfo `json:"hpcInfoList"` | |||
| CloudInfoList []*CloudInfo `json:"cloudInfoList"` | |||
| AiInfoList []*AiInfo `json:"aiInfoList"` | |||
| VmInfoList []*VmInfo `json:"vmInfoList"` | |||
| } | |||
| type PushTaskInfoResp { | |||
| Code int64 `json:"code"` | |||
| Msg string `json:"msg"` | |||
| } | |||
| type PushResourceInfoReq { | |||
| AdapterId int64 `json:"adapterId"` | |||
| ResourceStats []ResourceStats `json:"resourceStats"` | |||
| } | |||
| type PushResourceInfoResp { | |||
| Code int64 `json:"code"` | |||
| Msg string `json:"msg"` | |||
| } | |||
| type ResourceStats { | |||
| ClusterId int64 `json:"clusterId"` | |||
| Name string `json:"name"` | |||
| CpuCoreAvail int64 `json:"cpuCoreAvail"` | |||
| CpuCoreTotal int64 `json:"cpuCoreTotal"` | |||
| MemAvail float64 `json:"memAvail"` | |||
| MemTotal float64 `json:"memTotal"` | |||
| DiskAvail float64 `json:"diskAvail"` | |||
| DiskTotal float64 `json:"diskTotal"` | |||
| GpuAvail int64 `json:"gpuAvail"` | |||
| CardsAvail []*Card `json:"cardsAvail"` | |||
| CpuCoreHours float64 `json:"cpuCoreHours"` | |||
| Balance float64 `json:"balance"` | |||
| } | |||
| type Card { | |||
| Platform string `json:"platform"` | |||
| Type string `json:"type"` | |||
| Name string `json:"name"` | |||
| TOpsAtFp16 float64 `json:"TOpsAtFp16"` | |||
| CardHours float64 `json:"cardHours"` | |||
| CardNum int32 `json:"cardNum"` | |||
| } | |||
| @@ -9,7 +9,6 @@ import ( | |||
| "cloud/pcm-cloud.api" | |||
| "storelink/pcm-storelink.api" | |||
| "schedule/pcm-schedule.api" | |||
| "participant/pcm-participant.api" | |||
| "monitoring/pcm-monitoring.api" | |||
| ) | |||
| @@ -111,18 +110,26 @@ service pcm { | |||
| @handler metricsHandler | |||
| get /core/metrics | |||
| @doc "provided to participant to pull task info from core" | |||
| @doc "provide for adapter to pull task info from core" | |||
| @handler pullTaskInfoHandler | |||
| get /core/pullTaskInfo (PullTaskInfoReq) returns (PullTaskInfoResp) | |||
| @doc "provided to participant to push task info to core" | |||
| @doc "provide for adapter to push task info to core" | |||
| @handler pushTaskInfoHandler | |||
| post /core/pushTaskInfo (PushTaskInfoReq) returns (PushTaskInfoResp) | |||
| @doc "provided to participant to push resource info to core" | |||
| @doc "provide for adapter to push resource info to core" | |||
| @handler pushResourceInfoHandler | |||
| post /core/pushResourceInfo (PushResourceInfoReq) returns (PushResourceInfoResp) | |||
| @doc "provide for adapter to push notice info to core" | |||
| @handler pushNoticeHandler | |||
| post /core/pushNotice (PushNoticeReq) returns (PushNoticeResp) | |||
| @doc "list notice" | |||
| @handler listNoticeHandler | |||
| get /core/listNotice (ListNoticeReq) returns (ListNoticeResp) | |||
| @doc "paging queries the task list" | |||
| @handler pageListTaskHandler | |||
| get /core/task/list (pageTaskReq) returns(PageResult) | |||
| @@ -0,0 +1,28 @@ | |||
| package core | |||
| import ( | |||
| clientCore "gitlink.org.cn/JointCloud/pcm-coordinator/api/client" | |||
| "net/http" | |||
| "github.com/zeromicro/go-zero/rest/httpx" | |||
| "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/logic/core" | |||
| "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc" | |||
| ) | |||
| func ListNoticeHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | |||
| return func(w http.ResponseWriter, r *http.Request) { | |||
| var req clientCore.ListNoticeReq | |||
| if err := httpx.Parse(r, &req); err != nil { | |||
| httpx.ErrorCtx(r.Context(), w, err) | |||
| return | |||
| } | |||
| l := core.NewListNoticeLogic(r.Context(), svcCtx) | |||
| resp, err := l.ListNotice(&req) | |||
| if err != nil { | |||
| httpx.ErrorCtx(r.Context(), w, err) | |||
| } else { | |||
| httpx.OkJsonCtx(r.Context(), w, resp) | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,28 @@ | |||
| package core | |||
| import ( | |||
| clientCore "gitlink.org.cn/JointCloud/pcm-coordinator/api/client" | |||
| "net/http" | |||
| "github.com/zeromicro/go-zero/rest/httpx" | |||
| "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/logic/core" | |||
| "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc" | |||
| ) | |||
| func PushNoticeHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | |||
| return func(w http.ResponseWriter, r *http.Request) { | |||
| var req clientCore.PushNoticeReq | |||
| if err := httpx.Parse(r, &req); err != nil { | |||
| httpx.ErrorCtx(r.Context(), w, err) | |||
| return | |||
| } | |||
| l := core.NewPushNoticeLogic(r.Context(), svcCtx) | |||
| resp, err := l.PushNotice(&req) | |||
| if err != nil { | |||
| httpx.ErrorCtx(r.Context(), w, err) | |||
| } else { | |||
| httpx.OkJsonCtx(r.Context(), w, resp) | |||
| } | |||
| } | |||
| } | |||
| @@ -145,6 +145,16 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { | |||
| Path: "/core/pushResourceInfo", | |||
| Handler: core.PushResourceInfoHandler(serverCtx), | |||
| }, | |||
| { | |||
| Method: http.MethodPost, | |||
| Path: "/core/pushNotice", | |||
| Handler: core.PushNoticeHandler(serverCtx), | |||
| }, | |||
| { | |||
| Method: http.MethodGet, | |||
| Path: "/core/listNotice", | |||
| Handler: core.ListNoticeHandler(serverCtx), | |||
| }, | |||
| { | |||
| Method: http.MethodGet, | |||
| Path: "/core/task/list", | |||
| @@ -0,0 +1,36 @@ | |||
| package core | |||
| import ( | |||
| "context" | |||
| "github.com/zeromicro/go-zero/core/logx" | |||
| clientCore "gitlink.org.cn/JointCloud/pcm-coordinator/api/client" | |||
| "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc" | |||
| ) | |||
| type ListNoticeLogic struct { | |||
| logx.Logger | |||
| ctx context.Context | |||
| svcCtx *svc.ServiceContext | |||
| } | |||
| func NewListNoticeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ListNoticeLogic { | |||
| return &ListNoticeLogic{ | |||
| Logger: logx.WithContext(ctx), | |||
| ctx: ctx, | |||
| svcCtx: svcCtx, | |||
| } | |||
| } | |||
| func (l *ListNoticeLogic) ListNotice(req *clientCore.ListNoticeReq) (*clientCore.ListNoticeResp, error) { | |||
| var notices []clientCore.NoticeInfo | |||
| var resp clientCore.ListNoticeResp | |||
| l.svcCtx.DbEngin.Raw("select * from t_notice order by created_time desc").Scan(¬ices) | |||
| for _, notice := range notices { | |||
| resp.Data = append(resp.Data, notice) | |||
| } | |||
| resp.Code = 200 | |||
| resp.Msg = "success" | |||
| return &resp, nil | |||
| } | |||
| @@ -0,0 +1,31 @@ | |||
| package core | |||
| import ( | |||
| "context" | |||
| "github.com/zeromicro/go-zero/core/logx" | |||
| clientCore "gitlink.org.cn/JointCloud/pcm-coordinator/api/client" | |||
| "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc" | |||
| ) | |||
| type PushNoticeLogic struct { | |||
| logx.Logger | |||
| ctx context.Context | |||
| svcCtx *svc.ServiceContext | |||
| } | |||
| func NewPushNoticeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PushNoticeLogic { | |||
| return &PushNoticeLogic{ | |||
| Logger: logx.WithContext(ctx), | |||
| ctx: ctx, | |||
| svcCtx: svcCtx, | |||
| } | |||
| } | |||
| func (l *PushNoticeLogic) PushNotice(req *clientCore.PushNoticeReq) (resp *clientCore.PushNoticeResp, err error) { | |||
| result := l.svcCtx.DbEngin.Table("t_notice").Create(&req.NoticeInfo) | |||
| if result.Error != nil { | |||
| return nil, result.Error | |||
| } | |||
| return | |||
| } | |||