2 * Copyright (C) 2018 "IoT.bzh"
3 * Author Sebastien Douheret <sebastien@iot.bzh>
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
23 common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib"
24 "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1"
25 "github.com/gin-gonic/gin"
32 // getTargets returns all targets configuration
33 func (s *APIService) getTargets(c *gin.Context) {
34 c.JSON(http.StatusOK, s.targets.GetConfigArr())
37 // getTarget returns a specific target configuration
38 func (s *APIService) getTarget(c *gin.Context) {
39 id, err := s.targets.ResolveID(c.Param("id"))
41 common.APIError(c, err.Error())
44 f := s.targets.Get(id)
46 common.APIError(c, "Invalid id")
50 c.JSON(http.StatusOK, (*f).GetConfig())
53 // addTarget adds a new target to server config
54 func (s *APIService) addTarget(c *gin.Context) {
55 var cfgArg xsapiv1.TargetConfig
56 if c.BindJSON(&cfgArg) != nil {
57 common.APIError(c, "Invalid arguments")
61 // Retrieve session info
62 sess := s.sessions.Get(c)
64 common.APIError(c, "Unknown sessions")
68 s.Log.Debugln("Add target config: ", cfgArg)
70 newTgt, err := s.targets.Add(cfgArg, sess)
72 common.APIError(c, err.Error())
76 c.JSON(http.StatusOK, newTgt)
79 // delTarget deletes target from server config
80 func (s *APIService) delTarget(c *gin.Context) {
81 id, err := s.targets.ResolveID(c.Param("id"))
83 common.APIError(c, err.Error())
87 // Retrieve session info
88 sess := s.sessions.Get(c)
90 common.APIError(c, "Unknown sessions")
94 s.Log.Debugln("Delete target id ", id)
96 delEntry, err := s.targets.Delete(id, sess)
98 common.APIError(c, err.Error())
101 c.JSON(http.StatusOK, delEntry)
107 // getTgtTerms Get list of all terminals
108 func (s *APIService) getTgtTerms(c *gin.Context) {
109 id, err := s.targets.ResolveID(c.Param("id"))
111 common.APIError(c, err.Error())
115 res, err := s.targets.GetTerminalsArr(id)
117 common.APIError(c, err.Error())
121 c.JSON(http.StatusOK, res)
124 // getTgtTerm Get info a terminal
125 func (s *APIService) getTgtTerm(c *gin.Context) {
126 id, tid, err := s._decodeTermArgs(c)
128 common.APIError(c, err.Error())
132 iTerm, err := s.targets.GetTerminal(id, tid)
134 common.APIError(c, err.Error())
138 c.JSON(http.StatusOK, (*iTerm).GetConfig())
141 // createTgtTerm Create a new terminal
142 func (s *APIService) createTgtTerm(c *gin.Context) {
146 // updateTgtTerm Update terminal config
147 func (s *APIService) updateTgtTerm(c *gin.Context) {
148 var cfgArg xsapiv1.TerminalConfig
150 tgtID, termID, err := s._decodeTermArgs(c)
151 if tgtID == "" && err != nil {
152 common.APIError(c, err.Error())
155 if err := c.BindJSON(&cfgArg); err != nil {
156 common.APIError(c, "Invalid arguments")
162 if termID != "" && cfgArg.ID != termID {
163 common.APIError(c, "Invalid arguments, inconsistent terminal id ")
166 s.Log.Debugln("Add or Update terminal config: ", cfgArg)
167 term, err := s.targets.CreateUpdateTerminal(tgtID, cfgArg, false)
169 common.APIError(c, err.Error())
172 c.JSON(http.StatusOK, term)
175 // delTgtTerm Delete a terminal
176 func (s *APIService) delTgtTerm(c *gin.Context) {
178 tgtID, termID, err := s._decodeTermArgs(c)
180 common.APIError(c, err.Error())
183 term, err := s.targets.DeleteTerminal(tgtID, termID)
185 common.APIError(c, err.Error())
189 c.JSON(http.StatusOK, term)
192 // openTgtTerm Open a target terminal/console
193 func (s *APIService) openTgtTerm(c *gin.Context) {
195 id, tid, err := s._decodeTermArgs(c)
197 common.APIError(c, err.Error())
201 // Retrieve session info
202 sess := s.sessions.Get(c)
204 common.APIError(c, "Unknown sessions")
208 term, err := s.targets.OpenTerminal(id, tid, sess)
210 common.APIError(c, err.Error())
213 c.JSON(http.StatusOK, term)
216 // closeTgtTerm Close a terminal
217 func (s *APIService) closeTgtTerm(c *gin.Context) {
218 id, tid, err := s._decodeTermArgs(c)
220 common.APIError(c, err.Error())
224 // Retrieve session info
225 sess := s.sessions.Get(c)
227 common.APIError(c, "Unknown sessions")
231 term, err := s.targets.CloseTerminal(id, tid, sess)
233 common.APIError(c, err.Error())
236 c.JSON(http.StatusOK, term)
239 // resizeTgtTerm Resize a terminal
240 func (s *APIService) resizeTgtTerm(c *gin.Context) {
241 var sizeArg xsapiv1.TerminalResizeArgs
243 id, tid, err := s._decodeTermArgs(c)
245 common.APIError(c, err.Error())
248 if err := c.BindJSON(&sizeArg); err != nil {
249 common.APIError(c, "Invalid arguments")
253 // Retrieve session info
254 sess := s.sessions.Get(c)
256 common.APIError(c, "Unknown sessions")
260 term, err := s.targets.ResizeTerminal(id, tid, sizeArg.Cols, sizeArg.Rows, sess)
262 common.APIError(c, err.Error())
265 c.JSON(http.StatusOK, term)
268 // signalTgtTerm Send a signal to a terminal
269 func (s *APIService) signalTgtTerm(c *gin.Context) {
270 var sigArg xsapiv1.TerminalSignalArgs
272 id, tid, err := s._decodeTermArgs(c)
274 common.APIError(c, err.Error())
278 sigName := c.Param("sig")
280 if err := c.BindJSON(&sigArg); err != nil {
281 common.APIError(c, "Invalid arguments")
284 sigName = sigArg.Signal
287 common.APIError(c, "Invalid arguments")
291 if err := s.targets.SignalTerminal(id, tid, sigName); err != nil {
292 common.APIError(c, err.Error())
296 c.JSON(http.StatusOK, "")
299 // _decodeTermArgs Helper to decode arguments of Terminal routes
300 func (s *APIService) _decodeTermArgs(c *gin.Context) (string, string, error) {
301 id, err := s.targets.ResolveID(c.Param("id"))
306 termID, err := s.targets.ResolveTerminalID(c.Param("tid"))
311 return id, termID, nil