pcm-coordinator/api/internal/logic/apps/applistlogic.go

115 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package apps
import (
"context"
"gitlink.org.cn/JointCloud/pcm-kubernetes/kubernetes"
"gorm.io/datatypes"
"gorm.io/gorm"
"time"
"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 AppListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAppListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AppListLogic {
return &AppListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
type Task struct {
Id int64 `db:"id"` // id
Name string `db:"name"` // 作业名称
Description string `db:"description"` // 作业描述
Status string `db:"status"` // 作业状态
Strategy int64 `db:"strategy"` // 策略
SynergyStatus int64 `db:"synergy_status"` // 协同状态0-未协同、1-已协同)
CommitTime time.Time `db:"commit_time"` // 提交时间
StartTime string `db:"start_time"` // 开始时间
EndTime string `db:"end_time"` // 结束运行时间
RunningTime int64 `db:"running_time"` // 已运行时间(单位秒)
YamlString datatypes.JSON `db:"yaml_string"`
Result string `db:"result"` // 作业结果
DeletedAt gorm.DeletedAt `gorm:"index"`
NsID string `db:"ns_id"`
PName string `db:"p_name"` // p端名称
PId int64 `db:"p_id"` // p端id
}
func (l *AppListLogic) AppList(req *types.AppListReq) (resp *types.AppListResp, err error) {
var tasks []Task
resp = &types.AppListResp{}
l.svcCtx.DbEngin.Raw("select * from task t where t.`ns_id` = ? AND t.`deleted_at` IS NULL ORDER BY t.created_time Desc", req.NsID).Scan(&tasks)
for _, task := range tasks {
//调用p端接口查询应用状态 running、creating、waiting、error、pause
data, err := l.svcCtx.K8sRpc.GetAppByAppName(context.Background(), &kubernetes.DeploymentDetailReq{
Namespace: req.NsID,
Name: task.Name,
})
if err != nil {
logx.Errorf("调用p端接口查询应用失败err:%v", err)
return resp, err
}
minReplicas := ""
maxReplicas := ""
status := "creating"
if data.Data.Deployment != nil {
app := data.Data.Deployment
maxReplicas = app.Metadata.Annotations["deploy.cloud.sealos.io/maxReplicas"]
minReplicas = app.Metadata.Annotations["deploy.cloud.sealos.io/minReplicas"]
if app.Status != nil {
if app.Status.Replicas == nil && app.Status.AvailableReplicas == nil {
status = "pause"
} else if app.Status.Replicas != nil && app.Status.AvailableReplicas == nil {
status = "creating"
} else if *app.Status.Replicas == *app.Status.AvailableReplicas {
status = "running"
}
}
} else if data.Data.StatefulSet != nil {
app := data.Data.StatefulSet
maxReplicas = app.Metadata.Annotations["deploy.cloud.sealos.io/maxReplicas"]
minReplicas = app.Metadata.Annotations["deploy.cloud.sealos.io/minReplicas"]
if app.Status != nil {
replicas := app.Status.Replicas
availableReplicas := app.Status.AvailableReplicas
if *replicas == 0 && *availableReplicas == 0 {
status = "pause"
} else if *replicas == *availableReplicas {
status = "running"
} else if *replicas > *availableReplicas {
status = "creating"
}
}
}
var details []types.AppLocation
sql :=
`select phy.id as participant_id, phy.name as participant_name, c.kind
from cloud c
join sc_participant_phy_info phy on c.participant_id = phy.id
WHERE c.kind in ('Deployment', 'StatefulSet')
and task_id = ?`
l.svcCtx.DbEngin.Raw(sql, task.Id).Scan(&details)
resp.Apps = append(resp.Apps, types.App{
Id: task.Id,
Name: task.Name,
Status: status,
CreateTime: task.CommitTime.Format("2006-01-02 15:04:05"),
MinReplicas: minReplicas,
MaxReplicas: maxReplicas,
AppLocations: details,
})
}
return
}