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
|
||
}
|