websocket.go 4.4 KB
Newer Older
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
1 2 3
package controller

import (
aaronchen2k2k's avatar
aaronchen2k2k 已提交
4
	"encoding/json"
aaronchen2k2k's avatar
i118  
aaronchen2k2k 已提交
5
	"fmt"
雨爱无痕 已提交
6

aaronchen2k2k's avatar
aaronchen2k2k 已提交
7 8 9
	commConsts "github.com/easysoft/zentaoatf/internal/pkg/consts"
	commDomain "github.com/easysoft/zentaoatf/internal/pkg/domain"
	execHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/exec"
雨爱无痕 已提交
10
	watchHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/watch"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11
	websocketHelper "github.com/easysoft/zentaoatf/internal/pkg/helper/websocket"
雨爱无痕 已提交
12 13
	serverConfig "github.com/easysoft/zentaoatf/internal/server/config"
	serverDomain "github.com/easysoft/zentaoatf/internal/server/modules/v1/domain"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
14
	"github.com/easysoft/zentaoatf/internal/server/modules/v1/service"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
15 16
	i118Utils "github.com/easysoft/zentaoatf/pkg/lib/i118"
	logUtils "github.com/easysoft/zentaoatf/pkg/lib/log"
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
17
	"github.com/fatih/color"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
18
	"github.com/kataras/iris/v12"
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
19 20 21 22 23 24 25
	"github.com/kataras/iris/v12/websocket"
)

var (
	ch chan int
)

26
type WebSocketCtrl struct {
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
27
	Namespace         string
28
	WorkspaceService  *service.WorkspaceService `inject:""`
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
29 30 31
	*websocket.NSConn `stateless:"true"`
}

32 33
func NewWebSocketCtrl() *WebSocketCtrl {
	inst := &WebSocketCtrl{Namespace: serverConfig.WsDefaultNameSpace}
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
34 35 36
	return inst
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
37
func (c *WebSocketCtrl) OnNamespaceConnected(wsMsg websocket.Message) error {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38
	websocketHelper.SetConn(c.Conn)
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
39

aaronchen2k2k's avatar
aaronchen2k2k 已提交
40
	logUtils.Infof(i118Utils.Sprintf("ws_namespace_connected", c.Conn.ID(), wsMsg.Room))
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
41

aaronchen2k2k's avatar
aaronchen2k2k 已提交
42
	resp := commDomain.WsResp{Msg: "from server: connected to websocket"}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43
	bytes, _ := json.Marshal(resp)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
44
	mqData := commDomain.MqMsg{Namespace: wsMsg.Namespace, Room: wsMsg.Room, Event: wsMsg.Event, Content: string(bytes)}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
45
	websocketHelper.PubMsg(mqData)
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
46 47 48 49 50
	return nil
}

// OnNamespaceDisconnect
// This will call the "OnVisit" event on all clients, except the current one,
aaronchen2k2k's avatar
aaronchen2k2k 已提交
51
// it can't because it's left but for any case use this type of design.
aaronchen2k2k's avatar
aaronchen2k2k 已提交
52
func (c *WebSocketCtrl) OnNamespaceDisconnect(wsMsg websocket.Message) error {
aaronchen2k2k's avatar
i118  
aaronchen2k2k 已提交
53
	logUtils.Infof(i118Utils.Sprintf("ws_namespace_disconnected", c.Conn.ID()))
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
54

aaronchen2k2k's avatar
aaronchen2k2k 已提交
55
	resp := commDomain.WsResp{Msg: fmt.Sprintf("ws_connected")}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
56
	bytes, _ := json.Marshal(resp)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
57
	mqData := commDomain.MqMsg{Namespace: wsMsg.Namespace, Room: wsMsg.Room, Event: wsMsg.Event, Content: string(bytes)}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
58
	websocketHelper.PubMsg(mqData)
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
59 60 61
	return nil
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
62 63
// OnChat This will call the "OnVisit" event on all clients,
// including the current one, with the 'newCount' variable.
64
func (c *WebSocketCtrl) OnChat(wsMsg websocket.Message) (err error) {
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
65
	ctx := websocket.GetContext(c.Conn)
aaronchen2k2k's avatar
i118  
aaronchen2k2k 已提交
66
	logUtils.Infof(i118Utils.Sprintf("ws_onchat", ctx.RemoteAddr(), wsMsg.Room, string(wsMsg.Body)))
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
67

aaronchen2k2k's avatar
aaronchen2k2k 已提交
68
	req := serverDomain.WsReq{}
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
69
	err = json.Unmarshal(wsMsg.Body, &req)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
70
	if err != nil {
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
71
		msg := i118Utils.Sprintf("wrong_req_params", err.Error())
aaronchen2k2k's avatar
aaronchen2k2k 已提交
72
		websocketHelper.SendExecMsg(msg, "", commConsts.Error, nil, &wsMsg)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
73
		logUtils.ExecConsole(color.FgRed, msg)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
74 75
		return
	}
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
76

aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
77
	act := req.Act
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
78 79 80

	if act == commConsts.ExecInit {
		msg := i118Utils.Sprintf("success_to_conn")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81
		//websocketHelper.SendExecMsg(msg, strconv.FormatBool(execHelper.GetRunning()), wsMsg)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
82 83 84 85
		logUtils.ExecConsole(color.FgCyan, msg)
		return
	}

雨爱无痕 已提交
86 87 88 89 90
	if act == commConsts.Watch {
		watchHelper.WatchFromReq(req.TestSets, &wsMsg)
		return
	}

aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
91
	if act == commConsts.ExecStop {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
92
		if ch != nil {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93
			if !execHelper.GetRunning() {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
94 95 96 97 98
				ch = nil
			} else {
				ch <- 1
				ch = nil
			}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
99
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
100

aaronchen2k2k's avatar
aaronchen2k2k 已提交
101
		execHelper.SetRunning(false)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
102

aaronchen2k2k's avatar
aaronchen2k2k 已提交
103
		msg := i118Utils.Sprintf("end_task")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
104
		websocketHelper.SendExecMsg(msg, "false", commConsts.Run, nil, &wsMsg)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
105 106 107 108
		logUtils.ExecConsole(color.FgCyan, msg)
		return
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
109
	if execHelper.GetRunning() && (act == commConsts.ExecCase || act == commConsts.ExecModule ||
aaronchen2k2k's avatar
aaronchen2k2k 已提交
110
		act == commConsts.ExecSuite || act == commConsts.ExecTask || act == commConsts.ExecUnit) {
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
111
		msg := i118Utils.Sprintf("pls_stop_previous")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
112
		websocketHelper.SendExecMsg(msg, "true", commConsts.Run, nil, &wsMsg)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
113 114
		logUtils.ExecConsole(color.FgRed, msg)

aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
115
		return
aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
116 117
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
118 119
	// populate test set's props with parent
	execHelper.PopulateTestSetProps(&req)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
120 121
	for idx, _ := range req.TestSets {
		testSet := &req.TestSets[idx]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122

aaronchen2k2k's avatar
aaronchen2k2k 已提交
123
		if testSet.WorkspaceId != 0 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
124
			po, _ := c.WorkspaceService.Get(uint(testSet.WorkspaceId))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
125
			testSet.WorkspacePath = po.Path
aaronchen2k2k's avatar
aaronchen2k2k 已提交
126
			testSet.WorkspaceType = po.Type
aaronchen2k2k's avatar
aaronchen2k2k 已提交
127 128 129
		}
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
130
	ch = make(chan int, 1)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
131
	go func() {
132
		execHelper.Exec(ch, req, &wsMsg)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
133
		execHelper.SetRunning(false)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
134 135
	}()

aaronchen2k2k's avatar
aaronchen2k2k 已提交
136
	execHelper.SetRunning(true)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
137

aaronchen2k2k's avatar
aaronchen2k2k 已提交
138
	msg := i118Utils.Sprintf("start_task")
aaronchen2k2k's avatar
aaronchen2k2k 已提交
139 140
	websocketHelper.SendExecMsg(msg, "true", commConsts.Run,
		iris.Map{"status": "start-task"}, &wsMsg)
aaronchen2k2k's avatar
report  
aaronchen2k2k 已提交
141 142
	logUtils.ExecConsole(color.FgCyan, msg)

aaronchen2k2k's avatar
init  
aaronchen2k2k 已提交
143 144
	return
}