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