| @@ -93,4 +93,5 @@ JcsMiddleware: | |||||
| JobStatusReportUrl: http://101.201.215.196:7891/jobSet/jobStatusReport | JobStatusReportUrl: http://101.201.215.196:7891/jobSet/jobStatusReport | ||||
| Participant: | Participant: | ||||
| AdapterId: "1777144940456666666" | |||||
| AdapterId: "1777144940456666666" | |||||
| CloudAdapterId: "1770658294298316800" | |||||
| @@ -71,5 +71,6 @@ type JcsMiddleware struct { | |||||
| } | } | ||||
| type Participant struct { | type Participant struct { | ||||
| AdapterId string | |||||
| AdapterId string | |||||
| CloudAdapterId string | |||||
| } | } | ||||
| @@ -0,0 +1,32 @@ | |||||
| package cloud | |||||
| import ( | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/logic/cloud" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result" | |||||
| "io" | |||||
| "k8s.io/apimachinery/pkg/util/json" | |||||
| "net/http" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc" | |||||
| container "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/cloud" | |||||
| ) | |||||
| func ContainerCreateHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | |||||
| return func(w http.ResponseWriter, r *http.Request) { | |||||
| var req container.CreateParam | |||||
| 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) | |||||
| return | |||||
| } | |||||
| l := cloud.NewContainerCreateLogic(r.Context(), svcCtx) | |||||
| resp, err := l.ContainerCreate(&req) | |||||
| result.HttpResult(r, w, resp, err) | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,32 @@ | |||||
| package cloud | |||||
| import ( | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/logic/cloud" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result" | |||||
| "io" | |||||
| "k8s.io/apimachinery/pkg/util/json" | |||||
| "net/http" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc" | |||||
| container "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/cloud" | |||||
| ) | |||||
| func ContainerDeleteHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | |||||
| return func(w http.ResponseWriter, r *http.Request) { | |||||
| var req container.DeleteParam | |||||
| 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) | |||||
| return | |||||
| } | |||||
| l := cloud.NewContainerDeleteLogic(r.Context(), svcCtx) | |||||
| resp, err := l.ContainerDelete(&req) | |||||
| result.HttpResult(r, w, resp, err) | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,32 @@ | |||||
| package cloud | |||||
| import ( | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/logic/cloud" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result" | |||||
| "io" | |||||
| "k8s.io/apimachinery/pkg/util/json" | |||||
| "net/http" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc" | |||||
| container "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/cloud" | |||||
| ) | |||||
| func ContainerGetHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { | |||||
| return func(w http.ResponseWriter, r *http.Request) { | |||||
| var req container.GetParam | |||||
| 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) | |||||
| return | |||||
| } | |||||
| l := cloud.NewContainerGetLogic(r.Context(), svcCtx) | |||||
| resp, err := l.ContainerGet(&req) | |||||
| result.HttpResult(r, w, resp, err) | |||||
| } | |||||
| } | |||||
| @@ -376,6 +376,24 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { | |||||
| Path: "/task/list", | Path: "/task/list", | ||||
| Handler: cloud.CloudListHandler(serverCtx), | Handler: cloud.CloudListHandler(serverCtx), | ||||
| }, | }, | ||||
| { | |||||
| // 创建容器 | |||||
| Method: http.MethodPost, | |||||
| Path: "/cloud/container/create", | |||||
| Handler: cloud.ContainerCreateHandler(serverCtx), | |||||
| }, | |||||
| { | |||||
| // 删除容器 | |||||
| Method: http.MethodDelete, | |||||
| Path: "/cloud/container/delete", | |||||
| Handler: cloud.ContainerDeleteHandler(serverCtx), | |||||
| }, | |||||
| { | |||||
| // 获取容器 | |||||
| Method: http.MethodGet, | |||||
| Path: "/cloud/container/get", | |||||
| Handler: cloud.ContainerGetHandler(serverCtx), | |||||
| }, | |||||
| }, | }, | ||||
| rest.WithPrefix("/pcm/v1"), | rest.WithPrefix("/pcm/v1"), | ||||
| ) | ) | ||||
| @@ -0,0 +1,64 @@ | |||||
| /* | |||||
| Copyright (c) [2023] [pcm] | |||||
| [pcm-coordinator] is licensed under Mulan PSL v2. | |||||
| You can use this software according to the terms and conditions of the Mulan PSL v2. | |||||
| You may obtain a copy of Mulan PSL v2 at: | |||||
| http://license.coscl.org.cn/MulanPSL2 | |||||
| THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, | |||||
| EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, | |||||
| MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. | |||||
| See the Mulan PSL v2 for more details. | |||||
| */ | |||||
| package cloud | |||||
| import ( | |||||
| "context" | |||||
| "errors" | |||||
| "github.com/zeromicro/go-zero/core/logx" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/participant/cloud" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc" | |||||
| container "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/cloud" | |||||
| "net/http" | |||||
| ) | |||||
| type ContainerCreateLogic struct { | |||||
| logx.Logger | |||||
| ctx context.Context | |||||
| svcCtx *svc.ServiceContext | |||||
| } | |||||
| func NewContainerCreateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ContainerCreateLogic { | |||||
| return &ContainerCreateLogic{ | |||||
| Logger: logx.WithContext(ctx), | |||||
| ctx: ctx, | |||||
| svcCtx: svcCtx, | |||||
| } | |||||
| } | |||||
| func (l *ContainerCreateLogic) ContainerCreate(req *container.CreateParam) (resp interface{}, err error) { | |||||
| param := &cloud.CreateParam{ | |||||
| Name: req.Name, | |||||
| Port: req.Port, | |||||
| Cpu: req.Cpu, | |||||
| Memory: req.Memory, | |||||
| Image: req.Image, | |||||
| Args: req.Args, | |||||
| MountPath: req.MountPath, | |||||
| Envs: req.Envs, | |||||
| NodePort: req.NodePort, | |||||
| ContainerGroupName: req.ContainerGroupName, | |||||
| CreateParameter: req.ContainerCreateParameter, | |||||
| } | |||||
| create, err := l.svcCtx.Cloud.ContainerCreate(req.ClusterId, param) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if create.Code != http.StatusOK { | |||||
| return nil, errors.New(create.Message) | |||||
| } | |||||
| resp = create.Data | |||||
| return | |||||
| } | |||||
| @@ -0,0 +1,54 @@ | |||||
| /* | |||||
| Copyright (c) [2023] [pcm] | |||||
| [pcm-coordinator] is licensed under Mulan PSL v2. | |||||
| You can use this software according to the terms and conditions of the Mulan PSL v2. | |||||
| You may obtain a copy of Mulan PSL v2 at: | |||||
| http://license.coscl.org.cn/MulanPSL2 | |||||
| THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, | |||||
| EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, | |||||
| MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. | |||||
| See the Mulan PSL v2 for more details. | |||||
| */ | |||||
| package cloud | |||||
| import ( | |||||
| "context" | |||||
| "errors" | |||||
| "github.com/zeromicro/go-zero/core/logx" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/participant/cloud" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc" | |||||
| container "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/cloud" | |||||
| "net/http" | |||||
| ) | |||||
| type ContainerDeleteLogic struct { | |||||
| logx.Logger | |||||
| ctx context.Context | |||||
| svcCtx *svc.ServiceContext | |||||
| } | |||||
| func NewContainerDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ContainerDeleteLogic { | |||||
| return &ContainerDeleteLogic{ | |||||
| Logger: logx.WithContext(ctx), | |||||
| ctx: ctx, | |||||
| svcCtx: svcCtx, | |||||
| } | |||||
| } | |||||
| func (l *ContainerDeleteLogic) ContainerDelete(req *container.DeleteParam) (resp interface{}, err error) { | |||||
| param := &cloud.DeleteParam{ | |||||
| Name: req.Name, | |||||
| } | |||||
| create, err := l.svcCtx.Cloud.ContainerDelete(req.ClusterId, param) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if create.Code != http.StatusOK { | |||||
| return nil, errors.New(create.Message) | |||||
| } | |||||
| resp = create.Data | |||||
| return | |||||
| } | |||||
| @@ -0,0 +1,54 @@ | |||||
| /* | |||||
| Copyright (c) [2023] [pcm] | |||||
| [pcm-coordinator] is licensed under Mulan PSL v2. | |||||
| You can use this software according to the terms and conditions of the Mulan PSL v2. | |||||
| You may obtain a copy of Mulan PSL v2 at: | |||||
| http://license.coscl.org.cn/MulanPSL2 | |||||
| THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, | |||||
| EITHER EXPaRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, | |||||
| MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. | |||||
| See the Mulan PSL v2 for more details. | |||||
| */ | |||||
| package cloud | |||||
| import ( | |||||
| "context" | |||||
| "errors" | |||||
| "github.com/zeromicro/go-zero/core/logx" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/participant/cloud" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc" | |||||
| container "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types/cloud" | |||||
| "net/http" | |||||
| ) | |||||
| type ContainerGetLogic struct { | |||||
| logx.Logger | |||||
| ctx context.Context | |||||
| svcCtx *svc.ServiceContext | |||||
| } | |||||
| func NewContainerGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ContainerGetLogic { | |||||
| return &ContainerGetLogic{ | |||||
| Logger: logx.WithContext(ctx), | |||||
| ctx: ctx, | |||||
| svcCtx: svcCtx, | |||||
| } | |||||
| } | |||||
| func (l *ContainerGetLogic) ContainerGet(req *container.GetParam) (resp interface{}, err error) { | |||||
| param := &cloud.GetParam{ | |||||
| Name: req.Name, | |||||
| } | |||||
| get, err := l.svcCtx.Cloud.ContainerGet(req.ClusterId, param) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if get.Code != http.StatusOK { | |||||
| return nil, errors.New(get.Message) | |||||
| } | |||||
| resp = get.Data | |||||
| return | |||||
| } | |||||
| @@ -0,0 +1,81 @@ | |||||
| package cloud | |||||
| import ( | |||||
| "crypto/tls" | |||||
| "errors" | |||||
| "fmt" | |||||
| "net/http" | |||||
| "time" | |||||
| "github.com/go-resty/resty/v2" | |||||
| ) | |||||
| type ReqCallback func(req *resty.Request) | |||||
| var ( | |||||
| NoRedirectClient *resty.Client | |||||
| RestyClient *resty.Client | |||||
| HttpClient *http.Client | |||||
| ) | |||||
| var UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" | |||||
| var DefaultTimeout = time.Second * 300 | |||||
| func InitClient() { | |||||
| NoRedirectClient = resty.New().SetRedirectPolicy( | |||||
| resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error { | |||||
| return http.ErrUseLastResponse | |||||
| }), | |||||
| ).SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}) | |||||
| NoRedirectClient.SetHeader("user-agent", UserAgent) | |||||
| RestyClient = NewRestyClient() | |||||
| HttpClient = NewHttpClient() | |||||
| } | |||||
| func NewRestyClient() *resty.Client { | |||||
| client := resty.New(). | |||||
| SetHeader("user-agent", UserAgent). | |||||
| SetRetryCount(3). | |||||
| SetRetryResetReaders(true). | |||||
| SetTimeout(DefaultTimeout). | |||||
| SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}) | |||||
| return client | |||||
| } | |||||
| func NewHttpClient() *http.Client { | |||||
| return &http.Client{ | |||||
| Timeout: time.Hour * 48, | |||||
| Transport: &http.Transport{ | |||||
| Proxy: http.ProxyFromEnvironment, | |||||
| TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, | |||||
| }, | |||||
| } | |||||
| } | |||||
| func Request(url string, method string, callback ReqCallback) ([]byte, error) { | |||||
| respErr := &RespErr{} | |||||
| req := RestyClient.R(). | |||||
| SetHeaders(map[string]string{ | |||||
| "Content-Type": "application/json", | |||||
| }). | |||||
| SetError(&respErr) | |||||
| if callback != nil { | |||||
| callback(req) | |||||
| } | |||||
| res, err := req.Execute(method, url) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if respErr.Message != "" { | |||||
| return nil, errors.New(respErr.Message) | |||||
| } | |||||
| if res.StatusCode() != http.StatusOK && res.StatusCode() != http.StatusCreated { | |||||
| return nil, errors.New(fmt.Sprintf("msg: %s, status: %d", res.String(), res.StatusCode())) | |||||
| } | |||||
| return res.Body(), nil | |||||
| } | |||||
| @@ -0,0 +1,105 @@ | |||||
| package cloud | |||||
| import ( | |||||
| "fmt" | |||||
| "github.com/go-resty/resty/v2" | |||||
| "github.com/pkg/errors" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database" | |||||
| "net/http" | |||||
| "sync" | |||||
| ) | |||||
| const CreateContainer = "/cloud/container/create" | |||||
| const DeleteContainer = "/cloud/container/delete" | |||||
| const GetContainer = "/cloud/container/get" | |||||
| type Cloud struct { | |||||
| store *database.CloudStorage | |||||
| idAddr sync.Map | |||||
| } | |||||
| func New(store *database.CloudStorage, adapterId string) (*Cloud, error) { | |||||
| if store == nil { | |||||
| return nil, errors.New("store cannot be nil") | |||||
| } | |||||
| a := &Cloud{ | |||||
| store: store, | |||||
| } | |||||
| css, err := store.GetClustersByAdapterId(adapterId) | |||||
| if err != nil { | |||||
| return nil, fmt.Errorf("failed to get clusters: %w", err) | |||||
| } | |||||
| for _, info := range css.List { | |||||
| a.idAddr.Store(info.Id, info.Server) | |||||
| } | |||||
| InitClient() | |||||
| return a, nil | |||||
| } | |||||
| func (c *Cloud) ContainerCreate(platformId string, param *CreateParam) (resp *Resp, err error) { | |||||
| addr, ok := c.GetServerAddrById(platformId) | |||||
| if !ok { | |||||
| return nil, fmt.Errorf("clusterId not found: %s", platformId) | |||||
| } | |||||
| respErr := &RespErr{} | |||||
| _, err = Request(addr+CreateContainer, http.MethodPost, func(req *resty.Request) { | |||||
| req.SetQueryParams(map[string]string{ | |||||
| "pfId": platformId, | |||||
| }).SetBody(param).SetError(&respErr).SetResult(&resp) | |||||
| }) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| return resp, nil | |||||
| } | |||||
| func (c *Cloud) ContainerDelete(platformId string, param *DeleteParam) (resp *Resp, err error) { | |||||
| addr, ok := c.GetServerAddrById(platformId) | |||||
| if !ok { | |||||
| return nil, fmt.Errorf("clusterId not found: %s", platformId) | |||||
| } | |||||
| respErr := &RespErr{} | |||||
| _, err = Request(addr+DeleteContainer, http.MethodDelete, func(req *resty.Request) { | |||||
| req.SetQueryParams(map[string]string{ | |||||
| "pfId": platformId, | |||||
| }).SetBody(param).SetError(&respErr).SetResult(&resp) | |||||
| }) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| return | |||||
| } | |||||
| func (c *Cloud) ContainerGet(platformId string, param *GetParam) (resp *Resp, err error) { | |||||
| addr, ok := c.GetServerAddrById(platformId) | |||||
| if !ok { | |||||
| return nil, fmt.Errorf("clusterId not found: %s", platformId) | |||||
| } | |||||
| respErr := &RespErr{} | |||||
| _, err = Request(addr+GetContainer, http.MethodGet, func(req *resty.Request) { | |||||
| req.SetQueryParams(map[string]string{ | |||||
| "pfId": platformId, | |||||
| "name": param.Name, | |||||
| }).SetBody(param).SetError(&respErr).SetResult(&resp) | |||||
| }) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| return resp, nil | |||||
| } | |||||
| func (c *Cloud) GetServerAddrById(id string) (string, bool) { | |||||
| val, ok := c.idAddr.Load(id) | |||||
| if !ok { | |||||
| return "", false | |||||
| } | |||||
| addr, ok := val.(string) | |||||
| if !ok { | |||||
| return "", false | |||||
| } | |||||
| return addr, true | |||||
| } | |||||
| @@ -0,0 +1,38 @@ | |||||
| package cloud | |||||
| type RespErr struct { | |||||
| Code int32 `json:"code"` | |||||
| Message string `json:"message"` | |||||
| } | |||||
| type Resp struct { | |||||
| Code int32 `json:"code"` | |||||
| Message string `json:"msg"` | |||||
| Data interface{} `json:"data"` | |||||
| } | |||||
| type CreateParam struct { | |||||
| ContainerGroupName string `json:"containerGroupName"` | |||||
| Name string `json:"name"` | |||||
| Image string `json:"image"` | |||||
| Cpu string `json:"cpu,omitempty"` | |||||
| Memory string `json:"memory,omitempty"` | |||||
| Port int32 `json:"port,omitempty"` | |||||
| NodePort int32 `json:"nodePort,omitempty"` | |||||
| MountPath string `json:"mountPath,omitempty"` | |||||
| Args []string `json:"args,omitempty"` | |||||
| Envs []struct { | |||||
| Name string `json:"name,omitempty"` | |||||
| Value string `json:"value,omitempty"` | |||||
| } `json:"envs,omitempty"` | |||||
| CreateParameter interface{} `json:"createParameter,omitempty"` | |||||
| } | |||||
| type DeleteParam struct { | |||||
| Name string `json:"name,omitempty"` | |||||
| DeleteParameter interface{} `json:"deleteParameter,omitempty"` | |||||
| } | |||||
| type GetParam struct { | |||||
| Name string `json:"name,omitempty"` | |||||
| GetParameter interface{} `json:"getParameter,omitempty"` | |||||
| } | |||||
| @@ -1,22 +1,24 @@ | |||||
| package database | package database | ||||
| import ( | import ( | ||||
| "github.com/zeromicro/go-zero/core/logx" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/entity" | "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/entity" | ||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types" | |||||
| "gorm.io/gorm" | "gorm.io/gorm" | ||||
| ) | ) | ||||
| type CloudStorage struct { | type CloudStorage struct { | ||||
| dbEngin *gorm.DB | |||||
| DbEngin *gorm.DB | |||||
| } | } | ||||
| func NewCloudStorage(dbEngin *gorm.DB) *CloudStorage { | func NewCloudStorage(dbEngin *gorm.DB) *CloudStorage { | ||||
| return &CloudStorage{dbEngin: dbEngin} | |||||
| return &CloudStorage{DbEngin: dbEngin} | |||||
| } | } | ||||
| func (c *CloudStorage) GetProviderParams() ([]entity.ProviderParams, error) { | func (c *CloudStorage) GetProviderParams() ([]entity.ProviderParams, error) { | ||||
| var proParams []entity.ProviderParams | var proParams []entity.ProviderParams | ||||
| sqlstr := "SELECT SUM(a.disk_avail) as disk_avail,SUM(a.mem_avail) as mem_avail,SUM(a.cpu_total * a.cpu_usable) as cpu_avail,participant_id from (SELECT * from sc_node_avail_info where created_time in (SELECT MAX(created_time) as time from sc_node_avail_info where deleted_flag = 0 GROUP BY participant_id,node_name)) a GROUP BY a.participant_id" | sqlstr := "SELECT SUM(a.disk_avail) as disk_avail,SUM(a.mem_avail) as mem_avail,SUM(a.cpu_total * a.cpu_usable) as cpu_avail,participant_id from (SELECT * from sc_node_avail_info where created_time in (SELECT MAX(created_time) as time from sc_node_avail_info where deleted_flag = 0 GROUP BY participant_id,node_name)) a GROUP BY a.participant_id" | ||||
| c.dbEngin.Raw(sqlstr).Scan(&proParams) | |||||
| c.DbEngin.Raw(sqlstr).Scan(&proParams) | |||||
| if len(proParams) == 0 { | if len(proParams) == 0 { | ||||
| return nil, nil | return nil, nil | ||||
| } | } | ||||
| @@ -26,9 +28,18 @@ func (c *CloudStorage) GetProviderParams() ([]entity.ProviderParams, error) { | |||||
| func (c *CloudStorage) FindAvailableParticipants() ([]entity.Participant, error) { | func (c *CloudStorage) FindAvailableParticipants() ([]entity.Participant, error) { | ||||
| var parts []entity.Participant | var parts []entity.Participant | ||||
| sqlstr := "select id as participant_id, name as name from sc_participant_phy_info" | sqlstr := "select id as participant_id, name as name from sc_participant_phy_info" | ||||
| c.dbEngin.Raw(sqlstr).Scan(&parts) | |||||
| c.DbEngin.Raw(sqlstr).Scan(&parts) | |||||
| if len(parts) == 0 { | if len(parts) == 0 { | ||||
| return nil, nil | return nil, nil | ||||
| } | } | ||||
| return parts, nil | return parts, nil | ||||
| } | } | ||||
| func (c *CloudStorage) GetClustersByAdapterId(id string) (*types.ClusterListResp, error) { | |||||
| var resp types.ClusterListResp | |||||
| tx := c.DbEngin.Raw("select * from t_cluster where `deleted_at` IS NULL and `adapter_id` = ? ORDER BY create_time Desc", id).Scan(&resp.List) | |||||
| if tx.Error != nil { | |||||
| logx.Errorf(tx.Error.Error()) | |||||
| return nil, tx.Error | |||||
| } | |||||
| return &resp, nil | |||||
| } | |||||
| @@ -24,6 +24,7 @@ import ( | |||||
| "gitlink.org.cn/JointCloud/pcm-ac/hpcacclient" | "gitlink.org.cn/JointCloud/pcm-ac/hpcacclient" | ||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/config" | "gitlink.org.cn/JointCloud/pcm-coordinator/internal/config" | ||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/participant" | "gitlink.org.cn/JointCloud/pcm-coordinator/internal/participant" | ||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/participant/cloud" | |||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler" | "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler" | ||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database" | "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/database" | ||||
| "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service" | "gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/service" | ||||
| @@ -58,6 +59,7 @@ type ServiceContext struct { | |||||
| HttpClient *resty.Client | HttpClient *resty.Client | ||||
| Scheduler *scheduler.Scheduler | Scheduler *scheduler.Scheduler | ||||
| Ai *participant.Ai | Ai *participant.Ai | ||||
| Cloud *cloud.Cloud | |||||
| } | } | ||||
| func NewServiceContext(c config.Config) *ServiceContext { | func NewServiceContext(c config.Config) *ServiceContext { | ||||
| @@ -111,6 +113,7 @@ func NewServiceContext(c config.Config) *ServiceContext { | |||||
| // scheduler | // scheduler | ||||
| storage := &database.AiStorage{DbEngin: dbEngin} | storage := &database.AiStorage{DbEngin: dbEngin} | ||||
| hpcStorage := &database.HpcStorage{DbEngin: dbEngin} | hpcStorage := &database.HpcStorage{DbEngin: dbEngin} | ||||
| cloudStorage := &database.CloudStorage{DbEngin: dbEngin} | |||||
| cache := make(map[string]interface{}, 0) | cache := make(map[string]interface{}, 0) | ||||
| aiService, err := service.NewAiService(&c, storage, cache) | aiService, err := service.NewAiService(&c, storage, cache) | ||||
| if err != nil { | if err != nil { | ||||
| @@ -128,6 +131,11 @@ func NewServiceContext(c config.Config) *ServiceContext { | |||||
| logx.Error(err.Error()) | logx.Error(err.Error()) | ||||
| panic(err) | panic(err) | ||||
| } | } | ||||
| cloud, err := cloud.New(cloudStorage, c.Participant.CloudAdapterId) | |||||
| if err != nil { | |||||
| logx.Error(err.Error()) | |||||
| panic(err) | |||||
| } | |||||
| return &ServiceContext{ | return &ServiceContext{ | ||||
| DbEngin: dbEngin, | DbEngin: dbEngin, | ||||
| Cron: cron.New(cron.WithSeconds()), | Cron: cron.New(cron.WithSeconds()), | ||||
| @@ -144,5 +152,6 @@ func NewServiceContext(c config.Config) *ServiceContext { | |||||
| HttpClient: httpClient, | HttpClient: httpClient, | ||||
| Scheduler: scheduler, | Scheduler: scheduler, | ||||
| Ai: ai, | Ai: ai, | ||||
| Cloud: cloud, | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,80 @@ | |||||
| package cloud | |||||
| type ContainerCreateParameter interface { | |||||
| ContainerCreateParam() | |||||
| } | |||||
| type ContainerGetParameter interface { | |||||
| ContainerGetParam() | |||||
| } | |||||
| type ContainerDeleteParameter interface { | |||||
| ContainerDeleteParam() | |||||
| } | |||||
| type CreateParam struct { | |||||
| ClusterId string `json:"clusterId,omitempty"` | |||||
| ContainerGroupName string `json:"containerGroupName"` | |||||
| Name string `json:"name"` | |||||
| Image string `json:"image"` | |||||
| Cpu string `json:"cpu,omitempty"` | |||||
| Memory string `json:"memory,omitempty"` | |||||
| Port int32 `json:"port,omitempty"` | |||||
| NodePort int32 `json:"nodePort,omitempty"` | |||||
| MountPath string `json:"mountPath,omitempty"` | |||||
| Args []string `json:"args,omitempty"` | |||||
| Envs []struct { | |||||
| Name string `json:"name,omitempty"` | |||||
| Value string `json:"value,omitempty"` | |||||
| } `json:"envs,omitempty"` | |||||
| ContainerCreateParameter ContainerCreateParameter `json:"containerCreateParameter,omitempty"` | |||||
| } | |||||
| type K8sCreateParam struct { | |||||
| } | |||||
| type EciCreateParam struct { | |||||
| } | |||||
| func (k K8sCreateParam) ContainerCreateParam() { | |||||
| } | |||||
| func (e EciCreateParam) ContainerCreateParam() { | |||||
| } | |||||
| // 删除容器参数 | |||||
| type DeleteParam struct { | |||||
| ClusterId string `json:"clusterId,omitempty"` | |||||
| Name string `json:"name,omitempty"` | |||||
| ContainerDeleteParameter ContainerDeleteParameter `json:"containerDeleteParameter,omitempty"` | |||||
| } | |||||
| func (k K8sDeleteParam) ContainerDeleteParameter() { | |||||
| } | |||||
| func (e EciDeleteParam) ContainerDeleteParameter() { | |||||
| } | |||||
| type K8sDeleteParam struct { | |||||
| } | |||||
| type EciDeleteParam struct { | |||||
| RegionId string `json:"regionId,omitempty"` | |||||
| ContainerGroupId string `json:"containerGroupId,omitempty"` | |||||
| } | |||||
| // 获取容器信息 | |||||
| type GetParam struct { | |||||
| ClusterId string `json:"clusterId,omitempty"` | |||||
| Name string `json:"name,omitempty"` | |||||
| GetParameter ContainerGetParameter `json:"getParameter,omitempty"` | |||||
| } | |||||
| func (g K8sGetParam) ContainerGetParam() { | |||||
| } | |||||
| func (g EciGetParam) ContainerGetParam() { | |||||
| } | |||||
| type K8sGetParam struct { | |||||
| } | |||||
| type EciGetParam struct { | |||||
| RegionId string `json:"regionId,omitempty"` | |||||
| ContainerGroupName string `json:"containerGroupName,omitempty"` | |||||
| } | |||||