X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Fxds%2Fxds-agent.git;a=blobdiff_plain;f=lib%2Fagent%2Fapiv1.go;h=4637bc43c00015a5f2a8dab85c95cff6e840af08;hp=77b05baeaa966ebbb8c10d7d5c0912c9b22a4fd7;hb=247bb7c2db5f0d48178398599348249bf886ebbc;hpb=2d90eac319979dba64371258b30e61e77a15db7d diff --git a/lib/agent/apiv1.go b/lib/agent/apiv1.go index 77b05ba..4637bc4 100644 --- a/lib/agent/apiv1.go +++ b/lib/agent/apiv1.go @@ -1,14 +1,34 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Sebastien Douheret + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package agent import ( "fmt" "strconv" + "strings" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/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" +const apiBaseURL = "/api/v1" // APIService . type APIService struct { @@ -21,7 +41,7 @@ type APIService struct { func NewAPIV1(ctx *Context) *APIService { s := &APIService{ Context: ctx, - apiRouter: ctx.webServer.router.Group(apiBaseUrl), + apiRouter: ctx.webServer.router.Group(apiBaseURL), serverIndex: 0, } @@ -30,13 +50,14 @@ func NewAPIV1(ctx *Context) *APIService { 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("/project/:id", s.getProject) - s.apiRouter.POST("/project", s.addProject) - s.apiRouter.POST("/project/sync/:id", s.syncProject) - s.apiRouter.DELETE("/project/:id", s.delProject) + s.apiRouter.GET("/projects/:id", s.getProject) + s.apiRouter.PUT("/projects/:id", s.updateProject) + s.apiRouter.POST("/projects", s.addProject) + s.apiRouter.POST("/projects/sync/:id", s.syncProject) + s.apiRouter.DELETE("/projects/:id", s.delProject) s.apiRouter.POST("/exec", s.execCmd) s.apiRouter.POST("/exec/:id", s.execCmd) @@ -46,6 +67,9 @@ func NewAPIV1(ctx *Context) *APIService { 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 } @@ -79,12 +103,13 @@ func (s *APIService) AddXdsServer(cfg xdsconfig.XDSServerConf) (*XdsServer, erro } else { // Create a new server object + cfg.URLIndex = strconv.Itoa(s.serverIndex) + s.serverIndex = s.serverIndex + 1 if cfg.APIBaseURL == "" { - cfg.APIBaseURL = apiBaseUrl + cfg.APIBaseURL = apiBaseURL } if cfg.APIPartialURL == "" { - cfg.APIPartialURL = "/server/" + strconv.Itoa(s.serverIndex) - s.serverIndex = s.serverIndex + 1 + cfg.APIPartialURL = "/servers/" + cfg.URLIndex } // Create a new XDS Server @@ -92,11 +117,48 @@ func (s *APIService) AddXdsServer(cfg xdsconfig.XDSServerConf) (*XdsServer, erro 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) - svr.PassthroughGet("/sdks") - svr.PassthroughGet("/sdk/:id") + + // 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 @@ -107,14 +169,6 @@ func (s *APIService) AddXdsServer(cfg xdsconfig.XDSServerConf) (*XdsServer, erro 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 } @@ -127,3 +181,41 @@ func (s *APIService) DelXdsServer(id string) error { 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 "" +}