Former-commit-id: 32aa80967d7e49848cac871a4740bd64f1594fde
This commit is contained in:
Jake 2024-04-11 17:46:38 +08:00
commit 6d6c7f4e47
26 changed files with 345 additions and 186 deletions

View File

@ -132,6 +132,8 @@ type (
MatchLabels map[string]string `json:"matchLabels,optional"` MatchLabels map[string]string `json:"matchLabels,optional"`
servers []ServerCommit `json:"servers,optional"` servers []ServerCommit `json:"servers,optional"`
platform string `json:"platform,optional"` platform string `json:"platform,optional"`
AdapterId string `json:"adapterId,optional"`
ClusterType string `json:"clusterType,optional"`
} }
ServerCommit { ServerCommit {
allCardRunTime string `json:"allCardRunTime"` allCardRunTime string `json:"allCardRunTime"`
@ -158,7 +160,10 @@ type (
} }
commitVmTaskResp { commitVmTaskResp {
VmTask []VmTask `json:"vmTask" copier:"VmTask"` // VmTask []VmTask `json:"vmTask" copier:"VmTask"`
TaskId int64 `json:"taskId"`
Code int32 `json:"code"`
Msg string `json:"msg"`
} }
VmTask{ VmTask{
Id string `json:"id" copier:"Id"` Id string `json:"id" copier:"Id"`
@ -812,7 +817,6 @@ type (
ItemValue string `json:"itemValue,omitempty"` ItemValue string `json:"itemValue,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
SortOrder string `json:"sortOrder,omitempty"` SortOrder string `json:"sortOrder,omitempty"`
Type string `json:"type,omitempty" db:"type"`
ParentId string `json:"parentId,omitempty"` ParentId string `json:"parentId,omitempty"`
Status string `json:"status,omitempty" db:"status"` Status string `json:"status,omitempty" db:"status"`
CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"` CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"`
@ -838,7 +842,6 @@ type (
ItemValue string `json:"itemValue,optional"` ItemValue string `json:"itemValue,optional"`
Description string `json:"description,optional"` Description string `json:"description,optional"`
SortOrder string `json:"sortOrder,optional"` SortOrder string `json:"sortOrder,optional"`
Type string `json:"type,optional"`
ParentId string `json:"parentId,optional"` ParentId string `json:"parentId,optional"`
Status string `json:"status,optional"` Status string `json:"status,optional"`
} }
@ -850,7 +853,6 @@ type (
ItemValue string `json:"itemValue,omitempty"` ItemValue string `json:"itemValue,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
SortOrder string `json:"sortOrder,omitempty"` SortOrder string `json:"sortOrder,omitempty"`
Type string `json:"type,omitempty"`
ParentId string `json:"parentId,omitempty"` ParentId string `json:"parentId,omitempty"`
Status string `json:"status,omitempty"` Status string `json:"status,omitempty"`
CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"` CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"`

View File

@ -43,10 +43,6 @@ service pcm {
@handler commitVmTaskHandler @handler commitVmTaskHandler
post /core/commitVmTask (commitVmTaskReq) returns (commitVmTaskResp) post /core/commitVmTask (commitVmTaskReq) returns (commitVmTaskResp)
@doc "提交虚拟机任务临时"
@handler commitVmTaskTempHandler
post /core/commitVmTaskTemp (commitVmTaskReq) returns (commitVmTaskResp)
@doc "删除任务" @doc "删除任务"
@handler deleteTaskHandler @handler deleteTaskHandler
delete /core/deleteTask/:id (deleteTaskReq) delete /core/deleteTask/:id (deleteTaskReq)
@ -389,10 +385,14 @@ service pcm {
@handler GetNetworkNumHandler @handler GetNetworkNumHandler
get /vm/getNetworkNum (ListNetworksReq) returns (NetworkNum) get /vm/getNetworkNum (ListNetworksReq) returns (NetworkNum)
@doc "查询镜像列表" @doc "查询镜像数量"
@handler getImageNumHandler @handler getImageNumHandler
get /vm/getImageNum (ListImagesReq) returns (ImageNum) get /vm/getImageNum (ListImagesReq) returns (ImageNum)
@doc "查询虚拟机概览数据"
@handler getOpenstackOverviewHandler
get /vm/getOpenstackOverview (OpenstackOverviewReq) returns (OpenstackOverviewResp)
@doc "查询虚拟机列表" @doc "查询虚拟机列表"
@handler ListServerHandler @handler ListServerHandler
get /vm/listServer (ListServersReq) returns (ListServersResp) get /vm/listServer (ListServersReq) returns (ListServersResp)

View File

@ -75,6 +75,22 @@ type (
Msg string `json:"msg,omitempty"` Msg string `json:"msg,omitempty"`
ErrorMsg string `json:"errorMsg,omitempty"` ErrorMsg string `json:"errorMsg,omitempty"`
} }
OpenstackOverviewReq {
Platform string `form:"platform,optional"`
}
OpenstackOverviewResp {
Data OpenstackOverview `json:"data"`
Code int32 `json:"code,omitempty"`
Msg string `json:"msg,omitempty"`
ErrorMsg string `json:"errorMsg,omitempty"`
}
OpenstackOverview {
max_total_cores int32 `json:"max_total_cores"`
max_total_ram_size int32 `json:"max_total_ram_size"`
max_total_volumes int32 `json:"max_total_volumes"`
}
) )
/****************** servers start*************************/ /****************** servers start*************************/
type ( type (

View File

@ -45,11 +45,6 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Path: "/core/commitVmTask", Path: "/core/commitVmTask",
Handler: core.CommitVmTaskHandler(serverCtx), Handler: core.CommitVmTaskHandler(serverCtx),
}, },
{
Method: http.MethodPost,
Path: "/core/commitVmTaskTemp",
Handler: core.CommitVmTaskTempHandler(serverCtx),
},
{ {
Method: http.MethodDelete, Method: http.MethodDelete,
Path: "/core/deleteTask/:id", Path: "/core/deleteTask/:id",
@ -461,6 +456,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
Path: "/vm/getImageNum", Path: "/vm/getImageNum",
Handler: vm.GetImageNumHandler(serverCtx), Handler: vm.GetImageNumHandler(serverCtx),
}, },
{
Method: http.MethodGet,
Path: "/vm/getOpenstackOverview",
Handler: vm.GetOpenstackOverviewHandler(serverCtx),
},
{ {
Method: http.MethodGet, Method: http.MethodGet,
Path: "/vm/listServer", Path: "/vm/listServer",

View File

@ -1,24 +1,24 @@
package core package vm
import ( import (
"net/http" "net/http"
"github.com/zeromicro/go-zero/rest/httpx" "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/logic/vm"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types"
) )
func CommitVmTaskTempHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { func GetOpenstackOverviewHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
var req types.CommitVmTaskReq var req types.OpenstackOverviewReq
if err := httpx.Parse(r, &req); err != nil { if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err) httpx.ErrorCtx(r.Context(), w, err)
return return
} }
l := core.NewCommitVmTaskTempLogic(r.Context(), svcCtx) l := vm.NewGetOpenstackOverviewLogic(r.Context(), svcCtx)
resp, err := l.CommitVmTaskTemp(&req) resp, err := l.GetOpenstackOverview(&req)
if err != nil { if err != nil {
httpx.ErrorCtx(r.Context(), w, err) httpx.ErrorCtx(r.Context(), w, err)
} else { } else {

View File

@ -42,6 +42,14 @@ func (l *CommitVmTaskLogic) CommitVmTask(req *types.CommitVmTaskReq) (resp *type
if tx.Error != nil { if tx.Error != nil {
return nil, tx.Error return nil, tx.Error
} }
var clusterIds []int64
l.svcCtx.DbEngin.Raw("SELECT id FROM `t_cluster` where adapter_id = ? and label = ?", req.AdapterId, req.ClusterType).Scan(&clusterIds)
if len(clusterIds) == 0 || clusterIds == nil {
return nil, nil
}
vm := models.Vm{} vm := models.Vm{}
tool.Convert(req, &vm) tool.Convert(req, &vm)
mqInfo := response.TaskInfo{ mqInfo := response.TaskInfo{
@ -52,5 +60,11 @@ func (l *CommitVmTaskLogic) CommitVmTask(req *types.CommitVmTaskReq) (resp *type
} }
//req.TaskId = taskModel.Id //req.TaskId = taskModel.Id
mqs.InsQueue.Beta.Add(&mqInfo) mqs.InsQueue.Beta.Add(&mqInfo)
return tx = l.svcCtx.DbEngin.Create(&mqInfo)
resp = &types.CommitVmTaskResp{
Code: 200,
Msg: "success",
TaskId: taskModel.Id,
}
return resp, nil
} }

View File

@ -1,49 +0,0 @@
package core
import (
"context"
"github.com/jinzhu/copier"
"github.com/pkg/errors"
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/helper/xerr"
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/repository/result"
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
"gitlink.org.cn/JointCloud/pcm-openstack/openstack"
"k8s.io/apimachinery/pkg/util/json"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type CommitVmTaskTempLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewCommitVmTaskTempLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CommitVmTaskTempLogic {
return &CommitVmTaskTempLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *CommitVmTaskTempLogic) CommitVmTaskTemp(req *types.CommitVmTaskReq) (resp *types.CommitVmTaskResp, err error) {
// todo: add your logic here and delete this line
CreateServerReq := &openstack.CreateServerReq{}
err = copier.CopyWithOption(CreateServerReq, req, copier.Option{Converters: utils.Converters})
CreateServerResp, err := l.svcCtx.OpenstackRpc.CreateServer(l.ctx, CreateServerReq)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrMsg("Failed to get Servers list"), "Failed to get db Servers list err : %v ,req:%+v", err, req)
}
marshal, err := json.Marshal(&CreateServerResp)
if err != nil {
return nil, result.NewDefaultError(err.Error())
}
json.Unmarshal(marshal, &resp)
err = copier.CopyWithOption(&resp, &CreateServerResp, copier.Option{Converters: utils.Converters})
return resp, err
return
}

View File

@ -39,11 +39,10 @@ func (l *AddDictItemLogic) AddDictItem(req *types.DictItemEditReq) (resp *types.
dictItem.ItemValue = req.ItemValue dictItem.ItemValue = req.ItemValue
dictItem.Description = req.Description dictItem.Description = req.Description
dictItem.SortOrder = req.SortOrder dictItem.SortOrder = req.SortOrder
dictItem.Type = req.Type dictItem.ParentId = "0"
if req.ParentId != "" { if req.ParentId != "" {
dictItem.ParentId = req.ParentId dictItem.ParentId = req.ParentId
} }
dictItem.ParentId = "0"
dictItem.Status = req.Status dictItem.Status = req.Status
dictItem.Id = utils.GenSnowflakeIDStr() dictItem.Id = utils.GenSnowflakeIDStr()
dictItem.CreateTime = time.Now().Format("2006-01-02 15:04:05") dictItem.CreateTime = time.Now().Format("2006-01-02 15:04:05")

View File

@ -30,7 +30,7 @@ func (l *EditDictItemLogic) EditDictItem(req *types.DictItemEditReq) (resp *type
dictItem := &types.DictItemInfo{} dictItem := &types.DictItemInfo{}
result := l.svcCtx.DbEngin.Table("t_dict_item").First(&dictItem, req.Id) result := l.svcCtx.DbEngin.Table("t_dict_item").First(&dictItem, req.Id)
if errors.Is(result.Error, gorm.ErrRecordNotFound) { if errors.Is(result.Error, gorm.ErrRecordNotFound) {
logx.Errorf("Dictionary data editing failure. errors: %s", err.Error()) logx.Errorf("Dictionary data editing failure. errors: %s", result.Error)
return nil, errors.New("DictItem does not exist") return nil, errors.New("DictItem does not exist")
} }
utils.Convert(req, &dictItem) utils.Convert(req, &dictItem)

View File

@ -31,7 +31,7 @@ func (l *EditDictLogic) EditDict(req *types.DictEditReq) (resp *types.DictResp,
dict := &types.DictInfo{} dict := &types.DictInfo{}
result := l.svcCtx.DbEngin.Table("t_dict").First(&dict, req.Id) result := l.svcCtx.DbEngin.Table("t_dict").First(&dict, req.Id)
if errors.Is(result.Error, gorm.ErrRecordNotFound) { if errors.Is(result.Error, gorm.ErrRecordNotFound) {
logx.Errorf("Dictionary editing failure. errors: %s", err.Error()) logx.Errorf("Dictionary editing failure. errors: %s", result.Error)
return nil, errors.New("Dict does not exist") return nil, errors.New("Dict does not exist")
} }
utils.Convert(req, &dict) utils.Convert(req, &dict)

View File

@ -2,6 +2,7 @@ package dictionary
import ( import (
"context" "context"
"github.com/pkg/errors"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types"
@ -29,12 +30,13 @@ func (l *ListDictItemByCodeLogic) ListDictItemByCode(req *types.DictCodeReq) (re
db := l.svcCtx.DbEngin.Model(&types.DictInfo{}).Table("t_dict") db := l.svcCtx.DbEngin.Model(&types.DictInfo{}).Table("t_dict")
// 左连接查询 // 左连接查询
db.Select("t_dict_item.*").Joins("left join t_dict_item on t_dict.id = t_dict_item.dict_id"). err = db.Select("t_dict_item.*").Joins("left join t_dict_item on t_dict.id = t_dict_item.dict_id").
Where("t_dict.dict_code = ?", req.DictCode). Where("t_dict.dict_code = ?", req.DictCode).
Where("t_dict_item.status", 1). Where("t_dict_item.status", 1).
Order("t_dict_item.sort_order").Scan(&dictList) Order("t_dict_item.sort_order").Scan(&dictList).Error
if err != nil { if err != nil {
return resp, err logx.Errorf("ListDictItemByCode()=> failed %s", err.Error())
return nil, errors.New("description Failed to query dictionary entry data")
} }
resp.List = dictList resp.List = dictList
return resp, nil return resp, nil

View File

@ -0,0 +1,35 @@
package vm
import (
"context"
"github.com/zeromicro/go-zero/core/logx"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/svc"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/types"
)
type GetOpenstackOverviewLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetOpenstackOverviewLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetOpenstackOverviewLogic {
return &GetOpenstackOverviewLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetOpenstackOverviewLogic) GetOpenstackOverview(req *types.OpenstackOverviewReq) (resp *types.OpenstackOverviewResp, err error) {
// todo: add your logic here and delete this line
var openstackOverview types.OpenstackOverview
sqlStr := "SELECT t.max_total_cores,t.max_total_ram_size,t.max_total_volumes FROM `vm_openstack_overview` t left join t_cluster tc on t.cluster_id=tc.id where tc.`name` = ?"
l.svcCtx.DbEngin.Raw(sqlStr, req.Platform).Scan(&openstackOverview)
resp = &types.OpenstackOverviewResp{
Code: 200,
Msg: "success",
Data: openstackOverview,
}
return resp, err
}

View File

@ -5,9 +5,8 @@ import (
) )
type Weight struct { type Weight struct {
Id int64 Id string
Weight int32 Weight int32
Name string
Replica int32 Replica int32
} }

View File

@ -18,6 +18,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"gitlink.org.cn/JointCloud/pcm-ac/hpcAC" "gitlink.org.cn/JointCloud/pcm-ac/hpcAC"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/schedulers/option" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/schedulers/option"
@ -28,7 +29,6 @@ import (
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models" "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils" "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
"gitlink.org.cn/JointCloud/pcm-octopus/octopus" "gitlink.org.cn/JointCloud/pcm-octopus/octopus"
"strconv"
"sync" "sync"
) )
@ -65,7 +65,7 @@ func (as *AiScheduler) GetNewStructForDb(task *response.TaskInfo, resource strin
func (as *AiScheduler) PickOptimalStrategy() (strategy.Strategy, error) { func (as *AiScheduler) PickOptimalStrategy() (strategy.Strategy, error) {
if as.option.AiClusterId != "" { if as.option.AiClusterId != "" {
// TODO database operation Find // TODO database operation Find
return &strategy.SingleAssignment{Cluster: &strategy.AssignedCluster{ParticipantId: 0, Name: "", Replicas: 1}}, nil return &strategy.SingleAssignment{Cluster: &strategy.AssignedCluster{ClusterId: "", Replicas: 1}}, nil
} }
resources, err := as.findClustersWithResources() resources, err := as.findClustersWithResources()
@ -79,8 +79,7 @@ func (as *AiScheduler) PickOptimalStrategy() (strategy.Strategy, error) {
if len(resources) == 1 { if len(resources) == 1 {
var cluster strategy.AssignedCluster var cluster strategy.AssignedCluster
cluster.ParticipantId = resources[0].ParticipantId cluster.ClusterId = resources[0].ClusterId
cluster.Name = resources[0].Name
cluster.Replicas = 1 cluster.Replicas = 1
return &strategy.SingleAssignment{Cluster: &cluster}, nil return &strategy.SingleAssignment{Cluster: &cluster}, nil
} }
@ -89,7 +88,11 @@ func (as *AiScheduler) PickOptimalStrategy() (strategy.Strategy, error) {
switch as.option.StrategyName { switch as.option.StrategyName {
case strategy.REPLICATION: case strategy.REPLICATION:
strategy := strategy.NewReplicationStrategy(&param.ReplicationParams{Params: params, Replicas: 1}) var clusterIds []string
for _, resource := range resources {
clusterIds = append(clusterIds, resource.ClusterId)
}
strategy := strategy.NewReplicationStrategy(clusterIds, 1)
return strategy, nil return strategy, nil
case strategy.RESOURCES_PRICING: case strategy.RESOURCES_PRICING:
strategy := strategy.NewPricingStrategy(&param.ResourcePricingParams{Params: params, Replicas: 1}) strategy := strategy.NewPricingStrategy(&param.ResourcePricingParams{Params: params, Replicas: 1})
@ -111,32 +114,46 @@ func (as *AiScheduler) AssignTask(clusters []*strategy.AssignedCluster) (interfa
return nil, errors.New("clusters is nil") return nil, errors.New("clusters is nil")
} }
for i := len(clusters) - 1; i >= 0; i-- {
if clusters[i].Replicas == 0 {
clusters = append(clusters[:i], clusters[i+1:]...)
}
}
if len(clusters) == 0 {
return nil, errors.New("clusters is nil")
}
var wg sync.WaitGroup var wg sync.WaitGroup
var results []*AiResult var results []*AiResult
var errs []error var errs []interface{}
var ch = make(chan *AiResult, len(clusters)) var ch = make(chan *AiResult, len(clusters))
var errCh = make(chan error, len(clusters)) var errCh = make(chan interface{}, len(clusters))
executorMap := *as.AiExecutor executorMap := *as.AiExecutor
for _, cluster := range clusters { for _, cluster := range clusters {
c := cluster c := cluster
if cluster.Replicas == 0 {
continue
}
wg.Add(1) wg.Add(1)
go func() { go func() {
opt, _ := cloneAiOption(as.option) opt, _ := cloneAiOption(as.option)
resp, err := executorMap[c.Name].Execute(as.ctx, opt) resp, err := executorMap[c.ClusterId].Execute(as.ctx, opt)
if err != nil { if err != nil {
errCh <- err e := struct {
err error
clusterId string
}{
err: err,
clusterId: c.ClusterId,
}
errCh <- e
wg.Done() wg.Done()
return return
} }
result, _ := convertType(resp) result, _ := convertType(resp)
result.Replica = c.Replicas result.Replica = c.Replicas
result.ClusterId = strconv.FormatInt(c.ParticipantId, 10) result.ClusterId = c.ClusterId
ch <- result ch <- result
wg.Done() wg.Done()
@ -150,10 +167,22 @@ func (as *AiScheduler) AssignTask(clusters []*strategy.AssignedCluster) (interfa
errs = append(errs, e) errs = append(errs, e)
} }
if len(errs) != 0 { if len(errs) != len(clusters) {
return nil, errors.New("submit task failed") return nil, errors.New("submit task failed")
} }
if len(errs) != 0 {
var msg string
for _, err := range errs {
e := (err).(struct {
err error
clusterId string
})
msg += fmt.Sprintf("clusterId: %v , error: %v \n", e.clusterId, e.err.Error())
}
return nil, errors.New(msg)
}
for s := range ch { for s := range ch {
// TODO: database operation // TODO: database operation
results = append(results, s) results = append(results, s)

View File

@ -9,18 +9,18 @@ type AiCollector interface {
} }
type ResourceStats struct { type ResourceStats struct {
ParticipantId int64 ClusterId string
Name string Name string
CpuCoreAvail int64 CpuCoreAvail int64
CpuCoreTotal int64 CpuCoreTotal int64
MemAvail float64 MemAvail float64
MemTotal float64 MemTotal float64
DiskAvail float64 DiskAvail float64
DiskTotal float64 DiskTotal float64
GpuAvail int64 GpuAvail int64
CardsAvail []*Card CardsAvail []*Card
CpuCoreHours float64 CpuCoreHours float64
Balance float64 Balance float64
} }
type Card struct { type Card struct {

View File

@ -33,15 +33,14 @@ func (ps *DynamicResourcesStrategy) Schedule() ([]*AssignedCluster, error) {
for _, res := range ps.resources { for _, res := range ps.resources {
if opt.ResourceType == "cpu" { if opt.ResourceType == "cpu" {
if res.CpuCoreHours <= 0 { if res.CpuCoreHours <= 0 {
cluster := &AssignedCluster{ParticipantId: res.ParticipantId, Name: res.Name, Replicas: ps.replicas} cluster := &AssignedCluster{ClusterId: res.ClusterId, Replicas: ps.replicas}
results = append(results, cluster) results = append(results, cluster)
return results, nil return results, nil
} }
if res.CpuCoreHours > maxCpuCoreHoursAvailable { if res.CpuCoreHours > maxCpuCoreHoursAvailable {
maxCpuCoreHoursAvailable = res.CpuCoreHours maxCpuCoreHoursAvailable = res.CpuCoreHours
assignedCluster.Name = res.Name assignedCluster.ClusterId = res.ClusterId
assignedCluster.ParticipantId = res.ParticipantId
assignedCluster.Replicas = ps.replicas assignedCluster.Replicas = ps.replicas
} }
} }
@ -56,8 +55,7 @@ func (ps *DynamicResourcesStrategy) Schedule() ([]*AssignedCluster, error) {
} }
if maxCurrentCardHours > maxCardHoursAvailable { if maxCurrentCardHours > maxCardHoursAvailable {
maxCardHoursAvailable = maxCurrentCardHours maxCardHoursAvailable = maxCurrentCardHours
assignedCluster.Name = res.Name assignedCluster.ClusterId = res.ClusterId
assignedCluster.ParticipantId = res.ParticipantId
assignedCluster.Replicas = ps.replicas assignedCluster.Replicas = ps.replicas
} }
} }

View File

@ -1,23 +0,0 @@
package param
import "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/entity"
type ReplicationParams struct {
Replicas int32
*Params
}
func (r *ReplicationParams) GetReplicas() int32 {
return r.Replicas
}
func (r *ReplicationParams) GetParticipants() []*entity.Participant {
var participants []*entity.Participant
for _, resource := range r.Resources {
participants = append(participants, &entity.Participant{
Participant_id: resource.ParticipantId,
Name: resource.Name,
})
}
return participants
}

View File

@ -2,6 +2,7 @@ package param
import ( import (
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/algorithm/providerPricing" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/algorithm/providerPricing"
"strconv"
) )
type ResourcePricingParams struct { type ResourcePricingParams struct {
@ -21,8 +22,9 @@ func (r *ResourcePricingParams) GetTask() *providerPricing.Task {
func (r *ResourcePricingParams) GetProviders() []*providerPricing.Provider { func (r *ResourcePricingParams) GetProviders() []*providerPricing.Provider {
var providerList []*providerPricing.Provider var providerList []*providerPricing.Provider
for _, resource := range r.Resources { for _, resource := range r.Resources {
id, _ := strconv.ParseInt(resource.ClusterId, 10, 64)
provider := providerPricing.NewProvider( provider := providerPricing.NewProvider(
resource.ParticipantId, id,
float64(resource.CpuCoreAvail), float64(resource.CpuCoreAvail),
resource.MemAvail, resource.MemAvail,
resource.DiskAvail, 0.0, 0.0, 0.0) resource.DiskAvail, 0.0, 0.0, 0.0)

View File

@ -2,33 +2,31 @@ package strategy
import ( import (
"errors" "errors"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/entity"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy/param"
) )
type ReplicationStrategy struct { type ReplicationStrategy struct {
replicas int32 replicas int32
participants []*entity.Participant clusterIds []string
} }
func NewReplicationStrategy(params *param.ReplicationParams) *ReplicationStrategy { func NewReplicationStrategy(clusterIds []string, replicas int32) *ReplicationStrategy {
return &ReplicationStrategy{replicas: params.GetReplicas(), return &ReplicationStrategy{clusterIds: clusterIds,
participants: params.GetParticipants(), replicas: replicas,
} }
} }
func (ps *ReplicationStrategy) Schedule() ([]*AssignedCluster, error) { func (r *ReplicationStrategy) Schedule() ([]*AssignedCluster, error) {
if ps.replicas < 1 { if r.replicas < 1 {
return nil, errors.New("replicas must be greater than 0") return nil, errors.New("replicas must be greater than 0")
} }
if ps.participants == nil { if len(r.clusterIds) == 0 {
return nil, errors.New("participantId must be set") return nil, errors.New("clusterIds must be set")
} }
var results []*AssignedCluster var results []*AssignedCluster
for _, p := range ps.participants { for _, c := range r.clusterIds {
cluster := &AssignedCluster{ParticipantId: p.Participant_id, Name: p.Name, Replicas: ps.replicas} cluster := &AssignedCluster{ClusterId: c, Replicas: r.replicas}
results = append(results, cluster) results = append(results, cluster)
} }
return results, nil return results, nil

View File

@ -18,6 +18,7 @@ import (
"errors" "errors"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/algorithm/providerPricing" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/algorithm/providerPricing"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy/param" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy/param"
"strconv"
) )
type PricingStrategy struct { type PricingStrategy struct {
@ -154,7 +155,7 @@ func (ps *PricingStrategy) Schedule() ([]*AssignedCluster, error) {
if e == 0 { if e == 0 {
continue continue
} }
cluster := &AssignedCluster{ParticipantId: ps.ProviderList[i].Pid, Replicas: int32(e)} cluster := &AssignedCluster{ClusterId: strconv.FormatInt(ps.ProviderList[i].Pid, 10), Replicas: int32(e)}
results = append(results, cluster) results = append(results, cluster)
} }

View File

@ -29,7 +29,7 @@ func (s *StaticWeightStrategy) Schedule() ([]*AssignedCluster, error) {
weights := make([]*weightDistributing.Weight, 0) weights := make([]*weightDistributing.Weight, 0)
for k, v := range s.staticWeightMap { for k, v := range s.staticWeightMap {
weight := &weightDistributing.Weight{ weight := &weightDistributing.Weight{
Name: k, Id: k,
Weight: v, Weight: v,
} }
weights = append(weights, weight) weights = append(weights, weight)
@ -39,7 +39,7 @@ func (s *StaticWeightStrategy) Schedule() ([]*AssignedCluster, error) {
var results []*AssignedCluster var results []*AssignedCluster
for _, weight := range weights { for _, weight := range weights {
cluster := &AssignedCluster{ParticipantId: weight.Id, Name: weight.Name, Replicas: weight.Replica} cluster := &AssignedCluster{ClusterId: weight.Id, Replicas: weight.Replica}
results = append(results, cluster) results = append(results, cluster)
} }

View File

@ -18,9 +18,8 @@ type Strategy interface {
} }
type AssignedCluster struct { type AssignedCluster struct {
ParticipantId int64 ClusterId string
Name string Replicas int32
Replicas int32
} }
func GetStrategyNames() []string { func GetStrategyNames() []string {

View File

@ -5,7 +5,6 @@ import (
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/entity" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/entity"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/service/collector" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/service/collector"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy" "gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy"
"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy/param"
"testing" "testing"
) )
@ -17,15 +16,15 @@ func TestReplication(t *testing.T) {
} }
rsc := []*collector.ResourceStats{ rsc := []*collector.ResourceStats{
{ {
ParticipantId: 1, ClusterId: "1",
Name: "test1", Name: "test1",
}, },
{ {
ParticipantId: 1, ClusterId: "2",
Name: "test2"}, Name: "test2"},
{ {
ParticipantId: 1, ClusterId: "3",
Name: "test3"}, Name: "test3"},
} }
tests := []struct { tests := []struct {
name string name string
@ -47,8 +46,11 @@ func TestReplication(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
params := &param.Params{Resources: rsc} var clusterIds []string
repl := strategy.NewReplicationStrategy(&param.ReplicationParams{Params: params, Replicas: tt.replica}) for _, stats := range rsc {
clusterIds = append(clusterIds, stats.ClusterId)
}
repl := strategy.NewReplicationStrategy(clusterIds, 0)
schedule, err := repl.Schedule() schedule, err := repl.Schedule()
if err != nil { if err != nil {
return return

View File

@ -283,11 +283,11 @@ func (o *OctopusLink) GetResourceStats(ctx context.Context) (*collector.Resource
} }
resourceStats := &collector.ResourceStats{ resourceStats := &collector.ResourceStats{
ParticipantId: o.participantId, ClusterId: strconv.FormatInt(o.participantId, 10),
Name: o.platform, Name: o.platform,
Balance: balance, Balance: balance,
CardsAvail: cards, CardsAvail: cards,
CpuCoreHours: cpuHours, CpuCoreHours: cpuHours,
} }
return resourceStats, nil return resourceStats, nil

View File

@ -284,14 +284,14 @@ func (s *ShuguangAi) GetResourceStats(ctx context.Context) (*collector.ResourceS
totalDcu := limitResp.Data.AccountMaxDcu totalDcu := limitResp.Data.AccountMaxDcu
//disk //disk
//diskReq := &hpcAC.ParaStorQuotaReq{} diskReq := &hpcAC.ParaStorQuotaReq{}
//diskResp, err := s.aCRpc.ParaStorQuota(ctx, diskReq) diskResp, err := s.aCRpc.ParaStorQuota(ctx, diskReq)
//if err != nil { if err != nil {
// return nil, err return nil, err
//} }
//
//totalDisk := common.RoundFloat(diskResp.Data[0].Threshold*KB*KB*KB, 3) totalDisk := common.RoundFloat(diskResp.Data[0].Threshold*KB*KB*KB, 3)
//availDisk := common.RoundFloat((diskResp.Data[0].Threshold-diskResp.Data[0].Usage)*KB*KB*KB, 3) availDisk := common.RoundFloat((diskResp.Data[0].Threshold-diskResp.Data[0].Usage)*KB*KB*KB, 3)
//memory //memory
nodeResp, err := s.aCRpc.GetNodeResources(ctx, nil) nodeResp, err := s.aCRpc.GetNodeResources(ctx, nil)
@ -344,13 +344,13 @@ func (s *ShuguangAi) GetResourceStats(ctx context.Context) (*collector.ResourceS
} }
cards = append(cards, dcu) cards = append(cards, dcu)
resourceStats := &collector.ResourceStats{ resourceStats := &collector.ResourceStats{
ParticipantId: s.participantId, ClusterId: strconv.FormatInt(s.participantId, 10),
Name: s.platform, Name: s.platform,
Balance: balance, Balance: balance,
CpuCoreTotal: totalCpu, CpuCoreTotal: totalCpu,
CpuCoreAvail: CpuCoreAvail, CpuCoreAvail: CpuCoreAvail,
//DiskTotal: totalDisk, DiskTotal: totalDisk,
//DiskAvail: availDisk, DiskAvail: availDisk,
MemTotal: memSize, MemTotal: memSize,
MemAvail: MemAvail, MemAvail: MemAvail,
CpuCoreHours: cpuHours, CpuCoreHours: cpuHours,

View File

@ -117,6 +117,8 @@ type CommitVmTaskReq struct {
MatchLabels map[string]string `json:"matchLabels,optional"` MatchLabels map[string]string `json:"matchLabels,optional"`
Servers []ServerCommit `json:"servers,optional"` Servers []ServerCommit `json:"servers,optional"`
Platform string `json:"platform,optional"` Platform string `json:"platform,optional"`
AdapterId string `json:"adapterId,optional"`
ClusterType string `json:"clusterType,optional"`
} }
type ServerCommit struct { type ServerCommit struct {
@ -146,7 +148,9 @@ type Block_device_mapping_v2Commit struct {
} }
type CommitVmTaskResp struct { type CommitVmTaskResp struct {
VmTask []VmTask `json:"vmTask" copier:"VmTask"` TaskId int64 `json:"taskId"`
Code int32 `json:"code"`
Msg string `json:"msg"`
} }
type VmTask struct { type VmTask struct {
@ -787,7 +791,6 @@ type DictItemInfo struct {
ItemValue string `json:"itemValue,omitempty"` ItemValue string `json:"itemValue,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
SortOrder string `json:"sortOrder,omitempty"` SortOrder string `json:"sortOrder,omitempty"`
Type string `json:"type,omitempty" db:"type"`
ParentId string `json:"parentId,omitempty"` ParentId string `json:"parentId,omitempty"`
Status string `json:"status,omitempty" db:"status"` Status string `json:"status,omitempty" db:"status"`
CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"` CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"`
@ -813,7 +816,6 @@ type DictItemEditReq struct {
ItemValue string `json:"itemValue,optional"` ItemValue string `json:"itemValue,optional"`
Description string `json:"description,optional"` Description string `json:"description,optional"`
SortOrder string `json:"sortOrder,optional"` SortOrder string `json:"sortOrder,optional"`
Type string `json:"type,optional"`
ParentId string `json:"parentId,optional"` ParentId string `json:"parentId,optional"`
Status string `json:"status,optional"` Status string `json:"status,optional"`
} }
@ -825,7 +827,6 @@ type DictItemResp struct {
ItemValue string `json:"itemValue,omitempty"` ItemValue string `json:"itemValue,omitempty"`
Description string `json:"description,omitempty"` Description string `json:"description,omitempty"`
SortOrder string `json:"sortOrder,omitempty"` SortOrder string `json:"sortOrder,omitempty"`
Type string `json:"type,omitempty"`
ParentId string `json:"parentId,omitempty"` ParentId string `json:"parentId,omitempty"`
Status string `json:"status,omitempty"` Status string `json:"status,omitempty"`
CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"` CreateTime string `json:"createTime,omitempty" db:"created_time" gorm:"autoCreateTime"`
@ -2691,6 +2692,23 @@ type GetVolumeLimitsResp struct {
ErrorMsg string `json:"errorMsg,omitempty"` ErrorMsg string `json:"errorMsg,omitempty"`
} }
type OpenstackOverviewReq struct {
Platform string `form:"platform,optional"`
}
type OpenstackOverviewResp struct {
Data OpenstackOverview `json:"data"`
Code int32 `json:"code,omitempty"`
Msg string `json:"msg,omitempty"`
ErrorMsg string `json:"errorMsg,omitempty"`
}
type OpenstackOverview struct {
Max_total_cores int32 `json:"max_total_cores"`
Max_total_ram_size int32 `json:"max_total_ram_size"`
Max_total_volumes int32 `json:"max_total_volumes"`
}
type ListServersReq struct { type ListServersReq struct {
Limit int32 `form:"limit,optional"` Limit int32 `form:"limit,optional"`
OffSet int32 `form:"offSet,optional"` OffSet int32 `form:"offSet,optional"`
@ -5316,6 +5334,123 @@ type AiAlgorithmsResp struct {
Algorithms []string `json:"algorithms"` Algorithms []string `json:"algorithms"`
} }
type PullTaskInfoReq struct {
AdapterId int64 `form:"adapterId"`
}
type PullTaskInfoResp struct {
HpcInfoList []*HpcInfo `json:"HpcInfoList,omitempty"`
CloudInfoList []*CloudInfo `json:"CloudInfoList,omitempty"`
AiInfoList []*AiInfo `json:"AiInfoList,omitempty"`
VmInfoList []*VmInfo `json:"VmInfoList,omitempty"`
}
type HpcInfo struct {
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 struct {
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 struct {
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 struct {
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"`
State string `json:"state,omitempty"`
}
type PushTaskInfoReq struct {
AdapterId int64 `json:"adapterId"`
HpcInfoList []*HpcInfo `json:"hpcInfoList"`
CloudInfoList []*CloudInfo `json:"cloudInfoList"`
AiInfoList []*AiInfo `json:"aiInfoList"`
VmInfoList []*VmInfo `json:"vmInfoList"`
}
type PushTaskInfoResp struct {
Code int64 `json:"code"`
Msg string `json:"msg"`
}
type PushResourceInfoReq struct {
AdapterId int64 `json:"adapterId"`
}
type CreateAlertRuleReq struct { type CreateAlertRuleReq struct {
CLusterId int64 `json:"clusterId"` CLusterId int64 `json:"clusterId"`
ClusterName string `json:"clusterName"` ClusterName string `json:"clusterName"`