You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
6.7 KiB
226 lines
6.7 KiB
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 |
|
}
|
|
|