diff options
-rw-r--r-- | gobgpd/main.go | 2 | ||||
-rw-r--r-- | openswitch/openswitch.go | 42 |
2 files changed, 43 insertions, 1 deletions
diff --git a/gobgpd/main.go b/gobgpd/main.go index 4fdd75d5..17bf68f3 100644 --- a/gobgpd/main.go +++ b/gobgpd/main.go @@ -161,7 +161,7 @@ func main() { log.Errorf("Failed to start ops config manager: %s", err) os.Exit(1) } - go m.Serve() + m.Serve() } else if opts.ConfigFile != "" { go config.ReadConfigfileServe(opts.ConfigFile, opts.ConfigType, configCh, reloadCh) reloadCh <- true diff --git a/openswitch/openswitch.go b/openswitch/openswitch.go index 007b8178..4ed77f47 100644 --- a/openswitch/openswitch.go +++ b/openswitch/openswitch.go @@ -239,6 +239,12 @@ func (m *OpsManager) handleNeighborUpdate(update ovsdb.TableUpdate) []*server.Gr } func (m *OpsManager) Serve() error { + go m.OpsServe() + go m.GobgpServe() + return nil +} + +func (m *OpsManager) OpsServe() error { initial, err := m.client.MonitorAll("OpenSwitch", "") if err != nil { return err @@ -297,6 +303,42 @@ func (m *OpsManager) Serve() error { return nil } +func (m *OpsManager) GobgpServe() error { + family := bgp.RF_IPv4_UC + arg := &api.Arguments{ + Resource: api.Resource_GLOBAL, + Family: uint32(family), + } + + stream, err := client.MonitorBestChanged(context.Background(), arg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + for { + d, err := stream.Recv() + if err == io.EOF { + break + } else if err != nil { + fmt.Println(err) + os.Exit(1) + } + p, err := ApiStruct2Path(d.Paths[0]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if globalOpts.Json { + j, _ := json.Marshal(p) + fmt.Println(string(j)) + } else { + ShowRoute(p, false, false, false, true, false) + } + } + return nil +} + func NewOpsManager(ch chan *server.GrpcRequest) (*OpsManager, error) { cli, err := ovsdb.ConnectUnix("") if err != nil { |