gNMI Service API
- class ydk.gnmi.services.gNMIService
Supports gNMI Set/Get/Subscribe operations on model API entities. It also allows to get gNMI server capabilities.
- set(provider, entity)
Create, update, or delete single entity or multiple entities in the server configuration.
- Parameters:
provider – (
gNMIServiceProvider
) Provider instance.entity –
(
Entity
) instance, which represents single container in device supported model. Each Entity instance must be annotated withYFilter
, which defines set operation:YFilter.replace - add new configuration or replace the whole configuration tree
YFilter.update - update or create configuration in existing tree
YFilter.delete - delete part or entire configuration tree
For multiple containers the
Entity
instances must be encapsulated into Pythonlist
or YDKEntityCollection
Config
.
- Returns:
True
if successful,False
if not.- Raises:
YServiceProviderError
if an error has occurred.
- get(provider, read_filter, read_mode='CONFIG')
Read the entity.
- Parameters:
provider – (
gNMIServiceProvider
) Provider instance.read_filter –
(
Entity
) instance, which represents single container in device supported model.For multiple containers the
Entity
instances must be encapsulated into Pythonlist
or YDKEntityCollection
Filter
.read_mode – (
str
) One of the values:CONFIG
,STATE
,OPERATIONAL
, orALL
.
- Returns:
For single entity filter - an instance of
Entity
as identified by the read_filter orNone
, if operation fails.For multiple filters - collection of
Entity
instances encapsulated into Pythonlist
or YDKEntityCollection
Config
accordingly to the type of read_filter.- Raises:
YServiceProviderError
if an error has occurred.
- subscribe(provider, subscription, qos=0, mode='ONCE, encoding='PROTO', callback_function=None)
Subscribe to telemetry updates.
- Parameters:
provider – (
gNMIServiceProvider
) Provider instance.subscription – (
gNMISubscription
) Single instance or Pythonlist
of instances of objects, which represent the subscription.qos – (
long
) QOS indicating the packet marking.mode – (
str
) Subscription mode: one ofSTREAM
,ONCE
orPOLL
.encoding – (
str
) Encoding method for the output: one ofJSON
,BYTES
,PROTO
,ASCII
, orJSON_IETF
.callback_function – (
func(str)
) Callback function, which is used to process the subscription data. The subscription data returned to the user as a string representation of protobuf SubscribeResponse message. If not specified, the response is printed to system stdout.
- Raises:
YServiceProviderError
if an error has occurred.
- capabilities(provider)
Get gNMI server capabilities
- Parameters:
provider – (
gNMIServiceProvider
) Provider instance.- Returns:
(
str
) JSON encoded string, which represents gNMI server capabilities.
- class ydk.gnmi.services.gNMISubscription
Instance of this class defines subscription for a single entity. Members of the class are:
entity: (
Entity
) Instance of the subscription entity. This parameter must be set by the user.subscription_mode: (
str
) Expected one of the following string values:TARGET_DEFINED
,ON_CHANGE
, orSAMPLE
; default value isON_CHANGE
.sample_interval: (
long
) Time interval in nanoseconds between samples inSTREAM
mode; default value is 60000000000 (1 minute).suppress_redundant: (
bool
) Indicates whether values that not changed should be sent in aSTREAM
subscription; default value isFalse
heartbeat_interval: (
long
) Specifies the maximum allowable silent period in nanoseconds when suppress_redundant is True. If not specified, the heartbeat_interval is set to 360000000000 (10 minutes) or sample_interval whatever is bigger.
gNMI Service Examples
To enable YDK logging include the following code:
1import logging
2logger = logging.getLogger("ydk")
3logger.setLevel(logging.INFO)
4handler = logging.StreamHandler()
5formatter = logging.Formatter(("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
6handler.setFormatter(formatter)
7logger.addHandler(handler)
To enable GRPC trace set environment variables as followed:
1export GRPC_VERBOSITY=debug
2export GRPC_TRACE=transport_security
gNMI ‘set’ example
Example of instantiating and using objects of gNMIServiceProvider
with gNMIService
is shown below (assuming you have openconfig
bundle installed).
1from ydk.models.openconfig import openconfig_bgp
2from ydk.path import Repository
3from ydk.gnmi.providers import gNMIServiceProvider
4from ydk.gnmi.services import gNMIService
5
6repository = Repository('/Users/test/yang_models_location')
7provider = gNMIServiceProvider(repo=repository, address='10.0.0.1', port=57400, username='admin', password='admin')
8gnmi_service = gNMIService()
9
10# Create entire BGP configuration
11bgp = openconfig_bgp.Bgp()
12bgp.global_.config.as_ = 65172
13neighbor = bgp.Neighbors.Neighbor()
14neighbor.neighbor_address = '172.16.255.2'
15neighbor.config.neighbor_address = '172.16.255.2'
16neighbor.config.peer_as = 65172
17bgp.neighbors.neighbor.append(neighbor)
18
19bgp.yfilter = YFilter.replace # Define set/create operation
20
21ok = gnmi_service.set(provider, bgp) # Perform create operation
22
23# Delete one neighbor
24bgp = openconfig_bgp.Bgp()
25neighbor = bgp.Neighbors.Neighbor()
26neighbor.neighbor_address = '172.16.255.2'
27bgp.neighbors.neighbor.append(neighbor)
28
29bgp.yfilter = YFilter.delete # Define set/delete operation
30
31ok = gnmi_service.set(provider, bgp) # Perform delete operation
gNMI ‘get’ example
Example of instantiating and using objects of gNMIServiceProvider
with gNMIService
is shown below (assuming you have openconfig
bundle installed).
1from ydk.models.openconfig import openconfig_bgp
2from ydk.path import Repository
3from ydk.gnmi.providers import gNMIServiceProvider
4from ydk.gnmi.services import gNMIService
5
6repository = Repository('/Users/test/yang_models_location')
7provider = gNMIServiceProvider(repo=repository, address='10.0.0.1', port=57400, username='admin', password='admin')
8gnmi_service = gNMIService()
9
10capabilities = provider.get_capabilities() # Get list of capabilities
11
12bgp = openconfig_bgp.Bgp()
13
14bgp_read = gnmi_service.get(provider, bgp) # Perform get operation
gNMI ‘subscribe’ example
Example of subscribing to telemetry using gNMIServiceProvider
with gNMIService
is shown below (assuming you have openconfig
bundle installed).
NOTE: The gNMIService
class can be used with multiprocessing.Pool
for the subscribe
operation as shown below as the subcription is a long-lived connection.
1from ydk.models.openconfig import openconfig_interfaces
2from ydk.path import Repository
3from ydk.gnmi.providers import gNMIServiceProvider
4from ydk.gnmi.services import gNMIService, gNMISubscription
5
6import datetime
7
8# Callback function to handle telemetry data
9def print_telemetry_data(s):
10 if 'update' in s:
11 current_dt = datetime.datetime.now()
12 print("\n===> Received subscribe response at %s: \n%s" %
13 (current_dt.strftime("%Y-%m-%d %H:%M:%S"), s))
14
15# Function to subscribe to telemetry data
16def subscribe(func):
17 # Initialize gNMI Service and Provider
18 gnmi = gNMIService()
19 repository = Repository('/home/yan/ydk-workspace/ydk-gen/scripts/repository/10.30.110.84')
20 provider = gNMIServiceProvider(repo=repository, address='10.30.110.85', port=57400,
21 username='admin', password='admin')
22
23 # Create telemetry subscription entity
24 interfaces = openconfig_interfaces.Interfaces()
25 interface = openconfig_interfaces.Interfaces.Interface()
26 interface.name = '"MgmtEth0/RP0/CPU0/0"'
27 interfaces.interface.append(interface)
28
29 # Build subscription
30 subscription = gNMISubscription()
31 subscription.entity = interfaces
32 subscription.subscription_mode = 'SAMPLE'
33 subscription.sample_interval = 10 * 1000000000
34 subscription.suppress_redundant = False
35 subscription.heartbeat_interval = 100 * 1000000000
36
37 # Subscribe for updates in STREAM mode.
38 gnmi.subscribe(provider, subscription, 10, 'STREAM', "PROTO", func)
39
40if __name__ == "__main__":
41 subscribe(print_telemetry_data)