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 */