func (m *OpsManager) GobgpMonitor(ready *bool) { time.Sleep(time.Duration(time.Second * 2)) reqCh := m.grpcCh family := bgp.RF_IPv4_UC arg := &api.Arguments{ Resource: api.Resource_GLOBAL, Family: uint32(family), } for { if !*ready { return } req := server.NewGrpcRequest(server.REQ_MONITOR_GLOBAL_BEST_CHANGED, "", bgp.RouteFamily(0), arg) reqCh <- req res := <-req.ResponseCh if err := res.Err(); err != nil { log.WithFields(log.Fields{ "Topic": "openswitch", "Type": "Monitor", "RequestType": req.RequestType, "Err": err, }).Error("grpc operation failed") } d := res.Data.(*api.Destination) bPath := d.Paths[0] if bPath.IsFromExternal && !bPath.IsWithdraw { continue } p, err := cmd.ApiStruct2Path(bPath) if err != nil { log.WithFields(log.Fields{ "Topic": "openswitch", "Type": "MonitorRequest", "Err": err, }).Error("failed parse path of gobgp") } o, err := m.TransactPreparation(p) if err != nil { log.WithFields(log.Fields{ "Topic": "openswitch", "Type": "Monitor", "Err": err, }).Error("failed transact preparation of ops") } m.opsCh <- o } }
func (m *OpsManager) GobgpMonitor(target string) { time.Sleep(time.Duration(time.Second * 2)) conn, err := grpc.Dial(target, grpc.WithTimeout(time.Second), grpc.WithBlock(), grpc.WithInsecure()) if err != nil { log.Fatal(err) } cli := api.NewGobgpApiClient(conn) stream, err := cli.MonitorRib(context.Background(), &api.Table{ Type: api.Resource_GLOBAL, Family: uint32(bgp.RF_IPv4_UC), }) for { d, err := stream.Recv() bPath := d.Paths[0] if bPath.IsFromExternal && !bPath.IsWithdraw { continue } p, err := cmd.ApiStruct2Path(bPath) if err != nil { log.WithFields(log.Fields{ "Topic": "openswitch", "Type": "MonitorRequest", "Error": err, }).Error("failed parse path of gobgp") } o, err := m.TransactPreparation(p) if err != nil { log.WithFields(log.Fields{ "Topic": "openswitch", "Type": "Monitor", "Error": err, }).Error("failed transact preparation of ops") } m.opsCh <- o } }
func Test_createRequestFromIPRouteMessage(t *testing.T) { assert := assert.New(t) m := &zebra.Message{} h := &zebra.Header{ Len: zebra.HEADER_SIZE, Marker: zebra.HEADER_MARKER, Version: zebra.VERSION, Command: zebra.IPV4_ROUTE_ADD, } b := &zebra.IPRouteBody{ Type: zebra.ROUTE_TYPE(zebra.ROUTE_STATIC), Flags: zebra.FLAG(zebra.FLAG_SELECTED), Message: zebra.MESSAGE_NEXTHOP | zebra.MESSAGE_DISTANCE | zebra.MESSAGE_METRIC, SAFI: zebra.SAFI(zebra.SAFI_UNICAST), Prefix: net.ParseIP("192.168.100.0"), PrefixLength: uint8(24), Nexthops: []net.IP{net.ParseIP("0.0.0.0")}, Ifindexs: []uint32{1}, Distance: uint8(0), Metric: uint32(100), Api: zebra.API_TYPE(zebra.IPV4_ROUTE_ADD), } m.Header = *h m.Body = b p := createRequestFromIPRouteMessage(m) assert.NotNil(p) paths, err := cmd.ApiStruct2Path(p.Path) assert.Nil(err) assert.Equal(len(paths), 1) path := paths[0] pp := table.NewPath(nil, path.Nlri, path.IsWithdraw, path.PathAttrs, time.Now(), false) pp.SetIsFromExternal(p.Path.IsFromExternal) assert.Equal("0.0.0.0", pp.GetNexthop().String()) assert.Equal("192.168.100.0/24", pp.GetNlri().String()) assert.True(pp.IsFromExternal()) assert.False(pp.IsWithdraw) // withdraw h.Command = zebra.IPV4_ROUTE_DELETE m.Header = *h p = createRequestFromIPRouteMessage(m) assert.NotNil(p) paths, err = cmd.ApiStruct2Path(p.Path) assert.Nil(err) assert.Equal(len(paths), 1) path = paths[0] pp = table.NewPath(nil, path.Nlri, path.IsWithdraw, path.PathAttrs, time.Now(), false) pp.SetIsFromExternal(p.Path.IsFromExternal) assert.Equal("0.0.0.0", pp.GetNexthop().String()) assert.Equal("192.168.100.0/24", pp.GetNlri().String()) med, _ := pp.GetMed() assert.Equal(uint32(100), med) assert.True(pp.IsFromExternal()) assert.True(pp.IsWithdraw) // IPv6 h.Command = zebra.IPV6_ROUTE_ADD b.Prefix = net.ParseIP("2001:db8:0:f101::") b.PrefixLength = uint8(64) b.Nexthops = []net.IP{net.ParseIP("::")} m.Header = *h m.Body = b p = createRequestFromIPRouteMessage(m) assert.NotNil(p) paths, err = cmd.ApiStruct2Path(p.Path) assert.Nil(err) assert.Equal(len(paths), 1) path = paths[0] pp = table.NewPath(nil, path.Nlri, path.IsWithdraw, path.PathAttrs, time.Now(), false) pp.SetIsFromExternal(p.Path.IsFromExternal) assert.Equal("::", pp.GetNexthop().String()) assert.Equal("2001:db8:0:f101::/64", pp.GetNlri().String()) med, _ = pp.GetMed() assert.Equal(uint32(100), med) assert.True(pp.IsFromExternal()) assert.False(pp.IsWithdraw) // withdraw h.Command = zebra.IPV6_ROUTE_DELETE m.Header = *h p = createRequestFromIPRouteMessage(m) assert.NotNil(p) paths, err = cmd.ApiStruct2Path(p.Path) assert.Nil(err) assert.Equal(len(paths), 1) path = paths[0] pp = table.NewPath(nil, path.Nlri, path.IsWithdraw, path.PathAttrs, time.Now(), false) pp.SetIsFromExternal(p.Path.IsFromExternal) assert.Equal("::", pp.GetNexthop().String()) assert.Equal("2001:db8:0:f101::/64", pp.GetNlri().String()) assert.True(pp.IsFromExternal()) assert.True(pp.IsWithdraw) }