X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fagent%2Fapiv1-targets.go;h=425634d1d2f91b7e25c55b8f109187053a5bfa61;hb=247bb7c2db5f0d48178398599348249bf886ebbc;hp=5a7862a8275362d5d3b9ecab539b755b1a301857;hpb=befb10519daefcbee85950a4e574678fe4b7f402;p=src%2Fxds%2Fxds-agent.git diff --git a/lib/agent/apiv1-targets.go b/lib/agent/apiv1-targets.go index 5a7862a..425634d 100644 --- a/lib/agent/apiv1-targets.go +++ b/lib/agent/apiv1-targets.go @@ -18,11 +18,12 @@ package agent import ( + "encoding/json" "fmt" "net/http" - "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent/lib/xaapiv1" - common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git/golib" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1" + common "gerrit.automotivelinux.org/gerrit/src/xds/xds-common.git" "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1" "github.com/franciscocpg/reflectme" "github.com/gin-gonic/gin" @@ -52,6 +53,110 @@ func (s *APIService) targetsPassthroughInit(svr *XdsServer) error { return nil } +// targetsEventsForwardInit Register events forwarder for targets +func (s *APIService) targetsEventsForwardInit(svr *XdsServer) error { + + if !svr.Connected { + return fmt.Errorf("Cannot register events: XDS Server %v not connected", svr.ID) + } + + // Forward Target events from XDS-server to client + if _, err := svr.EventOn(xsapiv1.EVTTargetAdd, xaapiv1.EVTTargetAdd, s._targetsEventCB); err != nil { + s.Log.Errorf("XDS Server EventOn '%s' failed: %v", xsapiv1.EVTTargetAdd, err) + return err + } + if _, err := svr.EventOn(xsapiv1.EVTTargetRemove, xaapiv1.EVTTargetRemove, s._targetsEventCB); err != nil { + s.Log.Errorf("XDS Server EventOn '%s' failed: %v", xsapiv1.EVTTargetRemove, err) + return err + } + if _, err := svr.EventOn(xsapiv1.EVTTargetStateChange, xaapiv1.EVTTargetStateChange, s._targetsEventCB); err != nil { + s.Log.Errorf("XDS Server EventOn '%s' failed: %v", xsapiv1.EVTTargetStateChange, err) + return err + } + + return nil +} + +func (s *APIService) _targetsEventCB(privD interface{}, data interface{}) error { + evt := xsapiv1.EventMsg{} + d, err := json.Marshal(data) + if err != nil { + s.Log.Errorf("Cannot marshal XDS Server Target event err=%v, data=%v", err, data) + return err + } + if err = json.Unmarshal(d, &evt); err != nil { + s.Log.Errorf("Cannot unmarshal XDS Server Target event err=%v, d=%v", err, string(d)) + return err + } + + // assume that xsapiv1.TargetConfig == xaapiv1.TargetConfig + target, err := evt.DecodeTargetEvent() + if err != nil { + s.Log.Errorf("Cannot decode XDS Server Target event: err=%v, data=%v", err, data) + return err + } + + evtName := privD.(string) + + if err := s.events.Emit(evtName, target, ""); err != nil { + s.Log.Warningf("Cannot notify %s (from server): %v", evtName, err) + return err + } + return nil +} + +// terminalsEventsForwardInit Register events forwarder for terminals +func (s *APIService) terminalsEventsForwardInit(svr *XdsServer) error { + + if !svr.Connected { + return fmt.Errorf("Cannot register events: XDS Server %v not connected", svr.ID) + } + + // Forward Terminal events from XDS-server to client + if _, err := svr.EventOn(xsapiv1.EVTTargetTerminalAdd, xaapiv1.EVTTargetTerminalAdd, s._terminalsEventCB); err != nil { + s.Log.Errorf("XDS Server EventOn '%s' failed: %v", xsapiv1.EVTTargetTerminalAdd, err) + return err + } + if _, err := svr.EventOn(xsapiv1.EVTTargetTerminalRemove, xaapiv1.EVTTargetTerminalRemove, s._terminalsEventCB); err != nil { + s.Log.Errorf("XDS Server EventOn '%s' failed: %v", xsapiv1.EVTTargetTerminalRemove, err) + return err + } + if _, err := svr.EventOn(xsapiv1.EVTTargetTerminalStateChange, xaapiv1.EVTTargetTerminalStateChange, s._terminalsEventCB); err != nil { + s.Log.Errorf("XDS Server EventOn '%s' failed: %v", xsapiv1.EVTTargetTerminalStateChange, err) + return err + } + + return nil +} + +func (s *APIService) _terminalsEventCB(privD interface{}, data interface{}) error { + evt := xsapiv1.EventMsg{} + d, err := json.Marshal(data) + if err != nil { + s.Log.Errorf("Cannot marshal XDS Server Target event err=%v, data=%v", err, data) + return err + } + if err = json.Unmarshal(d, &evt); err != nil { + s.Log.Errorf("Cannot unmarshal XDS Server Target event err=%v, d=%v", err, string(d)) + return err + } + + // assume that xsapiv1.TargetConfig == xaapiv1.TargetConfig + target, err := evt.DecodeTerminalEvent() + if err != nil { + s.Log.Errorf("Cannot decode XDS Server Target event: err=%v, data=%v", err, data) + return err + } + + evtName := privD.(string) + + if err := s.events.Emit(evtName, target, ""); err != nil { + s.Log.Warningf("Cannot notify %s (from server): %v", evtName, err) + return err + } + return nil +} + // GetServerFromTargetID Retrieve XDS Server definition from a target ID func (s *APIService) GetServerFromTargetID(targetID, termID string) (*XdsServer, string, error) {