/*
- * Copyright (C) 2017 "IoT.bzh"
+ * Copyright (C) 2017-2018 "IoT.bzh"
* Author Sebastien Douheret <sebastien@iot.bzh>
*
* Licensed under the Apache License, Version 2.0 (the "License");
import (
"fmt"
"strconv"
+ "strings"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent/lib/xaapiv1"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent/lib/xdsconfig"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
"github.com/gin-gonic/gin"
- "github.com/iotbzh/xds-agent/lib/xdsconfig"
)
const apiBaseURL = "/api/v1"
s.apiRouter.GET("/config", s.getConfig)
s.apiRouter.POST("/config", s.setConfig)
- s.apiRouter.GET("/browse", s.browseFS)
+ // s.apiRouter.GET("/browse", s.browseFS)
s.apiRouter.GET("/projects", s.getProjects)
s.apiRouter.GET("/projects/:id", s.getProject)
s.apiRouter.POST("/events/register", s.eventsRegister)
s.apiRouter.POST("/events/unregister", s.eventsUnRegister)
+ s.apiRouter.GET("/supervisor/topo", s.getSupervisorTopo)
+ s.apiRouter.POST("/supervisor/trace/start", s.startSupervisor)
+ s.apiRouter.POST("/supervisor/trace/stop", s.stopSupervisor)
return s
}
} else {
// Create a new server object
+ cfg.URLIndex = strconv.Itoa(s.serverIndex)
+ s.serverIndex = s.serverIndex + 1
if cfg.APIBaseURL == "" {
cfg.APIBaseURL = apiBaseURL
}
if cfg.APIPartialURL == "" {
- cfg.APIPartialURL = "/servers/" + strconv.Itoa(s.serverIndex)
- s.serverIndex = s.serverIndex + 1
+ cfg.APIPartialURL = "/servers/" + cfg.URLIndex
}
// Create a new XDS Server
svr.SetLoggerOutput(s.Config.LogVerboseOut)
- // Passthrough routes (handle by XDS Server)
+ // Define API group for this XDS Server
grp := s.apiRouter.Group(svr.PartialURL)
svr.SetAPIRouterGroup(grp)
- // Declare passthrough routes
+ // Define servers API processed locally
+ s.apiRouter.GET("/servers", s.getServersList) // API /servers
+ svr.apiRouter.GET("", s.getServer) // API /servers/:id
+ svr.apiRouter.POST("/reconnect", s.reconnectServer) // API /servers/:id/reconnect
+
+ // Declare passthrough API/routes
s.sdksPassthroughInit(svr)
+ s.targetsPassthroughInit(svr)
+
+ // Register callback on Connection
+ svr.ConnectOn(func(server *XdsServer) error {
+
+ // Add server to list
+ s.xdsServers[server.ID] = svr
+
+ // Register events forwarder
+ if err := s.sdksEventsForwardInit(server); err != nil {
+ s.Log.Errorf("XDS Server %v - sdk events forwarding error: %v", server.ID, err)
+ }
+ if err := s.targetsEventsForwardInit(server); err != nil {
+ s.Log.Errorf("XDS Server %v - target events forwarding error: %v", server.ID, err)
+ }
+ if err := s.terminalsEventsForwardInit(server); err != nil {
+ s.Log.Errorf("XDS Server %v - terminal events forwarding error: %v", server.ID, err)
+ }
+
+ // Load projects
+ if err := s.projects.Init(server); err != nil {
+ s.Log.Errorf("XDS Server %v - project init error: %v", server.ID, err)
+ }
+
+ // Registered to all events
+ if err := server.EventRegister(xsapiv1.EVTAll, ""); err != nil {
+ s.Log.Errorf("XDS Server %v - register all events error: %v", server.ID, err)
+ }
+
+ return nil
+ })
}
// Established connection
delete(s.xdsServers, cfg.ID)
}
- // Add to map
- s.xdsServers[svr.ID] = svr
-
- // Load projects
- if err == nil && svr.Connected {
- err = s.projects.Init(svr)
- }
-
return svr, err
}
s.xdsServers[id].Close()
return nil
}
+
+// UpdateXdsServer Update XDS Server configuration settings
+func (s *APIService) UpdateXdsServer(cfg xaapiv1.ServerCfg) error {
+ if _, exist := s.xdsServers[cfg.ID]; !exist {
+ return fmt.Errorf("Unknown Server ID %s", cfg.ID)
+ }
+
+ svr := s.xdsServers[cfg.ID]
+
+ // Update only some configurable fields
+ svr.ConnRetry = cfg.ConnRetry
+
+ return nil
+}
+
+// GetXdsServerFromURLIndex Retrieve XdsServer from URLIndex value
+func (s *APIService) GetXdsServerFromURLIndex(urlIdx string) *XdsServer {
+ for _, svr := range s.xdsServers {
+ if svr.URLIndex == urlIdx {
+ return svr
+ }
+ }
+ return nil
+}
+
+// ParamGetIndex Retrieve numerical parameter in request url
+func (s *APIService) ParamGetIndex(c *gin.Context) string {
+ uri := c.Request.RequestURI
+ for idx := strings.LastIndex(uri, "/"); idx > 0; {
+ id := uri[idx+1:]
+ if _, err := strconv.Atoi(id); err == nil {
+ return id
+ }
+ uri = uri[:idx]
+ idx = strings.LastIndex(uri, "/")
+ }
+ return ""
+}