From 82e2fafe3d4d9f9c083976942b63999085181ab9 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Tue, 26 Jun 2018 14:06:42 +0100 Subject: [PATCH 01/18] 201806261406 --- gNMI_Subscribe.py | 193 +---- gNMI_Subscribe.pyc | Bin 0 -> 2318 bytes gnmi_pb2.py | 2037 ++++++++++++++++++++++++++++++++++++++++++++ gnmi_pb2.pyc | Bin 0 -> 44121 bytes grpc_support.py | 191 +++++ grpc_support.pyc | Bin 0 -> 4915 bytes pygnmi.py | 131 +++ 7 files changed, 2380 insertions(+), 172 deletions(-) create mode 100644 gNMI_Subscribe.pyc create mode 100644 gnmi_pb2.py create mode 100644 gnmi_pb2.pyc create mode 100644 grpc_support.py create mode 100644 grpc_support.pyc create mode 100755 pygnmi.py diff --git a/gNMI_Subscribe.py b/gNMI_Subscribe.py index cae533b..8b6c83c 100644 --- a/gNMI_Subscribe.py +++ b/gNMI_Subscribe.py @@ -2,7 +2,7 @@ ############################################################################## # # -# gNMI_Subscribe.py # +# pygnmi.py # # # # History Change Log: # # # @@ -10,6 +10,8 @@ # 1.1 [SW] 2017/07/06 timeout behavior improved # # 1.2 [SW] 2017/08/08 logging improved, options added # # 1.3 [SW] 2017/12/04 support for gNMI v0.4 # +# 1.4 [JGC] 2018/06/26 separated to allow for more structured # +# development of other gNMI service operations # # # # Objective: # # # @@ -17,7 +19,8 @@ # # # Features supported: # # # -# - gNMI Subscribe (based on Nokia SROS 15.0 TLM feature-set) # +# - gNMI Capabilities # +# - gNMI Subscribe (Based on Nokia SR OS release 16 feature-set) # # - secure and insecure mode # # - multiple subscriptions paths # # # @@ -25,6 +28,8 @@ # # # - Disable server name verification against TLS cert (opt: noHostCheck) # # - Disable cert validation against root certificate (InsecureSkipVerify) # +# - gNMI Get # +# - gNMI Set # # # # License: # # # @@ -33,20 +38,25 @@ # # # Author: # # # -# Sven Wisotzky # +# Sven Wisotzky [SW] # # mail: sven.wisotzky(at)nokia.com # +# # +# James Cumming [JGC] # +# mail: james.cumming(at)nokia.com # +# # ############################################################################## + """ -gNMI Subscribe Client in Python Version 1.3 +gNMI Subscribe Client in Python Version 1.4 Copyright (C) 2017 Nokia. All Rights Reserved. """ __title__ = "gNMI_Subscribe" -__version__ = "1.3" -__status__ = "released" -__author__ = "Sven Wisotzky" -__date__ = "2017 December 4th" +__version__ = "1.4" +__status__ = "dev" +__author__ = "James Cumming" +__date__ = "2018 June 26th" ############################################################################## @@ -54,150 +64,12 @@ import re import sys import os -import logging import time +import grpc_support ############################################################################## -def list_from_path(path='/'): - if path: - if path[0]=='/': - if path[-1]=='/': - return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path)[1:-1] - else: - return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path)[1:] - else: - if path[-1]=='/': - return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path)[:-1] - else: - return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path) - return [] - - -def path_from_string(path='/'): - mypath = [] - - for e in list_from_path(path): - eName = e.split("[", 1)[0] - eKeys = re.findall('\[(.*?)\]', e) - dKeys = dict(x.split('=', 1) for x in eKeys) - mypath.append(gnmi_pb2.PathElem(name=eName, key=dKeys)) - - return gnmi_pb2.Path(elem=mypath) - - -def gen_request( opt ): - mysubs = [] - for path in opt.xpaths: - mypath = path_from_string(path) - mysub = gnmi_pb2.Subscription(path=mypath, mode=opt.submode, suppress_redundant=opt.suppress, sample_interval=opt.interval*1000000000, heartbeat_interval=opt.heartbeat) - mysubs.append(mysub) - - if opt.prefix: - myprefix = path_from_string(opt.prefix) - else: - myprefix = None - - if opt.qos: - myqos = gnmi_pb2.QOSMarking(marking=opt.qos) - else: - myqos = None - - mysblist = gnmi_pb2.SubscriptionList(prefix=myprefix, mode=opt.mode, allow_aggregation=opt.aggregate, encoding=opt.encoding, subscription=mysubs, use_aliases=opt.use_alias, qos=myqos) - mysubreq = gnmi_pb2.SubscribeRequest( subscribe=mysblist ) - - log.info('Sending SubscribeRequest\n'+str(mysubreq)) - yield mysubreq - -############################################################################## - -if __name__ == '__main__': - prog = os.path.splitext(os.path.basename(sys.argv[0]))[0] - - parser = argparse.ArgumentParser() - parser.add_argument('--version', action='version', version=prog+' '+__version__) - - group = parser.add_mutually_exclusive_group() - group.add_argument('-q', '--quiet', action='store_true', help='disable logging') - group.add_argument('-v', '--verbose', action='count', help='enhanced logging') - group = parser.add_argument_group() - group.add_argument('--server', default='localhost:57400', help='server/port (default: localhost:57400)') - group.add_argument('--username', default='admin', help='username (default: admin)') - group.add_argument('--password', default='admin', help='password (default: admin)') - group.add_argument('--cert', metavar='', help='CA root certificate') - group.add_argument('--tls', action='store_true', help='enable TLS security') - group.add_argument('--ciphers', help='override environment "GRPC_SSL_CIPHER_SUITES"') - group.add_argument('--altName', help='subjectAltName/CN override for server host validation') - group.add_argument('--noHostCheck', action='store_true', help='disable server host validation') - - group = parser.add_argument_group() - group.add_argument('--logfile', metavar='', type=argparse.FileType('wb', 0), default='-', help='Specify the logfile (default: )') - group.add_argument('--stats', action='store_true', help='collect stats') - - group = parser.add_argument_group() - group.add_argument('--interval', default=10, type=int, help='sample interval (default: 10s)') - group.add_argument('--timeout', type=int, help='subscription duration in seconds (default: none)') - group.add_argument('--heartbeat', type=int, help='heartbeat interval (default: none)') - group.add_argument('--aggregate', action='store_true', help='allow aggregation') - group.add_argument('--suppress', action='store_true', help='suppress redundant') - group.add_argument('--submode', default=2, type=int, help='subscription mode [TARGET_DEFINED, ON_CHANGE, SAMPLE]') - group.add_argument('--mode', default=0, type=int, help='[STREAM, ONCE, POLL]') - group.add_argument('--encoding', default=0, type=int, help='[JSON, BYTES, PROTO, ASCII, JSON_IETF]') - group.add_argument('--qos', default=0, type=int, help='[JSON, BYTES, PROTO, ASCII, JSON_IETF]') - group.add_argument('--use_alias', action='store_true', help='use alias') - group.add_argument('--prefix', default='', help='gRPC path prefix (default: none)') - group.add_argument('xpaths', nargs=argparse.REMAINDER, help='path(s) to subscriber (default: /)') - options = parser.parse_args() - - if len(options.xpaths)==0: - options.xpaths=['/'] - - if options.ciphers: - os.environ["GRPC_SSL_CIPHER_SUITES"] = options.ciphers - - # setup logging - - if options.quiet: - loghandler = logging.NullHandler() - loglevel = logging.NOTSET - else: - if options.verbose==None: - logformat = '%(asctime)s,%(msecs)-3d %(message)s' - else: - logformat = '%(asctime)s,%(msecs)-3d %(levelname)-8s %(threadName)s %(message)s' - - if options.verbose==None or options.verbose==1: - loglevel = logging.INFO - else: - loglevel = logging.DEBUG - - # For supported GRPC trace options check: - # https://github.com/grpc/grpc/blob/master/doc/environment_variables.md - - if options.verbose==3: - os.environ["GRPC_TRACE"] = "all" - os.environ["GRPC_VERBOSITY"] = "ERROR" - - if options.verbose==4: - os.environ["GRPC_TRACE"] = "api,call_error,channel,connectivity_state,op_failure" - os.environ["GRPC_VERBOSITY"] = "INFO" - - if options.verbose==5: - os.environ["GRPC_TRACE"] = "all" - os.environ["GRPC_VERBOSITY"] = "INFO" - - if options.verbose==6: - os.environ["GRPC_TRACE"] = "all" - os.environ["GRPC_VERBOSITY"] = "DEBUG" - - timeformat = '%y/%m/%d %H:%M:%S' - loghandler = logging.StreamHandler(options.logfile) - loghandler.setFormatter(logging.Formatter(logformat, timeformat)) - - log = logging.getLogger(prog) - log.setLevel(loglevel) - log.addHandler(loghandler) - +def subscribe(channel, options,log): try: import grpc import gnmi_pb2 @@ -205,33 +77,10 @@ def gen_request( opt ): log.error(str(err)) quit() - if options.tls or options.cert: - log.debug("Create SSL Channel") - if options.cert: - cred = grpc.ssl_channel_credentials(root_certificates=open(options.cert).read()) - opts = [] - if options.altName: - opts.append(('grpc.ssl_target_name_override', options.altName,)) - if options.noHostCheck: - log.error('Disable server name verification against TLS cert is not yet supported!') - # TODO: Clarify how to setup gRPC with SSLContext using check_hostname:=False - - channel = grpc.secure_channel(options.server, cred, opts) - else: - log.error('Disable cert validation against root certificate (InsecureSkipVerify) is not yet supported!') - # TODO: Clarify how to setup gRPC with SSLContext using verify_mode:=CERT_NONE - - cred = grpc.ssl_channel_credentials(root_certificates=None, private_key=None, certificate_chain=None) - channel = grpc.secure_channel(options.server, cred) - - else: - log.info("Create insecure Channel") - channel = grpc.insecure_channel(options.server) - log.debug("Create gNMI stub") stub = gnmi_pb2.gNMIStub(channel) - req_iterator = gen_request( options ) + req_iterator = grpc_support.gen_request( options, log ) metadata = [('username',options.username), ('password', options.password)] msgs = 0 diff --git a/gNMI_Subscribe.pyc b/gNMI_Subscribe.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef08149c28c0512ba4c272ef92e687ac5984524d GIT binary patch literal 2318 zcmb7FU2fY(5T2!E*`g%NKXIHU{b33SP=QoVjHGUZqG;i!NE*Zln`^{36(Y)0%mou}w-^_e7%PsxgaBqIG|8hu+KL_ux z@#q-_Nz}tAs3%A|)N@Fds8=Fcre2xk3iVb1m`S4A{6w3XTh*z z?OB<|tCSHd^9q?Y8doV3ghdw)%~607t7Df=P&Ob!uCYAAEK0IMa})z3%776Cz*wi* zFCweZxK0_sv8BO9%GQ7><_&uDLSzm4_UET!zE0UXjn}zch#+}sV@GsrHvDxq?sEKD zjZBlqP0k{#)3t-8D~8{oq~&m4n8Eo*(HRHHd%KNA6PhZDEUh)g9a%fLI+t*Isj(~ z$6T>!J2c*5v;%OMC!?3iY`jCmB4k@%x%uwoTYCOHJViHLwcYT<5yIw!{I|&Laz#b> zkjfbnxMr86s7JGC7`aUuIDRi*=K<%sUGy6kExRgjsl1VFGG}E<{wT;tM%8?~J@&`# z9dz)K?QG3WeV8cUD9@foZPEeyjVQ%Q3UN5B68l=ejuIJQg4>Y@6Tb9~Z}<@DSvc$` zO2<*CmEMKr7#2Q_*5V~3b(`_vDbOYu>ib^nUg!1+L+oM2t%W+(BUW*uh*Xk9iLODiDLr7-(=PPONDQCk zJd8jbhB{GU*CK8L_OY4`B0rIjLW8oUv9bH&B+6qi z2(%!;@`H)C!9930RI$P3(B=-d)5B9g4AsQSk)6}Izi8CumhEy<)&ft~jcs;j1qAd1 z1mK$}=`!f%Cth&}oT#tNLfsQx|PMxR$GaUq-`z-}=TYFcXCrcUr&yD!+lD^YQ8T zxyGqps(y-lI)Tdk0tbhBq4>!t_7kme2Qo)_kIuAJBi+3MYq!b6Eew}D{V%fE>6g<; YrW5tmJ;?eRhDyPUsFdqqVDT&e3lXOQCIA2c literal 0 HcmV?d00001 diff --git a/gnmi_pb2.py b/gnmi_pb2.py new file mode 100644 index 0000000..313674f --- /dev/null +++ b/gnmi_pb2.py @@ -0,0 +1,2037 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: proto/gnmi/gnmi.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='proto/gnmi/gnmi.proto', + package='gnmi', + syntax='proto3', + serialized_pb=_b('\n\x15proto/gnmi/gnmi.proto\x12\x04gnmi\x1a\x19google/protobuf/any.proto\x1a google/protobuf/descriptor.proto\"\x86\x01\n\x0cNotification\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\x1a\n\x06prefix\x18\x02 \x01(\x0b\x32\n.gnmi.Path\x12\r\n\x05\x61lias\x18\x03 \x01(\t\x12\x1c\n\x06update\x18\x04 \x03(\x0b\x32\x0c.gnmi.Update\x12\x1a\n\x06\x64\x65lete\x18\x05 \x03(\x0b\x32\n.gnmi.Path\"u\n\x06Update\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x1e\n\x05value\x18\x02 \x01(\x0b\x32\x0b.gnmi.ValueB\x02\x18\x01\x12\x1d\n\x03val\x18\x03 \x01(\x0b\x32\x10.gnmi.TypedValue\x12\x12\n\nduplicates\x18\x04 \x01(\r\"\xce\x02\n\nTypedValue\x12\x14\n\nstring_val\x18\x01 \x01(\tH\x00\x12\x11\n\x07int_val\x18\x02 \x01(\x03H\x00\x12\x12\n\x08uint_val\x18\x03 \x01(\x04H\x00\x12\x12\n\x08\x62ool_val\x18\x04 \x01(\x08H\x00\x12\x13\n\tbytes_val\x18\x05 \x01(\x0cH\x00\x12\x13\n\tfloat_val\x18\x06 \x01(\x02H\x00\x12&\n\x0b\x64\x65\x63imal_val\x18\x07 \x01(\x0b\x32\x0f.gnmi.Decimal64H\x00\x12)\n\x0cleaflist_val\x18\x08 \x01(\x0b\x32\x11.gnmi.ScalarArrayH\x00\x12\'\n\x07\x61ny_val\x18\t \x01(\x0b\x32\x14.google.protobuf.AnyH\x00\x12\x12\n\x08json_val\x18\n \x01(\x0cH\x00\x12\x17\n\rjson_ietf_val\x18\x0b \x01(\x0cH\x00\x12\x13\n\tascii_val\x18\x0c \x01(\tH\x00\x42\x07\n\x05value\"Y\n\x04Path\x12\x13\n\x07\x65lement\x18\x01 \x03(\tB\x02\x18\x01\x12\x0e\n\x06origin\x18\x02 \x01(\t\x12\x1c\n\x04\x65lem\x18\x03 \x03(\x0b\x32\x0e.gnmi.PathElem\x12\x0e\n\x06target\x18\x04 \x01(\t\"j\n\x08PathElem\x12\x0c\n\x04name\x18\x01 \x01(\t\x12$\n\x03key\x18\x02 \x03(\x0b\x32\x17.gnmi.PathElem.KeyEntry\x1a*\n\x08KeyEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"8\n\x05Value\x12\r\n\x05value\x18\x01 \x01(\x0c\x12\x1c\n\x04type\x18\x02 \x01(\x0e\x32\x0e.gnmi.Encoding:\x02\x18\x01\"N\n\x05\x45rror\x12\x0c\n\x04\x63ode\x18\x01 \x01(\r\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\"\n\x04\x64\x61ta\x18\x03 \x01(\x0b\x32\x14.google.protobuf.Any:\x02\x18\x01\".\n\tDecimal64\x12\x0e\n\x06\x64igits\x18\x01 \x01(\x04\x12\x11\n\tprecision\x18\x02 \x01(\r\"0\n\x0bScalarArray\x12!\n\x07\x65lement\x18\x01 \x03(\x0b\x32\x10.gnmi.TypedValue\"\x8a\x01\n\x10SubscribeRequest\x12+\n\tsubscribe\x18\x01 \x01(\x0b\x32\x16.gnmi.SubscriptionListH\x00\x12\x1a\n\x04poll\x18\x03 \x01(\x0b\x32\n.gnmi.PollH\x00\x12\"\n\x07\x61liases\x18\x04 \x01(\x0b\x32\x0f.gnmi.AliasListH\x00\x42\t\n\x07request\"\x06\n\x04Poll\"\x80\x01\n\x11SubscribeResponse\x12$\n\x06update\x18\x01 \x01(\x0b\x32\x12.gnmi.NotificationH\x00\x12\x17\n\rsync_response\x18\x03 \x01(\x08H\x00\x12 \n\x05\x65rror\x18\x04 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01H\x00\x42\n\n\x08response\"\xd7\x02\n\x10SubscriptionList\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12(\n\x0csubscription\x18\x02 \x03(\x0b\x32\x12.gnmi.Subscription\x12\x13\n\x0buse_aliases\x18\x03 \x01(\x08\x12\x1d\n\x03qos\x18\x04 \x01(\x0b\x32\x10.gnmi.QOSMarking\x12)\n\x04mode\x18\x05 \x01(\x0e\x32\x1b.gnmi.SubscriptionList.Mode\x12\x19\n\x11\x61llow_aggregation\x18\x06 \x01(\x08\x12#\n\nuse_models\x18\x07 \x03(\x0b\x32\x0f.gnmi.ModelData\x12 \n\x08\x65ncoding\x18\x08 \x01(\x0e\x32\x0e.gnmi.Encoding\x12\x14\n\x0cupdates_only\x18\t \x01(\x08\"&\n\x04Mode\x12\n\n\x06STREAM\x10\x00\x12\x08\n\x04ONCE\x10\x01\x12\x08\n\x04POLL\x10\x02\"\x9f\x01\n\x0cSubscription\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12$\n\x04mode\x18\x02 \x01(\x0e\x32\x16.gnmi.SubscriptionMode\x12\x17\n\x0fsample_interval\x18\x03 \x01(\x04\x12\x1a\n\x12suppress_redundant\x18\x04 \x01(\x08\x12\x1a\n\x12heartbeat_interval\x18\x05 \x01(\x04\"\x1d\n\nQOSMarking\x12\x0f\n\x07marking\x18\x01 \x01(\r\"0\n\x05\x41lias\x12\x18\n\x04path\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\r\n\x05\x61lias\x18\x02 \x01(\t\"\'\n\tAliasList\x12\x1a\n\x05\x61lias\x18\x01 \x03(\x0b\x32\x0b.gnmi.Alias\"\x81\x01\n\nSetRequest\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x1a\n\x06\x64\x65lete\x18\x02 \x03(\x0b\x32\n.gnmi.Path\x12\x1d\n\x07replace\x18\x03 \x03(\x0b\x32\x0c.gnmi.Update\x12\x1c\n\x06update\x18\x04 \x03(\x0b\x32\x0c.gnmi.Update\"\x84\x01\n\x0bSetResponse\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12$\n\x08response\x18\x02 \x03(\x0b\x32\x12.gnmi.UpdateResult\x12 \n\x07message\x18\x03 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\x12\x11\n\ttimestamp\x18\x04 \x01(\x03\"\xca\x01\n\x0cUpdateResult\x12\x15\n\ttimestamp\x18\x01 \x01(\x03\x42\x02\x18\x01\x12\x18\n\x04path\x18\x02 \x01(\x0b\x32\n.gnmi.Path\x12 \n\x07message\x18\x03 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\x12(\n\x02op\x18\x04 \x01(\x0e\x32\x1c.gnmi.UpdateResult.Operation\"=\n\tOperation\x12\x0b\n\x07INVALID\x10\x00\x12\n\n\x06\x44\x45LETE\x10\x01\x12\x0b\n\x07REPLACE\x10\x02\x12\n\n\x06UPDATE\x10\x03\"\xef\x01\n\nGetRequest\x12\x1a\n\x06prefix\x18\x01 \x01(\x0b\x32\n.gnmi.Path\x12\x18\n\x04path\x18\x02 \x03(\x0b\x32\n.gnmi.Path\x12\'\n\x04type\x18\x03 \x01(\x0e\x32\x19.gnmi.GetRequest.DataType\x12 \n\x08\x65ncoding\x18\x05 \x01(\x0e\x32\x0e.gnmi.Encoding\x12#\n\nuse_models\x18\x06 \x03(\x0b\x32\x0f.gnmi.ModelData\";\n\x08\x44\x61taType\x12\x07\n\x03\x41LL\x10\x00\x12\n\n\x06\x43ONFIG\x10\x01\x12\t\n\x05STATE\x10\x02\x12\x0f\n\x0bOPERATIONAL\x10\x03\"W\n\x0bGetResponse\x12(\n\x0cnotification\x18\x01 \x03(\x0b\x32\x12.gnmi.Notification\x12\x1e\n\x05\x65rror\x18\x02 \x01(\x0b\x32\x0b.gnmi.ErrorB\x02\x18\x01\"\x13\n\x11\x43\x61pabilityRequest\"\x82\x01\n\x12\x43\x61pabilityResponse\x12)\n\x10supported_models\x18\x01 \x03(\x0b\x32\x0f.gnmi.ModelData\x12+\n\x13supported_encodings\x18\x02 \x03(\x0e\x32\x0e.gnmi.Encoding\x12\x14\n\x0cgNMI_version\x18\x03 \x01(\t\"@\n\tModelData\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x14\n\x0corganization\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t*D\n\x08\x45ncoding\x12\x08\n\x04JSON\x10\x00\x12\t\n\x05\x42YTES\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\t\n\x05\x41SCII\x10\x03\x12\r\n\tJSON_IETF\x10\x04*A\n\x10SubscriptionMode\x12\x12\n\x0eTARGET_DEFINED\x10\x00\x12\r\n\tON_CHANGE\x10\x01\x12\n\n\x06SAMPLE\x10\x02\x32\xe3\x01\n\x04gNMI\x12\x41\n\x0c\x43\x61pabilities\x12\x17.gnmi.CapabilityRequest\x1a\x18.gnmi.CapabilityResponse\x12*\n\x03Get\x12\x10.gnmi.GetRequest\x1a\x11.gnmi.GetResponse\x12*\n\x03Set\x12\x10.gnmi.SetRequest\x1a\x11.gnmi.SetResponse\x12@\n\tSubscribe\x12\x16.gnmi.SubscribeRequest\x1a\x17.gnmi.SubscribeResponse(\x01\x30\x01:3\n\x0cgnmi_service\x12\x1c.google.protobuf.FileOptions\x18\xe9\x07 \x01(\tB\x08\xca>\x05\x30.5.0b\x06proto3') + , + dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR,google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,]) + +_ENCODING = _descriptor.EnumDescriptor( + name='Encoding', + full_name='gnmi.Encoding', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='JSON', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='BYTES', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PROTO', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ASCII', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='JSON_IETF', index=4, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3053, + serialized_end=3121, +) +_sym_db.RegisterEnumDescriptor(_ENCODING) + +Encoding = enum_type_wrapper.EnumTypeWrapper(_ENCODING) +_SUBSCRIPTIONMODE = _descriptor.EnumDescriptor( + name='SubscriptionMode', + full_name='gnmi.SubscriptionMode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TARGET_DEFINED', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ON_CHANGE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SAMPLE', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3123, + serialized_end=3188, +) +_sym_db.RegisterEnumDescriptor(_SUBSCRIPTIONMODE) + +SubscriptionMode = enum_type_wrapper.EnumTypeWrapper(_SUBSCRIPTIONMODE) +JSON = 0 +BYTES = 1 +PROTO = 2 +ASCII = 3 +JSON_IETF = 4 +TARGET_DEFINED = 0 +ON_CHANGE = 1 +SAMPLE = 2 + +GNMI_SERVICE_FIELD_NUMBER = 1001 +gnmi_service = _descriptor.FieldDescriptor( + name='gnmi_service', full_name='gnmi.gnmi_service', index=0, + number=1001, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + +_SUBSCRIPTIONLIST_MODE = _descriptor.EnumDescriptor( + name='Mode', + full_name='gnmi.SubscriptionList.Mode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='STREAM', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ONCE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='POLL', index=2, number=2, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1706, + serialized_end=1744, +) +_sym_db.RegisterEnumDescriptor(_SUBSCRIPTIONLIST_MODE) + +_UPDATERESULT_OPERATION = _descriptor.EnumDescriptor( + name='Operation', + full_name='gnmi.UpdateResult.Operation', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='INVALID', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DELETE', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='REPLACE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='UPDATE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2439, + serialized_end=2500, +) +_sym_db.RegisterEnumDescriptor(_UPDATERESULT_OPERATION) + +_GETREQUEST_DATATYPE = _descriptor.EnumDescriptor( + name='DataType', + full_name='gnmi.GetRequest.DataType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ALL', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='CONFIG', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='STATE', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OPERATIONAL', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2683, + serialized_end=2742, +) +_sym_db.RegisterEnumDescriptor(_GETREQUEST_DATATYPE) + + +_NOTIFICATION = _descriptor.Descriptor( + name='Notification', + full_name='gnmi.Notification', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', full_name='gnmi.Notification.timestamp', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='prefix', full_name='gnmi.Notification.prefix', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='alias', full_name='gnmi.Notification.alias', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='update', full_name='gnmi.Notification.update', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='delete', full_name='gnmi.Notification.delete', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=93, + serialized_end=227, +) + + +_UPDATE = _descriptor.Descriptor( + name='Update', + full_name='gnmi.Update', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='gnmi.Update.path', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='gnmi.Update.value', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + _descriptor.FieldDescriptor( + name='val', full_name='gnmi.Update.val', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='duplicates', full_name='gnmi.Update.duplicates', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=229, + serialized_end=346, +) + + +_TYPEDVALUE = _descriptor.Descriptor( + name='TypedValue', + full_name='gnmi.TypedValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='string_val', full_name='gnmi.TypedValue.string_val', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='int_val', full_name='gnmi.TypedValue.int_val', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uint_val', full_name='gnmi.TypedValue.uint_val', index=2, + number=3, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bool_val', full_name='gnmi.TypedValue.bool_val', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bytes_val', full_name='gnmi.TypedValue.bytes_val', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='float_val', full_name='gnmi.TypedValue.float_val', index=5, + number=6, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='decimal_val', full_name='gnmi.TypedValue.decimal_val', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='leaflist_val', full_name='gnmi.TypedValue.leaflist_val', index=7, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='any_val', full_name='gnmi.TypedValue.any_val', index=8, + number=9, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='json_val', full_name='gnmi.TypedValue.json_val', index=9, + number=10, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='json_ietf_val', full_name='gnmi.TypedValue.json_ietf_val', index=10, + number=11, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ascii_val', full_name='gnmi.TypedValue.ascii_val', index=11, + number=12, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='value', full_name='gnmi.TypedValue.value', + index=0, containing_type=None, fields=[]), + ], + serialized_start=349, + serialized_end=683, +) + + +_PATH = _descriptor.Descriptor( + name='Path', + full_name='gnmi.Path', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='element', full_name='gnmi.Path.element', index=0, + number=1, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + _descriptor.FieldDescriptor( + name='origin', full_name='gnmi.Path.origin', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='elem', full_name='gnmi.Path.elem', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='target', full_name='gnmi.Path.target', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=685, + serialized_end=774, +) + + +_PATHELEM_KEYENTRY = _descriptor.Descriptor( + name='KeyEntry', + full_name='gnmi.PathElem.KeyEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='gnmi.PathElem.KeyEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='gnmi.PathElem.KeyEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=840, + serialized_end=882, +) + +_PATHELEM = _descriptor.Descriptor( + name='PathElem', + full_name='gnmi.PathElem', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='gnmi.PathElem.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key', full_name='gnmi.PathElem.key', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_PATHELEM_KEYENTRY, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=776, + serialized_end=882, +) + + +_VALUE = _descriptor.Descriptor( + name='Value', + full_name='gnmi.Value', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='gnmi.Value.value', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='gnmi.Value.type', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001')), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=884, + serialized_end=940, +) + + +_ERROR = _descriptor.Descriptor( + name='Error', + full_name='gnmi.Error', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='gnmi.Error.code', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='gnmi.Error.message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data', full_name='gnmi.Error.data', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001')), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=942, + serialized_end=1020, +) + + +_DECIMAL64 = _descriptor.Descriptor( + name='Decimal64', + full_name='gnmi.Decimal64', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='digits', full_name='gnmi.Decimal64.digits', index=0, + number=1, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='precision', full_name='gnmi.Decimal64.precision', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1022, + serialized_end=1068, +) + + +_SCALARARRAY = _descriptor.Descriptor( + name='ScalarArray', + full_name='gnmi.ScalarArray', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='element', full_name='gnmi.ScalarArray.element', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1070, + serialized_end=1118, +) + + +_SUBSCRIBEREQUEST = _descriptor.Descriptor( + name='SubscribeRequest', + full_name='gnmi.SubscribeRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='subscribe', full_name='gnmi.SubscribeRequest.subscribe', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='poll', full_name='gnmi.SubscribeRequest.poll', index=1, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='aliases', full_name='gnmi.SubscribeRequest.aliases', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='request', full_name='gnmi.SubscribeRequest.request', + index=0, containing_type=None, fields=[]), + ], + serialized_start=1121, + serialized_end=1259, +) + + +_POLL = _descriptor.Descriptor( + name='Poll', + full_name='gnmi.Poll', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1261, + serialized_end=1267, +) + + +_SUBSCRIBERESPONSE = _descriptor.Descriptor( + name='SubscribeResponse', + full_name='gnmi.SubscribeResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='update', full_name='gnmi.SubscribeResponse.update', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sync_response', full_name='gnmi.SubscribeResponse.sync_response', index=1, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='error', full_name='gnmi.SubscribeResponse.error', index=2, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='response', full_name='gnmi.SubscribeResponse.response', + index=0, containing_type=None, fields=[]), + ], + serialized_start=1270, + serialized_end=1398, +) + + +_SUBSCRIPTIONLIST = _descriptor.Descriptor( + name='SubscriptionList', + full_name='gnmi.SubscriptionList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='prefix', full_name='gnmi.SubscriptionList.prefix', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='subscription', full_name='gnmi.SubscriptionList.subscription', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='use_aliases', full_name='gnmi.SubscriptionList.use_aliases', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='qos', full_name='gnmi.SubscriptionList.qos', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mode', full_name='gnmi.SubscriptionList.mode', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='allow_aggregation', full_name='gnmi.SubscriptionList.allow_aggregation', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='use_models', full_name='gnmi.SubscriptionList.use_models', index=6, + number=7, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='encoding', full_name='gnmi.SubscriptionList.encoding', index=7, + number=8, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='updates_only', full_name='gnmi.SubscriptionList.updates_only', index=8, + number=9, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _SUBSCRIPTIONLIST_MODE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1401, + serialized_end=1744, +) + + +_SUBSCRIPTION = _descriptor.Descriptor( + name='Subscription', + full_name='gnmi.Subscription', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='gnmi.Subscription.path', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='mode', full_name='gnmi.Subscription.mode', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sample_interval', full_name='gnmi.Subscription.sample_interval', index=2, + number=3, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='suppress_redundant', full_name='gnmi.Subscription.suppress_redundant', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='heartbeat_interval', full_name='gnmi.Subscription.heartbeat_interval', index=4, + number=5, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1747, + serialized_end=1906, +) + + +_QOSMARKING = _descriptor.Descriptor( + name='QOSMarking', + full_name='gnmi.QOSMarking', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='marking', full_name='gnmi.QOSMarking.marking', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1908, + serialized_end=1937, +) + + +_ALIAS = _descriptor.Descriptor( + name='Alias', + full_name='gnmi.Alias', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='path', full_name='gnmi.Alias.path', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='alias', full_name='gnmi.Alias.alias', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1939, + serialized_end=1987, +) + + +_ALIASLIST = _descriptor.Descriptor( + name='AliasList', + full_name='gnmi.AliasList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='alias', full_name='gnmi.AliasList.alias', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1989, + serialized_end=2028, +) + + +_SETREQUEST = _descriptor.Descriptor( + name='SetRequest', + full_name='gnmi.SetRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='prefix', full_name='gnmi.SetRequest.prefix', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='delete', full_name='gnmi.SetRequest.delete', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='replace', full_name='gnmi.SetRequest.replace', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='update', full_name='gnmi.SetRequest.update', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2031, + serialized_end=2160, +) + + +_SETRESPONSE = _descriptor.Descriptor( + name='SetResponse', + full_name='gnmi.SetResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='prefix', full_name='gnmi.SetResponse.prefix', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='response', full_name='gnmi.SetResponse.response', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='gnmi.SetResponse.message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + _descriptor.FieldDescriptor( + name='timestamp', full_name='gnmi.SetResponse.timestamp', index=3, + number=4, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2163, + serialized_end=2295, +) + + +_UPDATERESULT = _descriptor.Descriptor( + name='UpdateResult', + full_name='gnmi.UpdateResult', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', full_name='gnmi.UpdateResult.timestamp', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + _descriptor.FieldDescriptor( + name='path', full_name='gnmi.UpdateResult.path', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='gnmi.UpdateResult.message', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + _descriptor.FieldDescriptor( + name='op', full_name='gnmi.UpdateResult.op', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _UPDATERESULT_OPERATION, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2298, + serialized_end=2500, +) + + +_GETREQUEST = _descriptor.Descriptor( + name='GetRequest', + full_name='gnmi.GetRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='prefix', full_name='gnmi.GetRequest.prefix', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='path', full_name='gnmi.GetRequest.path', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='gnmi.GetRequest.type', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='encoding', full_name='gnmi.GetRequest.encoding', index=3, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='use_models', full_name='gnmi.GetRequest.use_models', index=4, + number=6, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _GETREQUEST_DATATYPE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2503, + serialized_end=2742, +) + + +_GETRESPONSE = _descriptor.Descriptor( + name='GetResponse', + full_name='gnmi.GetResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='notification', full_name='gnmi.GetResponse.notification', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='error', full_name='gnmi.GetResponse.error', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001'))), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2744, + serialized_end=2831, +) + + +_CAPABILITYREQUEST = _descriptor.Descriptor( + name='CapabilityRequest', + full_name='gnmi.CapabilityRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2833, + serialized_end=2852, +) + + +_CAPABILITYRESPONSE = _descriptor.Descriptor( + name='CapabilityResponse', + full_name='gnmi.CapabilityResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='supported_models', full_name='gnmi.CapabilityResponse.supported_models', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='supported_encodings', full_name='gnmi.CapabilityResponse.supported_encodings', index=1, + number=2, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='gNMI_version', full_name='gnmi.CapabilityResponse.gNMI_version', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2855, + serialized_end=2985, +) + + +_MODELDATA = _descriptor.Descriptor( + name='ModelData', + full_name='gnmi.ModelData', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='gnmi.ModelData.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='organization', full_name='gnmi.ModelData.organization', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='version', full_name='gnmi.ModelData.version', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2987, + serialized_end=3051, +) + +_NOTIFICATION.fields_by_name['prefix'].message_type = _PATH +_NOTIFICATION.fields_by_name['update'].message_type = _UPDATE +_NOTIFICATION.fields_by_name['delete'].message_type = _PATH +_UPDATE.fields_by_name['path'].message_type = _PATH +_UPDATE.fields_by_name['value'].message_type = _VALUE +_UPDATE.fields_by_name['val'].message_type = _TYPEDVALUE +_TYPEDVALUE.fields_by_name['decimal_val'].message_type = _DECIMAL64 +_TYPEDVALUE.fields_by_name['leaflist_val'].message_type = _SCALARARRAY +_TYPEDVALUE.fields_by_name['any_val'].message_type = google_dot_protobuf_dot_any__pb2._ANY +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['string_val']) +_TYPEDVALUE.fields_by_name['string_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['int_val']) +_TYPEDVALUE.fields_by_name['int_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['uint_val']) +_TYPEDVALUE.fields_by_name['uint_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['bool_val']) +_TYPEDVALUE.fields_by_name['bool_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['bytes_val']) +_TYPEDVALUE.fields_by_name['bytes_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['float_val']) +_TYPEDVALUE.fields_by_name['float_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['decimal_val']) +_TYPEDVALUE.fields_by_name['decimal_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['leaflist_val']) +_TYPEDVALUE.fields_by_name['leaflist_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['any_val']) +_TYPEDVALUE.fields_by_name['any_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['json_val']) +_TYPEDVALUE.fields_by_name['json_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['json_ietf_val']) +_TYPEDVALUE.fields_by_name['json_ietf_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_TYPEDVALUE.oneofs_by_name['value'].fields.append( + _TYPEDVALUE.fields_by_name['ascii_val']) +_TYPEDVALUE.fields_by_name['ascii_val'].containing_oneof = _TYPEDVALUE.oneofs_by_name['value'] +_PATH.fields_by_name['elem'].message_type = _PATHELEM +_PATHELEM_KEYENTRY.containing_type = _PATHELEM +_PATHELEM.fields_by_name['key'].message_type = _PATHELEM_KEYENTRY +_VALUE.fields_by_name['type'].enum_type = _ENCODING +_ERROR.fields_by_name['data'].message_type = google_dot_protobuf_dot_any__pb2._ANY +_SCALARARRAY.fields_by_name['element'].message_type = _TYPEDVALUE +_SUBSCRIBEREQUEST.fields_by_name['subscribe'].message_type = _SUBSCRIPTIONLIST +_SUBSCRIBEREQUEST.fields_by_name['poll'].message_type = _POLL +_SUBSCRIBEREQUEST.fields_by_name['aliases'].message_type = _ALIASLIST +_SUBSCRIBEREQUEST.oneofs_by_name['request'].fields.append( + _SUBSCRIBEREQUEST.fields_by_name['subscribe']) +_SUBSCRIBEREQUEST.fields_by_name['subscribe'].containing_oneof = _SUBSCRIBEREQUEST.oneofs_by_name['request'] +_SUBSCRIBEREQUEST.oneofs_by_name['request'].fields.append( + _SUBSCRIBEREQUEST.fields_by_name['poll']) +_SUBSCRIBEREQUEST.fields_by_name['poll'].containing_oneof = _SUBSCRIBEREQUEST.oneofs_by_name['request'] +_SUBSCRIBEREQUEST.oneofs_by_name['request'].fields.append( + _SUBSCRIBEREQUEST.fields_by_name['aliases']) +_SUBSCRIBEREQUEST.fields_by_name['aliases'].containing_oneof = _SUBSCRIBEREQUEST.oneofs_by_name['request'] +_SUBSCRIBERESPONSE.fields_by_name['update'].message_type = _NOTIFICATION +_SUBSCRIBERESPONSE.fields_by_name['error'].message_type = _ERROR +_SUBSCRIBERESPONSE.oneofs_by_name['response'].fields.append( + _SUBSCRIBERESPONSE.fields_by_name['update']) +_SUBSCRIBERESPONSE.fields_by_name['update'].containing_oneof = _SUBSCRIBERESPONSE.oneofs_by_name['response'] +_SUBSCRIBERESPONSE.oneofs_by_name['response'].fields.append( + _SUBSCRIBERESPONSE.fields_by_name['sync_response']) +_SUBSCRIBERESPONSE.fields_by_name['sync_response'].containing_oneof = _SUBSCRIBERESPONSE.oneofs_by_name['response'] +_SUBSCRIBERESPONSE.oneofs_by_name['response'].fields.append( + _SUBSCRIBERESPONSE.fields_by_name['error']) +_SUBSCRIBERESPONSE.fields_by_name['error'].containing_oneof = _SUBSCRIBERESPONSE.oneofs_by_name['response'] +_SUBSCRIPTIONLIST.fields_by_name['prefix'].message_type = _PATH +_SUBSCRIPTIONLIST.fields_by_name['subscription'].message_type = _SUBSCRIPTION +_SUBSCRIPTIONLIST.fields_by_name['qos'].message_type = _QOSMARKING +_SUBSCRIPTIONLIST.fields_by_name['mode'].enum_type = _SUBSCRIPTIONLIST_MODE +_SUBSCRIPTIONLIST.fields_by_name['use_models'].message_type = _MODELDATA +_SUBSCRIPTIONLIST.fields_by_name['encoding'].enum_type = _ENCODING +_SUBSCRIPTIONLIST_MODE.containing_type = _SUBSCRIPTIONLIST +_SUBSCRIPTION.fields_by_name['path'].message_type = _PATH +_SUBSCRIPTION.fields_by_name['mode'].enum_type = _SUBSCRIPTIONMODE +_ALIAS.fields_by_name['path'].message_type = _PATH +_ALIASLIST.fields_by_name['alias'].message_type = _ALIAS +_SETREQUEST.fields_by_name['prefix'].message_type = _PATH +_SETREQUEST.fields_by_name['delete'].message_type = _PATH +_SETREQUEST.fields_by_name['replace'].message_type = _UPDATE +_SETREQUEST.fields_by_name['update'].message_type = _UPDATE +_SETRESPONSE.fields_by_name['prefix'].message_type = _PATH +_SETRESPONSE.fields_by_name['response'].message_type = _UPDATERESULT +_SETRESPONSE.fields_by_name['message'].message_type = _ERROR +_UPDATERESULT.fields_by_name['path'].message_type = _PATH +_UPDATERESULT.fields_by_name['message'].message_type = _ERROR +_UPDATERESULT.fields_by_name['op'].enum_type = _UPDATERESULT_OPERATION +_UPDATERESULT_OPERATION.containing_type = _UPDATERESULT +_GETREQUEST.fields_by_name['prefix'].message_type = _PATH +_GETREQUEST.fields_by_name['path'].message_type = _PATH +_GETREQUEST.fields_by_name['type'].enum_type = _GETREQUEST_DATATYPE +_GETREQUEST.fields_by_name['encoding'].enum_type = _ENCODING +_GETREQUEST.fields_by_name['use_models'].message_type = _MODELDATA +_GETREQUEST_DATATYPE.containing_type = _GETREQUEST +_GETRESPONSE.fields_by_name['notification'].message_type = _NOTIFICATION +_GETRESPONSE.fields_by_name['error'].message_type = _ERROR +_CAPABILITYRESPONSE.fields_by_name['supported_models'].message_type = _MODELDATA +_CAPABILITYRESPONSE.fields_by_name['supported_encodings'].enum_type = _ENCODING +DESCRIPTOR.message_types_by_name['Notification'] = _NOTIFICATION +DESCRIPTOR.message_types_by_name['Update'] = _UPDATE +DESCRIPTOR.message_types_by_name['TypedValue'] = _TYPEDVALUE +DESCRIPTOR.message_types_by_name['Path'] = _PATH +DESCRIPTOR.message_types_by_name['PathElem'] = _PATHELEM +DESCRIPTOR.message_types_by_name['Value'] = _VALUE +DESCRIPTOR.message_types_by_name['Error'] = _ERROR +DESCRIPTOR.message_types_by_name['Decimal64'] = _DECIMAL64 +DESCRIPTOR.message_types_by_name['ScalarArray'] = _SCALARARRAY +DESCRIPTOR.message_types_by_name['SubscribeRequest'] = _SUBSCRIBEREQUEST +DESCRIPTOR.message_types_by_name['Poll'] = _POLL +DESCRIPTOR.message_types_by_name['SubscribeResponse'] = _SUBSCRIBERESPONSE +DESCRIPTOR.message_types_by_name['SubscriptionList'] = _SUBSCRIPTIONLIST +DESCRIPTOR.message_types_by_name['Subscription'] = _SUBSCRIPTION +DESCRIPTOR.message_types_by_name['QOSMarking'] = _QOSMARKING +DESCRIPTOR.message_types_by_name['Alias'] = _ALIAS +DESCRIPTOR.message_types_by_name['AliasList'] = _ALIASLIST +DESCRIPTOR.message_types_by_name['SetRequest'] = _SETREQUEST +DESCRIPTOR.message_types_by_name['SetResponse'] = _SETRESPONSE +DESCRIPTOR.message_types_by_name['UpdateResult'] = _UPDATERESULT +DESCRIPTOR.message_types_by_name['GetRequest'] = _GETREQUEST +DESCRIPTOR.message_types_by_name['GetResponse'] = _GETRESPONSE +DESCRIPTOR.message_types_by_name['CapabilityRequest'] = _CAPABILITYREQUEST +DESCRIPTOR.message_types_by_name['CapabilityResponse'] = _CAPABILITYRESPONSE +DESCRIPTOR.message_types_by_name['ModelData'] = _MODELDATA +DESCRIPTOR.enum_types_by_name['Encoding'] = _ENCODING +DESCRIPTOR.enum_types_by_name['SubscriptionMode'] = _SUBSCRIPTIONMODE +DESCRIPTOR.extensions_by_name['gnmi_service'] = gnmi_service +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Notification = _reflection.GeneratedProtocolMessageType('Notification', (_message.Message,), dict( + DESCRIPTOR = _NOTIFICATION, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Notification) + )) +_sym_db.RegisterMessage(Notification) + +Update = _reflection.GeneratedProtocolMessageType('Update', (_message.Message,), dict( + DESCRIPTOR = _UPDATE, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Update) + )) +_sym_db.RegisterMessage(Update) + +TypedValue = _reflection.GeneratedProtocolMessageType('TypedValue', (_message.Message,), dict( + DESCRIPTOR = _TYPEDVALUE, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.TypedValue) + )) +_sym_db.RegisterMessage(TypedValue) + +Path = _reflection.GeneratedProtocolMessageType('Path', (_message.Message,), dict( + DESCRIPTOR = _PATH, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Path) + )) +_sym_db.RegisterMessage(Path) + +PathElem = _reflection.GeneratedProtocolMessageType('PathElem', (_message.Message,), dict( + + KeyEntry = _reflection.GeneratedProtocolMessageType('KeyEntry', (_message.Message,), dict( + DESCRIPTOR = _PATHELEM_KEYENTRY, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.PathElem.KeyEntry) + )) + , + DESCRIPTOR = _PATHELEM, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.PathElem) + )) +_sym_db.RegisterMessage(PathElem) +_sym_db.RegisterMessage(PathElem.KeyEntry) + +Value = _reflection.GeneratedProtocolMessageType('Value', (_message.Message,), dict( + DESCRIPTOR = _VALUE, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Value) + )) +_sym_db.RegisterMessage(Value) + +Error = _reflection.GeneratedProtocolMessageType('Error', (_message.Message,), dict( + DESCRIPTOR = _ERROR, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Error) + )) +_sym_db.RegisterMessage(Error) + +Decimal64 = _reflection.GeneratedProtocolMessageType('Decimal64', (_message.Message,), dict( + DESCRIPTOR = _DECIMAL64, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Decimal64) + )) +_sym_db.RegisterMessage(Decimal64) + +ScalarArray = _reflection.GeneratedProtocolMessageType('ScalarArray', (_message.Message,), dict( + DESCRIPTOR = _SCALARARRAY, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.ScalarArray) + )) +_sym_db.RegisterMessage(ScalarArray) + +SubscribeRequest = _reflection.GeneratedProtocolMessageType('SubscribeRequest', (_message.Message,), dict( + DESCRIPTOR = _SUBSCRIBEREQUEST, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.SubscribeRequest) + )) +_sym_db.RegisterMessage(SubscribeRequest) + +Poll = _reflection.GeneratedProtocolMessageType('Poll', (_message.Message,), dict( + DESCRIPTOR = _POLL, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Poll) + )) +_sym_db.RegisterMessage(Poll) + +SubscribeResponse = _reflection.GeneratedProtocolMessageType('SubscribeResponse', (_message.Message,), dict( + DESCRIPTOR = _SUBSCRIBERESPONSE, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.SubscribeResponse) + )) +_sym_db.RegisterMessage(SubscribeResponse) + +SubscriptionList = _reflection.GeneratedProtocolMessageType('SubscriptionList', (_message.Message,), dict( + DESCRIPTOR = _SUBSCRIPTIONLIST, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.SubscriptionList) + )) +_sym_db.RegisterMessage(SubscriptionList) + +Subscription = _reflection.GeneratedProtocolMessageType('Subscription', (_message.Message,), dict( + DESCRIPTOR = _SUBSCRIPTION, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Subscription) + )) +_sym_db.RegisterMessage(Subscription) + +QOSMarking = _reflection.GeneratedProtocolMessageType('QOSMarking', (_message.Message,), dict( + DESCRIPTOR = _QOSMARKING, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.QOSMarking) + )) +_sym_db.RegisterMessage(QOSMarking) + +Alias = _reflection.GeneratedProtocolMessageType('Alias', (_message.Message,), dict( + DESCRIPTOR = _ALIAS, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.Alias) + )) +_sym_db.RegisterMessage(Alias) + +AliasList = _reflection.GeneratedProtocolMessageType('AliasList', (_message.Message,), dict( + DESCRIPTOR = _ALIASLIST, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.AliasList) + )) +_sym_db.RegisterMessage(AliasList) + +SetRequest = _reflection.GeneratedProtocolMessageType('SetRequest', (_message.Message,), dict( + DESCRIPTOR = _SETREQUEST, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.SetRequest) + )) +_sym_db.RegisterMessage(SetRequest) + +SetResponse = _reflection.GeneratedProtocolMessageType('SetResponse', (_message.Message,), dict( + DESCRIPTOR = _SETRESPONSE, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.SetResponse) + )) +_sym_db.RegisterMessage(SetResponse) + +UpdateResult = _reflection.GeneratedProtocolMessageType('UpdateResult', (_message.Message,), dict( + DESCRIPTOR = _UPDATERESULT, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.UpdateResult) + )) +_sym_db.RegisterMessage(UpdateResult) + +GetRequest = _reflection.GeneratedProtocolMessageType('GetRequest', (_message.Message,), dict( + DESCRIPTOR = _GETREQUEST, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.GetRequest) + )) +_sym_db.RegisterMessage(GetRequest) + +GetResponse = _reflection.GeneratedProtocolMessageType('GetResponse', (_message.Message,), dict( + DESCRIPTOR = _GETRESPONSE, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.GetResponse) + )) +_sym_db.RegisterMessage(GetResponse) + +CapabilityRequest = _reflection.GeneratedProtocolMessageType('CapabilityRequest', (_message.Message,), dict( + DESCRIPTOR = _CAPABILITYREQUEST, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.CapabilityRequest) + )) +_sym_db.RegisterMessage(CapabilityRequest) + +CapabilityResponse = _reflection.GeneratedProtocolMessageType('CapabilityResponse', (_message.Message,), dict( + DESCRIPTOR = _CAPABILITYRESPONSE, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.CapabilityResponse) + )) +_sym_db.RegisterMessage(CapabilityResponse) + +ModelData = _reflection.GeneratedProtocolMessageType('ModelData', (_message.Message,), dict( + DESCRIPTOR = _MODELDATA, + __module__ = 'proto.gnmi.gnmi_pb2' + # @@protoc_insertion_point(class_scope:gnmi.ModelData) + )) +_sym_db.RegisterMessage(ModelData) + +google_dot_protobuf_dot_descriptor__pb2.FileOptions.RegisterExtension(gnmi_service) + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\312>\0050.5.0')) +_UPDATE.fields_by_name['value'].has_options = True +_UPDATE.fields_by_name['value']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +_PATH.fields_by_name['element'].has_options = True +_PATH.fields_by_name['element']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +_PATHELEM_KEYENTRY.has_options = True +_PATHELEM_KEYENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) +_VALUE.has_options = True +_VALUE._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001')) +_ERROR.has_options = True +_ERROR._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('\030\001')) +_SUBSCRIBERESPONSE.fields_by_name['error'].has_options = True +_SUBSCRIBERESPONSE.fields_by_name['error']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +_SETRESPONSE.fields_by_name['message'].has_options = True +_SETRESPONSE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +_UPDATERESULT.fields_by_name['timestamp'].has_options = True +_UPDATERESULT.fields_by_name['timestamp']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +_UPDATERESULT.fields_by_name['message'].has_options = True +_UPDATERESULT.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +_GETRESPONSE.fields_by_name['error'].has_options = True +_GETRESPONSE.fields_by_name['error']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), _b('\030\001')) +try: + # THESE ELEMENTS WILL BE DEPRECATED. + # Please use the generated *_pb2_grpc.py files instead. + import grpc + from grpc.beta import implementations as beta_implementations + from grpc.beta import interfaces as beta_interfaces + from grpc.framework.common import cardinality + from grpc.framework.interfaces.face import utilities as face_utilities + + + class gNMIStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Capabilities = channel.unary_unary( + '/gnmi.gNMI/Capabilities', + request_serializer=CapabilityRequest.SerializeToString, + response_deserializer=CapabilityResponse.FromString, + ) + self.Get = channel.unary_unary( + '/gnmi.gNMI/Get', + request_serializer=GetRequest.SerializeToString, + response_deserializer=GetResponse.FromString, + ) + self.Set = channel.unary_unary( + '/gnmi.gNMI/Set', + request_serializer=SetRequest.SerializeToString, + response_deserializer=SetResponse.FromString, + ) + self.Subscribe = channel.stream_stream( + '/gnmi.gNMI/Subscribe', + request_serializer=SubscribeRequest.SerializeToString, + response_deserializer=SubscribeResponse.FromString, + ) + + + class gNMIServicer(object): + # missing associated documentation comment in .proto file + pass + + def Capabilities(self, request, context): + """Capabilities allows the client to retrieve the set of capabilities that + is supported by the target. This allows the target to validate the + service version that is implemented and retrieve the set of models that + the target supports. The models can then be specified in subsequent RPCs + to restrict the set of data that is utilized. + Reference: gNMI Specification Section 3.2 + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Get(self, request, context): + """Retrieve a snapshot of data from the target. A Get RPC requests that the + target snapshots a subset of the data tree as specified by the paths + included in the message and serializes this to be returned to the + client using the specified encoding. + Reference: gNMI Specification Section 3.3 + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Set(self, request, context): + """Set allows the client to modify the state of data on the target. The + paths to modified along with the new values that the client wishes + to set the value to. + Reference: gNMI Specification Section 3.4 + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Subscribe(self, request_iterator, context): + """Subscribe allows a client to request the target to send it values + of particular paths within the data tree. These values may be streamed + at a particular cadence (STREAM), sent one off on a long-lived channel + (POLL), or sent as a one-off retrieval (ONCE). + Reference: gNMI Specification Section 3.5 + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + + def add_gNMIServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Capabilities': grpc.unary_unary_rpc_method_handler( + servicer.Capabilities, + request_deserializer=CapabilityRequest.FromString, + response_serializer=CapabilityResponse.SerializeToString, + ), + 'Get': grpc.unary_unary_rpc_method_handler( + servicer.Get, + request_deserializer=GetRequest.FromString, + response_serializer=GetResponse.SerializeToString, + ), + 'Set': grpc.unary_unary_rpc_method_handler( + servicer.Set, + request_deserializer=SetRequest.FromString, + response_serializer=SetResponse.SerializeToString, + ), + 'Subscribe': grpc.stream_stream_rpc_method_handler( + servicer.Subscribe, + request_deserializer=SubscribeRequest.FromString, + response_serializer=SubscribeResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'gnmi.gNMI', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + class BetagNMIServicer(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + # missing associated documentation comment in .proto file + pass + def Capabilities(self, request, context): + """Capabilities allows the client to retrieve the set of capabilities that + is supported by the target. This allows the target to validate the + service version that is implemented and retrieve the set of models that + the target supports. The models can then be specified in subsequent RPCs + to restrict the set of data that is utilized. + Reference: gNMI Specification Section 3.2 + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Get(self, request, context): + """Retrieve a snapshot of data from the target. A Get RPC requests that the + target snapshots a subset of the data tree as specified by the paths + included in the message and serializes this to be returned to the + client using the specified encoding. + Reference: gNMI Specification Section 3.3 + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Set(self, request, context): + """Set allows the client to modify the state of data on the target. The + paths to modified along with the new values that the client wishes + to set the value to. + Reference: gNMI Specification Section 3.4 + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Subscribe(self, request_iterator, context): + """Subscribe allows a client to request the target to send it values + of particular paths within the data tree. These values may be streamed + at a particular cadence (STREAM), sent one off on a long-lived channel + (POLL), or sent as a one-off retrieval (ONCE). + Reference: gNMI Specification Section 3.5 + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + + + class BetagNMIStub(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + # missing associated documentation comment in .proto file + pass + def Capabilities(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Capabilities allows the client to retrieve the set of capabilities that + is supported by the target. This allows the target to validate the + service version that is implemented and retrieve the set of models that + the target supports. The models can then be specified in subsequent RPCs + to restrict the set of data that is utilized. + Reference: gNMI Specification Section 3.2 + """ + raise NotImplementedError() + Capabilities.future = None + def Get(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Retrieve a snapshot of data from the target. A Get RPC requests that the + target snapshots a subset of the data tree as specified by the paths + included in the message and serializes this to be returned to the + client using the specified encoding. + Reference: gNMI Specification Section 3.3 + """ + raise NotImplementedError() + Get.future = None + def Set(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Set allows the client to modify the state of data on the target. The + paths to modified along with the new values that the client wishes + to set the value to. + Reference: gNMI Specification Section 3.4 + """ + raise NotImplementedError() + Set.future = None + def Subscribe(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None): + """Subscribe allows a client to request the target to send it values + of particular paths within the data tree. These values may be streamed + at a particular cadence (STREAM), sent one off on a long-lived channel + (POLL), or sent as a one-off retrieval (ONCE). + Reference: gNMI Specification Section 3.5 + """ + raise NotImplementedError() + + + def beta_create_gNMI_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_deserializers = { + ('gnmi.gNMI', 'Capabilities'): CapabilityRequest.FromString, + ('gnmi.gNMI', 'Get'): GetRequest.FromString, + ('gnmi.gNMI', 'Set'): SetRequest.FromString, + ('gnmi.gNMI', 'Subscribe'): SubscribeRequest.FromString, + } + response_serializers = { + ('gnmi.gNMI', 'Capabilities'): CapabilityResponse.SerializeToString, + ('gnmi.gNMI', 'Get'): GetResponse.SerializeToString, + ('gnmi.gNMI', 'Set'): SetResponse.SerializeToString, + ('gnmi.gNMI', 'Subscribe'): SubscribeResponse.SerializeToString, + } + method_implementations = { + ('gnmi.gNMI', 'Capabilities'): face_utilities.unary_unary_inline(servicer.Capabilities), + ('gnmi.gNMI', 'Get'): face_utilities.unary_unary_inline(servicer.Get), + ('gnmi.gNMI', 'Set'): face_utilities.unary_unary_inline(servicer.Set), + ('gnmi.gNMI', 'Subscribe'): face_utilities.stream_stream_inline(servicer.Subscribe), + } + server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) + return beta_implementations.server(method_implementations, options=server_options) + + + def beta_create_gNMI_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_serializers = { + ('gnmi.gNMI', 'Capabilities'): CapabilityRequest.SerializeToString, + ('gnmi.gNMI', 'Get'): GetRequest.SerializeToString, + ('gnmi.gNMI', 'Set'): SetRequest.SerializeToString, + ('gnmi.gNMI', 'Subscribe'): SubscribeRequest.SerializeToString, + } + response_deserializers = { + ('gnmi.gNMI', 'Capabilities'): CapabilityResponse.FromString, + ('gnmi.gNMI', 'Get'): GetResponse.FromString, + ('gnmi.gNMI', 'Set'): SetResponse.FromString, + ('gnmi.gNMI', 'Subscribe'): SubscribeResponse.FromString, + } + cardinalities = { + 'Capabilities': cardinality.Cardinality.UNARY_UNARY, + 'Get': cardinality.Cardinality.UNARY_UNARY, + 'Set': cardinality.Cardinality.UNARY_UNARY, + 'Subscribe': cardinality.Cardinality.STREAM_STREAM, + } + stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) + return beta_implementations.dynamic_stub(channel, 'gnmi.gNMI', cardinalities, options=stub_options) +except ImportError: + pass +# @@protoc_insertion_point(module_scope) diff --git a/gnmi_pb2.pyc b/gnmi_pb2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1ab60c3f64a125eaa7e27f61f9505f85bebf423 GIT binary patch literal 44121 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 NAGq-1J$rjn{|Y4?#iIZK literal 0 HcmV?d00001 diff --git a/grpc_support.py b/grpc_support.py new file mode 100644 index 0000000..e6b09d0 --- /dev/null +++ b/grpc_support.py @@ -0,0 +1,191 @@ +#!/usr/bin/python + +############################################################################## +# # +# grpc_support.py # +# # +# History Change Log: # +# # +# 1.0 [JGC] 2018/06/26 first version # +# # +# Objective: # +# # +# Supporting module for pygnmi.py # +# Some ported from previous version of gNMI_Subscribe.py # +# # +# Features supported: # +# # +# - create_channel (secure and insecure) # +# - logging # +# - path manipulation # +# # +# License: # +# # +# Licensed under the MIT license # +# See LICENSE.md delivered with this project for more information. # +# # +# Author: # +# # +# Sven Wisotzky [SW] # +# mail: sven.wisotzky(at)nokia.com # +# # +# James Cumming [JGC] # +# mail: james.cumming(at)nokia.com # +# # +############################################################################## + +""" +gNMI Supporting Modules in Python Version 1.0 +Copyright (C) 2017 Nokia. All Rights Reserved. +""" + +__title__ = "grpc_support" +__version__ = "1.0" +__status__ = "dev" +__author__ = "James Cumming" +__date__ = "2018 June 26th" + +############################################################################## + +import argparse +import re +import sys +import os +import logging +import time +import gnmi_pb2 + +############################################################################## + +def create_channel(options,log): + try: + import grpc + except ImportError as err: + log.error(str(err)) + quit() + + if options.tls or options.cert: + log.debug("Create SSL Channel") + if options.cert: + cred = grpc.ssl_channel_credentials(root_certificates=open(options.cert).read()) + opts = [] + if options.altName: + opts.append(('grpc.ssl_target_name_override', options.altName,)) + if options.noHostCheck: + log.error('Disable server name verification against TLS cert is not yet supported!') + # TODO: Clarify how to setup gRPC with SSLContext using check_hostname:=False + + channel = grpc.secure_channel(options.server, cred, opts) + return channel + else: + log.error('Disable cert validation against root certificate (InsecureSkipVerify) is not yet supported!') + # TODO: Clarify how to setup gRPC with SSLContext using verify_mode:=CERT_NONE + + cred = grpc.ssl_channel_credentials(root_certificates=None, private_key=None, certificate_chain=None) + channel = grpc.secure_channel(options.server, cred) + return channel + + else: + log.info("Create insecure Channel... Username: "+options.username+" Password: "+options.password) + channel = grpc.insecure_channel(options.server) + return channel + +def list_from_path(path='/'): + if path: + if path[0]=='/': + if path[-1]=='/': + return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path)[1:-1] + else: + return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path)[1:] + else: + if path[-1]=='/': + return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path)[:-1] + else: + return re.split('''/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)''', path) + return [] + + +def path_from_string(path='/'): + mypath = [] + + for e in list_from_path(path): + eName = e.split("[", 1)[0] + eKeys = re.findall('\[(.*?)\]', e) + dKeys = dict(x.split('=', 1) for x in eKeys) + mypath.append(gnmi_pb2.PathElem(name=eName, key=dKeys)) + + return gnmi_pb2.Path(elem=mypath) + + +def gen_request( opt,log ): + mysubs = [] + for path in opt.xpaths: + mypath = path_from_string(path) + mysub = gnmi_pb2.Subscription(path=mypath, mode=opt.submode, suppress_redundant=opt.suppress, sample_interval=opt.interval*1000000000, heartbeat_interval=opt.heartbeat) + mysubs.append(mysub) + + if opt.prefix: + myprefix = path_from_string(opt.prefix) + else: + myprefix = None + + if opt.qos: + myqos = gnmi_pb2.QOSMarking(marking=opt.qos) + else: + myqos = None + + mysblist = gnmi_pb2.SubscriptionList(prefix=myprefix, mode=opt.mode, allow_aggregation=opt.aggregate, encoding=opt.encoding, subscription=mysubs, use_aliases=opt.use_alias, qos=myqos) + mysubreq = gnmi_pb2.SubscribeRequest( subscribe=mysblist ) + + log.info('Sending SubscribeRequest\n'+str(mysubreq)) + yield mysubreq + +############################################################################## + +def setup_log(options,prog): + # setup logging + + if options.quiet: + loghandler = logging.NullHandler() + loglevel = logging.NOTSET + else: + if options.verbose==None: + logformat = '%(asctime)s,%(msecs)-3d %(message)s' + else: + logformat = '%(asctime)s,%(msecs)-3d %(levelname)-8s %(threadName)s %(message)s' + + if options.verbose==None or options.verbose==1: + loglevel = logging.INFO + else: + loglevel = logging.DEBUG + + # For supported GRPC trace options check: + # https://github.com/grpc/grpc/blob/master/doc/environment_variables.md + + if options.verbose==3: + os.environ["GRPC_TRACE"] = "all" + os.environ["GRPC_VERBOSITY"] = "ERROR" + + if options.verbose==4: + os.environ["GRPC_TRACE"] = "api,call_error,channel,connectivity_state,op_failure" + os.environ["GRPC_VERBOSITY"] = "INFO" + + if options.verbose==5: + os.environ["GRPC_TRACE"] = "all" + os.environ["GRPC_VERBOSITY"] = "INFO" + + if options.verbose==6: + os.environ["GRPC_TRACE"] = "all" + os.environ["GRPC_VERBOSITY"] = "DEBUG" + + timeformat = '%y/%m/%d %H:%M:%S' + loghandler = logging.StreamHandler(options.logfile) + loghandler.setFormatter(logging.Formatter(logformat, timeformat)) + + log = logging.getLogger(prog) + log.setLevel(loglevel) + log.addHandler(loghandler) + return log + +# EOF + diff --git a/grpc_support.pyc b/grpc_support.pyc new file mode 100644 index 0000000000000000000000000000000000000000..272d02ccb9bfb2870017647c87b94b1bb00fef45 GIT binary patch literal 4915 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 Yp<-9ilFO$Ib-ntOtMm2gdcAt(KTHrgvj6}9 literal 0 HcmV?d00001 diff --git a/pygnmi.py b/pygnmi.py new file mode 100755 index 0000000..399cd5a --- /dev/null +++ b/pygnmi.py @@ -0,0 +1,131 @@ +#!/usr/bin/python + +############################################################################## +# # +# pygnmi.py # +# # +# History Change Log: # +# # +# 1.0 [JGC] 2018/06/26 first version # +# # +# Objective: # +# # +# Testing tool for the gNMI (GRPC Network Management Interface) in Python # +# # +# Features supported: # +# # +# - gNMI Capabilities # +# - gNMI Subscribe (Based on Nokia SR OS release 16 feature-set) # +# - secure and insecure mode # +# - multiple subscriptions paths # +# # +# Not yet supported: # +# # +# - Disable server name verification against TLS cert (opt: noHostCheck) # +# - Disable cert validation against root certificate (InsecureSkipVerify) # +# - gNMI Get # +# - gNMI Set # +# # +# License: # +# # +# Licensed under the MIT license # +# See LICENSE.md delivered with this project for more information. # +# # +# Author: # +# # +# Sven Wisotzky [SW] # +# mail: sven.wisotzky(at)nokia.com # +# # +# James Cumming [JGC] # +# mail: james.cumming(at)nokia.com # +# # +############################################################################## + +""" +gNMI tools in Python Version 1.0 +Copyright (C) 2018 Nokia. All Rights Reserved. +""" + +__title__ = "pygnmi" +__version__ = "1.0" +__status__ = "dev" +__author__ = "James Cumming" +__date__ = "2018 June 26th" + +############################################################################## + +import argparse +import re +import sys +import os +import time +import grpc_support + +############################################################################## + +def get_options(): + prog = os.path.splitext(os.path.basename(sys.argv[0]))[0] + + parser = argparse.ArgumentParser() + parser.add_argument('--version', action='version', version=prog+' '+__version__) + + group = parser.add_mutually_exclusive_group() + group.add_argument('-q', '--quiet', action='store_true', help='disable logging') + group.add_argument('-v', '--verbose', action='count', help='enhanced logging') + group = parser.add_argument_group() + group.add_argument('--server', default='localhost:57400', help='server/port (default: localhost:57400)') + group.add_argument('--username', default='admin', help='username (default: admin)') + group.add_argument('--password', default='admin', help='password (default: admin)') + group.add_argument('--cert', metavar='', help='CA root certificate') + group.add_argument('--tls', action='store_true', help='enable TLS security') + group.add_argument('--ciphers', help='override environment "GRPC_SSL_CIPHER_SUITES"') + group.add_argument('--altName', help='subjectAltName/CN override for server host validation') + group.add_argument('--noHostCheck', action='store_true', help='disable server host validation') + + group = parser.add_argument_group() + group.add_argument('--logfile', metavar='', type=argparse.FileType('wb', 0), default='-', help='Specify the logfile (default: )') + group.add_argument('--stats', action='store_true', help='collect stats') + + + group = parser.add_argument_group() + group.add_argument('--service', default="capabilities", help='[capabilities, get, set, subscribe]') + + group = parser.add_argument_group() + group.add_argument('--interval', default=10, type=int, help='sample interval (default: 10s)') + group.add_argument('--timeout', type=int, help='subscription duration in seconds (default: none)') + group.add_argument('--heartbeat', type=int, help='heartbeat interval (default: none)') + group.add_argument('--aggregate', action='store_true', help='allow aggregation') + group.add_argument('--suppress', action='store_true', help='suppress redundant') + group.add_argument('--submode', default=2, type=int, help='subscription mode [TARGET_DEFINED, ON_CHANGE, SAMPLE]') + group.add_argument('--mode', default=0, type=int, help='[STREAM, ONCE, POLL]') + group.add_argument('--encoding', default=0, type=int, help='[JSON, BYTES, PROTO, ASCII, JSON_IETF]') + group.add_argument('--qos', default=0, type=int, help='[JSON, BYTES, PROTO, ASCII, JSON_IETF]') + group.add_argument('--use_alias', action='store_true', help='use alias') + group.add_argument('--prefix', default='', help='gRPC path prefix (default: none)') + group.add_argument('xpaths', nargs=argparse.REMAINDER, help='path(s) to subscriber (default: /)') + options = parser.parse_args() + + if len(options.xpaths)==0: + options.xpaths=['/'] + + if options.ciphers: + os.environ["GRPC_SSL_CIPHER_SUITES"] = options.ciphers + + return(options,prog) + +if __name__ == '__main__': + (options,prog) = get_options() + + log = grpc_support.setup_log(options,prog) + + channel = grpc_support.create_channel(options,log) + + if options.service == "subscribe": + try: + import gNMI_Subscribe + gNMI_Subscribe.subscribe(channel, options,log) + except: + log.error(str(err)) + quit() + + From b843835c2a0a87a0743f8f88733c48a5234e95d0 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Tue, 26 Jun 2018 14:11:43 +0100 Subject: [PATCH 02/18] Updated usage info to add --service tag --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index eff1019..23b506b 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,14 @@ https://github.com/grpc/grpc/blob/master/INSTALL.md ``` $ pip install --upgrade pip $ pip install grpcio -$ curl -O https://raw.githubusercontent.com/openconfig/gnmi/c5b444cd3ab8af669d0b8934f47a41ed6a985cdc/proto/gnmi/gnmi_pb2.py -$ python gNMI_Subscribe.py --help +$ curl -O https://raw.githubusercontent.com/openconfig/gnmi/master/proto/gnmi/gnmi_pb2.py +$ python pygnmi.py --help ``` ## Usage Example: ``` -$ python gNMI_Subscribe.py --server 192.168.33.2:57400 --username grpc --password Nokia4gnmi --cert CAcert.pem --ciphers AES128 /state/port[port-id=1/1/1]/ethernet/statistics/out-utilization +$ python pygnmi.py --server 192.168.33.2:57400 --username grpc --password Nokia4gnmi --service subscribe --cert CAcert.pem --ciphers AES128 /state/port[port-id=1/1/1]/ethernet/statistics/out-utilization 17/12/04 16:02:43,160 Sending SubscribeRequest subscribe { subscription { @@ -81,5 +81,5 @@ update { ^C -17/12/04 16:03:04,511 gNMI_Subscribe stopped by user +17/12/04 16:03:04,511 pygnmi stopped by user ``` From e622c5098b655da190b7e62520fe22ca83f665e5 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Tue, 26 Jun 2018 14:13:30 +0100 Subject: [PATCH 03/18] Updated formatting of README --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 23b506b..35885bf 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,10 @@ $ python pygnmi.py --help ## Usage Example: ``` -$ python pygnmi.py --server 192.168.33.2:57400 --username grpc --password Nokia4gnmi --service subscribe --cert CAcert.pem --ciphers AES128 /state/port[port-id=1/1/1]/ethernet/statistics/out-utilization +$ python pygnmi.py --server 192.168.33.2:57400 --username grpc --password Nokia4gnmi \ + --service subscribe --cert CAcert.pem \ + --ciphers AES128 /state/port[port-id=1/1/1]/ethernet/statistics/out-utilization + 17/12/04 16:02:43,160 Sending SubscribeRequest subscribe { subscription { From a855e9988b95f69439949d7e851417fe0af19e7c Mon Sep 17 00:00:00 2001 From: James Cumming Date: Tue, 26 Jun 2018 14:17:21 +0100 Subject: [PATCH 04/18] 201806261417 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35885bf..f3b9e01 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Python tools for gNMI ## Installation Python tools for gNMI can be used with Python 2.7 and Python3. Please follow gRPC Installation Guide from: -https://github.com/grpc/grpc/blob/master/INSTALL.md +https://github.com/grpc/grpc ``` $ pip install --upgrade pip From 02f0f46b831f4db537ac47921a0e9320b81f049f Mon Sep 17 00:00:00 2001 From: James Cumming Date: Tue, 26 Jun 2018 14:36:53 +0100 Subject: [PATCH 05/18] 201806261437 Added Capabilities Service --- gNMI_Capabilities.py | 13 +++++++++++++ gNMI_Capabilities.pyc | Bin 0 -> 729 bytes pygnmi.py | 20 ++++++++++++++------ 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 gNMI_Capabilities.py create mode 100644 gNMI_Capabilities.pyc diff --git a/gNMI_Capabilities.py b/gNMI_Capabilities.py new file mode 100644 index 0000000..d669ad1 --- /dev/null +++ b/gNMI_Capabilities.py @@ -0,0 +1,13 @@ +def get_capabilities(channel, options, log): + try: + import grpc + import gnmi_pb2 + except ImportError as err: + log.error(str(err)) + quit() + stub = gnmi_pb2.gNMIStub(channel) + metadata = [('username',options.username), ('password',options.password)] + responses = gnmi_pb2.CapabilityResponse() + responses = stub.Capabilities(gnmi_pb2.CapabilityRequest(),5,metadata=metadata) + print responses + diff --git a/gNMI_Capabilities.pyc b/gNMI_Capabilities.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e631fc2b98aea1b399eddf2b23abe5ecd9a6865 GIT binary patch literal 729 zcmb7B!EVz)6r8o4#7$aJsKg2NhU5!G>KP$Wg`ld)!8w575IMFn4vFo0pM@gXr}8=c z9UoBUEiLrQ$~!wd``*5JUjNt8w0M2?ImPWTTwih8BSHrJ06vizEF+If>Jtt)N1W%J z_9tQgL?alz1qT0)8w>$HRL>BIhi_A~moUQ!ruVS%Ap!aku8n?1$N*CreCz{k#^|B? zFh=H~H`q+@#Y5&h9x5+93=?SZfu;^2`Y|?Br_5Bz0%Rlf6I^>nPeZ(YM~BO3Ov8)v zhC@Qq&gN~E>~gnh5^KNLZB}Y~PT@h4C6Yvkssx0hZBlnsRJ(H3tj}ad^SYLh#NStPs!$O zUCX>EW!~(y>v_QzR`;DfZ}xJ`$Rd|jde;aYYj^fB0me6n=GZ(iCuT-G(j{Z{3jDFLrg-ZS$9|9{2bS&OMrs literal 0 HcmV?d00001 diff --git a/pygnmi.py b/pygnmi.py index 399cd5a..d9cc73b 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -120,12 +120,20 @@ def get_options(): channel = grpc_support.create_channel(options,log) + if options.service == "capabilities": + try: + import gNMI_Capabilities + gNMI_Capabilities.get_capabilities(channel, options, log) + except Exception as err: + log.error(str(err)) + quit() + if options.service == "subscribe": - try: - import gNMI_Subscribe - gNMI_Subscribe.subscribe(channel, options,log) - except: - log.error(str(err)) - quit() + try: + import gNMI_Subscribe + gNMI_Subscribe.subscribe(channel, options,log) + except Exception as err: + log.error(str(err)) + quit() From d752b1b524743c09bfb2293d14747c055664705d Mon Sep 17 00:00:00 2001 From: James Cumming Date: Tue, 26 Jun 2018 14:48:08 +0100 Subject: [PATCH 06/18] 201806261448 --- gNMI_Capabilities.py | 1 + gNMI_Capabilities.pyc | Bin 729 -> 804 bytes grpc_support.py | 2 +- grpc_support.pyc | Bin 4915 -> 4932 bytes pygnmi.py | 2 +- 5 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gNMI_Capabilities.py b/gNMI_Capabilities.py index d669ad1..3e3ce3e 100644 --- a/gNMI_Capabilities.py +++ b/gNMI_Capabilities.py @@ -8,6 +8,7 @@ def get_capabilities(channel, options, log): stub = gnmi_pb2.gNMIStub(channel) metadata = [('username',options.username), ('password',options.password)] responses = gnmi_pb2.CapabilityResponse() + log.info("Obtaining capabilities from "+options.server) responses = stub.Capabilities(gnmi_pb2.CapabilityRequest(),5,metadata=metadata) print responses diff --git a/gNMI_Capabilities.pyc b/gNMI_Capabilities.pyc index 7e631fc2b98aea1b399eddf2b23abe5ecd9a6865..3f58181d898ce5150c082c7c822c8557b2b17688 100644 GIT binary patch delta 206 zcmcb~x`d65`7G1hW0)NnAkd!#Th1Z%KQ{Gx1HEW^OS;Ga~In3;)pEDk36q~%BNnA*d Z(NBXBs31rfNN4~t!{h`e)5-kIq5$3I8TbGI diff --git a/grpc_support.py b/grpc_support.py index e6b09d0..d6f13c6 100644 --- a/grpc_support.py +++ b/grpc_support.py @@ -86,7 +86,7 @@ def create_channel(options,log): return channel else: - log.info("Create insecure Channel... Username: "+options.username+" Password: "+options.password) + log.info("Create insecure channel to "+options.server+" Username: "+options.username+" Password: "+options.password) channel = grpc.insecure_channel(options.server) return channel diff --git a/grpc_support.pyc b/grpc_support.pyc index 272d02ccb9bfb2870017647c87b94b1bb00fef45..a4d7659359a4aab7741133ec6b45eef57e2beee9 100644 GIT binary patch delta 114 zcmdn2c0`Sh`7a}-MQ6^glm@|!(a O?l3ZHZB}LD;{^aPJRDL0 delta 97 zcmX@2wpoph`7d z-ps|U%_yhJz`)>Kl$uzQs*ssioSIx(l&avIk(ig4nxm(uw>gsK4kM%dW-~TEUI2~) B7?}V7 diff --git a/pygnmi.py b/pygnmi.py index d9cc73b..cf3d1e9 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -88,7 +88,7 @@ def get_options(): group = parser.add_argument_group() - group.add_argument('--service', default="capabilities", help='[capabilities, get, set, subscribe]') + group.add_argument('--service', default='capabilities', help='[capabilities, get, set, subscribe]') group = parser.add_argument_group() group.add_argument('--interval', default=10, type=int, help='sample interval (default: 10s)') From eaf5f2662acf969e08dd25375851b93694d027cf Mon Sep 17 00:00:00 2001 From: James Cumming Date: Tue, 26 Jun 2018 18:27:06 +0100 Subject: [PATCH 07/18] 201806261827 Added Get --- gNMI_Capabilities.py | 2 +- gNMI_Capabilities.pyc | Bin 804 -> 799 bytes gNMI_Get.py | 127 ++++++++++++++++++++++++++++++++++++++++++ gNMI_Get.pyc | Bin 0 -> 2095 bytes gNMI_Subscribe.py | 29 +++++++++- gNMI_Subscribe.pyc | Bin 2318 -> 3352 bytes grpc_support.py | 23 -------- grpc_support.pyc | Bin 4932 -> 3943 bytes pygnmi.py | 14 ++++- 9 files changed, 167 insertions(+), 28 deletions(-) create mode 100644 gNMI_Get.py create mode 100644 gNMI_Get.pyc diff --git a/gNMI_Capabilities.py b/gNMI_Capabilities.py index 3e3ce3e..b929c06 100644 --- a/gNMI_Capabilities.py +++ b/gNMI_Capabilities.py @@ -10,5 +10,5 @@ def get_capabilities(channel, options, log): responses = gnmi_pb2.CapabilityResponse() log.info("Obtaining capabilities from "+options.server) responses = stub.Capabilities(gnmi_pb2.CapabilityRequest(),5,metadata=metadata) - print responses + return responses diff --git a/gNMI_Capabilities.pyc b/gNMI_Capabilities.pyc index 3f58181d898ce5150c082c7c822c8557b2b17688..6a196a2971493fb0528aaac179bfae909c0f29fc 100644 GIT binary patch delta 24 gcmZ3&HlK}+`71): + log.info("%d update messages received", msgs) + return msgs + + return response + +# EOF + diff --git a/gNMI_Get.pyc b/gNMI_Get.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec7e8ac88e4bc36543db180d37a98519778da78b GIT binary patch literal 2095 zcmb7FZEqVz5S~51#ZDaOr7aaih6<-(7b1 z(pa*;kp2q(CLj3#&&=6{ZwOnSo!yz8otJ0El|S08-kYOehqU~7Sii>4{ss~e4L}tQ z6h$5lJc=qbs8Cd;L6xE!4QdqCDQeK9P6IF{-=INb#jnv|ZN)cf&|L8?8njmYIt|t- zTBEmkZiAwxFl{z_)@`vbuRvPy>B|%Ud+q!r^?#hXQI`5YYhx3vhx<=ky)2)ZBpx}x z+xx^ndV2V|f0|t-;lBUPWa9T(V*S3h+T7@9zvb3olT8LNX)D;kh~qWVH@1!Sc{tV9 z?-kQ&lE!uuCt~z@k!t_wnHwd4;d46Vgt0BY+QZNO4uX^+cN3z8M=@xHZlBPcXsqbF z*B{ZMO3tHkh2~YdQ?#hjyh7tD&1<|>*L!r%$~7{t2|krPE7mDRiea!WhYd1sX%0(B zv9~{ClZfkihxHQ=`u+Fe8z7XcQP9tG+qc4+NdEqomwIumEvyMyq)2p+W zOAmO9TJ-gGp{?t3PDM4#ovf2A?z5Mr+cR;f&smp8rg9*TgDqdIK{%b^sV*22V)wuu zm@IP#apDg0S&S$TRyf$tXKoz|u}%Y1`f-S@eF#EoL)F!m>Zon6sdl_N=tIyU`^0JB z*8~8uBAV^}3j=7C5)V@9^YjT-QU0qInHMNlofMa_Ldej(&H!KxI6wh!riy-HDXQ+t zIUq7dRf#vKGXkC~F7lm63!ngXRy1zXC0Z5cz_*x>Aq5I*v_R8=qTN8zYoKkKeagri zuk(wGO`11oyg_rZJVqM=Yfac!5S^zZ_`WH=|4B-T=N;};hL;C_f1oNrJ>C+PkCj?< zR^g$+=N%evmwGC#l1G1-gq7oTQhTm|sOH_afvbnON6^#_{b?=MLkx%b6DOa1^Gg zo(PXNh0OLlER<T5D(G$Q>|M3)wN=OKs7GEM-HxxvvJdaK)vmXr z9ze3~v2NAt@;`z^9t2S~3<60Kmc&go7Orm)+?4-N*zPa1^#?`g;HemTveVxqr#1YXcy RUj?t~)eVHd{8pRy{sudgyw(5! literal 0 HcmV?d00001 diff --git a/gNMI_Subscribe.py b/gNMI_Subscribe.py index 8b6c83c..f0bedb8 100644 --- a/gNMI_Subscribe.py +++ b/gNMI_Subscribe.py @@ -69,7 +69,31 @@ ############################################################################## -def subscribe(channel, options,log): +def gen_request( opt, log ): + import gnmi_pb2 + mysubs = [] + for path in opt.xpaths: + mypath = grpc_support.path_from_string(path) + mysub = gnmi_pb2.Subscription(path=mypath, mode=opt.submode, suppress_redundant=opt.suppress, sample_interval=opt.interval*1000000000, heartbeat_interval=opt.heartbeat) + mysubs.append(mysub) + + if opt.prefix: + myprefix = path_from_string(opt.prefix) + else: + myprefix = None + + if opt.qos: + myqos = gnmi_pb2.QOSMarking(marking=opt.qos) + else: + myqos = None + + mysblist = gnmi_pb2.SubscriptionList(prefix=myprefix, mode=opt.mode, allow_aggregation=opt.aggregate, encoding=opt.encoding, subscription=mysubs, use_aliases=opt.use_alias, qos=myqos) + mysubreq = gnmi_pb2.SubscribeRequest( subscribe=mysblist ) + + log.info('Sending SubscribeRequest\n'+str(mysubreq)) + yield mysubreq + +def subscribe(channel, options, log, prog): try: import grpc import gnmi_pb2 @@ -80,7 +104,7 @@ def subscribe(channel, options,log): log.debug("Create gNMI stub") stub = gnmi_pb2.gNMIStub(channel) - req_iterator = grpc_support.gen_request( options, log ) + req_iterator = gen_request( options, log ) metadata = [('username',options.username), ('password', options.password)] msgs = 0 @@ -121,6 +145,7 @@ def subscribe(channel, options,log): if (msgs>1): log.info("%d update messages received", msgs) + return msgs # EOF diff --git a/gNMI_Subscribe.pyc b/gNMI_Subscribe.pyc index ef08149c28c0512ba4c272ef92e687ac5984524d..fc65320ba2e06abfc91ac55afaf6d8eb91461c6d 100644 GIT binary patch literal 3352 zcmb7GQF9|l5$;*ZvLwrv?X%AZ31qn{R~bm`J6FPmgQ5Tv>h40Eu&UgpM5tw@9j{lG zcGokbJByNDIQ{@nRKdUCfk)nW;W2-O9{^wXYGslqBGt}L&-8Tnd^7#^*8aWO*6HbQ zhP3>7c>ffS{R5hqsE<}rUs3E)-=nxj{Tjt}>ene=qy8Gj4T{%k+@L->Wq+Oe>s7x= z{bto~QNLC7+thDY{SE4GP~4iUZETA7!{c|`XL&I*X>#fOqqFb&rw<-J^3U_DG&=TwHXi!{&saau zR-2bPK5n}$IAHtX%D$~(2&NprWBt-@;{7a|XzQO%CzCWwEH8rT_x)$nO#7!laF^+S z@H-zeh8uXgcoQZ zGQ88GFxuMC=y;mNQRW;YZ=*>u)?u1CoN_cy>0f{Ok?3FQ$hd)y+-lCPLw^#PD;%q9 zuoI&%(i_LFqwzR@6-G&7bP_pSFxSMW&W3r++8qeCyp)B^^1)B74&gDf+RFX8&aG?R zDh{;$2Be;8cRT;jLTon3!T1^1gH9+%~j%D!efH zB(%;{aV;-%85eI6feLE8g96{ zusa)Y?k#1xDQl2rO7=OKEl;)_=5yhVL18dPxRo#+7=3+&36jR%NAJYsxjRWxcT&vw zSWdpo7stiSae#@=a1Z4ipFp%e8d4qAP}{1j9;+R%rFOjr+Iwh!j{bof^1bG}##iqQ zkNrEgF?*Al7b(D;0U{{-LJcpncc>1!xI$8Yh!kxgUxYjWTAB8oLT(KyMk-VE8P6iu zJz)g!33vlMP?7*PjU0r=YmboZoYzRn7F~etVGjK^_Y=&5z1L^~-bM??Mhm(|yGgU( zD{#UH3?SA<7zYm_$33;!qMOgudNF7mBBXH z!hDnNJzBZqh`MC%d%O~?15$xo5DDn2UIKwp$QbR=emS%Mx&|t|?_GaU`QKny=C4cO zKv|`KFz{$cq5yv#+>Y(8BD*z#;9z3ILwrEt$|LhnwF(-bWC$H#b?Ff>Lpbh^INxK! z!^%g%u-uGYZ3Z;>B^Z_=%i+d5U!DAdUcAUIaTWIEDm?R)lKo)+yG+42QI$QRI%>-3 zuBaHC$98pFV#Kpeqk~e?|81qim69pwk14 z^f1E3TSk1NhdM~)D2siFsMt12AiqjcpfmsQ;qmE(Z}l+GVrx0S zd+>zhPlxugfB4?0E_BA-C~#^lCIrt|m62Q2!QIqfzQ;h!>$6qTO@ zh)*S~TP6DjW4Zy(*b5lPz(*r`*VEL=&SO28CURnYm_3|j@IBW2 zJ~wZ(I+wT=jY~~+=|tz#l2@NZ_Lr$1$6}Qy#Ht1OHh7Ddb5y9Rx~#_Kv6Vcpv)}=1 zFh_o+X2F>Mqvqcx>&6eF#)x80W(g84ASZ-1J hI#7w{ALHX^I@UjV4`w8f8WlXMQSShV<-gv#_g~yn@UZ{@ delta 985 zcmZ8g&ubGw6#m}s=GX2fo2HGeO_i2X38I%?f(JpVLQAPg6j~@+Xg7`BwwrXa0aIql zAxA+d>%o%;@#MurJ$U!xA7HQk1>QV*@y(=(&}HZC%$xV)d*6Hee)estV*bh73-^|{ z_i*_b{C&Wy(>ts5QW-p}=FUEzKQUQVNqOQNOVQ&sT!3U0j*c|N%v4zd>F09DF zp$)MPic=tIATSYGkg4QnYN2l-$Up)Ec1R=2BFI4!*lb`R&cHX-F|e_3z-KSsJ8IwL z+bsMP;+&SYmX4M#dZ#4Q2wX@G&MtZQX~->b7K@i&- zU>bf_V=O4;G%u14A`gLw0U%w>)Z$St6~73vWT?_6;4^+3lBI)zH7uC5tm4-}d3aME zn4ps-qknQS0>I`B;KLq_qRTz;MuXu`LNd+QhlcYUXjTV$$42Anktqe1Lc-Rt zoI?xZ>xlm;Rin-WoNr`5QLVzG%ESRp(ca?`<4t&cu+!dMjvPL$9k*K|dMrds)YW81 zYRo&4NN(8k)yP%m?6=eDww0ZBX*R+g(KzWgI#FHyD|Itjv+w70l7n!+mAtWUQYQIq z&t_HLwrDkz?{<}n$#1*j=>$iuW?ez4=aM<+7Fo%Pb9y_cH(wSn5x~IgQXF*3s!O5mV#ca+Xar?>ZgcLagflLh`W|(|{)nGEOuppztWO-pFMm_-L CR~bM6 delta 1047 zcmYjP&2G~`5T1<_C(e)aL!nd^6;ud?6Q~D3AOw^iK;lPiq#{}%vb#&_k~ofc1F7UF zhjQRr<;DYWtx#V9ao`EKapVEGabji@SGDBv%CHi#T72-^gCIDp(Z2MHnzkmRTl8`R)sGQlAZ z#GlOoe2sZ=|bVi*c9)S5I_UN7p(b`WYAfAG2i{QNSxV*tC-i?uI3eR8Pt)XHRjDDw2K;x{qo*C&njIfz**hoPBnPt##{k}l3^F@Bc}P2%flH2s_}p0}RPWgxjv4|)zm!>;B&BAE z^1Dba4TgR!2h-n`>o@2kIx@uH!iYM;P_3W=X0sYAv)inmaabc`qdkvy9sNai>=ZMW wy^Ur3^>MvYV(f5w!F|9Q)3&Q@pYm^~zuZgqCb`k{pZl1tPB*HnR@qtl55Se}hyVZp diff --git a/pygnmi.py b/pygnmi.py index cf3d1e9..454415d 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -123,7 +123,7 @@ def get_options(): if options.service == "capabilities": try: import gNMI_Capabilities - gNMI_Capabilities.get_capabilities(channel, options, log) + output = gNMI_Capabilities.get_capabilities(channel, options, log) except Exception as err: log.error(str(err)) quit() @@ -131,9 +131,19 @@ def get_options(): if options.service == "subscribe": try: import gNMI_Subscribe - gNMI_Subscribe.subscribe(channel, options,log) + output = gNMI_Subscribe.subscribe(channel, options, log, prog) except Exception as err: log.error(str(err)) quit() + if options.service == "get": + try: + import gNMI_Get + output = gNMI_Get.get(channel, options, log, prog) + except Exception as err: + log.error(str(err)) + quit() + + print output + From 4fd6c610ca5c5c1dee75cd7d4b6843dfeb8873c5 Mon Sep 17 00:00:00 2001 From: jgcumming Date: Mon, 2 Jul 2018 09:22:31 +0100 Subject: [PATCH 08/18] Update README.md Changed initial pre-requisite install section --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f3b9e01..b44e32c 100644 --- a/README.md +++ b/README.md @@ -4,15 +4,18 @@ Python tools for gNMI ## Installation Python tools for gNMI can be used with Python 2.7 and Python3. Please follow gRPC Installation Guide from: -https://github.com/grpc/grpc +https://grpc.io/docs/quickstart/python ``` $ pip install --upgrade pip $ pip install grpcio +$ pip install grpcio-tools googleapis-common-protos $ curl -O https://raw.githubusercontent.com/openconfig/gnmi/master/proto/gnmi/gnmi_pb2.py $ python pygnmi.py --help ``` +## The default service is 'capabilities' + ## Usage Example: ``` From 9f6c491e5db487311a16e18a27f883aff2fb36d4 Mon Sep 17 00:00:00 2001 From: jgcumming Date: Mon, 2 Jul 2018 09:24:52 +0100 Subject: [PATCH 09/18] Update README.md --- README.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b44e32c..5c9b06e 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,30 @@ $ python pygnmi.py --help ## The default service is 'capabilities' -## Usage Example: +## Usage Example (CAPABILITIES): + +``` +$ pygnmi.py --service capabilities --username grpc --password nokia123 \ + --server 192.168.5.10:57400 + +18/07/02 08:21:51,712 Create insecure channel to 192.168.5.10:57400 Username: grpc Password: nokia123 +18/07/02 08:21:51,714 Obtaining capabilities from 192.168.5.10:57400 +supported_models { + name: "nokia-conf" + organization: "Nokia" + version: "16.0.R1" +} +supported_models { + name: "nokia-state" + organization: "Nokia" + version: "16.0.R1" +} +supported_encodings: JSON +gNMI_version: "0.4.0" + +``` + +## Usage Example (SUBSCRIBE): ``` $ python pygnmi.py --server 192.168.33.2:57400 --username grpc --password Nokia4gnmi \ From 104e81fe9bb37c19cff12c0056f3529d16d18449 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Mon, 2 Jul 2018 08:54:07 +0000 Subject: [PATCH 10/18] Removed .pyc --- gNMI_Capabilities.pyc | Bin 799 -> 0 bytes gNMI_Get.pyc | Bin 2095 -> 0 bytes gNMI_Subscribe.pyc | Bin 3352 -> 0 bytes gnmi_pb2.pyc | Bin 44121 -> 0 bytes grpc_support.pyc | Bin 3943 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 gNMI_Capabilities.pyc delete mode 100644 gNMI_Get.pyc delete mode 100644 gNMI_Subscribe.pyc delete mode 100644 gnmi_pb2.pyc delete mode 100644 grpc_support.pyc diff --git a/gNMI_Capabilities.pyc b/gNMI_Capabilities.pyc deleted file mode 100644 index 6a196a2971493fb0528aaac179bfae909c0f29fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmb7CO>fgc5S_K1kLH86dyS92rb9PMUd3QU$|$;O zB3gH;A&IwL$^vQ>t$VZzC<{IB3oim{dnDomv9^7Zv;)eJ7WyGQmb^`u)+4VPiz@3- zhTJ{636wbc=&FbMXZjZ&?t|7YwXG4ava_QXPTv)#`h!=0Sa3!{Ze7JdR{F~d5Gx6wkj>ZwiYPn+_MnOvGu;|TJs;@ z?Cr%R*NX&;l*k3~eZcu$6}u#NRcT!AZQ86#?qVH{e90}3_N6G8kM{%cUe^f5a;Ge3 zvHX-8lW#mPE7nNNQr4y{68R?5laHWezoV1dP`O2?}$151`;H#hX4Qo diff --git a/gNMI_Get.pyc b/gNMI_Get.pyc deleted file mode 100644 index ec7e8ac88e4bc36543db180d37a98519778da78b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2095 zcmb7FZEqVz5S~51#ZDaOr7aaih6<-(7b1 z(pa*;kp2q(CLj3#&&=6{ZwOnSo!yz8otJ0El|S08-kYOehqU~7Sii>4{ss~e4L}tQ z6h$5lJc=qbs8Cd;L6xE!4QdqCDQeK9P6IF{-=INb#jnv|ZN)cf&|L8?8njmYIt|t- zTBEmkZiAwxFl{z_)@`vbuRvPy>B|%Ud+q!r^?#hXQI`5YYhx3vhx<=ky)2)ZBpx}x z+xx^ndV2V|f0|t-;lBUPWa9T(V*S3h+T7@9zvb3olT8LNX)D;kh~qWVH@1!Sc{tV9 z?-kQ&lE!uuCt~z@k!t_wnHwd4;d46Vgt0BY+QZNO4uX^+cN3z8M=@xHZlBPcXsqbF z*B{ZMO3tHkh2~YdQ?#hjyh7tD&1<|>*L!r%$~7{t2|krPE7mDRiea!WhYd1sX%0(B zv9~{ClZfkihxHQ=`u+Fe8z7XcQP9tG+qc4+NdEqomwIumEvyMyq)2p+W zOAmO9TJ-gGp{?t3PDM4#ovf2A?z5Mr+cR;f&smp8rg9*TgDqdIK{%b^sV*22V)wuu zm@IP#apDg0S&S$TRyf$tXKoz|u}%Y1`f-S@eF#EoL)F!m>Zon6sdl_N=tIyU`^0JB z*8~8uBAV^}3j=7C5)V@9^YjT-QU0qInHMNlofMa_Ldej(&H!KxI6wh!riy-HDXQ+t zIUq7dRf#vKGXkC~F7lm63!ngXRy1zXC0Z5cz_*x>Aq5I*v_R8=qTN8zYoKkKeagri zuk(wGO`11oyg_rZJVqM=Yfac!5S^zZ_`WH=|4B-T=N;};hL;C_f1oNrJ>C+PkCj?< zR^g$+=N%evmwGC#l1G1-gq7oTQhTm|sOH_afvbnON6^#_{b?=MLkx%b6DOa1^Gg zo(PXNh0OLlER<T5D(G$Q>|M3)wN=OKs7GEM-HxxvvJdaK)vmXr z9ze3~v2NAt@;`z^9t2S~3<60Kmc&go7Orm)+?4-N*zPa1^#?`g;HemTveVxqr#1YXcy RUj?t~)eVHd{8pRy{sudgyw(5! diff --git a/gNMI_Subscribe.pyc b/gNMI_Subscribe.pyc deleted file mode 100644 index fc65320ba2e06abfc91ac55afaf6d8eb91461c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3352 zcmb7GQF9|l5$;*ZvLwrv?X%AZ31qn{R~bm`J6FPmgQ5Tv>h40Eu&UgpM5tw@9j{lG zcGokbJByNDIQ{@nRKdUCfk)nW;W2-O9{^wXYGslqBGt}L&-8Tnd^7#^*8aWO*6HbQ zhP3>7c>ffS{R5hqsE<}rUs3E)-=nxj{Tjt}>ene=qy8Gj4T{%k+@L->Wq+Oe>s7x= z{bto~QNLC7+thDY{SE4GP~4iUZETA7!{c|`XL&I*X>#fOqqFb&rw<-J^3U_DG&=TwHXi!{&saau zR-2bPK5n}$IAHtX%D$~(2&NprWBt-@;{7a|XzQO%CzCWwEH8rT_x)$nO#7!laF^+S z@H-zeh8uXgcoQZ zGQ88GFxuMC=y;mNQRW;YZ=*>u)?u1CoN_cy>0f{Ok?3FQ$hd)y+-lCPLw^#PD;%q9 zuoI&%(i_LFqwzR@6-G&7bP_pSFxSMW&W3r++8qeCyp)B^^1)B74&gDf+RFX8&aG?R zDh{;$2Be;8cRT;jLTon3!T1^1gH9+%~j%D!efH zB(%;{aV;-%85eI6feLE8g96{ zusa)Y?k#1xDQl2rO7=OKEl;)_=5yhVL18dPxRo#+7=3+&36jR%NAJYsxjRWxcT&vw zSWdpo7stiSae#@=a1Z4ipFp%e8d4qAP}{1j9;+R%rFOjr+Iwh!j{bof^1bG}##iqQ zkNrEgF?*Al7b(D;0U{{-LJcpncc>1!xI$8Yh!kxgUxYjWTAB8oLT(KyMk-VE8P6iu zJz)g!33vlMP?7*PjU0r=YmboZoYzRn7F~etVGjK^_Y=&5z1L^~-bM??Mhm(|yGgU( zD{#UH3?SA<7zYm_$33;!qMOgudNF7mBBXH z!hDnNJzBZqh`MC%d%O~?15$xo5DDn2UIKwp$QbR=emS%Mx&|t|?_GaU`QKny=C4cO zKv|`KFz{$cq5yv#+>Y(8BD*z#;9z3ILwrEt$|LhnwF(-bWC$H#b?Ff>Lpbh^INxK! z!^%g%u-uGYZ3Z;>B^Z_=%i+d5U!DAdUcAUIaTWIEDm?R)lKo)+yG+42QI$QRI%>-3 zuBaHC$98pFV#Kpeqk~e?|81qim69pwk14 z^f1E3TSk1NhdM~)D2siFsMt12AiqjcpfmsQ;qmE(Z}l+GVrx0S zd+>zhPlxugfB4?0E_BA-C~#^lCIrt|m62Q2!QIqfzQ;h!>$6qTO@ zh)*S~TP6DjW4Zy(*b5lPz(*r`*VEL=&SO28CURnYm_3|j@IBW2 zJ~wZ(I+wT=jY~~+=|tz#l2@NZ_Lr$1$6}Qy#Ht1OHh7Ddb5y9Rx~#_Kv6Vcpv)}=1 zFh_o+X2F>Mqvqcx>&6eF#)x80W(g84ASZ-1J hI#7w{ALHX^I@UjV4`w8f8WlXMQSShV<-gv#_g~yn@UZ{@ diff --git a/gnmi_pb2.pyc b/gnmi_pb2.pyc deleted file mode 100644 index f1ab60c3f64a125eaa7e27f61f9505f85bebf423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44121 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 NAGq-1J$rjn{|Y4?#iIZK diff --git a/grpc_support.pyc b/grpc_support.pyc deleted file mode 100644 index 692bd84ecb59396bf0933d8da0dfc888e64a106e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3943 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 From 75cddff8178c7ab34a59aa7b08a56031801afaf7 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Mon, 2 Jul 2018 08:58:20 +0000 Subject: [PATCH 11/18] Added .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc From 89e39ad2f755d3d85defb8afde9ea4eef70b7cb8 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Mon, 2 Jul 2018 16:54:46 +0000 Subject: [PATCH 12/18] Updated to return subscriptions in a format consumable by logstash/elasticsearch --- gNMI_Subscribe.py | 4 +++- pygnmi.py | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gNMI_Subscribe.py b/gNMI_Subscribe.py index f0bedb8..e53f8a5 100644 --- a/gNMI_Subscribe.py +++ b/gNMI_Subscribe.py @@ -130,7 +130,9 @@ def subscribe(channel, options, log, prog): msgs += 1 upds += len(response.update.update) if not options.stats: - log.info('Update received\n'+str(response)) + #log.info('Update received\n'+str(response)) + import json + print json.dumps(str(response).replace("\n","").replace(" ",""), sort_keys=True, separators=(',',':') ,indent=0) else: log.error('Unknown response received:\n'+str(response)) diff --git a/pygnmi.py b/pygnmi.py index 454415d..18744a2 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -146,4 +146,3 @@ def get_options(): print output - From a66c7b2682d59b69210fe43d74bcf0c90991ec04 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Mon, 2 Jul 2018 16:58:54 +0000 Subject: [PATCH 13/18] Altered print to log --- gNMI_Subscribe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gNMI_Subscribe.py b/gNMI_Subscribe.py index e53f8a5..06961e4 100644 --- a/gNMI_Subscribe.py +++ b/gNMI_Subscribe.py @@ -132,7 +132,7 @@ def subscribe(channel, options, log, prog): if not options.stats: #log.info('Update received\n'+str(response)) import json - print json.dumps(str(response).replace("\n","").replace(" ",""), sort_keys=True, separators=(',',':') ,indent=0) + log.info(json.dumps(str(response).replace("\n","").replace(" ",""), sort_keys=True, separators=(',',':') ,indent=0)) else: log.error('Unknown response received:\n'+str(response)) From 1de7542d1151f186d5965a476dd1e350430b8406 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Mon, 2 Jul 2018 17:34:25 +0000 Subject: [PATCH 14/18] added logstash flag and surrounding output formatting --- gNMI_Subscribe.py | 8 +++++--- pygnmi.py | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/gNMI_Subscribe.py b/gNMI_Subscribe.py index 06961e4..0b7e09b 100644 --- a/gNMI_Subscribe.py +++ b/gNMI_Subscribe.py @@ -130,9 +130,11 @@ def subscribe(channel, options, log, prog): msgs += 1 upds += len(response.update.update) if not options.stats: - #log.info('Update received\n'+str(response)) - import json - log.info(json.dumps(str(response).replace("\n","").replace(" ",""), sort_keys=True, separators=(',',':') ,indent=0)) + if options.logstash: + import json + print json.JSONEncoder().encode(str(response)) + else: + log.info('Update received\n'+str(response)) else: log.error('Unknown response received:\n'+str(response)) diff --git a/pygnmi.py b/pygnmi.py index 18744a2..06a1117 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -85,6 +85,7 @@ def get_options(): group = parser.add_argument_group() group.add_argument('--logfile', metavar='', type=argparse.FileType('wb', 0), default='-', help='Specify the logfile (default: )') group.add_argument('--stats', action='store_true', help='collect stats') + group.add_argument('--logstash', action='store_true', help='Change subscription output format to be supported by logstash') group = parser.add_argument_group() From 65c79a3bdbd85319cdbd067fbadba99c030bbfef Mon Sep 17 00:00:00 2001 From: James Cumming Date: Mon, 2 Jul 2018 20:02:49 +0000 Subject: [PATCH 15/18] 201807022102 --- gNMI_Subscribe.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gNMI_Subscribe.py b/gNMI_Subscribe.py index 0b7e09b..0d3a482 100644 --- a/gNMI_Subscribe.py +++ b/gNMI_Subscribe.py @@ -131,8 +131,7 @@ def subscribe(channel, options, log, prog): upds += len(response.update.update) if not options.stats: if options.logstash: - import json - print json.JSONEncoder().encode(str(response)) + log.info(response.update.update) else: log.info('Update received\n'+str(response)) else: From 55a48e89543aa00abb2b0423a41e88a86c62dc7f Mon Sep 17 00:00:00 2001 From: James Cumming Date: Thu, 5 Jul 2018 16:59:55 +0100 Subject: [PATCH 16/18] Added --output xpath to output the data in xpath format --- grpc_support.py | 10 ++++++++++ pygnmi.py | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/grpc_support.py b/grpc_support.py index c05b78a..f15793a 100644 --- a/grpc_support.py +++ b/grpc_support.py @@ -116,6 +116,16 @@ def path_from_string(path='/'): return gnmi_pb2.Path(elem=mypath) +def string_from_path(path): + pathString = [] + for e in path.elem: + if e: + pathString.append(e.name) + for eKey in e.key: + pathString.append("["+eKey+"="+"\""+e.key[eKey]+"\""+"]") + returnString = "/"+"/".join(pathString) + return returnString + ############################################################################## diff --git a/pygnmi.py b/pygnmi.py index 06a1117..21277a4 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -86,6 +86,7 @@ def get_options(): group.add_argument('--logfile', metavar='', type=argparse.FileType('wb', 0), default='-', help='Specify the logfile (default: )') group.add_argument('--stats', action='store_true', help='collect stats') group.add_argument('--logstash', action='store_true', help='Change subscription output format to be supported by logstash') + group.add_argument('--output', default='raw', help='Output format [raw, xpath]') group = parser.add_argument_group() @@ -141,6 +142,17 @@ def get_options(): try: import gNMI_Get output = gNMI_Get.get(channel, options, log, prog) + if options.output == "xpath": + newOutput = [] + for n in output.notification: + for u in n.update: + tmpOutput = "" + tmpOutput += grpc_support.string_from_path(u.path) + tmpOutput += ": " + tmpOutput += u.val.json_val + newOutput.append(tmpOutput) + output = "\n".join(newOutput) + except Exception as err: log.error(str(err)) quit() From 181cd1127f61fc3e3c590f3c52e2da39df1b6c04 Mon Sep 17 00:00:00 2001 From: James Cumming Date: Thu, 5 Jul 2018 17:11:48 +0100 Subject: [PATCH 17/18] Moved xpath output to grpc_support --- grpc_support.py | 12 ++++++++++++ pygnmi.py | 12 ++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/grpc_support.py b/grpc_support.py index f15793a..28ad621 100644 --- a/grpc_support.py +++ b/grpc_support.py @@ -126,6 +126,18 @@ def string_from_path(path): returnString = "/"+"/".join(pathString) return returnString +def xpath_output(output): + newOutput = [] + for n in output.notification: + for u in n.update: + tmpOutput = "" + tmpOutput += string_from_path(u.path) + tmpOutput += ": " + tmpOutput += u.val.json_val + newOutput.append(tmpOutput) + output = "\n".join(newOutput) + return output + ############################################################################## diff --git a/pygnmi.py b/pygnmi.py index 21277a4..8865b9a 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -115,6 +115,7 @@ def get_options(): return(options,prog) + if __name__ == '__main__': (options,prog) = get_options() @@ -143,16 +144,7 @@ def get_options(): import gNMI_Get output = gNMI_Get.get(channel, options, log, prog) if options.output == "xpath": - newOutput = [] - for n in output.notification: - for u in n.update: - tmpOutput = "" - tmpOutput += grpc_support.string_from_path(u.path) - tmpOutput += ": " - tmpOutput += u.val.json_val - newOutput.append(tmpOutput) - output = "\n".join(newOutput) - + output = grpc_support.xpath_output(output) except Exception as err: log.error(str(err)) quit() From 605151998fc523e6d9d87873e9a6619fc41988da Mon Sep 17 00:00:00 2001 From: James Cumming Date: Thu, 5 Jul 2018 18:40:30 +0100 Subject: [PATCH 18/18] 201807051840 Fixed xpath output for subscribe works for get although needs further value iteration --- gNMI_Subscribe.py | 2 ++ grpc_support.py | 16 ++++++++++------ pygnmi.py | 3 ++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/gNMI_Subscribe.py b/gNMI_Subscribe.py index 0d3a482..9a32888 100644 --- a/gNMI_Subscribe.py +++ b/gNMI_Subscribe.py @@ -132,6 +132,8 @@ def subscribe(channel, options, log, prog): if not options.stats: if options.logstash: log.info(response.update.update) + if options.output == "xpath": + log.info(grpc_support.xpath_output(response.update)) else: log.info('Update received\n'+str(response)) else: diff --git a/grpc_support.py b/grpc_support.py index 28ad621..c932770 100644 --- a/grpc_support.py +++ b/grpc_support.py @@ -128,14 +128,18 @@ def string_from_path(path): def xpath_output(output): newOutput = [] - for n in output.notification: - for u in n.update: + for u in output.update: + if output.prefix.elem: tmpOutput = "" - tmpOutput += string_from_path(u.path) - tmpOutput += ": " - tmpOutput += u.val.json_val + tmpOutput += string_from_path(output.prefix) newOutput.append(tmpOutput) - output = "\n".join(newOutput) + tmpOutput = "" + tmpOutput += string_from_path(u.path) + tmpOutput += ": " + tmpOutput += u.val.json_val + newOutput.append(tmpOutput) + newOutput.append("\n") + output = "".join(newOutput) return output diff --git a/pygnmi.py b/pygnmi.py index 8865b9a..def8dbf 100755 --- a/pygnmi.py +++ b/pygnmi.py @@ -144,7 +144,8 @@ def get_options(): import gNMI_Get output = gNMI_Get.get(channel, options, log, prog) if options.output == "xpath": - output = grpc_support.xpath_output(output) + for n in output.notification: + output = grpc_support.xpath_output(n) except Exception as err: log.error(str(err)) quit()