614 lines
18 KiB
Go
614 lines
18 KiB
Go
|
package service
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"encoding/json"
|
|||
|
"html/template"
|
|||
|
"io"
|
|||
|
"os"
|
|||
|
"sort"
|
|||
|
"strconv"
|
|||
|
"strings"
|
|||
|
"time"
|
|||
|
|
|||
|
"go-common/app/admin/ep/melloi/conf"
|
|||
|
"go-common/app/admin/ep/melloi/model"
|
|||
|
"go-common/library/log"
|
|||
|
)
|
|||
|
|
|||
|
// QueryDraft Query Draft
|
|||
|
func (s *Service) QueryDraft(scene *model.Scene) (*model.QueryDraft, error) {
|
|||
|
return s.dao.QueryDraft(scene)
|
|||
|
}
|
|||
|
|
|||
|
// UpdateScene Update Scene
|
|||
|
func (s *Service) UpdateScene(scene *model.Scene) (fusing int, err error) {
|
|||
|
scriptIDList := make([]int, len(scene.Scripts))
|
|||
|
for index, script := range scene.Scripts {
|
|||
|
scriptIDList[index] = script.ID
|
|||
|
}
|
|||
|
fusing, err = s.dao.UpdateScene(scene, scriptIDList)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// AddScene Add Scene
|
|||
|
func (s *Service) AddScene(scene *model.Scene) (id int, err error) {
|
|||
|
id, err = s.dao.AddScene(scene)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// QueryAPI Query API
|
|||
|
func (s *Service) QueryAPI(scene *model.Scene) (*model.QueryAPIs, error) {
|
|||
|
return s.dao.QueryAPI(scene)
|
|||
|
}
|
|||
|
|
|||
|
// AddConfig Add Config
|
|||
|
func (s *Service) AddConfig(script *model.Script) error {
|
|||
|
return s.dao.AddConfig(script)
|
|||
|
}
|
|||
|
|
|||
|
// QueryTree Query Tree
|
|||
|
func (s *Service) QueryTree(script *model.Script) (*model.ShowTree, error) {
|
|||
|
return s.dao.QueryTree(script)
|
|||
|
}
|
|||
|
|
|||
|
// QueryScenesByPage Query Scene By Page
|
|||
|
func (s *Service) QueryScenesByPage(c context.Context, sessionID string, qsrq *model.QuerySceneRequest) (rsp *model.QuerySceneResponse, err error) {
|
|||
|
// 获取服务树节点
|
|||
|
var (
|
|||
|
treeNodes []string
|
|||
|
treeNodesd []string
|
|||
|
)
|
|||
|
if treeNodesd, err = s.QueryUserRoleNode(c, sessionID); err != nil {
|
|||
|
log.Error("QueryUserRoleNode err (%v):", err)
|
|||
|
}
|
|||
|
treeNodes = append(treeNodesd, "")
|
|||
|
|
|||
|
if ExistsInSlice(qsrq.Executor, conf.Conf.Melloi.Executor) {
|
|||
|
if rsp, err = s.dao.QueryScenesByPageWhiteName(&qsrq.Scene, qsrq.PageNum, qsrq.PageSize); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
} else {
|
|||
|
if rsp, err = s.dao.QueryScenesByPage(&qsrq.Scene, qsrq.PageNum, qsrq.PageSize, treeNodes); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//AddAndExecuScene AddSceneAuto add scene auto
|
|||
|
func (s *Service) AddAndExecuScene(c context.Context, scene model.Scene, cookie string) (resp model.DoPtestResp, err error) {
|
|||
|
var (
|
|||
|
buff *template.Template
|
|||
|
file *os.File
|
|||
|
scrThreadGroup model.ScrThreadGroup
|
|||
|
fileName string
|
|||
|
testNames []string
|
|||
|
testNameNicks []string
|
|||
|
loadTimes []int
|
|||
|
scripts []*model.Script
|
|||
|
jmeterLog string
|
|||
|
resJtl string
|
|||
|
sceneID int
|
|||
|
threadGroup string
|
|||
|
)
|
|||
|
// id 不是0 ,说明是输入接口创建的场景,根据sceneID 查询到接口列表,再根据接口列表生成jmx
|
|||
|
// 不是前端 quick-start 页的批量选择,走如下逻辑
|
|||
|
if scene.ID != 0 && !scene.IsBatch {
|
|||
|
script := model.Script{SceneID: scene.ID}
|
|||
|
if scripts, err = s.dao.QueryScripts(&script, 1, 200); err != nil {
|
|||
|
log.Error("s.dao.QueryScripts err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
scene.Scripts = scripts
|
|||
|
}
|
|||
|
if scene.IsDebug {
|
|||
|
for _, script := range scene.Scripts {
|
|||
|
script.ThreadsSum = 1
|
|||
|
script.Loops = 5
|
|||
|
script.TestName = script.TestName + "_perf_debug"
|
|||
|
}
|
|||
|
scene.SceneName = scene.SceneName + "_perf_debug"
|
|||
|
}
|
|||
|
// 非 quick-start 页面的批量选择,走如下逻辑,即 quick-start 页面的批量选择,不生成 scene.jmx 文件
|
|||
|
sceneSuffix := strconv.FormatInt(time.Now().Unix(), 10)
|
|||
|
if !scene.IsBatch {
|
|||
|
scrThreadGroup.Scripts = scene.Scripts
|
|||
|
if threadGroup, err = s.GetThreadGroup(scrThreadGroup); err != nil {
|
|||
|
log.Error("s.dao.GetThreadGroup (%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
scene.ThreadGroup = unescaped(threadGroup)
|
|||
|
if buff, err = template.ParseFiles(s.c.Jmeter.JmeterSceneTmp); err != nil {
|
|||
|
log.Error("file is not exists (%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
scene.ScriptPath = "/data/jmeter-log/" + scene.Department + "/" + scene.Project + "/" + scene.APP + "/" + "scene" + "/" + sceneSuffix + "/"
|
|||
|
if err = os.MkdirAll(scene.ScriptPath, 0755); err != nil {
|
|||
|
log.Error("Create SavePath Err (%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
// 创建脚本文件 脚本路径+场景名+后缀.jmx
|
|||
|
if file, err = os.Create(scene.ScriptPath + sceneSuffix + ".jmx"); err != nil {
|
|||
|
log.Error("os.Create file err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
defer file.Close()
|
|||
|
buff = buff.Funcs(template.FuncMap{"unescaped": unescaped})
|
|||
|
buff.Execute(io.Writer(file), scene)
|
|||
|
fileName = file.Name()
|
|||
|
jmeterLog = scene.ScriptPath + "jmg" + sceneSuffix
|
|||
|
resJtl = scene.ScriptPath + "jtl" + sceneSuffix
|
|||
|
}
|
|||
|
scene.JmeterLog = jmeterLog
|
|||
|
scene.JmeterFilePath = fileName
|
|||
|
scene.ResJtl = resJtl
|
|||
|
sceneID = scene.ID
|
|||
|
|
|||
|
// 批量选择脚本执行场景压测,则走如下逻辑,写 script 表
|
|||
|
if scene.ID == 0 || scene.IsBatch {
|
|||
|
//前端传入的scene 有 scripts , sceneId 没有传,走如下逻辑,写入scene 表
|
|||
|
if !scene.IsBatch {
|
|||
|
scene.SceneType = 1
|
|||
|
if sceneID, err = s.AddScene(&scene); err != nil {
|
|||
|
log.Error("s.AddScene err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
scene.ID = sceneID
|
|||
|
}
|
|||
|
for _, script := range scene.Scripts {
|
|||
|
script.IsSave = true
|
|||
|
script.SceneID = sceneID
|
|||
|
script.ID = 0
|
|||
|
script.TestType = model.SCENE_SCRIPT_TYPE
|
|||
|
//脚本落库
|
|||
|
if resp, err = s.AddAndExcuScript(c, script, "", &scene, false, true); err != nil {
|
|||
|
log.Error("s.AddAndExcuScript err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
script.ID = resp.ScriptID
|
|||
|
scripts = append(scripts, script)
|
|||
|
}
|
|||
|
scene.Scripts = scripts
|
|||
|
}
|
|||
|
|
|||
|
// 有id,需要更新数据库
|
|||
|
if scene.ID != 0 && !scene.IsDebug {
|
|||
|
if _, err = s.UpdateScene(&scene); err != nil {
|
|||
|
log.Error("s.UpdateScene error :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
//获取 testNames testNameNicks loadTimes
|
|||
|
for _, script := range scene.Scripts {
|
|||
|
testNames = append(testNames, script.TestName)
|
|||
|
testNameNicks = append(testNameNicks, script.TestName+sceneSuffix)
|
|||
|
loadTimes = append(loadTimes, script.LoadTime)
|
|||
|
}
|
|||
|
sort.Ints(loadTimes)
|
|||
|
//执行压测
|
|||
|
if scene.IsExecute && len(scene.Scripts) > 0 {
|
|||
|
ptestParam := model.DoPtestParam{
|
|||
|
TestNames: testNames,
|
|||
|
SceneName: scene.SceneName,
|
|||
|
UserName: scene.UserName,
|
|||
|
LoadTime: loadTimes[len(loadTimes)-1],
|
|||
|
FileName: fileName,
|
|||
|
Upload: false,
|
|||
|
ProjectName: scene.SceneName,
|
|||
|
JmeterLog: scene.JmeterLog,
|
|||
|
ResJtl: scene.ResJtl,
|
|||
|
Department: scene.Department,
|
|||
|
Project: scene.Project,
|
|||
|
APP: scene.APP,
|
|||
|
ScriptID: 0,
|
|||
|
DockerSum: 1,
|
|||
|
TestNameNick: SliceToString(testNameNicks, ","),
|
|||
|
TestNameNicks: testNameNicks,
|
|||
|
Scripts: scene.Scripts,
|
|||
|
SceneID: sceneID,
|
|||
|
Type: model.PROTOCOL_SCENE, // 场景
|
|||
|
IsDebug: scene.IsDebug,
|
|||
|
Cookie: cookie,
|
|||
|
Fusing: scene.Fusing,
|
|||
|
}
|
|||
|
if resp, err = s.DoPtest(c, ptestParam); err != nil {
|
|||
|
log.Error("s.DoPtest err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
//临时写法
|
|||
|
resp.ScriptID = sceneID
|
|||
|
}
|
|||
|
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// SaveScene Save Scene
|
|||
|
func (s *Service) SaveScene(scene *model.Scene) error {
|
|||
|
return s.dao.SaveScene(scene)
|
|||
|
}
|
|||
|
|
|||
|
// SaveOrder Save Order
|
|||
|
func (s *Service) SaveOrder(req model.SaveOrderReq, scene *model.Scene) error {
|
|||
|
|
|||
|
var (
|
|||
|
flag = 1
|
|||
|
length = len(req.GroupOrderList)
|
|||
|
index = length - 1
|
|||
|
bak int
|
|||
|
)
|
|||
|
if scene.SceneType == 1 {
|
|||
|
for i := 0; i < length; i++ {
|
|||
|
bak = req.GroupOrderList[i].GroupID
|
|||
|
req.GroupOrderList[i].GroupID = flag
|
|||
|
//防止越界
|
|||
|
if i == index {
|
|||
|
break
|
|||
|
}
|
|||
|
if bak != req.GroupOrderList[i+1].GroupID {
|
|||
|
flag++
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
for i := 0; i < length; i++ {
|
|||
|
bak = req.GroupOrderList[i].RunOrder
|
|||
|
req.GroupOrderList[i].RunOrder = flag
|
|||
|
//防止越界
|
|||
|
if i == index {
|
|||
|
break
|
|||
|
}
|
|||
|
if bak != req.GroupOrderList[i+1].RunOrder {
|
|||
|
flag++
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return s.dao.SaveOrder(req.GroupOrderList, scene)
|
|||
|
}
|
|||
|
|
|||
|
// QueryRelation Query Relation
|
|||
|
func (s *Service) QueryRelation(script *model.Script) (*model.QueryRelation, error) {
|
|||
|
var (
|
|||
|
groupId int
|
|||
|
err error
|
|||
|
)
|
|||
|
if _, groupId, err = s.dao.QueryGroupId(script); err != nil {
|
|||
|
log.Error("s.dao.QueryGroupId err :(%v)", err)
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
return s.dao.QueryRelation(groupId, script)
|
|||
|
}
|
|||
|
|
|||
|
// DeleteAPI Delete API
|
|||
|
func (s *Service) DeleteAPI(script *model.Script) error {
|
|||
|
return s.dao.DeleteAPI(script)
|
|||
|
}
|
|||
|
|
|||
|
// DoScenePtest Do Scene Ptest
|
|||
|
func (s *Service) DoScenePtest(c context.Context, ptestScene model.DoPtestSceneParam, addPtest bool, cookie string) (resp model.DoPtestResp, err error) {
|
|||
|
var (
|
|||
|
scenes []*model.Scene
|
|||
|
scripts []*model.Script
|
|||
|
)
|
|||
|
|
|||
|
scene := model.Scene{ID: ptestScene.SceneID}
|
|||
|
if scenes, err = s.dao.QueryScenes(&scene, 1, 1); err != nil {
|
|||
|
log.Error("s.dao.QueryScenes err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
script := model.Script{SceneID: ptestScene.SceneID}
|
|||
|
if scripts, err = s.dao.QueryScripts(&script, 1, 300); err != nil {
|
|||
|
log.Error("s.dao.QueryScripts err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
scenes[0].Scripts = scripts
|
|||
|
if len(scenes) > 0 {
|
|||
|
sceneInfo := GetSceneInfo(scenes[0])
|
|||
|
ptestParam := model.DoPtestParam{
|
|||
|
TestNames: sceneInfo.TestNames,
|
|||
|
SceneName: sceneInfo.SceneName,
|
|||
|
UserName: ptestScene.UserName,
|
|||
|
LoadTime: sceneInfo.MaxLoadTime,
|
|||
|
FileName: scenes[0].JmeterFilePath,
|
|||
|
Upload: false,
|
|||
|
ProjectName: sceneInfo.SceneName,
|
|||
|
ResJtl: sceneInfo.ResJtl,
|
|||
|
JmeterLog: sceneInfo.JmeterLog,
|
|||
|
Department: scenes[0].Department,
|
|||
|
Project: scenes[0].Project,
|
|||
|
APP: scenes[0].APP,
|
|||
|
ScriptID: 0,
|
|||
|
DockerSum: 1,
|
|||
|
TestNameNick: SliceToString(sceneInfo.TestNameNicks, ","),
|
|||
|
TestNameNicks: sceneInfo.TestNameNicks,
|
|||
|
Scripts: sceneInfo.Scripts,
|
|||
|
SceneID: ptestScene.SceneID,
|
|||
|
Type: model.PROTOCOL_SCENE, // 场景
|
|||
|
AddPtest: addPtest,
|
|||
|
Cookie: cookie,
|
|||
|
}
|
|||
|
return s.DoPtest(c, ptestParam)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//DoScenePtestBatch dosceneptest batch
|
|||
|
func (s *Service) DoScenePtestBatch(c context.Context, ptestScenes model.DoPtestSceneParams, cookie string) (err error) {
|
|||
|
for _, SceneID := range ptestScenes.SceneIDs {
|
|||
|
ptestScene := model.DoPtestSceneParam{SceneID: SceneID, UserName: ptestScenes.UserName}
|
|||
|
go s.DoScenePtest(context.TODO(), ptestScene, false, cookie)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
//GetSceneInfo get sceneInfo
|
|||
|
func GetSceneInfo(scene *model.Scene) (sceneInfo model.SceneInfo) {
|
|||
|
var (
|
|||
|
loadTimes []int
|
|||
|
testNames []string
|
|||
|
testNameNicks []string
|
|||
|
scripts []*model.Script
|
|||
|
)
|
|||
|
if scene == nil {
|
|||
|
return
|
|||
|
}
|
|||
|
sceneSuffix := strconv.FormatInt(time.Now().Unix(), 10)
|
|||
|
for _, script := range scene.Scripts {
|
|||
|
loadTimes = append(loadTimes, script.LoadTime)
|
|||
|
testNames = append(testNames, script.TestName)
|
|||
|
testNameNicks = append(testNameNicks, script.TestName+sceneSuffix)
|
|||
|
scripts = append(scripts, script)
|
|||
|
}
|
|||
|
sort.Ints(loadTimes)
|
|||
|
sceneInfo = model.SceneInfo{
|
|||
|
MaxLoadTime: loadTimes[len(loadTimes)-1],
|
|||
|
JmeterLog: scene.JmeterLog + sceneSuffix,
|
|||
|
ResJtl: scene.ResJtl + sceneSuffix,
|
|||
|
LoadTimes: loadTimes,
|
|||
|
TestNames: testNames,
|
|||
|
TestNameNicks: testNameNicks,
|
|||
|
SceneName: scene.SceneName,
|
|||
|
Scripts: scripts,
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// QueryExistAPI Query Exist API
|
|||
|
func (s *Service) QueryExistAPI(c context.Context, sessionID string, req *model.APIInfoRequest) (res *model.APIInfoList, err error) {
|
|||
|
// 获取服务树节点
|
|||
|
var (
|
|||
|
treeNodes []string
|
|||
|
treeNodesd []string
|
|||
|
)
|
|||
|
if treeNodesd, err = s.QueryUserRoleNode(c, sessionID); err != nil {
|
|||
|
log.Error("QueryUserRoleNode err (%v):", err)
|
|||
|
}
|
|||
|
treeNodes = append(treeNodesd, "")
|
|||
|
if res, err = s.dao.QueryExistAPI(&req.Script, req.PageNum, req.PageSize, req.SceneID, treeNodes); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
for _, script := range res.ScriptList {
|
|||
|
if script.APIHeader != "" {
|
|||
|
if err = json.Unmarshal([]byte(script.APIHeader), &script.Headers); err != nil {
|
|||
|
log.Error("get script header err : (%v),scriptId:(%d)", err, script.ID)
|
|||
|
}
|
|||
|
}
|
|||
|
if script.ArgumentString != "" {
|
|||
|
if err = json.Unmarshal([]byte(script.ArgumentString), &script.ArgumentsMap); err != nil {
|
|||
|
log.Error("get script argument err: (%v), scriptId:(%d)", err, script.ID)
|
|||
|
}
|
|||
|
}
|
|||
|
if script.OutputParams != "" {
|
|||
|
if err = json.Unmarshal([]byte(script.OutputParams), &script.OutputParamsMap); err != nil {
|
|||
|
log.Error("get script OutputParams err: (%v),scriptId:(%d)", err, script.ID)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// QueryPreview Query Preview
|
|||
|
func (s *Service) QueryPreview(req *model.Script) (preRes *model.PreviewInfoList, err error) {
|
|||
|
var (
|
|||
|
list *model.GroupList
|
|||
|
preList *model.PreviewList
|
|||
|
preResd model.PreviewInfoList
|
|||
|
)
|
|||
|
|
|||
|
if list, err = s.dao.QueryGroup(req.SceneID); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
for i := 0; i < len(list.GroupList); i++ {
|
|||
|
// 或者使用var preInfo = &model.PreviewInfo{}
|
|||
|
preInfo := new(model.PreviewInfo)
|
|||
|
groupId := list.GroupList[i].GroupID
|
|||
|
threadsSum := list.GroupList[i].ThreadsSum
|
|||
|
loadTime := list.GroupList[i].LoadTime
|
|||
|
readyTime := list.GroupList[i].ReadyTime
|
|||
|
if preList, err = s.dao.QueryPreview(req.SceneID, groupId); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
preInfo.GroupID = groupId
|
|||
|
preInfo.ThreadsSum = threadsSum
|
|||
|
preInfo.LoadTime = loadTime
|
|||
|
preInfo.ReadyTime = readyTime
|
|||
|
preInfo.InfoList = preList.PreList
|
|||
|
|
|||
|
preResd.PreviewInfoList = append(preResd.PreviewInfoList, preInfo)
|
|||
|
preRes = &preResd
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// QueryParams Query Params
|
|||
|
func (s *Service) QueryParams(req *model.Script) (res *model.UsefulParamsList, tempRes *model.UsefulParamsList, err error) {
|
|||
|
//var paramList []string
|
|||
|
var (
|
|||
|
uParam *model.UsefulParams
|
|||
|
)
|
|||
|
res = &model.UsefulParamsList{}
|
|||
|
if tempRes, err = s.dao.QueryUsefulParams(req.SceneID); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if len(tempRes.ParamsList) > 0 {
|
|||
|
for _, tempParam := range tempRes.ParamsList {
|
|||
|
|
|||
|
if strings.Contains(tempParam.OutputParams, ",") {
|
|||
|
tempParamList := strings.Split(tempParam.OutputParams, ",")
|
|||
|
for _, param := range tempParamList {
|
|||
|
uParam = &model.UsefulParams{}
|
|||
|
uParam.OutputParams = strings.Split(strings.Split(param, "\":\"")[0], "\"")[1]
|
|||
|
res.ParamsList = append(res.ParamsList, uParam)
|
|||
|
}
|
|||
|
} else {
|
|||
|
uParam = &model.UsefulParams{}
|
|||
|
uParam.OutputParams = strings.Split(strings.Split(tempParam.OutputParams, "\":\"")[0], "\"")[1]
|
|||
|
res.ParamsList = append(res.ParamsList, uParam)
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 赋值空数组
|
|||
|
res.ParamsList = []*model.UsefulParams{}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// UpdateBindScene Update Bind Scene
|
|||
|
func (s *Service) UpdateBindScene(bindScene *model.BindScene) (err error) {
|
|||
|
return s.dao.UpdateBindScene(bindScene)
|
|||
|
}
|
|||
|
|
|||
|
// QueryDrawRelation Query Draw Relation
|
|||
|
func (s *Service) QueryDrawRelation(scene *model.Scene) (res model.DrawRelationList, tempRes *model.SaveOrderReq, err error) {
|
|||
|
var (
|
|||
|
//relationList model.DrawRelationList
|
|||
|
edges []*model.Edge
|
|||
|
edge *model.Edge
|
|||
|
tempEdge *model.Edge
|
|||
|
//nodes []*model.Node
|
|||
|
node *model.Node
|
|||
|
)
|
|||
|
|
|||
|
if tempRes, err = s.dao.QueryDrawRelation(scene); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
for k := 0; k < len(tempRes.GroupOrderList); k++ {
|
|||
|
node = &model.Node{}
|
|||
|
node.ID = tempRes.GroupOrderList[k].ID
|
|||
|
node.Name = tempRes.GroupOrderList[k].TestName
|
|||
|
res.Nodes = append(res.Nodes, node)
|
|||
|
}
|
|||
|
for i := 0; i < len(tempRes.GroupOrderList)-1; i++ {
|
|||
|
edge = &model.Edge{}
|
|||
|
tempEdge = &model.Edge{}
|
|||
|
if tempRes.GroupOrderList[i].GroupID == tempRes.GroupOrderList[i+1].GroupID && tempRes.GroupOrderList[i].RunOrder == tempRes.GroupOrderList[i+1].RunOrder {
|
|||
|
edge.Source = tempRes.GroupOrderList[i].TestName
|
|||
|
edges = append(edges, edge)
|
|||
|
if len(edges) > 0 {
|
|||
|
//edges[i+1].Source =
|
|||
|
tempEdge.Source = edges[i-1].Source
|
|||
|
tempEdge.Target = tempRes.GroupOrderList[i+1].TestName
|
|||
|
edges = append(edges, tempEdge)
|
|||
|
}
|
|||
|
} else if tempRes.GroupOrderList[i].GroupID == tempRes.GroupOrderList[i+1].GroupID && tempRes.GroupOrderList[i].RunOrder != tempRes.GroupOrderList[i+1].RunOrder {
|
|||
|
edge.Source = tempRes.GroupOrderList[i].TestName
|
|||
|
edge.Target = tempRes.GroupOrderList[i+1].TestName
|
|||
|
edges = append(edges, edge)
|
|||
|
} else if tempRes.GroupOrderList[i].GroupID != tempRes.GroupOrderList[i+1].GroupID {
|
|||
|
edge.Source = tempRes.GroupOrderList[i].TestName
|
|||
|
edges = append(edges, edge)
|
|||
|
}
|
|||
|
}
|
|||
|
for j := 0; j < len(edges); j++ {
|
|||
|
if edges[j].Target != "" {
|
|||
|
//relationList.Edges = append(relationList.Edges, edges[j])
|
|||
|
res.Edges = append(res.Edges, edges[j])
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// DeleteDraft Delete Draft
|
|||
|
func (s *Service) DeleteDraft(scene *model.Scene) error {
|
|||
|
return s.dao.DeleteDraft(scene)
|
|||
|
}
|
|||
|
|
|||
|
// QueryConfig Query Config
|
|||
|
func (s *Service) QueryConfig(script *model.Script) (*model.GroupInfo, error) {
|
|||
|
return s.dao.QueryConfig(script)
|
|||
|
}
|
|||
|
|
|||
|
// DeleteScene Delete Scene
|
|||
|
func (s *Service) DeleteScene(scene *model.Scene) error {
|
|||
|
return s.dao.DeleteScene(scene)
|
|||
|
}
|
|||
|
|
|||
|
//CopyScene copy scene
|
|||
|
func (s *Service) CopyScene(c context.Context, scene *model.Scene, cookie string) (addScene model.AddScene, err error) {
|
|||
|
var (
|
|||
|
scripts []*model.Script
|
|||
|
scenes []*model.Scene
|
|||
|
sceneID int
|
|||
|
resp model.DoPtestResp
|
|||
|
)
|
|||
|
script := model.Script{SceneID: scene.ID}
|
|||
|
scened := model.Scene{ID: scene.ID}
|
|||
|
//先根据 scene.ID 查询 scenes 和 scripts
|
|||
|
if scenes, err = s.dao.QueryScenes(&scened, 1, 10); err != nil {
|
|||
|
log.Error("s.dao.QueryScenes err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
if scripts, err = s.dao.QueryScripts(&script, 1, 200); err != nil {
|
|||
|
log.Error("s.dao.QueryScripts err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
if len(scenes) != 0 {
|
|||
|
scenes[0].ID = 0
|
|||
|
scenes[0].UserName = scene.UserName
|
|||
|
scenes[0].SceneName = scene.SceneName
|
|||
|
//将新的scene 写入 数据库,并返回 sceneID
|
|||
|
if sceneID, err = s.dao.AddScene(scenes[0]); err != nil {
|
|||
|
log.Error("s.dao.AddScene err :(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
// 将新的 script 写入 script 表
|
|||
|
for _, sctd := range scripts {
|
|||
|
sctd.SceneID = sceneID
|
|||
|
sctd.ID = 0
|
|||
|
if _, _, _, err = s.dao.AddScript(sctd); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
sce := model.Scene{
|
|||
|
APP: scenes[0].APP,
|
|||
|
Department: scenes[0].Department,
|
|||
|
Project: scenes[0].Project,
|
|||
|
ID: sceneID,
|
|||
|
IsDebug: false,
|
|||
|
IsExecute: false,
|
|||
|
UserName: scene.UserName,
|
|||
|
SceneName: scene.SceneName,
|
|||
|
}
|
|||
|
if resp, err = s.AddAndExecuScene(c, sce, cookie); err != nil {
|
|||
|
log.Error("s.AddAndExecuScene err :(%v), (%v)", err, resp)
|
|||
|
return
|
|||
|
}
|
|||
|
addScene.SceneID = sceneID
|
|||
|
addScene.UserName = scene.UserName
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// QueryFusing Query Fusing
|
|||
|
func (s *Service) QueryFusing(script *model.Script) (res *model.FusingInfoList, err error) {
|
|||
|
res, err = s.dao.QueryFusing(script)
|
|||
|
for i := 0; i < len(res.FusingList)-1; i++ {
|
|||
|
if res.FusingList[i] != res.FusingList[i+1] {
|
|||
|
res.SetNull = true
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|