227 lines
6.7 KiB
Go
227 lines
6.7 KiB
Go
|
package dao
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"encoding/json"
|
|||
|
"fmt"
|
|||
|
"net/http"
|
|||
|
"strings"
|
|||
|
|
|||
|
"go-common/app/admin/ep/melloi/conf"
|
|||
|
"go-common/app/admin/ep/melloi/model"
|
|||
|
"go-common/library/ecode"
|
|||
|
"go-common/library/log"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
_rmJob = "/api/rm/job"
|
|||
|
_jobNodeURI = "/api/rm/jobs"
|
|||
|
statsPort = "8999"
|
|||
|
statsPath = "/ep/docker/stats"
|
|||
|
_clearableDockers = "/ep/docker/get"
|
|||
|
_dockerKeyword = "run"
|
|||
|
)
|
|||
|
|
|||
|
//AddJob add perf job
|
|||
|
func (d *Dao) AddJob(c context.Context, token string, jobInfo *model.Job) (cluster *model.PaasJobResponse, err error) {
|
|||
|
var (
|
|||
|
url = d.c.ServiceCluster.TestHost + _jobNodeURI
|
|||
|
req *http.Request
|
|||
|
passDetail []byte
|
|||
|
)
|
|||
|
|
|||
|
paasJobDetail := &model.PaasJobDetail{
|
|||
|
BusinessUnit: conf.Conf.Paas.BusinessUnit,
|
|||
|
Project: conf.Conf.Paas.Project,
|
|||
|
App: conf.Conf.Paas.App,
|
|||
|
Env: conf.Conf.Paas.Env,
|
|||
|
Name: jobInfo.Name,
|
|||
|
Image: conf.Conf.Paas.Image,
|
|||
|
ImageVersion: conf.Conf.Paas.ImageVersion,
|
|||
|
Volumes: conf.Conf.Paas.Volumes,
|
|||
|
CPURequest: jobInfo.CPU / 4,
|
|||
|
CPULimit: jobInfo.CPU,
|
|||
|
MemoryRequest: jobInfo.Memory,
|
|||
|
Command: jobInfo.Command,
|
|||
|
ResourcePoolID: conf.Conf.Paas.ResourcePoolID,
|
|||
|
Parallelism: jobInfo.Parallelism,
|
|||
|
Completions: conf.Conf.Paas.Completions,
|
|||
|
RetriesLimit: conf.Conf.Paas.RetriesLimit,
|
|||
|
NetworkID: conf.Conf.Paas.NetworkID,
|
|||
|
ClusterID: conf.Conf.Paas.ClusterID,
|
|||
|
TreeID: conf.Conf.Paas.TreeID,
|
|||
|
HostInfo: conf.Conf.Paas.HostInfo,
|
|||
|
EnvInfo: jobInfo.EnvInfo,
|
|||
|
}
|
|||
|
|
|||
|
log.Info("Command:(%s)", paasJobDetail.Command)
|
|||
|
|
|||
|
if passDetail, err = json.Marshal(paasJobDetail); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("passDetail:(%s)", string(passDetail))
|
|||
|
|
|||
|
if req, err = d.newRequest(http.MethodPost, url, paasJobDetail); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
req.Header.Set("Content-Type", "application/json")
|
|||
|
req.Header.Set("X-Authorization-Token", token)
|
|||
|
if err = d.httpClient.Do(c, req, &cluster); err != nil {
|
|||
|
log.Error("d.AddJob url(%s) res($s) error(%v)", url, err)
|
|||
|
return
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//DeleteJob force stop perf job
|
|||
|
func (d *Dao) DeleteJob(c context.Context, token, name string) (cluster *model.PaasJobResponse, err error) {
|
|||
|
log.Info("删除job -------- token:(%s), job_name(%s): ", token, name)
|
|||
|
var (
|
|||
|
url = d.c.ServiceCluster.TestHost + _rmJob
|
|||
|
req *http.Request
|
|||
|
)
|
|||
|
|
|||
|
if req, err = d.newRequest(http.MethodDelete, url, nil); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
req.Header.Set("X-Authorization-Token", token)
|
|||
|
q := req.URL.Query()
|
|||
|
q.Add("business_unit", "test")
|
|||
|
q.Add("project", "ep")
|
|||
|
q.Add("app", "melloi-launch")
|
|||
|
q.Add("env", "dev")
|
|||
|
q.Add("name", name)
|
|||
|
q.Add("cluster_id", "1")
|
|||
|
q.Add("tree_id", "39400")
|
|||
|
req.URL.RawQuery = q.Encode()
|
|||
|
if err = d.httpClient.Do(c, req, &cluster); err != nil {
|
|||
|
log.Error("d.Job url(%s) res($s) error(%v)", url, err)
|
|||
|
err = ecode.MelloiPaasRequestErr
|
|||
|
return
|
|||
|
}
|
|||
|
// 此处不return
|
|||
|
if err = d.DeletePtestJobByJobName(name); err != nil {
|
|||
|
log.Error("d.DeletePtestJobByJobName uerror(%v)", name)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// QueryCleanableDocker query clearable docker list
|
|||
|
func (d *Dao) QueryCleanableDocker(c context.Context) (dockers []*model.CleanableDocker, err error) {
|
|||
|
var (
|
|||
|
url = fmt.Sprintf("%s:%d%s", d.c.DockerStatus.Host, d.c.DockerStatus.Port, _clearableDockers)
|
|||
|
req *http.Request
|
|||
|
bs []byte
|
|||
|
result []string
|
|||
|
)
|
|||
|
|
|||
|
if req, err = d.newRequest(http.MethodGet, url, nil); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if bs, err = d.httpClient.Raw(c, req, ""); err != nil {
|
|||
|
log.Error("d.job query clearable docker url(%s) error (%v)", url, err)
|
|||
|
return
|
|||
|
}
|
|||
|
result = strings.Split(string(bs), "\n")
|
|||
|
for _, item := range result {
|
|||
|
var docker = &model.CleanableDocker{}
|
|||
|
if strings.Contains(item, _dockerKeyword) {
|
|||
|
docker.Name = item
|
|||
|
dockers = append(dockers, docker)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//QueryJobCPU query job cpu status
|
|||
|
func (d *Dao) QueryJobCPU(c context.Context, token, jobName string) (responseBody *model.PaasQueryJobCPUResult, err error) {
|
|||
|
|
|||
|
Query := strings.Replace(conf.Conf.Paas.Query, "JobNamed", jobName, -1)
|
|||
|
var (
|
|||
|
url = d.c.ServiceCluster.QueryJobCPUHost
|
|||
|
req *http.Request
|
|||
|
paasQueryJobPostCPUDetail = &model.PaasQueryJobCPUPostDetail{
|
|||
|
Action: conf.Conf.Paas.Action,
|
|||
|
PublicKey: conf.Conf.Paas.PublicKey,
|
|||
|
Signature: conf.Conf.Paas.Signature,
|
|||
|
DataSource: conf.Conf.Paas.DataSource,
|
|||
|
Query: Query,
|
|||
|
}
|
|||
|
)
|
|||
|
if req, err = d.newRequest(http.MethodPost, url, paasQueryJobPostCPUDetail); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
req.Header.Set("X-Authorization-Token", token)
|
|||
|
req.Header.Set("Content-Type", "application/json")
|
|||
|
req.Header.Set("X-Authorization-Token", token)
|
|||
|
if err = d.httpClient.Do(c, req, &responseBody); err != nil {
|
|||
|
log.Error("d.Job url(%s) res($s) error(%v)", url, err)
|
|||
|
err = ecode.MelloiPaasRequestErr
|
|||
|
return
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//QueryJobCPUByEP query job cup by ep
|
|||
|
func (d *Dao) QueryJobCPUByEP(c context.Context, id, hostIP string) (dokcerStats *model.DockerStats, err error) {
|
|||
|
var (
|
|||
|
req *http.Request
|
|||
|
)
|
|||
|
url := "http://" + hostIP + ":" + statsPort + statsPath
|
|||
|
if req, err = d.newRequest(http.MethodGet, url, nil); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
q := req.URL.Query()
|
|||
|
q.Add("id", id)
|
|||
|
req.URL.RawQuery = q.Encode()
|
|||
|
if err = d.httpClient.Do(c, req, &dokcerStats); err != nil {
|
|||
|
log.Error("d.queryJobCPU By EP err : url(%s) error(%v)", url, err)
|
|||
|
return
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//Job get job info
|
|||
|
func (d *Dao) Job(c context.Context, token, name string) (responseBody *model.PaasJobQueryStatus, err error) {
|
|||
|
var (
|
|||
|
url = d.c.ServiceCluster.TestHost + _rmJob
|
|||
|
req *http.Request
|
|||
|
)
|
|||
|
if req, err = d.newRequest(http.MethodGet, url, nil); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
q := req.URL.Query()
|
|||
|
q.Add("business_unit", "test")
|
|||
|
q.Add("project", "ep")
|
|||
|
q.Add("app", "melloi-launch")
|
|||
|
q.Add("env", "dev")
|
|||
|
q.Add("name", name)
|
|||
|
q.Add("cluster_id", "1")
|
|||
|
q.Add("tree_id", "39400")
|
|||
|
req.Header.Set("X-Authorization-Token", token)
|
|||
|
req.URL.RawQuery = q.Encode()
|
|||
|
req.Header.Set("Content-Type", "application/json")
|
|||
|
req.Header.Set("X-Authorization-Token", token)
|
|||
|
if err = d.httpClient.Do(c, req, &responseBody); err != nil {
|
|||
|
log.Error("d.Job url(%s) res($s) error(%v)", url, err)
|
|||
|
err = ecode.MelloiPaasRequestErr
|
|||
|
return
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//ForceDeleteJob Force Delete Job
|
|||
|
func (d *Dao) ForceDeleteJob(reportSuId int) (jobList *model.JobInfoList, err error) {
|
|||
|
jobList = &model.JobInfoList{}
|
|||
|
err = d.DB.Table("ptest_job").Select("host_ip, job_name").Where("report_su_id = ?", reportSuId).Find(&jobList.JobList).Error
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//UpdateJobStatus Update Job Status
|
|||
|
func (d *Dao) UpdateJobStatus(reportSuId int) (err error) {
|
|||
|
if err = d.DB.Model(&model.PtestJob{}).Where("report_su_id = ?", reportSuId).Update("active", -1).Error; err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
return d.DB.Table("report_summary").Where("id = ?", reportSuId).Update("test_status", 3).Error
|
|||
|
}
|