...
1 package host
2
3 import (
4 "net/http"
5 "time"
6
7 "github.com/gin-gonic/gin"
8 "github.com/gin-gonic/gin/binding"
9
10 "edge-infra.dev/pkg/sds/interlock/topic"
11 )
12
13
14
15
16 type VNCStatus string
17
18
19 type VNC struct {
20
21 RequestID string `json:"requestId"`
22
23 Status VNCStatus `json:"status"`
24
25 Connections int `json:"connections"`
26
27 TimeStamp string `json:"timestamp"`
28 }
29
30
31
32
33 type VNCStates []VNC
34
35 const (
36 Requested VNCStatus = "REQUESTED"
37 Accepted VNCStatus = "ACCEPTED"
38 Suspended VNCStatus = "SUSPENDED"
39 Rejected VNCStatus = "REJECTED"
40 Dropped VNCStatus = "DROPPED"
41 Connected VNCStatus = "CONNECTED"
42 )
43
44
45
46 func (h *Host) VNCPost(c *gin.Context) {
47 err := h.topic.UpdateState(
48 func(state interface{}) error {
49 var payload postVNCPayload
50 if err := c.ShouldBindWith(&payload, binding.JSON); err != nil {
51 return err
52 }
53 hostState := state.(*State)
54 updateStateVNC(hostState, payload)
55 c.JSON(http.StatusAccepted, state)
56 return nil
57 },
58 )
59 if err != nil {
60 topic.HandleBindingError(c, err)
61 return
62 }
63 }
64
65
66
67
68
69
70 func updateStateVNC(hostState *State, payload postVNCPayload) {
71
72 timestamp := payload.TimeStamp
73 if timestamp.IsZero() {
74 timestamp = time.Now()
75 }
76
77 val := VNC{
78 RequestID: payload.RequestID,
79 Status: payload.Status,
80 Connections: payload.Connections,
81 TimeStamp: timestamp.Format(time.RFC3339),
82 }
83
84
85 for i, vnc := range hostState.VNC {
86
87 if vnc.RequestID != payload.RequestID {
88 continue
89 }
90
91 if payload.Status == Dropped {
92 hostState.VNC = removeVNC(hostState.VNC, i)
93 return
94 }
95
96 hostState.VNC[i] = val
97 return
98 }
99
100
101 if payload.Status == Dropped {
102 return
103 }
104
105 hostState.VNC = append(hostState.VNC, val)
106 }
107
108 func removeVNC(vncs VNCStates, i int) VNCStates {
109 return append(vncs[:i], vncs[i+1:]...)
110 }
111
112
113
114 func (h *Host) VNCPut(c *gin.Context) {
115 err := h.topic.UpdateState(
116 func(state interface{}) error {
117 var payload putVNCPayloads
118 if err := c.ShouldBindWith(&payload, binding.JSON); err != nil {
119 return err
120 }
121 if err := payload.validateRequestIDs(); err != nil {
122 return err
123 }
124 hostState := state.(*State)
125 hostState.VNC = []VNC{}
126 for _, p := range payload {
127 hostState.VNC = append(hostState.VNC, VNC{
128 RequestID: p.RequestID,
129 Status: p.Status,
130 Connections: p.Connections,
131 TimeStamp: p.TimeStamp.Format(time.RFC3339),
132 })
133 }
134 c.JSON(http.StatusAccepted, state)
135 return nil
136 },
137 )
138 if err != nil {
139 topic.HandleBindingError(c, err)
140 return
141 }
142 }
143
144
145
146
147
148
149
150 type VNCPostParams struct {
151
152 Body postVNCPayload
153 }
154
155
156
157
158
159
160
161
162
163
164
165
166 type VNCPutParams struct {
167
168 Body putVNCPayloads
169 }
170
171
172
173
174
175
176
177
178
View as plain text