/
server.go
114 lines (100 loc) · 2.65 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package terminal
import (
"github.com/fanux/fist/tools"
"github.com/wonderivan/logger"
"log"
"net/http"
"strconv"
"time"
"github.com/emicklei/go-restful"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
//Register is
func Register(container *restful.Container) {
terminal := new(restful.WebService)
terminal.
Path("/").
Consumes(restful.MIME_XML, restful.MIME_JSON).
Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well
terminal.Route(terminal.POST("/terminal").To(createTerminal))
terminal.Route(terminal.GET("/heartbeat").To(handleHeartbeat))
container.Add(terminal)
}
func createTerminal(request *restful.Request, response *restful.Response) {
t := newTerminal()
err := request.ReadEntity(t)
if err != nil {
tools.ResponseSystemError(response, err)
return
}
err = t.Create()
if err != nil {
tools.ResponseSystemError(response, err)
return
}
tools.ResponseSuccess(response, t)
}
func handleHeartbeat(request *restful.Request, response *restful.Response) {
//get client of k8s
tid := request.QueryParameter("tid")
if tid == "" {
tools.ResponseError(response, tools.ErrParamTidEmpty)
return
}
namespace := request.QueryParameter("namespace")
if namespace == "" {
namespace = DefaultTTYnameapace
}
var hbInterface Heartbeater
hbInterface = NewHeartbeater(tid, namespace)
err := hbInterface.UpdateTimestamp()
if err != nil {
tools.ResponseSystemError(response, err)
return
}
tools.ResponseSuccess(response, nil)
}
func cleanTerminal(namespace string) {
clientSet := tools.GetK8sClient()
deploymentsClient := clientSet.AppsV1().Deployments(namespace)
t := time.NewTicker(600 * time.Second) //every 10min check heartbeat
defer t.Stop()
for {
select {
case <-t.C:
logger.Info("timer running for cleanTerminal.")
list, err := deploymentsClient.List(metav1.ListOptions{})
if err != nil {
log.Fatal(err)
}
for _, d := range list.Items {
var hbInterface Heartbeater
hbInterface = NewHeartbeater(d.Name, namespace)
err := hbInterface.CleanTerminalJob()
if err != nil {
log.Fatal(err)
}
}
}
}
}
var (
//TerminalPort is cmd port param
TerminalPort uint16
)
//Serve start a terminal server
func Serve() {
LoadTerminalID()
wsContainer := restful.NewContainer()
wsContainer.Router(restful.CurlyRouter{})
Register(wsContainer)
//cors
tools.Cors(wsContainer)
//clean dead terminal
go cleanTerminal(DefaultTTYnameapace)
//process port for command
sPort := ":" + strconv.FormatUint(uint64(TerminalPort), 10)
logger.Info("start listening on localhost", sPort)
server := &http.Server{Addr: sPort, Handler: wsContainer}
log.Fatal(server.ListenAndServe())
}