diff --git a/README.md b/README.md index 59105d044..3d4bd41f5 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,31 @@ You can also build a debian package and install it: * See [SONiC telemetry in dial-out mode](./doc/dialout.md) for how to run dial-out mode system telemetry client * See [gNMI Usage Examples](./doc/gNMI_usage_examples.md) for gNMI client usage examples. +### Streaming events +SONiC publishes events of interest via gNMI. +Sample events could be bgp-state change, link-state change. +A sample query URL is as below. + `gnmi_cli -client_types=gnmi -a 127.0.0.1:50051 -t EVENTS -logtostderr -insecure -v 7 -streaming_type ON_CHANGE -q all -qt s` + +The events URL can take the following optional parameters.
+heartbeat:
+ `[heartbeat=]` +
+    The SONiC switch publishes periodic hearbeats when there are no events to publish.
+    The frequency of the heartbeat can be controlled by this parameter as beat in every N seconds.
+ +usecache:
+ `[usecache=true/false]` +
+    The SONiC switch does offline cache when gNMI client is down.
+    The cached events are delivered upon nest gNMI connection
+    Only one client should use the cache service
+    The cached events are delivered upon nest gNMI connection
+    If you are running test clients, use this param to turn off cache use.
+ +Sample URL:
+`gnmi_cli -client_types=gnmi -a 127.0.0.1:50051 -t EVENTS -logtostderr -insecure -v 7 -streaming_type ON_CHANGE -q all[heartbeat=5][usecache=false] -qt s` + ## Need Help? For general questions, setup help, or troubleshooting: diff --git a/gnmi_server/server_test.go b/gnmi_server/server_test.go index 96fac9758..3a0c0da82 100644 --- a/gnmi_server/server_test.go +++ b/gnmi_server/server_test.go @@ -2619,7 +2619,7 @@ func TestClient(t *testing.T) { rcv_timeout := sdc.SUBSCRIBER_TIMEOUT deinit_done := false - mock1 := gomonkey.ApplyFunc(sdc.C_init_subs, func() unsafe.Pointer { + mock1 := gomonkey.ApplyFunc(sdc.C_init_subs, func(use_cache bool) unsafe.Pointer { return nil }) defer mock1.Reset() @@ -2672,7 +2672,7 @@ func TestClient(t *testing.T) { }, } - sdc.C_init_subs() + sdc.C_init_subs(true) for _, tt := range tests { heartbeat = 0 diff --git a/sonic_data_client/events_client.go b/sonic_data_client/events_client.go index 0ac70279d..990b5daad 100644 --- a/sonic_data_client/events_client.go +++ b/sonic_data_client/events_client.go @@ -56,6 +56,7 @@ const TEST_EVENT = "{\"sonic-host:device-test-event" // Path parameter const PARAM_HEARTBEAT = "heartbeat" const PARAM_QSIZE = "qsize" +const PARAM_USE_CACHE = "usecache" type EventClient struct { @@ -90,12 +91,13 @@ func Set_heartbeat(val int) { } } -func C_init_subs() unsafe.Pointer { - return C.events_init_subscriber_wrap(true, C.int(SUBSCRIBER_TIMEOUT)) +func C_init_subs(use_cache bool) unsafe.Pointer { + return C.events_init_subscriber_wrap(C.bool(use_cache), C.int(SUBSCRIBER_TIMEOUT)) } func NewEventClient(paths []*gnmipb.Path, prefix *gnmipb.Path, logLevel int) (Client, error) { var evtc EventClient + use_cache := true evtc.prefix = prefix evtc.pq_max = PQ_DEF_SIZE log.V(4).Infof("Events priority Q max set default = %v", evtc.pq_max) @@ -132,6 +134,11 @@ func NewEventClient(paths []*gnmipb.Path, prefix *gnmipb.Path, logLevel int) (Cl evtc.pq_max = val log.V(7).Infof("Events priority Q max set by qsize param = %v", evtc.pq_max) } + } else if (k == PARAM_USE_CACHE) { + if strings.ToLower(v) == "false" { + use_cache = false + log.V(7).Infof("Cache use is turned off") + } } } } @@ -139,7 +146,7 @@ func NewEventClient(paths []*gnmipb.Path, prefix *gnmipb.Path, logLevel int) (Cl C.swssSetLogPriority(C.int(logLevel)) /* Init subscriber with cache use and defined time out */ - evtc.subs_handle = C_init_subs() + evtc.subs_handle = C_init_subs(use_cache) evtc.stopped = 0 /* Init list & counters */