From 78a1043e5f1da9c38f2046adfc0d685632c0e22f Mon Sep 17 00:00:00 2001 From: Tim Raphael Date: Mon, 12 Aug 2024 16:29:10 +1000 Subject: [PATCH 01/13] Major simplifications and new abstractions, renamed napalm-srl -> napalm-srlinux, adding typing and reimplementing PoC methods for get_bgp_neighbors, get_lldp_neighbors, get_users. --- AUTHORS | 1 + examples/example_script.py | 10 +- napalm_srl/gnmi_pb2.py | 2041 -------------- napalm_srl/jsondiff.py | 262 -- napalm_srl/srl.py | 2888 -------------------- {napalm_srl => napalm_srlinux}/__init__.py | 6 +- napalm_srlinux/srlinux.py | 951 +++++++ off_box_diff.png | Bin 156946 -> 0 bytes pyproject.toml | 2 +- requirements.txt | 12 +- setup.cfg | 4 +- setup.py | 2 +- test/unit/TestNokiaSRLDriver.py | 4 +- test/unit/conftest.py | 6 +- tox.ini | 2 +- 15 files changed, 970 insertions(+), 5221 deletions(-) delete mode 100644 napalm_srl/gnmi_pb2.py delete mode 100644 napalm_srl/jsondiff.py delete mode 100644 napalm_srl/srl.py rename {napalm_srl => napalm_srlinux}/__init__.py (83%) create mode 100644 napalm_srlinux/srlinux.py delete mode 100755 off_box_diff.png diff --git a/AUTHORS b/AUTHORS index ed1aaeb..b5d3bb0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -5,3 +5,4 @@ Syed Shekupillai Ashna Shah Wim Henderickx Jeroen van Bemmel +Tim Raphael diff --git a/examples/example_script.py b/examples/example_script.py index cb689f8..171025b 100644 --- a/examples/example_script.py +++ b/examples/example_script.py @@ -5,18 +5,12 @@ from napalm import get_network_driver import json -driver = get_network_driver("srl") +driver = get_network_driver("srlinux") optional_args = { - "gnmi_port": 57400, "jsonrpc_port": 80, - "target_name": "172.20.20.2", - "tls_cert":"/root/gnmic_certs/srl_certs/clientCert.crt", - "tls_ca": "/root/gnmic_certs/srl_certs/RootCA.crt", - "tls_key": "/root/gnmic_certs/srl_certs/clientKey.pem", #"skip_verify": True, #"insecure": False - "encoding": "JSON_IETF" -} +} device = driver("172.20.20.2", "admin", "admin", 60, optional_args) device.open() #print(json.dumps(device.get_bgp_config(neighbor="", group=""))) #Done diff --git a/napalm_srl/gnmi_pb2.py b/napalm_srl/gnmi_pb2.py deleted file mode 100644 index 61a423e..0000000 --- a/napalm_srl/gnmi_pb2.py +++ /dev/null @@ -1,2041 +0,0 @@ -# Copyright 2020 Nokia -# Licensed under the Apache License 2.0. -# SPDX-License-Identifier: Apache-2.0 - -# 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/napalm_srl/jsondiff.py b/napalm_srl/jsondiff.py deleted file mode 100644 index 5f079da..0000000 --- a/napalm_srl/jsondiff.py +++ /dev/null @@ -1,262 +0,0 @@ -# Copyright 2020 Nokia -# Licensed under the Apache License 2.0. -# SPDX-License-Identifier: Apache-2.0 - -import json -index_keys = ['name','id','index','sequence-id','buffer-name','address'] - -class jsondiff(object): - """ - Class to find json diff - """ - def __init__(self): - pass - def compare(self, newjsonfile, oldjsonfile): - with open(newjsonfile, "r") as f: - newjson = json.load(f) - with open(oldjsonfile, "r") as f: - oldjson = json.load(f) - return self.cmp_dict(newjson, oldjson) - - def cmp_dict(self, new, old, parent=""): - result=[] - keydiff = self._get_dict_key_diff(new, old) - - #step1 removed - for k in keydiff["---"]: - result.append({ - "---":"{}[{}]".format(parent, k), - "value":old[k] - }) - #step2 added - for k in keydiff["+++"]: - result.append({ - "+++":"{}[{}]".format(parent, k), - "value": new[k] - }) - - #step3 modified - for k in keydiff["common"]: - if isinstance(old[k] ,dict) and isinstance(new[k] ,dict): - res = self.cmp_dict(new[k], old[k], parent ="{}[{}]".format(parent, k)) - result.extend(res) - elif isinstance(old[k], list) and isinstance(new[k] ,list): - res = self._cmp_list(new[k],old[k],parent ="{}[{}]".format(parent,k)) - result.extend(res) - else: - if not old[k] == new[k]: - result.append({ - "chg": "{}[{}]".format(parent, k), - "old_value": old[k], - "new_value":new[k] - }) - - return result - - def _find_index_key(self, old_dicts): - max_ct = 0 - key = None - for i in index_keys: - ct = 0 - for o in old_dicts: - for k,v in o.items(): - if k==i: - ct = ct +1 - continue - if ct >max_ct: - max_ct = ct - key = i - if not max_ct==0: - return key - #find key either string or int and present in all/many dict and is unique - - #print("{}\nType index key for above list:".format(old_dicts)) - #return str(input()) - #=========================== - #find if there is a key ending with id/index/address/name and values unique - suffixes = ['id', 'index', 'address', 'name'] - key = None - max_ct = 0 - for s in suffixes: - ct = 0 - vals = [] - ct_key = None - for o in old_dicts: - for k,v in o.items(): - if str(k).lower().endswith(s): - ct = ct + 1 - vals.append(v) - ct_key = k - continue - if ct > max_ct and self.are_values_unique(vals): #unique and maximum count - max_ct = ct - key = ct_key - if not max_ct == 0: - return key - - #int and is unique - max_ct = 0 - key = None - int_keys = [k for o in old_dicts for k,v in o.items() if isinstance(v,int)] - int_keys = list(set(int_keys)) - for i in int_keys: - ct = 0 - vals = [] - for o in old_dicts: - for k, v in o.items(): - if k == i: - ct = ct + 1 - vals.append(v) - continue - if ct > max_ct and self.are_values_unique(vals): #unique and maximum count: - max_ct = ct - key = i - if not max_ct == 0: - return key - - - #string without space and is unique - max_ct = 0 - key = None - str_keys = [k for o in old_dicts for k,v in o.items() if isinstance(v,str) and " " not in v] - str_keys = list(set(str_keys)) - for i in str_keys: - ct = 0 - vals = [] - for o in old_dicts: - for k, v in o.items(): - if k == i: - ct = ct + 1 - vals.append(v) - continue - if ct > max_ct and self.are_values_unique(vals): #unique and maximum count:: - max_ct = ct - key = i - if not max_ct == 0: - return key - return None - - - - - def are_values_unique(self, vals): - return len(set(vals)) == len(vals) - - def _cmp_list(self, new, old_in, parent=""): - result = [] - old = old_in[:] # to capture --- - old_dicts = [o for o in old if isinstance(o, dict)] - old_has_list = any([o for o in old if isinstance(o, list)]) - ind_key = None - if len(old_dicts) >1 : - ind_key = self._find_index_key(old_dicts) - for index,n in enumerate(new): - - # either n shd be in old - # or n not in old , n is a dict and n not have indexkey - # or n not in old , n is a dict and n have indexkey but no matching o - # or n not in old , n is a dict and n have indexkey but has matching o to compare - - if n in old_in: - if n in old: #if duplicat n is already removed. - old.remove(n) - continue - elif isinstance(n, dict): - if len(old_dicts) == 0: - result.append({ - "+++": "{}[{}]".format(parent, index), - "value": n - }) - continue - elif len(old_dicts) == 1: - res = self.cmp_dict(n,old_dicts[0],"{}[{}]".format(parent,index) ) - result.extend(res) - old.remove(old_dicts[0]) - continue - elif not ind_key: - max_equal_flds = 0 - old_to_compare = None - ct_available_old_dicts_for_comp = [o for o in old if isinstance(o, dict)] - for o in ct_available_old_dicts_for_comp: - equal_flds_ct = 0 - for k,v in n.items(): - if k in o and o[k] == v: - equal_flds_ct = equal_flds_ct + 1 - if equal_flds_ct > max_equal_flds: - max_equal_flds = equal_flds_ct - old_to_compare = o - if max_equal_flds == 0: - result.append({ - "+++": "{}[{}]".format(parent, index), - "value": n - }) - else: - res = self.cmp_dict(n, old_to_compare, "{}[{}]".format(parent, index)) - result.extend(res) - old.remove(old_to_compare) - continue - elif ind_key not in n.keys(): - result.append({ - "+++":"{}[{}]".format(parent,index), - "value": n - }) - continue - else: - ind_key_value = n[ind_key] - o_to_compare = [o for o in old if ind_key in o and o[ind_key]==ind_key_value] - if len(o_to_compare)==0: - result.append({ - "+++": "{}[{}]".format(parent, index), - "value": n - }) - continue - else: - o_to_compare = o_to_compare[0] - old.remove(o_to_compare) - res = self.cmp_dict(n, o_to_compare, "{}[{}]".format(parent, index)) - result.extend(res) - elif isinstance(n, list): - if not old_has_list: - result.append({ - "+++": "{}[{}]".format(parent, index), - "value": n - }) - continue - else: - for o in old: - if isinstance(o, list): - old.remove(o) - res = self._cmp_list(n,o,"{}[{}]".format(parent, index)) - result.extend(res) - continue - #if no more list available in o - result.append({ - "+++": "{}[{}]".format(parent, index), - "value": n - }) - continue - else: - result.append({ - "+++": "{}[{}]".format(parent, index), - "value": n - }) - if old: - for index,o in enumerate(old_in): - if o in old: - result.append({ - "---": "{}[{}]".format(parent, index), - "value": o - }) - return result - - def _get_dict_key_diff(self, new, old): - d1_keys = new.keys() - d2_keys = old.keys() - plus_ks = [k for k in d1_keys if k not in d2_keys] - minus_ks = [k for k in d2_keys if k not in d1_keys] - return { - "+++":plus_ks, - "---": minus_ks, - "common": [k for k in d1_keys if k not in plus_ks], - } - diff --git a/napalm_srl/srl.py b/napalm_srl/srl.py deleted file mode 100644 index d13eb0a..0000000 --- a/napalm_srl/srl.py +++ /dev/null @@ -1,2888 +0,0 @@ - # -*- coding: utf-8 -*- -# Copyright 2021 Nokia. All rights reserved. -# -# The contents of this file are licensed under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with the -# License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. -# SPDX-License-Identifier: Apache-2.0 - -""" -Napalm driver for SR Linux. - -Read https://napalm.readthedocs.io for more information. -""" -import base64 -import json -import logging -import os -import re -import datetime -import grpc -import tempfile -from google.protobuf import json_format -from napalm_srl import gnmi_pb2, jsondiff - -from napalm.base import NetworkDriver -from napalm.base.helpers import convert, mac, as_number -from napalm.base.exceptions import ( - ConnectionException, - MergeConfigException, - ReplaceConfigException, - CommandErrorException, - CommitError, -) - -import requests - -from requests.packages.urllib3.poolmanager import PoolManager -from requests.packages.urllib3.util import ssl_ -from requests.adapters import HTTPAdapter - -class TLSHttpAdapter(HTTPAdapter): - """ - "Transport adapter" to re-enable the ECDHE-RSA-AES256-SHA cipher as fallback - - urllib3 version 2.0.2 reduced the list of ciphers offered by default, - removing the ECDHE-RSA-AES256-SHA cipher. When the cipher list is left empty - in SR Linux CLI, by default it only accepts this cipher - """ - def __init__(self, ciphers=None, **kwargs): - self.ciphers = ciphers - super(TLSHttpAdapter, self).__init__(**kwargs) - - def init_poolmanager(self, connections, maxsize, block=False): - logging.warning( f"Enabled TLS ciphers: {self.ciphers}" ) - ctx = ssl_.create_urllib3_context(ciphers=self.ciphers,cert_reqs=ssl_.CERT_REQUIRED) - ctx.check_hostname = False # for some reason, CERT_REQUIRED becomes None - self.poolmanager = PoolManager( - num_pools=connections, maxsize=maxsize, - ssl_context=ctx, block=block) - -class NokiaSRLDriver(NetworkDriver): - """Napalm driver for SRL.""" - - def __init__(self, hostname, username, password, timeout=60, optional_args=None): - """Constructor.""" - self.device = None - self._metadata = None - # still need to figure out why these variables are used - self.config_session = None - self.locked = False - self.profile = ["srl"] - self.platform = "srl" - - self.hostname = hostname - self.username = username - self.password = password - self.timeout = timeout - self.private_candidate_name = None - - self._stub = None - self._channel = None - self.running_format = optional_args.get("running_format","json") if optional_args else "json" - - self.device = SRLAPI(hostname, username, password, timeout=60, optional_args=optional_args) - - self.pending_commit = False - # Whether to save changes to startup config, default False - self.commit_mode = "save" if optional_args and optional_args.get("commit_save",False) else "now" - self.tmp_cfgfile = None - self.chkpoint_id = 0 - - def open(self): - self.device.open() - - def close(self): - self.device.close() - - def _find_txt(self, value_dict, key, default=""): - value = "" - try: - if isinstance(value_dict, dict): - value = value_dict.get(key) if value_dict.get(key) else default - except Exception as findTxtErr01: # in case of any exception, returns default - logging.error(findTxtErr01) - value = default - return str(value) - - def _str_to_dict(self, value): - if value: - return eval(value.replace("'", '"')) - else: - return "" - - def _str_to_list(self, value): - if value: - return list(eval(value.replace("'", '"'))) - else: - return "" - - def get_arp_table(self, vrf=""): - """ - Returns a list of dictionaries having the following set of keys: - interface (string) - mac (string) - ip (string) - age (float) - ‘vrf’ of null-string will default to all VRFs. - Specific ‘vrf’ will return the ARP table entries for that VRFs - (including potentially ‘default’ or ‘global’). - - In all cases the same data structure is returned and no reference to the VRF that was - used is included in the output. - """ - try: - arp_table = [] - subinterface_names = [] - - def _find_neighbors(is_ipv4, ip_dict): - ip_dict = eval(ip_dict.replace("'", '"')) - neighbor_list = self._find_txt(ip_dict, "neighbor") - if neighbor_list: - neighbor_list = list(eval(neighbor_list)) - for neighbor in neighbor_list: - ipv4_address = "" - ipv6_address = "" - timeout = -1.0 - reachable_time = -1.0 - if is_ipv4: - ipv4_address = self._find_txt(neighbor, "ipv4-address") - timeout = convert( - float, self._find_txt(ip_dict, "timeout"), default=-1.0 - ) - else: - ipv6_address = self._find_txt(neighbor, "ipv6-address") - reachable_time = convert( - float, - self._find_txt(ip_dict, "reachable-time"), - default=-1.0, - ) - arp_table.append( - { - "interface": sub_interface_name, - "mac": self._find_txt(neighbor, "link-layer-address"), - "ip": ipv4_address if is_ipv4 else ipv6_address, - "age": timeout if is_ipv4 else reachable_time, - } - ) - - if vrf: - vrf_path = {"network-instance[name={}]".format(vrf)} - else: - vrf_path = {"network-instance[name=*]"} - pathType = "STATE" - vrf_output = self.device._gnmiGet("", vrf_path, pathType) - if not vrf_output: - return [] - for vrf in vrf_output["srl_nokia-network-instance:network-instance"]: - if "interface" in vrf.keys(): - subinterface_list = self._find_txt(vrf, "interface") - subinterface_list = list(eval(subinterface_list)) - for dictionary in subinterface_list: - if "name" in dictionary.keys(): - subinterface_names.append(self._find_txt(dictionary, "name")) - - interface_path = {"interface[name=*]"} - interface_output = self.device._gnmiGet("", interface_path, pathType) - - for interface in interface_output["srl_nokia-interfaces:interface"]: - interface_name = self._find_txt(interface, "name") - if interface_name: - sub_interface = self._find_txt(interface, "subinterface") - if sub_interface: - sub_interface = list(eval(sub_interface)) - for dictionary in sub_interface: - sub_interface_name = self._find_txt(dictionary, "name") - if sub_interface_name in subinterface_names: - ipv4_data = self._find_txt(dictionary, "ipv4") - if ipv4_data: - ipv4_data = eval(ipv4_data.replace("'", '"')) - ipv4_arp_dict = self._find_txt( - ipv4_data, "srl_nokia-interfaces-nbr:arp" - ) - if ipv4_arp_dict: - _find_neighbors(True, ipv4_arp_dict) - - ipv6_data = self._find_txt(dictionary, "ipv6") - if ipv6_data: - ipv6_data = eval(ipv6_data.replace("'", '"')) - ipv6_neighbor_dict = self._find_txt( - ipv6_data, "srl_nokia-if-ip-nbr:neighbor-discovery" - ) - if ipv6_neighbor_dict: - _find_neighbors(False, ipv6_neighbor_dict) - return arp_table - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_bgp_neighbors(self): - """ - Returns a dictionary of dictionaries. The keys for the first dictionary will be the vrf - (global if no vrf). The inner dictionary will contain the following data for each vrf: - - router_id - peers - another dictionary of dictionaries. Outer keys are the IPs of the neighbors. - The inner keys are: - local_as (int) - remote_as (int) - remote_id - peer router id - is_up (True/False) - is_enabled (True/False) - description (string) - uptime (int in seconds) - address_family (dictionary) - A dictionary of address families available for - the neighbor. - So far it can be ‘ipv4’ or ‘ipv6’ - received_prefixes (int) - accepted_prefixes (int) - sent_prefixes (int) - Note, if is_up is False and uptime has a positive value then this indicates the - uptime of the last active BGP session. - """ - try: - bgp_neighbors = { - "global": { - "router_id": "", - "peers": {} - } - } - system_date_time = "" - - def _build_prefix_dict(): - prefix_limit = {} - ipv4_unicast = self._find_txt(bgp_neighbor, "ipv4-unicast") - if ipv4_unicast: - ipv4_unicast = eval(ipv4_unicast.replace("'", '"')) - prefix_limit.update( - { - "ipv4": { - "sent_prefixes": convert( - int, - self._find_txt(ipv4_unicast, "sent-routes"), - default=-1, - ), - "received_prefixes": convert( - int, - self._find_txt(ipv4_unicast, "received-routes"), - default=-1, - ), - "accepted_prefixes": convert( - int, - self._find_txt(ipv4_unicast, "active-routes"), - default=-1, - ), - } - } - ) - ipv6_unicast = self._find_txt(bgp_neighbor, "ipv6-unicast") - if ipv6_unicast: - ipv6_unicast = eval(ipv6_unicast.replace("'", '"')) - prefix_limit.update( - { - "ipv6": { - "sent_prefixes": convert( - int, - self._find_txt(ipv6_unicast, "sent-routes"), - default=-1, - ), - "received_prefixes": convert( - int, - self._find_txt(ipv6_unicast, "received-routes"), - default=-1, - ), - "accepted_prefixes": convert( - int, - self._find_txt(ipv6_unicast, "active-routes"), - default=-1, - ), - } - } - ) - return prefix_limit - - path = {"/network-instance[name=*]"} - system_path = {"system/information"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - system_output = self.device._gnmiGet("", system_path, pathType) - - for key, value in system_output["srl_nokia-system:system"].items(): - system_date_time = self._find_txt(value, "current-datetime") - if system_date_time: - system_date_time = datetime.datetime.strptime( - system_date_time, "%Y-%m-%dT%H:%M:%S.%fZ" - ).timestamp() - - for network_instance in output["srl_nokia-network-instance:network-instance"]: - instance_name = self._find_txt(network_instance, "name") - router_id = self._find_txt(network_instance, "router-id") - global_autonomous_system_number = self._find_txt( - network_instance, "autonomous-system", - ) - bgp_neighbors.update({instance_name: {"router_id": router_id, "peers": {}}}) - protocols = self._find_txt(network_instance, "protocols") - if protocols: - protocols = eval(protocols.replace("'", '"')) - bgp_dict = self._find_txt(protocols, "srl_nokia-bgp:bgp") - if bgp_dict: - bgp_dict = eval(bgp_dict.replace("'", '"')) - bgp_neighbors_list = self._find_txt(bgp_dict, "neighbor") - if bgp_neighbors_list: - bgp_neighbors_list = list( - eval(bgp_neighbors_list.replace("'", '"')) - ) - for bgp_neighbor in bgp_neighbors_list: - peer_ip = self._find_txt(bgp_neighbor, "peer-address") - if peer_ip: - local_as = self._find_txt(bgp_neighbor, "local-as") - explicit_peer_as = self._find_txt( - bgp_neighbor, "peer-as" - ) - - local_as_number = -1 - peer_as_number = ( - explicit_peer_as - if explicit_peer_as - else global_autonomous_system_number - ) - if local_as: - local_as = list(eval(local_as.replace("'", '"'))) - - for dictionary in local_as: - explicit_local_as_number = self._find_txt( - dictionary, "as-number" - ) - local_as_number = ( - explicit_local_as_number - if explicit_local_as_number - else global_autonomous_system_number - ) - last_established = self._find_txt( - bgp_neighbor, "last-established" - ) - if last_established: - last_established = datetime.datetime.strptime( - last_established, "%Y-%m-%dT%H:%M:%S.%fZ" - ).timestamp() - bgp_neighbors[instance_name]["peers"].update( - { - peer_ip: { - "local_as": as_number(local_as_number), - "remote_as": as_number(peer_as_number), - "remote_id": peer_ip, - "is_up": True - if self._find_txt( - bgp_neighbor, "session-state" - ) - == "established" - else False, - "is_enabled": True - if self._find_txt( - bgp_neighbor, "admin-state" - ) - == "enable" - else False, - "description": self._find_txt( - bgp_neighbor, "description" - ), - "uptime": convert( - int, - (system_date_time - last_established) if isinstance(last_established, - float) else -1, - default=-1, - ), - "address_family": _build_prefix_dict(), - } - } - ) - - return bgp_neighbors - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_bgp_neighbors_detail(self, neighbor_address=""): - """ - :param neighbor_address: - :return: - Returns a dictionary of dictionaries. The keys for the first dictionary will be the vrf (global if no vrf). - The keys of the inner dictionary represent the AS number of the neighbors. - Leaf dictionaries contain the following fields: - up (True/False) - local_as (int) - remote_as (int) - router_id (string) - local_address (string) - routing_table (string) - local_address_configured (True/False) - local_port (int) - remote_address (string) - remote_port (int) - multihop (True/False) - multipath (True/False) - remove_private_as (True/False) - import_policy (string) - export_policy (string) - input_messages (int) - output_messages (int) - input_updates (int) - output_updates (int) - messages_queued_out (int) - connection_state (string) - previous_connection_state (string) - last_event (string) - suppress_4byte_as (True/False) - local_as_prepend (True/False) - holdtime (int) - configured_holdtime (int) - keepalive (int) - configured_keepalive (int) - active_prefix_count (int) - received_prefix_count (int) - accepted_prefix_count (int) - suppressed_prefix_count (int) - advertised_prefix_count (int) - flap_count (int) - - """ - try: - bgp_neighbor_detail = {} - - path = {"/network-instance[name=*]"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - for network_instance in output["srl_nokia-network-instance:network-instance"]: - instance_name = self._find_txt(network_instance, "name") - router_id = self._find_txt(network_instance, "router-id") - global_autonomous_system_number = self._find_txt( - network_instance, "autonomous-system", - ) - protocols = self._find_txt(network_instance, "protocols") - if protocols: - protocols = eval(protocols.replace("'", '"')) - bgp_dict = self._find_txt(protocols, "srl_nokia-bgp:bgp") - if bgp_dict: - bgp_dict = eval(bgp_dict.replace("'", '"')) - bgp_neighbors_list = self._find_txt(bgp_dict, "neighbor") - if bgp_neighbors_list: - bgp_neighbors_list = list( - eval(bgp_neighbors_list.replace("'", '"')) - ) - bgp_neighbor_detail[instance_name] = {} - for bgp_neighbor in bgp_neighbors_list: - peer_ip = self._find_txt(bgp_neighbor, "peer-address") - if peer_ip: - if neighbor_address and not neighbor_address == peer_ip: - continue - local_as = self._find_txt(bgp_neighbor, "local-as") - explicit_peer_as = self._find_txt( - bgp_neighbor, "peer-as" - ) - local_as_number = -1 - peer_as_number = ( - explicit_peer_as - if explicit_peer_as - else global_autonomous_system_number - ) - - if local_as: - local_as = list( - eval(local_as.replace("'", '"')) - ) - for dictionary in local_as: - explicit_local_as_number = self._find_txt( - dictionary, "as-number" - ) - local_as_number = ( - explicit_local_as_number - if explicit_local_as_number - else global_autonomous_system_number - ) - transport = self._str_to_dict( - self._find_txt(bgp_neighbor, "transport") - ) - local_address = "" - if transport: - local_address = self._find_txt( - transport, "local-address" - ) - timers = self._str_to_dict( - self._find_txt(bgp_neighbor, "timers") - ) - sent_messages = self._str_to_dict( - self._find_txt(bgp_neighbor, "sent-messages") - ) - received_messages = self._str_to_dict( - self._find_txt( - bgp_neighbor, "received-messages" - ) - ) - ipv4_unicast = self._str_to_dict( - self._find_txt(bgp_neighbor, "ipv4-unicast") - ) - active_ipv4 = -1 - received_ipv4 = -1 - suppressed_ipv4 = -1 - advertised_ipv4 = -1 - if ipv4_unicast: - active_ipv4 = convert( - int, - self._find_txt( - ipv4_unicast, "active-routes" - ), - default=-1, - ) - received_ipv4 = convert( - int, - self._find_txt( - ipv4_unicast, "received-routes" - ), - default=-1, - ) - suppressed_ipv4 = convert( - int, - self._find_txt( - ipv4_unicast, "rejected-routes" - ), - default=-1, - ) - advertised_ipv4 = convert( - int, - self._find_txt(ipv4_unicast, "sent-routes"), - default=-1, - ) - ipv6_unicast = self._str_to_dict( - self._find_txt(bgp_neighbor, "ipv6-unicast") - ) - # bgp_neighbor_detail[instance_name][ - # as_number(peer_as_number) - # ].append( - peer_data = { - "up": True - if self._find_txt( - bgp_neighbor, "session-state" - ) - == "established" - else False, - "local_as": as_number(local_as_number), - "remote_as": as_number(peer_as_number), - "router_id": router_id, - "local_address": local_address, - "routing_table": self._find_txt( - bgp_neighbor, "peer-group" - ), - "local_address_configured": False - if local_address - else True, - "local_port": convert( - int, - self._find_txt(transport, "local-port"), - default=-1, - ) - if transport - else -1, - "remote_address": peer_ip, - "remote_port": convert( - int, - self._find_txt( - transport, "remote-port" - ), - default=-1, - ), - "multihop": False, # Not yet supported in SRLinux - "multipath": False, # Not yet supported in SRLinux - "remove_private_as": False, # Not yet supported in SRLinux - "import_policy": self._find_txt( - bgp_neighbor, "import-policy" - ), - "export_policy": self._find_txt( - bgp_neighbor, "export-policy" - ), - "input_messages": convert( - int, - self._find_txt( - received_messages, "total-messages" - ), - default=-1, - ), - "output_messages": convert( - int, - self._find_txt( - sent_messages, "total-messages" - ), - default=-1, - ), - "input_updates": convert( - int, - self._find_txt( - received_messages, "total-updates" - ), - default=-1, - ), - "output_updates": convert( - int, - self._find_txt( - sent_messages, "total-updates" - ), - default=-1, - ), - "messages_queued_out": convert( - int, - self._find_txt( - sent_messages, "queue-depth" - ), - default=-1, - ), - "connection_state": self._find_txt( - bgp_neighbor, "session-state" - ), - "previous_connection_state": self._find_txt( - bgp_neighbor, "last-state" - ), - "last_event": self._find_txt( - bgp_neighbor, "last-event" - ), - "suppress_4byte_as": False, # Not yet supported in SRLinux - "local_as_prepend": convert( - bool, - self._find_txt( - local_as, "prepend-local-as" - ), - default=False, - ), - "holdtime": convert( - int, - self._find_txt(timers, "hold-time"), - default=-1, - ), - "configured_holdtime": convert( - int, - self._find_txt( - timers, "negotiated-hold-time" - ), - default=-1, - ), - "keepalive": convert( - int, - self._find_txt( - timers, "keepalive-interval" - ), - default=-1, - ), - "configured_keepalive": convert( - int, - self._find_txt( - timers, - "negotiated-keepalive-interval", - ), - default=-1, - ), - "active_prefix_count": active_ipv4 - if active_ipv4 != -1 - else convert( - int, - self._find_txt( - ipv6_unicast, "active-routes" - ), - default=-1, - ), - "received_prefix_count": received_ipv4 - if received_ipv4 != -1 - else convert( - int, - self._find_txt( - ipv6_unicast, "received-routes" - ), - default=-1, - ), - "accepted_prefix_count": active_ipv4 - if active_ipv4 != -1 - else convert( - int, - self._find_txt( - ipv6_unicast, "active-routes" - ), - default=-1, - ), - "suppressed_prefix_count": suppressed_ipv4 - if suppressed_ipv4 != -1 - else convert( - int, - self._find_txt( - ipv6_unicast, "rejected-routes" - ), - default=-1, - ), - "advertised_prefix_count": advertised_ipv4 - if advertised_ipv4 != -1 - else convert( - int, - self._find_txt( - ipv6_unicast, "sent-routes" - ), - default=-1, - ), - "flap_count": -1, # Not yet supported in SRLinux - } - # ) - peer_as_number = as_number(peer_as_number) - if peer_as_number in bgp_neighbor_detail[instance_name]: - bgp_neighbor_detail[instance_name][peer_as_number].append(peer_data) - else: - bgp_neighbor_detail[instance_name][peer_as_number] = [peer_data] - return bgp_neighbor_detail - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_environment(self): - """ - Returns a dictionary where: - - fans is a dictionary of dictionaries where the key is the location and the values: - status (True/False) - True if it’s ok, false if it’s broken - temperature is a dict of dictionaries where the key is the location and the values: - temperature (float) - Temperature in celsius the sensor is reporting. - is_alert (True/False) - True if the temperature is above the alert threshold - is_critical (True/False) - True if the temp is above the critical threshold - power is a dictionary of dictionaries where the key is the PSU id and the values: - status (True/False) - True if it’s ok, false if it’s broken - capacity (float) - Capacity in W that the power supply can support - output (float) - Watts drawn by the system - cpu is a dictionary of dictionaries where the key is the ID and the values - %usage - memory is a dictionary with: - available_ram (int) - Total amount of RAM installed in the device - used_ram (int) - RAM in use in the device - """ - try: - environment_data = { - "fans": {}, - "power": {}, - "temperature": {}, - "memory": {}, - "cpu": {} - } - path = {"/platform"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - for component in output["srl_nokia-platform:platform"][ - "srl_nokia-platform-control:control" - ]: - slot = self._find_txt(component, "slot") - if slot: - temperature = self._find_txt(component, "temperature") - if temperature: - temperature = eval(temperature.replace("'", '"')) - environment_data["temperature"].update( - { - slot: { - "temperature": convert( - float, - self._find_txt(temperature, "instant"), - default=-1.0, - ), - "is_alert": convert( - bool, - self._find_txt(temperature, "alarm-status"), # Not able to detect alarm-status - default=False), - "is_critical": False, # Not supported yet in SRLinux - } - } - ) - memory = self._find_txt(component, "srl_nokia-platform-memory:memory") - environment_data["memory"] = { - "available_ram": -1, - "used_ram": -1 - - } - if memory: - memory = eval(memory.replace("'", '"')) - physical = convert( - int, self._find_txt(memory, "physical"), default=-1 - ) - free_memory = convert( - int, self._find_txt(memory, "free"), default=-1 - ) - environment_data["memory"].update( - { - "available_ram": physical, - "used_ram": physical - free_memory - if physical and free_memory > -1 - else -1, - } - ) - cpus = self._getObj(component, *["srl_nokia-platform-cpu:cpu"]) - if cpus: - for cpu in cpus: - environment_data["cpu"].update( - { - self._getObj(cpu, *["index"]): { - "%usage": float(self._getObj(cpu, *["total", "instant"], default=-1.0)) - } - } - ) - - for power_supply in output["srl_nokia-platform:platform"][ - "srl_nokia-platform-psu:power-supply" - ]: - environment_data["power"].update( - { - self._find_txt(power_supply, "id"): { - "status": True - if self._find_txt(power_supply, "oper-state") == "up" - else False, - "capacity": convert( - float, self._find_txt(power_supply, "capacity"), default=-1.0 - ), - "output": -1.0, # Not supported yet in SRLinx - } - } - ) - - # fan_ouput = self.device._gnmiGet("", fan_path, pathType) - # print("OUTPUT FAN:", fan_ouput) - - for fans in output["srl_nokia-platform:platform"][ - "srl_nokia-platform-fan:fan-tray" - ]: - environment_data["fans"].update( - { - self._find_txt(fans, "id"): { - "status": True - if self._find_txt(fans, "oper-state") == "up" - else False - } - } - ) - # for fan in output["srl-nokia-platform:platform"]: - # print("FAN:", fan) - - return environment_data - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_facts(self): - """ - Returns a dictionary containing the following information: - uptime - Uptime of the device in seconds. - vendor - Manufacturer of the device. - model - Device model. - hostname - Hostname of the device - fqdn - Fqdn of the device - os_version - String with the OS version running on the device. - serial_number - Serial number of the device - interface_list - List of the interfaces of the device - """ - - # Providing path for getting information from router - try: - path = {"/platform/chassis", "system/information", "system/name/host-name"} - interface_path = {"interface[name=*]"} - pathType = "STATE" - - output = self.device._gnmiGet("", path, pathType) - interface_output = self.device._gnmiGet("", interface_path, pathType) - - # defining output variables - interface_list = [] - uptime = -1.0 - version = "" - hostname = "" - serial_number = "" - chassis_type = "" - # getting interface names from the list - for interface in interface_output["srl_nokia-interfaces:interface"]: - interface_list.append(interface["name"]) - # getting system and platform information - for key, value in output.items(): - if "system" in key and isinstance(value, dict): - for key_1, value_1 in value.items(): - if "information" in key_1: - version = self._find_txt(value_1, "version") - uptime = self._find_txt(value_1, "uptime") - if uptime: - uptime = datetime.datetime.strptime( - uptime, "%Y-%m-%dT%H:%M:%S.%fZ" - ).timestamp() - if "name" in key_1: - hostname = self._find_txt(value_1, "host-name") - if "platform" in key and isinstance(value, dict): - for key_1, value_1 in value.items(): - if "chassis" in key_1: - chassis_type = self._find_txt(value_1, "type") - serial_number = self._find_txt(value_1, "serial-number") - return { - "hostname": hostname, - "fqdn": hostname, - "vendor": u"Nokia", - "model": chassis_type, - "serial_number": serial_number, - "os_version": version, - "uptime": convert(float, uptime, default=-1.0), - "interface_list": interface_list, - } - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_interfaces(self): - """ - Returns a dictionary of dictionaries. - The keys for the first dictionary will be the interfaces in the devices. - The inner dictionary will containing the following data for each interface: - is_up (True/False) - is_enabled (True/False) - description (string) - last_flapped (float in seconds) - speed (float in Mbit) - MTU (in Bytes) - mac_address (string) - """ - try: - interfaces = {} - path = {"interface[name=*]"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - # looping over interfaces to get information - for interface in output["srl_nokia-interfaces:interface"]: - interface_name = self._find_txt(interface, "name") - if interface_name: - last_flapped = self._find_txt(interface, "last-change") - if last_flapped: - last_flapped = datetime.datetime.strptime( - last_flapped, "%Y-%m-%dT%H:%M:%S.%fZ" - ).timestamp() - speed = -1.0 - mac_address = "" - for key, value in interface.items(): - if "ethernet" in key: - speed = self._find_txt(value, "port-speed") - if speed: - regex = re.compile(r"(\d+|\s+)") - speed = regex.split(speed) - speed = convert(float, speed[1], default=-1.0) - mac_address = self._find_txt( - value, "hw-mac-address", default="" - ) - interfaces.update( - { - interface_name: { - "is_up": True - if self._find_txt(interface, "oper-state") == "up" - else False, - "is_enabled": True - if self._find_txt(interface, "admin-state") == "enable" - else False, - "description": self._find_txt(interface, "description"), - "last_flapped": last_flapped if last_flapped else -1.0, - "mtu": convert( - int, self._find_txt(interface, "mtu"), default=-1 - ), - "speed": convert(float, speed, default=-1.0), - "mac_address": mac(mac_address) if mac_address else "", - } - } - ) - - return interfaces - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_interfaces_counters(self): - """ - Returns a dictionary of dictionaries where the first key is an interface name - and the inner dictionary contains the following keys: - tx_errors (int) - rx_errors (int) - tx_discards (int) - rx_discards (int) - tx_octets (int) - rx_octets (int) - tx_unicast_packets (int) - rx_unicast_packets (int) - tx_multicast_packets (int) - rx_multicast_packets (int) - tx_broadcast_packets (int) - rx_broadcast_packets (int) - """ - try: - interface_counters = {} - - path = {"interface[name=*]"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - for interface in output["srl_nokia-interfaces:interface"]: - interface_name = self._find_txt(interface, "name") - if interface_name: - statistics_interface = self._find_txt(interface, "statistics") - if statistics_interface: - statistics_interface = self._str_to_dict(statistics_interface) - sub_interface = self._find_txt(interface, "subinterface") - if sub_interface: - sub_interface = self._str_to_list(sub_interface) - for dictionary in sub_interface: - sub_interface_name = self._find_txt(dictionary, "name") - if sub_interface_name: - ifctrs = { - "tx_errors": -1, - "rx_errors": -1, - "tx_discards": -1, - "rx_discards": -1, - "tx_octets": -1, - "rx_octets": -1, - "tx_unicast_packets": -1, - "rx_unicast_packets": -1, - "tx_multicast_packets": -1, - "rx_multicast_packets": -1, - "tx_broadcast_packets": -1, - "rx_broadcast_packets": -1 - } - interface_counters[sub_interface_name] = ifctrs - statistics = self._find_txt(dictionary, "statistics") - if statistics: - statistics = self._str_to_dict(statistics) - ifctrs = { - "tx_errors": convert( - int, - self._find_txt( - statistics, "out-error-packets" - ), - default=-1, - ), - "rx_errors": convert( - int, - self._find_txt( - statistics, "in-error-packets" - ), - default=-1, - ), - "tx_discards": convert( - int, - self._find_txt( - statistics, "out-discarded-packets" - ), - default=-1, - ), - "rx_discards": convert( - int, - self._find_txt( - statistics, "in-discarded-packets" - ), - default=-1, - ), - "tx_octets": convert( - int, - self._find_txt(statistics, "out-octets"), - default=-1, - ), - "rx_octets": convert( - int, - self._find_txt(statistics, "in-octets"), - default=-1, - ), - # unicast, broadcast, multicast packet statistics - # are taken at the interface level - "tx_unicast_packets": convert( - int, - self._find_txt( - statistics_interface, - "out-unicast-packets", - ), - default=-1, - ), - "rx_unicast_packets": convert( - int, - self._find_txt( - statistics_interface, - "in-unicast-packets", - ), - default=-1, - ), - "tx_multicast_packets": convert( - int, - self._find_txt( - statistics_interface, - "out-multicast-packets", - ), - default=-1, - ), - "rx_multicast_packets": convert( - int, - self._find_txt( - statistics_interface, - "in-multicast-packets", - ), - default=-1, - ), - "tx_broadcast_packets": convert( - int, - self._find_txt( - statistics_interface, - "out-broadcast-packets", - ), - default=-1, - ), - "rx_broadcast_packets": convert( - int, - self._find_txt( - statistics_interface, - "in-broadcast-packets", - ), - default=-1, - ), - } - interface_counters[sub_interface_name].update(ifctrs) - - return interface_counters - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_interfaces_ip(self): - """ - Returns all configured IP addresses on all interfaces as a dictionary of dictionaries. - of the main dictionary represent the name of the interface. - Values of the main dictionary represent are dictionaries that may consist of two keys - ‘ipv4’ and ‘ipv6’ (one, both or none) which are themselves dictionaries with the IP addresses as keys. - Each IP Address dictionary has the following keys: - prefix_length (int) - """ - try: - interfaces_ip = {} - - path = {"interface[name=*]/subinterface"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - for interface in output["srl_nokia-interfaces:interface"]: - for s in interface["subinterface"]: - ip_addr = {} - for v in ["ipv4","ipv6"]: - if v in s and 'address' in s[v]: - for addr in s[v]["address"]: - ip_l = addr['ip-prefix'].split('/') - e = { ip_l[0]: { "prefix_length": int(ip_l[1]) } } - if v not in ip_addr: - ip_addr[v] = e - else: - ip_addr[v].update( e ) - interfaces_ip[ s['name'] ] = ip_addr - - return interfaces_ip - except Exception as e: - logging.exception(f"Error occurred : {e}") - - def get_ipv6_neighbors_table(self): - """ - Get IPv6 neighbors table information. - - Return a list of dictionaries having the following set of keys: - - interface (string) - mac (string) - ip (string) - age (float) in seconds - state (string) - """ - try: - ipv6_neighbor_list = [] - - path = {"interface[name=*]"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - for interface in output["srl_nokia-interfaces:interface"]: - interface_name = self._find_txt(interface, "name") - if interface_name: - sub_interface = self._str_to_list( - self._find_txt(interface, "subinterface") - ) - if sub_interface: - for dictionary in sub_interface: - sub_interface_name = self._find_txt(dictionary, "name") - if sub_interface_name: - ipv6 = self._str_to_dict(self._find_txt(dictionary, "ipv6")) - if ipv6: - neighbour_discovery = self._str_to_dict( - self._find_txt( - ipv6, - "srl_nokia-interfaces-nbr:neighbor-discovery", - ) - ) - - if neighbour_discovery: - neighbors = self._str_to_dict( - self._find_txt(neighbour_discovery, "neighbor", ) - ) - if neighbors: - for neighbor in neighbors: - next_state_time = self._find_txt( - neighbor, "next-state-time" - ) - if next_state_time: - next_state_time = datetime.datetime.strptime( - next_state_time, - "%Y-%m-%dT%H:%M:%S.%fZ", - ).timestamp() - ipv6_neighbor_list.append( - { - "interface": sub_interface_name, - "mac": self._find_txt( - neighbor, "link-layer-address", - ), - "ip": self._find_txt( - neighbor, "ipv6-address" - ), - "age": convert( - float, - next_state_time, - default=-1.0, - ), - "state": self._find_txt( - neighbor, "current-state" - ), - } - ) - return ipv6_neighbor_list - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_lldp_neighbors(self): - """ - Returns a dictionary where the keys are local ports and the value is a list of dictionaries - with the following information: - hostname - port - """ - try: - lldp_neighbors = {} - - path = {"/system/lldp"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - for key, value in output["srl_nokia-system:system"].items(): - chassis_id = self._find_txt(value, "chassis-id") - if chassis_id == "": - continue - interfaces = self._str_to_list(self._find_txt(value, "interface")) - if interfaces: - for dictionary in interfaces: - interface_name = self._find_txt(dictionary, "name") - neighbors = self._str_to_list( - self._find_txt(dictionary, "neighbor") - ) - neighbor_data = [] - for neighbor in neighbors: - neighbor_data.append({ - "hostname": self._find_txt(neighbor, "system-name"), - "port": self._find_txt(neighbor, "port-id"), - }) - lldp_neighbors.update({interface_name: neighbor_data}) - - return lldp_neighbors - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_lldp_neighbors_detail(self, interface=""): - """ - Returns a detailed view of the LLDP neighbors as a dictionary containing lists - of dictionaries for each interface. - - Empty entries are returned as an empty string (e.g. ‘’) or list where applicable. - - Inner dictionaries contain fields: - parent_interface (string) - remote_port (string) - remote_port_description (string) - remote_chassis_id (string) - remote_system_name (string) - remote_system_description (string) - remote_system_capab (list) with any of these values - other - repeater - bridge - wlan-access-point - router - telephone - docsis-cable-device - station - remote_system_enabled_capab (list) - """ - try: - lldp_neighbors_detail = {} - - path = {"/system/lldp"} - pathType = "STATE" - output = self.device._gnmiGet("", path, pathType) - - interface_name_list = [] - if not output: - return {} - for key, value in output["srl_nokia-system:system"].items(): - chassis_id = self._find_txt(value, "chassis-id") - if chassis_id == "": - continue - interfaces = self._str_to_list(self._find_txt(value, "interface")) - if interfaces: - for dictionary in interfaces: - interface_name = self._find_txt(dictionary, "name") - if interface: - if interface_name == interface: - interface_name_list.append(interface_name) - else: - continue - else: - interface_name_list.append(interface_name) - neighbors = self._str_to_list( - self._find_txt(dictionary, "neighbor") - ) - neighbor_data = [] - for neighbor in neighbors: - capability_list = self._str_to_list( - self._find_txt(neighbor, "capability") - ) - capabilities = [] - capabilities_enabled = [] - for capability in capability_list: - capabilities.append(capability["name"]) - if capability["enabled"] is True: - capabilities_enabled.append(capability["name"]) - neighbor_data.append({ - "parent_interface": interface_name, - "remote_port": self._find_txt(neighbor, "port-id"), - "remote_port_description": self._find_txt( - neighbor, "port-description" - ), - "remote_chassis_id": self._find_txt( - neighbor, "chassis-id" - ), - "remote_system_name": self._find_txt( - neighbor, "system-name" - ), - "remote_system_description": self._find_txt( - neighbor, "system-description" - ), - "remote_system_capab": capabilities, - "remote_system_enable_capab": capabilities_enabled, - }) - lldp_neighbors_detail.update({interface_name: neighbor_data}) - - return lldp_neighbors_detail - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_network_instances(self, name=""): - """ - Return a dictionary of network instances (VRFs) configured, including default/global - Parameters: name (string) – - Returns: - name (dict) - name (unicode) - type (unicode) - state (dict) - route_distinguisher (unicode) - interfaces (dict) - interface (dict) - interface name: (dict) - """ - try: - network_instances = {} - - if name: - vrf_path = {"network-instance[name={}]".format(name)} - else: - vrf_path = {"network-instance[name=*]"} - pathType = "STATE" - vrf_output = self.device._gnmiGet("", vrf_path, pathType) - if not vrf_output: - return {} - for vrf in vrf_output["srl_nokia-network-instance:network-instance"]: - # vrf_name = self._find_txt(vrf, "name") - vrf_name = name if name else self._find_txt(vrf, "name") - vrf_type = self._find_txt(vrf, "type") - network_instances.update( - { - vrf_name: { - "name": vrf_name, - "type": vrf_type, - "state": { - "route_distinguisher": "" # Not supported yet in SRLinux - }, - "interfaces": {"interface": {}}, - } - } - ) - interface_list = self._str_to_list(self._find_txt(vrf, "interface")) - if interface_list: - for interface in interface_list: - interface_name = self._find_txt(interface, "name") - network_instances[vrf_name]["interfaces"]["interface"].update( - {interface_name: {}} - ) - - return network_instances - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_users(self): - """ - Returns a dictionary with the configured users. - The keys of the main dictionary represents the username. - The values represent the details of the user, represented by the following keys: - level (int) - password (str) - sshkeys (list) - The level is an integer between 0 and 15, where 0 is the lowest access - and 15 represents full access to the device. - """ - try: - users_dict = {} - - path = {"system/aaa/authentication/admin-user"} - path_type = "STATE" - output = self.device._gnmiGet("", path, path_type) - - for key, value in output["srl_nokia-system:system"]["srl_nokia-aaa:aaa"]["authentication"].items(): - username = self._find_txt(value, "username") - users_dict.update({ - username: { - "level": 0, # Not supported yet in SRLinux - "password": self._find_txt(value, "password"), - "sshkeys": [] # Not supported yet in SRLinux - } - }) - return users_dict - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_bgp_config(self, group="", neighbor=""): - """ - Returns a dictionary containing the BGP configuration. Can return either the whole config, either the config only for a group or neighbor. - - :param neighbor: specific BGP neighbor. - :param group: specific BGP group. - :return: Returns the configuration of a specific BGP neighbor /BGP group - """ - try: - path = {"/network-instance/protocols/bgp"} - path_type = "STATE" - output = self.device._gnmiGet("", path, path_type) - groups_keys_path = ["srl_nokia-network-instance:network-instance", 0, "protocols", "srl_nokia-bgp:bgp", "group"] - neighbors_keys_path = ["srl_nokia-network-instance:network-instance", 0, "protocols", "srl_nokia-bgp:bgp", - "neighbor"] - multipath_keys_path = ["srl_nokia-network-instance:network-instance", 0, "protocols", "srl_nokia-bgp:bgp", - "ipv4-unicast", "multipath", "allow-multiple-as"] - groups = self._getObj(output, *groups_keys_path, default=[]) - neighbors = self._getObj(output, *neighbors_keys_path, default=[]) - multipath = self._getObj(output, *multipath_keys_path, default=False) - groups_data = {} - for g in groups: - group_name = self._getObj(g, *["group-name"]) - g_description = self._getObj(g, *["description"]) - local_address = self._getObj(g, *["transport", "local-address"]) - g_local_as = self._getObj(g, *["local-as", 0, "as-number"]) - g_remote_as = self._getObj(g, *["peer-as"]) - g_export_policy = self._getObj(g, *["export-policy"]) - g_import_policy = self._getObj(g, *["import-policy"]) - g_ipv4_unicast = self._getObj(g, *["ipv4-unicast"]) - g_ipv6_unicast = self._getObj(g, *["ipv6-unicast"]) - ct_neighbors = [n for n in neighbors if self._getObj(n, *["peer-group"]) == group_name] - neighbors_data = {} - for n in ct_neighbors: - n_ip_address = self._getObj(n, *["peer-address"]) - n_description = self._getObj(n, *["description"]) - n_import_policy = self._getObj(n, *["import-policy"]) - n_export_policy = self._getObj(n, *["export-policy"]) - n_local_address = self._getObj(n, *["transport", "local-address"]) - n_local_as = self._getObj(n, *["local-as", 0, "as-number"], default=-1) - n_remote_as = self._getObj(n, *["peer-as"], default=-1) - n_ipv4_unicast = self._getObj(n, *["ipv4-unicast"]) - n_ipv6_unicast = self._getObj(n, *["ipv6-unicast"]) - n_route_reflector_client = self._getObj(n, *["route-reflector", "client"], default=False) - n_nhs = self._getObj(n, *["next-hop-self"], default=False) - neighbors_data.update({ - n_ip_address: { - "description": n_description, - "import_policy": n_import_policy, - "export_policy": n_export_policy, - "local_address": n_local_address, - "local_as": n_local_as, - "remote_as": n_remote_as, - "authentication_key": "", - "prefix_limit": { - "inet": { - "unicast": { - 'limit': self._getObj(n_ipv4_unicast, *["prefix-limit", "max-received-routes"], - default=-1), - 'teardown': { - 'threshold': self._getObj(n_ipv4_unicast, - *["prefix-limit", "warning-threshold-pct"], - default=-1), - "timeout": -1, - } - } - }, - "inet6": { - "unicast": { - 'limit': self._getObj(n_ipv6_unicast, *["prefix-limit", "max-received-routes"], - default=-1), - 'teardown': { - 'threshold': self._getObj(n_ipv6_unicast, - *["prefix-limit", "warning-threshold-pct"], - default=-1), - "timeout": -1, - } - } - } - }, - "route_reflector_client": n_route_reflector_client, - "nhs": n_nhs - } - }) - ct_grp_data = { - group_name: { - "type": "internal" if g_local_as == g_remote_as else "external", - "description": g_description, - "apply_groups": [], # Not Supported - "multihop_ttl": -1, # Not Supported - "multipath": multipath, - "local_address": local_address, - "local_as": g_local_as, - "remote_as": g_remote_as, - "import_policy": g_import_policy, - "export_policy": g_export_policy, - "remove_private_as": False, # Not Supported - "prefix_limit": { - "inet": { - "unicast": { - 'limit': self._getObj(g_ipv4_unicast, *["prefix-limit", "max-received-routes"], - default=-1), - 'teardown': { - 'threshold': self._getObj(g_ipv4_unicast, - *["prefix-limit", "warning-threshold-pct"], default=-1), - "timeout": -1, - } - } - }, - "inet6": { - "unicast": { - 'limit': self._getObj(g_ipv6_unicast, *["prefix-limit", "max-received-routes"], - default=-1), - 'teardown': { - 'threshold': self._getObj(g_ipv6_unicast, - *["prefix-limit", "warning-threshold-pct"], default=-1), - "timeout": -1, - } - } - } - }, - "neighbors": neighbors_data - } - } - if group and group == group_name: - return ct_grp_data - # return self._removeNotFound(ct_grp_data) - if neighbor and neighbor in neighbors_data.keys(): - ct_grp_data[group_name]["neighbors"] = {} - ct_grp_data[group_name]["neighbors"][neighbor] = neighbors_data[neighbor] - return ct_grp_data - # return self._removeNotFound(ct_grp_data) - groups_data.update(ct_grp_data) - # return groups_data if not group or not neighbor else {} - # if group or neighbor is true and is present , then return shd have happened in for loop - return {} if group or neighbor else groups_data - # return {} if group or neighbor else self._removeNotFound(groups_data) - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_snmp_information(self): - """ - :return: - Returns a dict of dicts containing SNMP configuration. Each inner dictionary contains these fields - - chassis_id (string) - community (dictionary) - contact (string) - location (string) - """ - try: - contact_path = {"/system/information/contact"} - location_path = {"/system/information/location"} - path_type = "STATE" - contact_output = self.device._gnmiGet("", contact_path, path_type) - location_output = self.device._gnmiGet("", location_path, path_type) - contact = self._getObj(contact_output, - *['srl_nokia-system:system', 'srl_nokia-system-info:information', 'contact']) - location = self._getObj(location_output, - *['srl_nokia-system:system', 'srl_nokia-system-info:information', 'location']) - output = { - "chassis_id": "", - "community": {}, - "contact": contact, - "location": location - } - return output - except Exception as e: - logging.error("Error occurred : {}".format(e)) - # def get_config_jsonrpc(self, retrieve='all', full=False, sanitized=False): - # """ - # :param retrieve: Which configuration type you want to populate, default is all of them. The rest will be set to “”. - # :param full:Retrieve all the configuration. For instance, on ios, “sh run all”. - # :param sanitized:Remove secret data. Default: False. - # :return:Return the configuration of a device. - # """ - # cmds = [ - # { - # "datastore": "running", - # "path": "/" - # } - # ] - # running = self.device._jsonrpcGet(cmds) - # if retrieve == 'all': - # return { - # "running": str(running), - # "candidate": "", - # "startup": "" - # } - # if retrieve == 'running': - # return { - # "running": str(running), - # "candidate": "", - # "startup": "" - # } - # - # if retrieve == 'candidate': - # return { - # "running": "", - # "candidate": "", - # "startup": "" - # } - # if retrieve == 'startup': - # return { - # "running": "", - # "candidate": "", - # "startup": "" - # } - - - def get_config( - self, - retrieve: str = "all", - full: bool = False, - sanitized: bool = False, - format: str = "text", # This driver supports 'cli' for CLI, else default 'json' - ): - """ - :param retrieve: Which configuration type you want to populate, default is all of them. The rest will be set to “”. - :param full:Retrieve all the configuration. For instance, on ios, “sh run all”. - :param sanitized:Remove secret data. Default: False. - :return:Return the configuration of a device. - """ - try: - if retrieve not in ['all','running']: - # Only 'running' or 'all' is supported for get_config - return { - "running": "", - "candidate": "", - "startup": "" - } - - if self.running_format == 'cli' or format == 'cli': - if sanitized: - raise NotImplementedError( - "sanitized=True is not implemented with CLI format") - output = self.device._jsonrpcRunCli(["info flat"]) - running_config = self._return_result(output) - else: - running = self.device._gnmiGet("", {"/"}, "CONFIG") - if sanitized: - if "srl_nokia-system:system" in running: - _system = running["srl_nokia-system:system"] - if "srl_nokia-aaa:aaa" in _system: - del _system["srl_nokia-aaa:aaa"] - if "srl_nokia-tls:tls" in _system: - del _system["srl_nokia-tls:tls"] - running_config = json.dumps(running) # don't use sort_keys=True - - return { - "running": running_config, - "candidate": "", - "startup": "" - } - except NotImplementedError as e: - raise e - except Exception as e: - logging.error(f"Error occurred in get_config: {e}") - return { - "running": "", - "candidate": "", - "startup": "" - } - - def get_ntp_servers(self): - """ - :return:Returns the NTP servers configuration as dictionary. The keys of the dictionary represent the IP Addresses of the servers. Inner dictionaries do not have yet any available keys. - """ - try: - path = {"/system/ntp"} - path_type = "STATE" - output = self.device._gnmiGet("", path, path_type) - ntp_servers = self._getObj(output, *['srl_nokia-system:system','srl_nokia-ntp:ntp', "server"], default=[]) - server_data = {} - for s in ntp_servers: - if "address" in s: - server_data.update({ - s["address"]:{} - }) - return server_data - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - # # def get_ntp_peers(self): - # # """ - # # :return:Returns the NTP peers configuration as dictionary. The keys of the dictionary represent the IP Addresses of the peers. Inner dictionaries do not have yet any available keys. - # # """ - # # path = {"/system/ntp/server"} - # # path_type = "STATE" - # # output = self.device._gnmiGet("", path, path_type) - # # ntp_servers = self._getObj(output, *['srl_nokia-system:system/srl_nokia-ntp:ntp', "server"]) - # # peers_data = {} - # # for s in ntp_servers: - # # if "address" in s: - # # peers_data.update({ - # # s["address"]:{} - # # }) - # # return peers_data - # pass - - def get_ntp_stats(self): - """ - :return:Returns a list of NTP synchronization statistics. - """ - try: - path = {"/system/ntp"} - path_type = "STATE" - output = self.device._gnmiGet("", path, path_type) - ntp_servers = self._getObj(output, *['srl_nokia-system:system', 'srl_nokia-ntp:ntp', "server"], default=[]) - synchronized = self._getObj(output, *['srl_nokia-system:system', 'srl_nokia-ntp:ntp', 'synchronized']) - stats_data = [] - for s in ntp_servers: - prefer = s["prefer"] if "prefer" in s else None - if synchronized.lower() == "synchronized" or synchronized.lower() == "synchronised": - synced = True - else: - synced = False - if prefer: - offset = self._getObj(s, *["offset"], default=-1.0) - jitter = self._getObj(s, *["jitter"], default=-1.0) - stats_data.append({ - 'remote': self._getObj(s, *["address"]), - "referenceid": "", - 'synchronized': synced, - 'stratum': self._getObj(s, *["stratum"], default=-1), - "type": "", - "when": "", - 'hostpoll': self._getObj(s, *["poll-interval"], default=-1), - "reachability": -1, - "delay": -1.0, - 'offset': float(offset), - 'jitter': float(jitter) - }) - return stats_data - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_optics(self): - """ - :return:Fetches the power usage on the various transceivers installed on the switch (in dbm), and returns a view that conforms with the openconfig model openconfig-platform-transceiver.yang - """ - try: - path = {"/interface"} - path_type = "STATE" - output = self.device._gnmiGet("", path, path_type) - interfaces = self._getObj(output, *['srl_nokia-interfaces:interface'], default=[]) - channel_data = {} - for i in interfaces: - name = self._getObj(i, *["name"]) - channel = self._getObj(i, *["transceiver", "channel"], default={}) - channel_data.update({ - name: { - 'physical_channels': { - 'channel': [ - { - 'index': self._getObj(channel, *["index"], default=-1), - 'state': { - 'input_power': { - 'instant': self._getObj(channel, *["input-power", "latest_value"], - default=-1.0), - "avg": -1.0, - "min": -1.0, - "max": -1.0 - }, - 'output_power': { - 'instant': self._getObj(channel, *["output-power", "latest_value"], - default=-1.0), - "avg": -1.0, - "min": -1.0, - "max": -1.0 - }, - 'laser_bias_current': { - 'instant': self._getObj(channel, *["laser-bias-current", "latest_value"], - default=-1.0), - "avg": -1.0, - "min": -1.0, - "max": -1.0 - }, - } - } - ] - } - } - }) - return channel_data - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_mac_address_table(self): - """ - Returns a lists of dictionaries. Each dictionary represents an entry in the MAC Address Table, - having the following keys: - mac (string) - interface (string) - vlan (int) - active (boolean) - static (boolean) - moves (int) - last_move (float) - """ - try: - path = {"/network-instance/bridge-table/mac-table/mac"} - path_type = "STATE" - output = self.device._gnmiGet("", path, path_type) - mac_data = [] - instances = self._getObj(output, *['srl_nokia-network-instance:network-instance'], default=[]) - for i in instances: - mac_output = self._getObj(i, *['bridge-table', 'srl_nokia-bridge-table-mac-table:mac-table', 'mac'], - default=[]) - for m in mac_output: - dest_splits = str(m['destination']).split(".") - int = dest_splits[0] - subint = dest_splits[1] if len(dest_splits) >= 2 else "*" - vlan_path = { - "/interface[name={}]/subinterface[index={}]/vlan/encap/single-tagged/vlan-id".format(int, subint)} - vlan_output = self.device._gnmiGet("", vlan_path, "STATE") - vlanid = self._getObj(vlan_output, *['srl_nokia-interfaces:interface', 0, 'subinterface', 0, - 'srl_nokia-interfaces-vlans:vlan', 'encap', 'single-tagged', - 'vlan-id'], default=-1) - type = self._getObj(m, *["type"]) - static = False if not type else type != "learnt" - m_data = { - 'mac': self._getObj(m, *['address']), - 'interface': self._getObj(m, *['destination']), - 'vlan': vlanid, - "active": False, - 'static': static, - "moves": -1, - "last_move": -1.0 - } - mac_data.append(m_data) - return mac_data - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def get_route_to(self, destination='', protocol='', longer=False): - """ - :return:Returns a dictionary of dictionaries containing details of all available routes to a destination. - """ - try: - path = {"/network-instance"} - path_type = "STATE" - output = self.device._gnmiGet("", path, path_type) - dpath = {"/system/information/current-datetime"} - doutput = self.device._gnmiGet("", dpath, "STATE") - ctdatetime = self._getObj(doutput, - *['srl_nokia-system:system', 'srl_nokia-system-info:information', 'current-datetime'], - default=None) - interfaces = self._getObj(output, *['srl_nokia-network-instance:network-instance'], default=[]) - route_data = {} - for i in interfaces: - routes = self._getObj(i, *["route-table", "srl_nokia-ip-route-tables:ipv4-unicast", "route"], default=[]) - next_hop_groups = self._getObj(i, *["route-table", "srl_nokia-ip-route-tables:next-hop-group"], default=[]) - next_hops = self._getObj(i, *["route-table", "srl_nokia-ip-route-tables:next-hop"], default=[]) - name = self._getObj(i, *["name"]) - for r in routes: - if "next-hop-group" not in r: - continue - next_hop_group_id = r["next-hop-group"] - next_hop_group = [n for n in next_hop_groups if n["index"] == next_hop_group_id] - next_hop_group = next_hop_group[0] # definitely this will be present . list cannot be empty - next_hop_ids = [n["next-hop"] for n in next_hop_group["next-hop"]] - - ct_next_hops = [n for n in next_hops if n["index"] in next_hop_ids] - ct_next_hops_data = [] - for next_hop in ct_next_hops: - ip_address = self._getObj(next_hop, *["ip-address"]) - subinterface = self._getObj(next_hop, *["subinterface"]) - if ctdatetime and self._getObj(r, *["last-app-update"], default=None): - ctdatetime_obj = datetime.datetime.strptime(ctdatetime, "%Y-%m-%dT%H:%M:%S.%fZ") - last_app_date = datetime.datetime.strptime(r["last-app-update"], "%Y-%m-%dT%H:%M:%S.%fZ") - age = int((ctdatetime_obj - last_app_date).total_seconds()) - else: - age = -1 - ct_protocol = str(r["owner"]).split(":")[-1] - data = { - "protocol": ct_protocol, - "current_active": self._getObj(r, *["active"], default=False), - "last_active": False, - "age": age, - "next_hop": ip_address, - "outgoing_interface": subinterface, - "selected_next_hop": True if ip_address else False, - "preference": self._getObj(r, *["preference"], default=-1), - "inactive_reason": "", - "routing_table": name, - } - if "bgp" in r["owner"]: - bgp_protocol = self._getObj(i, *["protocols", "srl_nokia-bgp:bgp"], default={}) - bgp_rib_routes = self._getObj(i, *["srl_nokia-rib-bgp:bgp-rib", "ipv4-unicast", "local-rib", - "routes"], default=[]) - bgp_rib_attrsets = self._getObj(i, *["srl_nokia-rib-bgp:bgp-rib", "attr-sets", "attr-set"], - default=[]) - neighbor = [b for b in bgp_protocol["neighbor"] if b["peer-address"] == ip_address] - neighbor = neighbor[0] # exactly one neighbor will be present if it is bgp - rib_route = [rr for rr in bgp_rib_routes if - rr["prefix"] == r["ipv4-prefix"] and rr["neighbor"] == ip_address and rr[ - "origin-protocol"] == "bgp"] - rib_route = rib_route[0] - attr_id = rib_route["attr-id"] - att_set = [a for a in bgp_rib_attrsets if a["index"] == attr_id][0] - data.update({ - "protocol_attributes": { - "local_as": self._getObj(bgp_protocol, *["autonomous-system"], default=-1), - "remote_as": self._getObj(neighbor, *["peer-as"], default=-1), - "peer_id": self._getObj(neighbor, *["peer-address"]), - "as_path": str(self._getObj(att_set, *["as-path", "segment", 0, "member", 0])), - "communities": self._getObj(att_set, *["communities", "community"], default=[]), - "local_preference": self._getObj(att_set, *["local-pref"], default=-1), - "preference2": -1, - "metric": self._getObj(r, *["metric"], default=-1), - "metric2": -1 - } - }) - if "isis" in r["owner"]: - isis_protocol = self._getObj(i, *["protocols", "srl_nokia-isis:isis", "instance"])[0] - level = self._getObj(isis_protocol, *["level", 0, "level-number"], default=-1) - data.update({ - "protocol_attributes": { - "level": level - } - }) - ct_next_hops_data.append(data) - if destination and ( - destination == r["ipv4-prefix"] or destination == str(r["ipv4-prefix"]).split("/")[0]): - return { - r["ipv4-prefix"]: ct_next_hops_data - } - route_data.update({ - r["ipv4-prefix"]: ct_next_hops_data - }) - if protocol: - route_data_filtered = {} - for ipv4_prefix, nhs in route_data.items(): - next_hop_filtered = [n for n in nhs if n["protocol"] == protocol] - if next_hop_filtered: - route_data_filtered.update({ - ipv4_prefix: next_hop_filtered - }) - return route_data_filtered - if destination: # if destination was present , it should not reach here, rather returned earlier. - return {} - return route_data - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def is_alive(self): - alive = False - if self._channel: - try: - output = self.device._jsonrpcRunCli(["date"]) - if "result" in output: - alive = True - except Exception as e: - logging.error( f"Exception in is_alive: {e} -> returning False" ) - return { "is_alive": alive } - - def traceroute(self, destination, source="", ttl=255, timeout=2, vrf=""): - try: - if not vrf: - vrf = "default" - command = "traceroute {} {} {}".format( - destination, - "-m {}".format(ttl) if ttl else "", - "network-instance {}".format(vrf) if vrf else "", - ) - output = self.device._jsonrpcRunCli([command]) - if "error" in output: - return { - "error": output["error"] - } - if "result" not in output: - return { - "error": "No result in output: {}".format(output) - } - result = output["result"][0]['text'] - if "* * *" in result: - return { - 'error': 'unknown host {}'.format(destination) - } - hops = result.split("byte packets")[1] - hop_list = hops.split("\n") - probes = {} - for h in hop_list: - if h.strip(): - h_splits = re.split(r" |\(|\)", h.strip()) - splts = [s.strip() for s in h_splits if s.strip()] - ct_probe = { - 1: { - 'rtt': float(splts[3]), - 'ip_address': splts[2], - 'host_name': splts[1] - }, - 2: { - 'rtt': float(splts[5]), - 'ip_address': splts[2], - 'host_name': splts[1] - }, - 3: { - 'rtt': float(splts[7]), - 'ip_address': splts[2], - 'host_name': splts[1] - } - } - probes[int(splts[0])] = ct_probe - return {"success": probes} - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def _ping(self, destination, source="", ttl=255, timeout=2, size=100, count=5, vrf=""): - try: - if not vrf: - vrf = "default" - output = self.device._jsonrpcRunCli(["ping {} {} {} {} {} {} {}".format( - destination, - "-I {}".format(source) if source else "", - "-t {}".format(ttl) if ttl else "", - "-W {}".format(timeout) if timeout else "", - "-s {}".format(size) if size else "", - "-c {}".format(count) if count else "", - "network-instance {}".format(vrf) if vrf else "", - )]) - if "error" in output: - value = output["error"]["message"] - return {"error": value.strip()} - result = output["result"][0]['text'] - if "Destination Host Unreachable" in result: - return {"error": "unknown host {}".format(destination)} - pings = result.split("bytes of data.")[1] - ping_list = [p for p in pings.split("\n") if p.strip()] - rtt_line = ping_list[-1] - success_data = {} - r_splits = [r for r in re.split(" |/|=", rtt_line.strip()) if r.strip()] - stats_line = ping_list[-2] - s_splits = [s for s in stats_line.split(" ")] - loss = s_splits[5].strip("%") - sent = int(s_splits[0]) - lost_packets = int(sent * int(loss) / 100) - success_data.update({ - 'probes_sent': sent, - 'packet_loss': lost_packets, - 'rtt_min': float(r_splits[5]), - 'rtt_max': float(r_splits[7]), - 'rtt_avg': float(r_splits[6]), - 'rtt_stddev': float(r_splits[8]), - }) - ping_lines = [] - for line in ping_list: - if "ping statistics" in line: - break - if line.strip(): - ping_lines.append(line) - results = [] - for p in ping_lines: - p_splits = [s for s in re.split(" |:|=", p.strip()) if s.strip()] - results.append({ - 'ip_address': p_splits[3], - 'rtt': float(p_splits[9]) - }) - success_data.update({ - "results": results - }) - return {"success": success_data} - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def cli(self, commands, encoding="text"): - """ - Will execute a list of commands and return the output in a dictionary format. - """ - if encoding not in ("text",): - raise NotImplementedError("%s is not a supported encoding" % encoding) - - try: - output = {} - jsonrpc_output = self.device._jsonrpcRunCli(commands) - if "error" in jsonrpc_output: - return jsonrpc_output - result = jsonrpc_output["result"] - for (c, r) in zip(commands, result): - output[c] = r - return output - except Exception as e: - logging.error("Error occurred : {}".format(e)) - - def _clear_candidate(self): - if self.tmp_cfgfile is not None: - self.tmp_cfgfile.close() - self.tmp_cfgfile = None - return True - return False - - def _cli_commit(self, message='', revert_in=None): - """ - Commits the changes requested by the method load_replace_candidate or load_merge_candidate. - :return: - """ - try: - cmds = [ - "enter candidate private ", - "/", - f'commit { self.commit_mode }' + (f'comment "{message}"' if message else '') - ] - output = self.device._jsonrpcRunCli(cmds) - return self._return_result(output) - except Exception as e: - logging.error("Error occurred in _cli_commit: {}".format(e)) - raise CommitError(e) from e - - def compare_config(self): - try: - if not self._is_commit_pending(): #means to do compare for merge operation i.e onbox -remote diff - return self._compare_config_on_box() - else: #means to do compare for replace operation i.e offbox -local diff - if self.running_format == "cli": - raise NotImplementedError("compare_config for 'cli' format is not supported") - - running_config = self.get_config()["running"] - running_config_dict = json.loads(running_config) - cand_config = json.load(self.tmp_cfgfile) - if 'updates' in cand_config: - return cand_config # The update is the diff - cand_config = cand_config['replaces'][0]['value'] - return self._diff_json(cand_config, running_config_dict) - except Exception as e: - logging.error("Error occurred in compare_config: {}".format(e)) - raise CommandErrorException(e) from e - - def _compare_config_on_box(self): - """ - A string showing the difference between the running configuration and the candidate configuration. - The running_config is loaded automatically just before doing the comparison so there is no need for you to do it. - :return: - """ - cmds = [ - "enter candidate private", - "/", - "diff" - ] - output = self.device._jsonrpcRunCli(cmds) - if "result" in output: - result = output["result"] - return result[-1]["text"] if "text" in result[-1] else "" if result[-1] =={} else result[-1] - elif "error" in output: - return output["error"] - return output - - def load_replace_candidate(self, filename=None, config=None): - """ - Accepts either a native JSON formatted config, or a gNMI style JSON config - containing only 'replaces' - """ - try: - return self._load_candidate(filename,config,is_replace=True) - except Exception as e: - raise ReplaceConfigException("Error during load_replace_candidate operation") from e - - def load_merge_candidate(self, filename=None, config=None): - """ - Accepts either a native JSON formatted config (interpreted as 'update /') - or a gNMI style JSON config containing any number of 'deletes','replaces','updates' - """ - try: - return self._load_candidate(filename,config,is_replace=False) - except Exception as e: - raise MergeConfigException("Error during load_merge_candidate operation") from e - - def _return_result(self,output): - if "result" in output: - result = output["result"] - return result[-1]["text"] if "text" in result[-1] else result[-1] - elif "error" in output: - raise Exception(f"Error message from SRL : {output}") - raise Exception(f"result not found in output. Output : {output}") - - def _load_candidate(self,filename,config,is_replace): - if self._is_commit_pending(): - raise Exception("Candidate config is already loaded. Discard it to reload") - - if filename: - with open(filename,"r") as f: - config = f.read() - if not config: - raise Exception("Configuration is empty") - elif not config: - raise Exception("Either 'filename' or 'config' argument must be provided") - - cfg = None - try: - cfg = json.loads(config) # try to load it as json, could keep order of keys - if 'deletes' in cfg or 'updates' in cfg or 'replaces' in cfg: - if is_replace: - if ('deletes' in cfg or 'updates' in cfg): - raise Exception("'load_replace_candidate' cannot contain 'deletes' or 'updates'") - elif "path" not in cfg["replaces"] or cfg["replaces"]["path"] != "/": - raise Exception("'load_replace_candidate' must use 'replaces' with a single path of '/'") - else: - cfg = { 'replaces' if is_replace else 'updates': [ { 'path': '/', 'value': cfg } ] } - - self.tmp_cfgfile = tempfile.TemporaryFile(mode='w+') - json.dump(cfg, self.tmp_cfgfile, sort_keys=True) - self.tmp_cfgfile.seek(0) # Prepare for reading back - return "JSON candidate config loaded for " + ("replace" if is_replace else "merge") - except json.decoder.JSONDecodeError: # Upon error, assume it's CLI commands - cmds = [ - "enter candidate private", - "/", - ] - if is_replace: - cmds.append("delete /") - cmds.extend( config.split("\n") ) - output = self.device._jsonrpcRunCli(cmds) - return self._return_result(output) - - def commit_config(self, message='', revert_in=None): - """ - This method creates a system-wide checkpoint containing the current state before this configuration change. - """ - if revert_in: - raise NotImplementedError("'revert_in' not implemented") - - # Create named checkpoint - self.chkpoint_id = self.chkpoint_id + 1 - chkpt_cmds = [ - f"/tools system configuration generate-checkpoint name NAPALM-{self.chkpoint_id}" - ] - result = self.device._jsonrpcRunCli(chkpt_cmds) - logging.info( f"Checkpoint 'NAPALM-{self.chkpoint_id}' created: {result}" ) - - if self._is_commit_pending(): - try: - self.tmp_cfgfile.seek(0) - json_config = json.load(self.tmp_cfgfile) - if message: - raise NotImplementedError("'message' not supported with JSON config") - self.device._commit_json_config(json_config) - self._clear_candidate() - return "JSON config committed" - - # except grpc._channel._InactiveRpcError as e: - # Log but do not raise - # logging.error(e) - - except Exception as e: - logging.error(e) - raise CommitError(e) from e - else: - return self._cli_commit(message,revert_in) - - def discard_config(self): - if not self._clear_candidate(): - cmds = [ - "enter candidate private", - "/", - "discard now" - ] - output = self.device._jsonrpcRunCli(cmds) - return output["result"] if "result" in output else output - - return "Candidate config discarded" - - def _is_commit_pending(self): - return self.tmp_cfgfile is not None - - def rollback(self): - """ - Reverts changes made by the most recent commit_config call, by loading the named checkpoint that was created - - Caveat: Checkpoints contain the entire system configuration tree, and restore the system state to the point at which - the (named) checkpoint was created (i.e. most recent commit_config call) - If changes were made to the config after that checkpoint was created, those changes will be reverted too (!) - - In a highly concurrent environment in which multiple systems are provisioning nodes, it may be better to implement fine-grained - rollback consisting of only incremental changes, rather than the entire system state. In that case, 'rollback' would be implemented - by another call to commit_config, containing the original config subtree. - """ - try: - output = self.device._jsonrpcRunCli( - [ - "enter candidate private", - f"load checkpoint name NAPALM-{self.chkpoint_id}", # Use named checkpoint to avoid parallel overwrite - f"commit {self.commit_mode}" - ] - ) - return output - except Exception as e: - logging.error("Error occurred : {}".format(e)) - raise CommitError(e) from e - - def _getObj(self, obj, *keys, default=""): - try: - if len(keys) == 1: - output = obj[keys[0]] - return output if output else default - else: - output = self._getObj(obj[keys[0]], *keys[1:], default=default) - return output if output else default - except Exception as e: - logging.error(e) - # raise type(e)("{} occurred when trying to get path {}".format(e, keys)) - # return "##NOTFOUND##" - return default - - def _get_old(self, obj, *keys, default=""): - try: - if len(keys) == 1: - return obj[keys[0]] - else: - return self._get_old(obj[keys[0]], *keys[1:]) - except Exception as e: - raise type(e)("{} occurred when trying to get path {}".format(e, keys)) - # return "##NOTFOUND##" - # return default - - def _removeNotFound(self, obj): - """ - removes the ##NOTFOUND## from the obj - :param obj: shd be a dict or list. Can be nested - :return: - """ - if isinstance(obj, dict): - result = {} - for k, v in obj.items(): - if isinstance(v, dict) or isinstance(v, list): - result[k] = self._removeNotFound(v) - elif isinstance(v, str) and v == "##NOTFOUND##": - continue - else: - result[k] = v - return result - elif isinstance(obj, list): - result = [] - for r in obj: - if isinstance(r, dict) or isinstance(r, list): - result.append(self._removeNotFound(r)) - elif isinstance(r, str) and r == "##NOTFOUND##": - continue - else: - result.append(r) - return result - - def _diff_json(self, newjson, oldjson): - try: - j = jsondiff.jsondiff() - return j.cmp_dict(newjson, oldjson) - except Exception as e: - logging.error("Error occurred : {}".format(e)) - -class SRLAPI(object): - def __init__(self, hostname, username, password, timeout=60, optional_args=None): - """Constructor.""" - self.device = None - self._metadata = None - - self.hostname = hostname - self.username = username - self.password = password - self.timeout = timeout - - self._stub = None - self._channel = None - - if optional_args is None: - optional_args = {} - self.gnmi_port = optional_args.get("gnmi_port", 57400) - self.jsonrpc_port = optional_args.get("jsonrpc_port", 443) - if self.gnmi_port: - self.target = str(self.hostname) + ":" + str(self.gnmi_port) - self.target_name = optional_args.get("target_name", "") - self.skip_verify = optional_args.get("skip_verify", False) - self.insecure = optional_args.get("insecure", False) - self.encoding = optional_args.get("encoding", "JSON_IETF") - - self.tls_ca = optional_args.get("tls_ca", "") - self.tls_cert = optional_args.get("tls_cert", "") - self.tls_key = optional_args.get("tls_key", "") - - ciphers = optional_args.get("jsonrpc_ciphers", - "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-SHA") - - self.jsonrpc_session = requests.session() - self.jsonrpc_session.mount("https://", TLSHttpAdapter(ciphers=ciphers)) - - # Warn about incompatible/oddball settings - if self.jsonrpc_port == 80: - if not self.insecure: - logging.warning( "Secure JSON RPC uses port 443, not 80. " + - "Set 'insecure=True' flag to indicate this is ok" ) - elif self.jsonrpc_port != 443: - logging.warning( f"Non-default JSON RPC port configured ({self.jsonrpc_port}), typically only 443(default) or 80 are used" ) - - if not self.insecure: - if not self.tls_ca: - logging.warning( "Incompatible settings: insecure=False " + - "requires certificate parameter 'tls_ca' to be set " + - "when using self-signed certificates" ) - - def open(self): - """Implement the NAPALM method open (mandatory)""" - try: - # read the certificates - certs = {} - if self.tls_ca: - certs["root_certificates"] = self._readFile(self.tls_ca) - if self.tls_cert: - certs["certificate_chain"] = self._readFile(self.tls_cert) - if self.tls_key: - certs["private_key"] = self._readFile(self.tls_key) - - # If not provided and 'insecure' flag is set, fetch CA cert from server - if 'root_certificates' not in certs and self.insecure: - # Lazily import dependencies - from cryptography import x509 - import ssl - from cryptography.hazmat.backends import default_backend - - ssl_cert = ssl.get_server_certificate((self.hostname, self.gnmi_port)).encode("utf-8") - certs["root_certificates"] = ssl_cert - logging.warning("Using server certificate as root CA due to 'insecure' flag, not recommended for production use" ) - if not self.target_name: - ssl_cert_deserialized = x509.load_pem_x509_certificate(ssl_cert, default_backend()) - ssl_cert_common_names = ssl_cert_deserialized.subject.get_attributes_for_oid(x509.oid.NameOID.COMMON_NAME) - self.target_name = ssl_cert_common_names[0].value - logging.warning(f'ssl_target_name_override(={self.target_name}) is auto-discovered, should be used for testing only!') - - credentials = grpc.ssl_channel_credentials(**certs) - self._metadata = [("username", self.username), ("password", self.password)] - - # open a secure channel, note that this does *not* send username/pwd yet... - self._channel = grpc.secure_channel( - target=self.target, - credentials=credentials, - options=(("grpc.ssl_target_name_override", self.target_name),), - ) - - if self._stub is None: - self._stub = gnmi_pb2.gNMIStub(self._channel) - # print("stub", self._stub) - except Exception as e: - logging.error("Error in Connection to SRL : {}".format(e)) - raise ConnectionException(e) from e - - def close(self): - """Implement the NAPALM method close (mandatory)""" - try: - if not self._channel: - logging.warning("No grpc channels created to close") - return - self._channel.close() - self._channel = None - self._stub = None - except Exception as e: - logging.error("Error occurred : {}".format(e)) - raise ConnectionException(e) from e - - @staticmethod - def _readFile(filename): - """ - Reads a binary certificate/key file - Parameters: - optionName(str): used to read filename from options - Returns: - File content - Raises: - ConnectionException: file does not exist or read excpetions - """ - path = "/etc/ssl:/etc/ssl/certs:/etc/ca-certificates" - - if filename: - if filename.startswith("~"): - filename = os.path.expanduser(filename) - if not filename.startswith("/"): - for entry in path.split(":"): - if os.path.isfile(os.path.join(entry, filename)): - filename = os.path.join(entry, filename) - break - if os.path.isfile(filename): - try: - with open(filename, "rb") as f: - return f.read() - except Exception as exc: - raise ConnectionException( - "Failed to read cert/keys file %s: %s" % (filename, exc) - ) - else: - raise ConnectionException( - "Cert/keys file %s does not exist" % filename - ) - return None - - def _jsonrpcRunCli(self, cmds): - data = { - "jsonrpc": "2.0", - "id": 0, - "method": "cli", - "params": { - "commands": cmds - } - } - return self._jsonrpcPost(data) - - def _jsonrpcSet(self, cmds, other_params=None): - data = { - "jsonrpc": "2.0", - "id": 0, - "method": "set", - "params": { - "commands": cmds - } - } - if other_params: - data["params"].update(other_params) - return self._jsonrpcPost(data) - - def _jsonrpcGet(self, cmds, other_params=None): - data = { - "jsonrpc": "2.0", - "id": 0, - "method": "get", - "params": { - "commands": cmds - } - } - if other_params: - data["params"].update(other_params) - return self._jsonrpcPost(data) - - def _jsonrpcPost(self, json_data, timeout=None): - headers = { - "Content-Type": "application/json", - "Accept": "application/json", - } - proto = "https" if (self.jsonrpc_port==443 or (self.jsonrpc_port!=80 and not self.insecure)) else "http" - geturl = f"{proto}://{self.hostname}:{self.jsonrpc_port}/jsonrpc" - cert = ( self.tls_cert, self.tls_key ) if self.tls_cert and self.tls_key else None - resp = self.jsonrpc_session.post(geturl, headers=headers, json=json_data, - timeout=timeout if timeout else self.timeout, - auth=(self.username, self.password), cert=cert, - verify=False if self.skip_verify else self.tls_ca) - resp.raise_for_status() - return resp.json() if resp.text else "" - - def _gnmiGet(self, prefix, path, pathType): - """ - Executes a gNMI Get request - Encoding that is used for data serialization is automatically determined - based on the remote device capabilities. This gNMI plugin has implemented - suppport for JSON_IETF (preferred) and JSON (fallback). - Parameters: - type (str): Type of data that is requested: ALL, CONFIG, STATE - prefix (str): Path prefix that is added to all paths (XPATH syntax) - paths (list): List of paths (str) to be captured - Returns: - str: GetResponse message converted into JSON format - """ - # Remove all input parameters from kwargs that are not set - - input = {"path": path, "type": pathType, "encoding": self.encoding} - input["path"] = [self._encodeXpath(path) for path in input["path"]] - input["prefix"] = self._encodeXpath(prefix) - - try: - request = json_format.ParseDict(input, gnmi_pb2.GetRequest()) - response = self._stub.Get(request, metadata=self._metadata) - # print("response:", response) - except Exception as e: - if "StatusCode.INVALID_ARGUMENT" in str(e): - return "" - #logging.exception(e) - else: - for line in str(e).splitlines(False): - if "detail" in line: - raise Exception(line.strip()) from e - output = self._mergeToSingleDict( - json_format.MessageToDict(response)["notification"] - ) - return output - - # def _gnmiSet1(self, prefix=None, updates=None, replaces=None, deletes=None, extensions=None): - # request = gnmi_pb2.SetRequest() - # if prefix: - # request.prefix.CopyFrom(prefix) - # test_list = [updates, replaces, deletes] - # if not any(test_list): - # raise Exception("At least update, replace, or delete must be specified!") - # for item in test_list: - # if not item: - # continue - # if not isinstance(item, (list, set)): - # raise Exception("updates, replaces, and deletes must be iterables!") - # if updates: - # updates1 =[] - # for u in updates: - # update = gnmi_pb2.Update() - # update.val.json_ietf_val = gnmi_pb2.Path(u["val"]) - # update.path.CopyFrom(u["path"]) - # updates1.append(update) - # request.update.extend(updates1) - # if replaces: - # request.replace.extend(replaces) - # if deletes: - # request.delete.extend(deletes) - # if extensions: - # request.extension.extend(extensions) - # - # - # response = self._stub.Set(request, metadata={"username":""}) - # print(response) - - - # def _gnmi_update(self, update_path, update_json): - # update = gnmi_pb2.Update() - # path = json_format.ParseDict(self._encodeXpath(update_path), gnmi_pb2.Path()) - # update.path.CopyFrom(path) - # update.val.json_ietf_val = json.dumps(update_json).encode("utf-8") - # updates = [update] - # self._gnmiSet(update = updates) - - - # def gnmi_replace(self, replace_json): - # update = gnmi_pb2.Update() - # #path = json_format.ParseDict(self._encodeXpath(replace_path), gnmi_pb2.Path()) - # #update.path.CopyFrom(path) - # update.val.json_ietf_val = json.dumps(replace_json).encode("utf-8") - # updates = [update] - # self._gnmiSet(replace = updates) - - # def _gnmiSet(self, prefix=None, delete=None, replace=None, update=None): - # request = gnmi_pb2.SetRequest() - # if prefix: request.prefix.CopyFrom(prefix) - # if update: request.update.extend(update) - # if delete: request.delete.extend(delete) - # if replace: request.replace.extend(replace) - # self._stub.Set(request, metadata=self._metadata) - - def _commit_json_config(self,json_config): - request = gnmi_pb2.SetRequest() - if 'deletes' in json_config: - request.delete.extend( [ json_format.ParseDict(self._encodeXpath(p), gnmi_pb2.Path()) for p in json_config['deletes']] ) - for k in ('replaces','updates'): - if k in json_config: - items = [] - for u in json_config[k]: - update = gnmi_pb2.Update() - path = json_format.ParseDict(self._encodeXpath(u['path']), gnmi_pb2.Path()) - update.path.CopyFrom(path) - update.val.json_ietf_val = json.dumps(u['value']).encode("utf-8") - items.append(update) - if k=='replaces': - request.replace.extend( items ) - else: - request.update.extend( items ) - self._stub.Set(request, metadata=self._metadata) - - @staticmethod - def _encodeXpath(path): - """ - Encodes XPATH to dict representation that allows conversion to gnmi_pb.Path object - Parameters: - xpath (str): path string using XPATH syntax - Returns: - (dict): path dict using gnmi_pb2.Path structure for easy conversion - """ - mypath = [] - xpath = path.strip("\t\n\r /") - if xpath: - path_elements = re.split(r"""/(?=(?:[^\[\]]|\[[^\[\]]+\])*$)""", xpath) - for e in path_elements: - entry = {"name": e.split("[", 1)[0]} - eKeys = re.findall(r"\[(.*?)\]", e) - dKeys = dict(x.split("=", 1) for x in eKeys) - if dKeys: - entry["key"] = dKeys - mypath.append(entry) - return {"elem": mypath} - return {} - - def _mergeToSingleDict(self, rawData): - result = {} - - for entry in rawData: - if "syncResponse" in entry and entry["syncResponse"]: - # Ignore: SyncResponse is sent after initial update - break - elif "update" not in entry: - # Ignore: entry without updates - break - elif "timestamp" not in entry: - # Subscribe response, enter update context - entry = entry["update"] - else: - # Get response, keep context - pass - - prfx = result - if ("prefix" in entry) and ("elem" in entry["prefix"]): - prfx_elements = entry["prefix"]["elem"] - else: - prfx_elements = [] - - for elem in prfx_elements: - eleName = elem["name"] - if "key" in elem: - eleKey = json.dumps(elem["key"]) - eleName = "___" + eleName - # Path Element has key => must be list() - if eleName in prfx: - # Path Element exists => Change Context - prfx = prfx[eleName] - if eleKey not in prfx: - # List entry does not exist => Create - prfx[eleKey] = elem["key"] - prfx = prfx[eleKey] - else: - # Path Element does not exist => Create - prfx[eleName] = {} - prfx = prfx[eleName] - prfx[eleKey] = elem["key"] - prfx = prfx[eleKey] - else: - # Path Element hasn't key => must be dict() - if eleName in prfx: - # Path Element exists => Change Context - prfx = prfx[eleName] - else: - # Path Element does not exist => Create - prfx[eleName] = {} - prfx = prfx[eleName] - - for _upd in entry["update"]: - if "val" not in _upd: - # requested path without content (no value) => skip - continue - elif ("path" in _upd) and ("elem" in _upd["path"]): - path_elements = _upd["path"]["elem"] - cPath = prfx - elif prfx_elements: - path_elements = prfx_elements - cPath = result - else: - # No path at all, replace the objecttree with value - result = self._decodeVal(_upd["val"]) - prfx = result - continue - - # If path_elements has more than just a single entry, - # we need to create/navigate to the specified subcontext - for elem in path_elements[:-1]: - eleName = elem["name"] - if "key" in elem: - eleKey = json.dumps(elem["key"]) - eleName = "___" + eleName - # Path Element has key => must be list() - if eleName in cPath: - # Path Element exists => Change Context - cPath = cPath[eleName] - if eleKey not in cPath: - # List entry does not exist => Create - cPath[eleKey] = elem["key"] - cPath = cPath[eleKey] - else: - # Path Element does not exist => Create - cPath[eleName] = {} - cPath = cPath[eleName] - cPath[eleKey] = elem["key"] - cPath = cPath[eleKey] - else: - # Path Element hasn't key => must be dict() - if eleName in cPath: - # Path Element exists => Change Context - cPath = cPath[eleName] - else: - # Path Element does not exist => Create - cPath[eleName] = {} - cPath = cPath[eleName] - - # The last entry of path_elements is the leaf element - # that needs to be created/updated - leaf_elem = path_elements[-1] - if "key" in leaf_elem: - eleKey = json.dumps(leaf_elem["key"]) - eleName = "___" + leaf_elem["name"] - if eleName not in cPath: - cPath[eleName] = {} - cPath = cPath[eleName] - cPath[eleKey] = self._decodeVal(_upd["val"]) - else: - cPath[leaf_elem["name"]] = self._decodeVal(_upd["val"]) - - return self._dictToList(result) - - def _decodeVal(self, val): - """ - Decodes value from dict representation converted from gnmi_pb.TypedValue object - Parameters: - val (dict): decoded gnmi_pb.TypedValue object - Returns: - (ANY): extracted data - """ - if "jsonIetfVal" in val: - return json.loads(base64.b64decode(val["jsonIetfVal"])) - elif "jsonVal" in val: - return json.loads(base64.b64decode(val["jsonVal"])) - else: - raise ConnectionException( - "gNMI plugin does not support encoding for value: %s" % json.dumps(val) - ) - - def _dictToList(self, aDict): - for key in aDict.keys(): - if key.startswith("___"): - aDict[key[3:]] = [ - self._dictToList(val) if isinstance(val, dict) else val - for val in aDict[key].values() - ] - del aDict[key] - else: - if isinstance(aDict[key], dict): - aDict[key] = self._dictToList(aDict[key]) - return aDict - diff --git a/napalm_srl/__init__.py b/napalm_srlinux/__init__.py similarity index 83% rename from napalm_srl/__init__.py rename to napalm_srlinux/__init__.py index 9f67f51..2049e5a 100644 --- a/napalm_srl/__init__.py +++ b/napalm_srlinux/__init__.py @@ -12,7 +12,7 @@ # License for the specific language governing permissions and limitations under # the License. -"""napalm-srl package.""" -from napalm_srl.srl import NokiaSRLDriver # noqa +"""napalm-srlinux package.""" +from napalm_srlinux.srlinux import NokiaSRLinuxDriver # noqa -__all__ = ('NokiaSRLDriver',) +__all__ = ('NokiaSRLinuxDriver',) diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py new file mode 100644 index 0000000..641f6d2 --- /dev/null +++ b/napalm_srlinux/srlinux.py @@ -0,0 +1,951 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 Nokia. All rights reserved. +# +# The contents of this file are licensed under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# SPDX-License-Identifier: Apache-2.0 + +""" +Napalm driver for SR Linux. + +Read https://napalm.readthedocs.io for more information. +""" + +import jsonpath_ng +import logging +import re +import datetime +import enum + +from napalm.base import NetworkDriver +from napalm.base.exceptions import ( + ConnectionException, + MergeConfigException, + ReplaceConfigException, + CommandErrorException, + CommitError, +) + +import httpx +from typing import Optional, AnyStr, Union + + +class NokiaSRLinuxDriver(NetworkDriver): + """Napalm driver for SRLinux.""" + + def __init__(self, hostname, username, password, timeout=60, optional_args=None): + """Constructor.""" + self.hostname = hostname + self.username = username + self.password = password + self.timeout = timeout + self.running_format = optional_args.get("running_format", "json") if optional_args else "json" + self.device = SRLinuxDevice(hostname, username, password, timeout=60, optional_args=optional_args) + + def open(self) -> None: + self.device.open() + + def close(self) -> None: + self.device.close() + + def get_arp_table(self, vrf: Optional[AnyStr] = "") -> list: + """ + Returns a list of dictionaries having the following set of keys: + interface (string) + mac (string) + ip (string) + age (float) + ‘vrf’ of null-string will default to all VRFs. + Specific ‘vrf’ will return the ARP table entries for that VRFs + (including potentially ‘default’ or ‘global’). + + In all cases the same data structure is returned and no reference to the VRF that was + used is included in the output. + """ + raise NotImplementedError + + def get_bgp_neighbors(self) -> dict: + """ + Returns a dictionary of dictionaries. The keys for the first dictionary will be the vrf + (global if no vrf). The inner dictionary will contain the following data for each vrf: + + router_id + peers - another dictionary of dictionaries. Outer keys are the IPs of the neighbors. + The inner keys are: + local_as (int) + remote_as (int) + remote_id - peer router id + is_up (True/False) + is_enabled (True/False) + description (string) + uptime (int in seconds) + address_family (dictionary) - A dictionary of address families available for + the neighbor. + So far it can be ‘ipv4’ or ‘ipv6’ + received_prefixes (int) + accepted_prefixes (int) + sent_prefixes (int) + Note, if is_up is False and uptime has a positive value then this indicates the + uptime of the last active BGP session. + """ + + return_data = { + "global": { + "router_id": "", + "peers": {} + } + } + + jrpc_output = self.device.get_paths( + ["/network-instance[name=*]/protocols/bgp", "/system/information"], + SRLinuxDevice.RPCDatastore.STATE + ) + + # TODO: handle exception + + bgp_data = jrpc_output[0] + system_data = jrpc_output[1] + + if not system_data.get("current-datetime"): + raise Exception("Missing 'current-datetime' key in /system/information") + + system_date_time = datetime.datetime.strptime( + system_data.get("current-datetime"), "%Y-%m-%dT%H:%M:%S.%fZ" + ) + + for network_instance in bgp_data["srl_nokia-network-instance:network-instance"]: + instance_name = network_instance.get("name") + + # SRLinux global route tables is called "default" + if instance_name == "default": + instance_name = "global" + + router_id = NokiaSRLinuxDriver._get_value_from_jsonpath( + "$.protocols.srl_nokia-bgp:bgp.router-id", network_instance) + global_asn = NokiaSRLinuxDriver._get_value_from_jsonpath( + "$.protocols.srl_nokia-bgp:bgp.autonomous-system", network_instance) + + return_data.update({instance_name: {"router_id": router_id, "peers": {}}}) + + # extract BGP Neighbours + bgp_neighbors = NokiaSRLinuxDriver._get_by_jsonpath( + "$.protocols.srl_nokia-bgp:bgp.neighbor[*]", + network_instance + ) + + for neighbor in bgp_neighbors: + cur_neighbor = { + "local_as": neighbor.get("local-as", {}).get("as-number", global_asn), + "remote_as": neighbor.get("peer-as", global_asn), + "remote_id": neighbor.get("peer-remote-id", neighbor.get("peer-address")), + "is_up": True if neighbor.get("session-state", "nil") == "established" else False, + "is_enabled": True if neighbor.get("admin-state", False) == "enable" else False, + "description": neighbor.get("description", ""), + "uptime": -1, + "address_family": {}, + } + + if cur_neighbor["is_up"]: + last_established = datetime.datetime.strptime( + neighbor.get("last-established"), + "%Y-%m-%dT%H:%M:%S.%fZ") + cur_neighbor["uptime"] = (system_date_time - last_established).seconds + + for afi_safi in neighbor.get("afi-safi", []): + # IPv4 + if afi_safi.get("afi-safi-name") == "srl_nokia-common:ipv4-unicast": + cur_neighbor["address_family"]["ipv4"] = { + "received_prefixes": afi_safi.get("received-routes", -1), + "sent_prefixes": afi_safi.get("sent-routes", -1), + "accepted_prefixes": afi_safi.get("accepted-routes", 0), + } + # IPv6 + if afi_safi.get("afi-safi-name") == "srl_nokia-common:ipv6-unicast": + cur_neighbor["address_family"]["ipv6"] = { + "received_prefixes": afi_safi.get("received-routes", -1), + "sent_prefixes": afi_safi.get("sent-routes", -1), + "accepted_prefixes": afi_safi.get("accepted-routes", 0), + } + + return_data[instance_name]["peers"][neighbor.get("peer-address")] = cur_neighbor + return return_data + + def get_bgp_neighbors_detail(self, neighbor_address: Optional[AnyStr] = "") -> dict: + """ + :param neighbor_address: + :return: + Returns a dictionary of dictionaries. The keys for the first dictionary will be the vrf (global if no vrf). + The keys of the inner dictionary represent the AS number of the neighbors. + Leaf dictionaries contain the following fields: + up (True/False) + local_as (int) + remote_as (int) + router_id (string) + local_address (string) + routing_table (string) + local_address_configured (True/False) + local_port (int) + remote_address (string) + remote_port (int) + multihop (True/False) + multipath (True/False) + remove_private_as (True/False) + import_policy (string) + export_policy (string) + input_messages (int) + output_messages (int) + input_updates (int) + output_updates (int) + messages_queued_out (int) + connection_state (string) + previous_connection_state (string) + last_event (string) + suppress_4byte_as (True/False) + local_as_prepend (True/False) + holdtime (int) + configured_holdtime (int) + keepalive (int) + configured_keepalive (int) + active_prefix_count (int) + received_prefix_count (int) + accepted_prefix_count (int) + suppressed_prefix_count (int) + advertised_prefix_count (int) + flap_count (int) + + """ + raise NotImplementedError + + def get_environment(self): + """ + Returns a dictionary where: + + fans is a dictionary of dictionaries where the key is the location and the values: + status (True/False) - True if it’s ok, false if it’s broken + temperature is a dict of dictionaries where the key is the location and the values: + temperature (float) - Temperature in celsius the sensor is reporting. + is_alert (True/False) - True if the temperature is above the alert threshold + is_critical (True/False) - True if the temp is above the critical threshold + power is a dictionary of dictionaries where the key is the PSU id and the values: + status (True/False) - True if it’s ok, false if it’s broken + capacity (float) - Capacity in W that the power supply can support + output (float) - Watts drawn by the system + cpu is a dictionary of dictionaries where the key is the ID and the values + %usage + memory is a dictionary with: + available_ram (int) - Total amount of RAM installed in the device + used_ram (int) - RAM in use in the device + """ + raise NotImplementedError + + def get_facts(self): + """ + Returns a dictionary containing the following information: + uptime - Uptime of the device in seconds. + vendor - Manufacturer of the device. + model - Device model. + hostname - Hostname of the device + fqdn - Fqdn of the device + os_version - String with the OS version running on the device. + serial_number - Serial number of the device + interface_list - List of the interfaces of the device + """ + + raise NotImplementedError + + def get_interfaces(self) -> dict: + """ + Returns a dictionary of dictionaries. + The keys for the first dictionary will be the interfaces in the devices. + The inner dictionary contains the following data for each interface: + is_up (True/False) + is_enabled (True/False) + description (string) + last_flapped (float in seconds) + speed (float in Mbit) + MTU (in Bytes) + mac_address (string) + """ + + interfaces = {} + + json_data = self.device.get_paths( + ["/interface[name=*]", + "/system/information", + ], + SRLinuxDevice.RPCDatastore.STATE + ) + + # TODO: handle exception + + interfaces_json = json_data[0] + system_data = json_data[1] + + for interface in interfaces_json.get("srl_nokia-interfaces:interface"): + interfaces[interface.get("name")] = { + "is_up": True if interface.get("oper-state") == "up" else False, + "is_enabled": True if interface.get("admin-state") == "enable" else False, + "description": interface.get("description"), + "last-flapped": NokiaSRLinuxDriver._calculate_time_since( + system_data.get("current-datetime"), + interface.get("last-change") + ), + "speed": NokiaSRLinuxDriver._port_speed_to_mbits(interface.get("ethernet", {}).get("port-speed")), + "mtu": interface.get("mtu"), + "mac_address": interface.get("ethernet", {}).get("hw-mac-address") + } + + return interfaces + + def get_interfaces_counters(self): + """ + Returns a dictionary of dictionaries where the first key is an interface name + and the inner dictionary contains the following keys: + tx_errors (int) + rx_errors (int) + tx_discards (int) + rx_discards (int) + tx_octets (int) + rx_octets (int) + tx_unicast_packets (int) + rx_unicast_packets (int) + tx_multicast_packets (int) + rx_multicast_packets (int) + tx_broadcast_packets (int) + rx_broadcast_packets (int) + """ + raise NotImplementedError + + def get_interfaces_ip(self): + """ + Returns all configured IP addresses on all interfaces as a dictionary of dictionaries. + of the main dictionary represent the name of the interface. + Values of the main dictionary represent are dictionaries that may consist of two keys + ‘ipv4’ and ‘ipv6’ (one, both or none) which are themselves dictionaries with the IP addresses as keys. + Each IP Address dictionary has the following keys: + prefix_length (int) + """ + raise NotImplementedError + + def get_ipv6_neighbors_table(self): + """ + Get IPv6 neighbors table information. + + Return a list of dictionaries having the following set of keys: + + interface (string) + mac (string) + ip (string) + age (float) in seconds + state (string) + """ + raise NotImplementedError + + def get_lldp_neighbors(self) -> dict: + """ + Returns a dictionary where the keys are local ports and the value is a list of dictionaries + with the following information: + hostname + port + """ + lldp_neighbors = {} + json_output = self.device.get_paths( + ["/system/lldp"], + SRLinuxDevice.RPCDatastore.STATE + ) + + #TODO: Handle exception + + if not json_output: + # no lldp interfaces + return {} + + lldp_interfaces = json_output[0].get("interface") + + for interface in lldp_interfaces: + if not interface.get("neighbor"): + continue + + neighbors = [] + + for neighor in interface.get("neighbor"): + neighbors.append( + { + "port": neighor.get("port-id"), + "hostname": neighor.get("system-name") + } + ) + lldp_neighbors[interface.get("name")] = neighbors + + return lldp_neighbors + + def get_lldp_neighbors_detail(self, interface: Optional[AnyStr] = "") -> dict: + """ + Returns a detailed view of the LLDP neighbors as a dictionary containing lists + of dictionaries for each interface. + + Empty entries are returned as an empty string (e.g. ‘’) or list where applicable. + + Inner dictionaries contain fields: + parent_interface (string) + remote_port (string) + remote_port_description (string) + remote_chassis_id (string) + remote_system_name (string) + remote_system_description (string) + remote_system_capab (list) with any of these values + other + repeater + bridge + wlan-access-point + router + telephone + docsis-cable-device + station + remote_system_enabled_capab (list) + """ + lldp_neighbors = {} + json_output = self.device.get_paths( + ["/system/lldp"], + SRLinuxDevice.RPCDatastore.STATE + ) + + # TODO: handle exception + + if not json_output: + # no lldp interfaces + return {} + + lldp_interfaces = json_output[0].get("interface") + + # TODO: respect the `interface` param + for interface in lldp_interfaces: + if not interface.get("neighbor"): + continue + + neighbors = [] + + for neighor in interface.get("neighbor"): + neighbors.append( + { + "parent_interface": interface.get("name"), + "remote_port": neighor.get("port-id"), + "remote_port_description": neighor.get("port-description", ""), + "remote_chassis_id": neighor.get("chassis-id", ""), + "remote_system_name": neighor.get("system-name", ""), + "remote_system_description": neighor.get("system-description", ""), + "remote_system_capab": [cap.get("name").split(":")[1].lower() for cap in + neighor.get("capability", [])] + } + ) + lldp_neighbors[interface.get("name")] = neighbors + + return lldp_neighbors + + def get_network_instances(self, name=""): + """ + Return a dictionary of network instances (VRFs) configured, including default/global + Parameters: name (string) – + Returns: + name (dict) + name (unicode) + type (unicode) + state (dict) + route_distinguisher (unicode) + interfaces (dict) + interface (dict) + interface name: (dict) + """ + raise NotImplementedError + + def get_users(self) -> dict: + """ + Returns a dictionary with the configured users. + The keys of the main dictionary represents the username. + The values represent the details of the user, represented by the following keys: + level (int) + password (str) + sshkeys (list) + The level is an integer between 0 and 15, where 0 is the lowest access + and 15 represents full access to the device. + """ + + users_dict = {} + + paths_data = self.device.get_paths( + ["/system/aaa/authentication/admin-user", + "/system/aaa/authentication/user[username=*]"], + SRLinuxDevice.RPCDatastore.STATE + ) + + # TODO: handle thrown exception + + # first result is the admin user + admin_user = paths_data[0] + users_dict.update({ + "admin": { + "level": 0, # Not supported by SRLinux + "password": admin_user["password"], + "ssh-keys": [k for k in admin_user["ssh-key"]] + } + }) + + # all other users + for user in paths_data[1]["user"]: + users_dict.update({ + user["username"]: { + "level": 0, + "password": user["password"], + "ssh-keys": [k for k in user.get("ssh-key", [])] + } + }) + + return users_dict + + def get_bgp_config(self, group="", neighbor=""): + """ + Returns a dictionary containing the BGP configuration. Can return either the whole config, either the config only for a group or neighbor. + + :param neighbor: specific BGP neighbor. + :param group: specific BGP group. + :return: Returns the configuration of a specific BGP neighbor /BGP group + """ + raise NotImplementedError + + def get_snmp_information(self): + """ + :return: + Returns a dict of dicts containing SNMP configuration. Each inner dictionary contains these fields + + chassis_id (string) + community (dictionary) + contact (string) + location (string) + """ + raise NotImplementedError + + def get_config(self, retrieve: str = "all", full: bool = False, sanitized: bool = False, format: str = "text"): + """ + :param retrieve: Which configuration type you want to populate, default is all of them. The rest will be set to “”. + :param full:Retrieve all the configuration. For instance, on ios, “sh run all”. + :param sanitized:Remove secret data. Default: False. + :return:Return the configuration of a device. + """ + raise NotImplementedError + + def get_ntp_servers(self): + """ + :return:Returns the NTP servers configuration as dictionary. The keys of the dictionary represent the IP Addresses of the servers. Inner dictionaries do not have yet any available keys. + """ + raise NotImplementedError + + def get_ntp_stats(self): + """ + :return:Returns a list of NTP synchronization statistics. + """ + raise NotImplementedError + + def get_optics(self): + """ + :return:Fetches the power usage on the various transceivers installed on the switch (in dbm), and returns a view that conforms with the openconfig model openconfig-platform-transceiver.yang + """ + raise NotImplementedError + + def get_mac_address_table(self): + """ + Returns a lists of dictionaries. Each dictionary represents an entry in the MAC Address Table, + having the following keys: + mac (string) + interface (string) + vlan (int) + active (boolean) + static (boolean) + moves (int) + last_move (float) + """ + raise NotImplementedError + + def get_route_to(self, destination='', protocol='', longer=False): + """ + Returns a dictionary of dictionaries containing details of all available routes to a destination. + """ + raise NotImplementedError + + def is_alive(self) -> dict: + """ + Tests if the device is reachable. Returns a dict with a single key: 'is_alive', value is a bool. + """ + try: + alive = self.device.open() + return {'is_alive': alive} + except Exception: + return {'is_alive': False} + + def traceroute(self, destination, source="", ttl=255, timeout=2, vrf=""): + raise NotImplementedError + + def ping(self, destination: str, source: Optional[str] = "", ttl: Optional[int] = 255, + timeout: Optional[int] = 2, + size: Optional[int] = 100, + count: Optional[int] = 5, + vrf: Optional[AnyStr] = "default", + source_interface: Optional[AnyStr] = "") -> dict: + """ + Executes a ping against the provided destination + Returns a dictionary in the required NAPALM format. + TODO: update with format + """ + # prefer source_interface if given + ping_src = "" + if source_interface: + ping_src = source_interface + elif source: + ping_src = source + + ping_cmd = [f"ping {destination}", + f"-I {ping_src}" if ping_src else "", + f"-t {ttl}" if ttl else "", + f"-W {timeout}" if timeout else "", + f"-s {size}" if size else "", + f"-c {count}" if count else "", + f"network-instance {vrf}"] + try: + result = self.device.run_cli_commands( + [" ".join(ping_cmd)] + ) + except Exception as e: + return { + 'error': str(e) + } + ping_text = result[0].get("text") + re_pattern = "(\d+) packets transmitted, (\d+) received, (\d*\.?\d*)% packet loss, time (\w+)ms(\nrtt min/avg/max/mdev = (\d*\.?\d*)/(\d*\.?\d*)/(\d*\.?\d*)/(\d*\.?\d*))?" + re_match = re.search(re_pattern, ping_text) + + # If DNS doesn't resolve or a host isn't in the route-table, fail the request. + if not re_match: + return {'error': 'Unable to complete request'} + + groups = re_match.groups() + pings_pattern = '(\d+\.\d+\.\d+\.\d+)\)?: icmp_seq=\d+ ttl=\d+ time=(\d+\.\d+) ms' + pings = re.findall(pings_pattern, ping_text) + + # SRL doesn't print stats if at least one ping isn't successful. + has_stats = len(groups) == 9 + + ping_results = [{'ip_address': p[0], 'rtt': p[1]} for p in pings] + return { + 'success': { + 'probes_sent': groups[0], + 'packet_loss': int(groups[0]) - int(groups[1]), + 'rtt_min': groups[5] if has_stats else -1.0, + 'rtt_max': groups[7] if has_stats else -1.0, + 'rtt_avg': groups[6] if has_stats else -1.0, + 'rtt_stddev': groups[8] if has_stats else -1.0, + 'results': ping_results + } + } + + def cli(self, commands, encoding="text"): + """ + Will execute a list of commands and return the output in a dictionary format. + """ + raise NotImplementedError + + def compare_config(self) -> AnyStr: + """ + Compares the current running configuration with the loaded candidate configuration. + Returns a string that represents the diff between these config datastore's. + """ + raise NotImplementedError + + def load_replace_candidate(self, filename=None, config=None): + """ + Accepts either a native JSON formatted config, or a gNMI style JSON config + containing only 'replaces' + """ + raise NotImplementedError + + def load_merge_candidate(self, filename=None, config=None): + """ + Accepts either a native JSON formatted config (interpreted as 'update /') + or a gNMI style JSON config containing any number of 'deletes','replaces','updates' + """ + raise NotImplementedError + + def commit_config(self, message='', revert_in=None): + """ + This method creates a system-wide checkpoint containing the current state before this configuration change. + """ + raise NotImplementedError + + def discard_config(self): + """ + Discards the current candidate configuration changes. + """ + raise NotImplementedError + + def rollback(self): + """ + Reverts changes made by the most recent commit_config call, by loading the named checkpoint that was created + + Caveat: Checkpoints contain the entire system configuration tree, and restore the system state to the point at which + the (named) checkpoint was created (i.e. most recent commit_config call) + If changes were made to the config after that checkpoint was created, those changes will be reverted too (!) + + In a highly concurrent environment in which multiple systems are provisioning nodes, it may be better to implement fine-grained + rollback consisting of only incremental changes, rather than the entire system state. In that case, 'rollback' would be implemented + by another call to commit_config, containing the original config subtree. + """ + return NotImplementedError + + @staticmethod + def _jsonpath_expr(jsonpath: AnyStr) -> jsonpath_ng.jsonpath.Child: + """ + Builds and escapes a provided JSONPath string and returns a jsonpath.Child object. + """ + # need to single-quote keys with ':' in them + keys = jsonpath.split(".") + + quoted_keys = [] + for k in keys: + # find keys with [...] at the end + if '[' in k and ':' in k: + x = re.findall("(.*)(\[.*])", k) + # quote the key portion, leaving the slice indicator unquoted + quoted_key = f"['{x[0][0]}']{x[0][1]}" + quoted_keys.append(quoted_key) + elif ':' in k: + # quote keys with : in them + quoted_keys.append(f"['{k}']") + else: + # don't touch otherwise + quoted_keys.append(k) + + return jsonpath_ng.parse('.'.join(quoted_keys)) + + @staticmethod + def _get_by_jsonpath(jsonpath: AnyStr, data: dict) -> list: + """ + Fetch a subtree from a jsonpath string and return a list of results. + """ + expr = NokiaSRLinuxDriver._jsonpath_expr(jsonpath) + matches = expr.find(data) + return [m.value for m in matches] + + @staticmethod + def _get_value_from_jsonpath(jsonpath: AnyStr, data: dict) -> Union[None, AnyStr]: + """ + Get a single value from a jsonpath string and return it. + """ + expr = NokiaSRLinuxDriver._jsonpath_expr(jsonpath) + matches = expr.find(data) + + return matches[0].value if matches else None + + @staticmethod + def _calculate_time_since(system_time: AnyStr, reference_time: AnyStr) -> int: + """ + Calculate the difference between a timestamp and the system's time. + SRL timestamps are in the format "%Y-%m-%dT%H:%M:%S.%fZ" + """ + system_datetime = datetime.datetime.strptime(system_time, "%Y-%m-%dT%H:%M:%S.%fZ") + ref_datetime = datetime.datetime.strptime(reference_time, "%Y-%m-%dT%H:%M:%S.%fZ") + return (ref_datetime - system_datetime).seconds + + @staticmethod + def _port_speed_to_mbits(port_speed: str) -> float: + """ + Convert a string port-speed to a floating point of Megabits + """ + port_speeds = { + "10M": 10000.0, + "100M": 100000.0, + "1G": 1000000.0, + "10G": 10000000.0, + "25G": 25000000.0, + "40G": 40000000.0, + "50G": 50000000.0, + "100G": 100000000.0, + "200G": 200000000.0, + "400G": 400000000.0, + "800G": 800000000.0, + "1T": 1000000000.0, + } + return port_speeds.get(port_speed) + + +class SRLinuxDevice(object): + """ + Represents an SRLinux device and abstracts the connection Protocol + used to talk to the device. + """ + + class RPCMethod(str, enum.Enum): + """ + Enum class used to represent RPC Methods + """ + GET = "get" + SET = "set" + VALIDATE = "validate" + CLI = "cli" + + class RPCAction(str, enum.Enum): + """ + Enum class used to represent RPC Actions + """ + REPLACE = "replace" + UPDATE = "update" + DELETE = "delete" + + class RPCDatastore(str, enum.Enum): + """ + Enum class used to represent SRL Data stores for RPC calls. + """ + CANDIDATE = "candidate" + RUNNING = "running" + STATE = "state" + TOOLS = "tools" + + def __init__(self, hostname: str, username: str, password: str, timeout: Optional[int] = 60, + optional_args: Optional[dict] = None): + """Constructor.""" + self.device = None + self.hostname = hostname + self.username = username + self.password = password + self.timeout = timeout + + if optional_args is None: + optional_args = {} + + # Optional Arguments + self.jsonrpc_port = optional_args.get("jsonrpc_port", 443) + self.skip_verify = optional_args.get("skip_verify", False) + self.insecure = optional_args.get("insecure", False) + self.tls_ca = optional_args.get("tls_ca", "") + self.tls_cert_path = optional_args.get("tls_cert_path", "") + self.tls_key_path = optional_args.get("tls_key_path", "") + self.tls_key_password = optional_args.get("tls_key_password", "") + + self.jsonrpc_session = self._new_jsonrpc_client() + + # Warn about incompatible/oddball settings + if self.jsonrpc_port == 80: + if not self.insecure: + logging.warning("Secure JSON RPC uses port 443, not 80." + + "Set 'insecure=True' flag to indicate this is ok") + elif self.jsonrpc_port != 443: + logging.warning( + f"Non-default JSON RPC port configured ({self.jsonrpc_port}), typically only 443(default) or 80 are used") + + if not self.insecure: + if not self.tls_ca: + logging.warning("Incompatible settings: insecure=False " + + "requires certificate parameter 'tls_ca' to be set " + + "when using self-signed certificates") + + def open(self): + """ Check the supplied init params actually work, throw an exception if not.""" + # Set up a JSON RPC Client and test connectivity to the endpoint. + path = "/system/information/version" + ok, data = self.get_paths([path], SRLinuxDevice.RPCDatastore.STATE) + + if ok: + return True + else: + raise Exception("Error opening connection. Error: " + data.get("error").get("message")) + + def close(self): + """Cleanup the HTTP Client """ + self.jsonrpc_session.close() + + def get_paths(self, paths: list, datastore: RPCDatastore) -> list: + """ + Get the subtrees from a list of YANG paths from the specified datastore. + Returns a list of results. + """ + commands = [{"path": p, "datastore": datastore} for p in paths] + + ok, result = self._jsonrpc_request( + SRLinuxDevice.RPCMethod.GET, + {"commands": commands} + ) + + if ok: + return result.get("result") + else: + raise Exception("Error getting subtrees from YANG path. Error: " + result.get("error")) + + def run_cli_commands(self, commands: list) -> list: + """ + Runs a list of CLI commands on the device, returns the result or raises an exception if + a command isn't valid or fails. Returns a list of results. + """ + ok, response = self._jsonrpc_request( + SRLinuxDevice.RPCMethod.CLI, + {"commands": commands} + ) + + if ok: + return response.get("result") + else: + raise Exception(response.get("error", {}).get("message")) + + def _jsonrpc_request(self, method: RPCMethod, params: dict) -> (bool, dict): + """ + Make a JSON RPC request, raise an exception if the HTTP request returns anything other than 2xx + Return a boolean success value (if HTTP 2xx) and the result. + """ + headers = { + "Content-Type": "application/json", + "Accept": "application/json", + } + + request_data = { + "jsonrpc": "2.0", + "id": datetime.datetime.now().strftime('%s'), + "method": method, + "params": params, + } + + proto = "https" if (self.jsonrpc_port == 443 or (self.jsonrpc_port != 80 and not self.insecure)) else "http" + url = f"{proto}://{self.hostname}:{self.jsonrpc_port}/jsonrpc" + + result = self.jsonrpc_session.post(url, headers=headers, json=request_data, timeout=self.timeout) + + if result.status_code == httpx.codes.OK and result.json().get("error"): + return False, result.json() + elif result.status_code == httpx.codes.OK: + return True, result.json() + elif result.status_code == httpx.codes.BAD_REQUEST: + raise Exception("Request raised HTTP/400 BAD REQUEST") + else: + raise Exception(f"Request raised unknown status code {result.status_code}") + + def _new_jsonrpc_client(self): + """ + Create a JSON RPC Client, preconfigured with TLS if required. + """ + cert = None + if not self.insecure: + cert = (self.tls_cert_path, self.tls_key_path, self.tls_key_password) \ + if self.tls_key_password else (self.tls_cert_path, self.tls_key_path) + + opts = { + "verify": (not self.insecure), + "auth": (self.username, self.password) + } + + if cert: + opts["cert"] = cert + + return httpx.Client(**opts) diff --git a/off_box_diff.png b/off_box_diff.png deleted file mode 100755 index ff438493573f87f53c4a1c27b5ce453249e519b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156946 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

=St5h#|BNeNs5B?*n0iCpV8F& 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 dqP#N!MYq0Hy!B=56.0.0", "wheel"] build-backend = "setuptools.build_meta" [project] -name = "napalm-srl" +name = "napalm-srlinux" version="1.0.5" description="Network Automation and Programmability Abstraction Layer driver for Nokia SR Linux" readme = "README.md" diff --git a/requirements.txt b/requirements.txt index 75c446b..99591ed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,12 +2,6 @@ napalm>=2.0.0 pip>=20.1.1 pytest>=5.4.3 setuptools>=47.3.1 -paramiko>=2.7.1 -grpcio -protobuf==3.20.3 -cryptography - -# The new 2.0.2 version contains security enhancements -# however botocore 1.31.14 depends on urllib3<1.27 -# urllib3>=2.0.2 -urllib3 +httpx>=0.27.0 +jsonpath-ng>=1.6.0 +pydantic>=2.8.2 diff --git a/setup.cfg b/setup.cfg index e1016ed..cfd8fc5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -30,8 +30,8 @@ jsonapi = true [coverage:run] include = - napalm_srl/* + napalm_srlinux/* [coverage:report] omit = - napalm_srl/test/* + napalm_srlinux/test/* diff --git a/setup.py b/setup.py index b165f18..f19c12f 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ __author__ = 'Jose Valente ' setup( - name="napalm-srl", + name="napalm-srlinux", version="1.0.5", packages=find_packages(), author="Jose Valente", diff --git a/test/unit/TestNokiaSRLDriver.py b/test/unit/TestNokiaSRLDriver.py index 183b062..e2f0bd4 100644 --- a/test/unit/TestNokiaSRLDriver.py +++ b/test/unit/TestNokiaSRLDriver.py @@ -15,7 +15,7 @@ import unittest import pytest -from napalm_srl import srl +from napalm_srlinux import srlinux from napalm.base.test.base import TestConfigNetworkDriver from napalm.base.exceptions import ( MergeConfigException, @@ -38,7 +38,7 @@ def setUpClass(cls): # "insecure": False "encoding": "JSON_IETF" } - cls.device = srl.NokiaSRLDriver( + cls.device = srl.NokiaSRLinuxDriver( hostname, username, password, timeout=60, optional_args=optional_args ) cls.device.open() diff --git a/test/unit/conftest.py b/test/unit/conftest.py index dc9fd6b..51d865a 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -11,7 +11,7 @@ from napalm.base.test.double import BaseTestDouble -from napalm_srl import srl +from napalm_srlinux import srlinux import json @pytest.fixture(scope="session", autouse=True) @@ -26,7 +26,7 @@ def fin(): request.cls.device.close() request.addfinalizer(fin) - request.cls.driver = srl.NokiaSRLDriver + request.cls.driver = srl.NokiaSRLinuxDriver request.cls.patched_driver = PatchedsrlDriver request.cls.vendor = 'srl' parent_conftest.set_device_parameters(request) @@ -37,7 +37,7 @@ def pytest_generate_tests(metafunc): parent_conftest.pytest_generate_tests(metafunc, __file__) -class PatchedsrlDriver(srl.NokiaSRLDriver): +class PatchedsrlDriver(srl.NokiaSRLinuxDriver): """Patched Skeleton Driver.""" def __init__(self, hostname, username, password, timeout=60, optional_args=None): diff --git a/tox.ini b/tox.ini index 746e406..bd1419d 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27,py34,py35,py36 +envlist = py27,py34,py35,py36,py39,py310 [testenv] deps = From b83638ec072874998e5f96ff4fb8b4a9f6126d09 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 00:44:27 +0300 Subject: [PATCH 02/13] ignore pyenv files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 345b0b0..890cd3b 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,6 @@ target/ .ipynb_checkpoints venv .idea + +# pyenv +.python-version \ No newline at end of file From d38036386f627cd12879fb682a26f944bd9b0be9 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 00:46:24 +0300 Subject: [PATCH 03/13] format with Ruff --- napalm_srlinux/__init__.py | 3 +- napalm_srlinux/srlinux.py | 421 +++++++++++++++++++++---------------- 2 files changed, 244 insertions(+), 180 deletions(-) diff --git a/napalm_srlinux/__init__.py b/napalm_srlinux/__init__.py index 2049e5a..6cfeb58 100644 --- a/napalm_srlinux/__init__.py +++ b/napalm_srlinux/__init__.py @@ -13,6 +13,7 @@ # the License. """napalm-srlinux package.""" + from napalm_srlinux.srlinux import NokiaSRLinuxDriver # noqa -__all__ = ('NokiaSRLinuxDriver',) +__all__ = ("NokiaSRLinuxDriver",) diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py index 641f6d2..95637eb 100644 --- a/napalm_srlinux/srlinux.py +++ b/napalm_srlinux/srlinux.py @@ -15,29 +15,28 @@ # SPDX-License-Identifier: Apache-2.0 """ -Napalm driver for SR Linux. +Napalm driver for Nokia SR Linux. Read https://napalm.readthedocs.io for more information. """ -import jsonpath_ng -import logging -import re import datetime import enum +import logging +import re +from typing import AnyStr, Optional, Union +import httpx +import jsonpath_ng from napalm.base import NetworkDriver from napalm.base.exceptions import ( + CommandErrorException, + CommitError, ConnectionException, MergeConfigException, ReplaceConfigException, - CommandErrorException, - CommitError, ) -import httpx -from typing import Optional, AnyStr, Union - class NokiaSRLinuxDriver(NetworkDriver): """Napalm driver for SRLinux.""" @@ -48,8 +47,12 @@ def __init__(self, hostname, username, password, timeout=60, optional_args=None) self.username = username self.password = password self.timeout = timeout - self.running_format = optional_args.get("running_format", "json") if optional_args else "json" - self.device = SRLinuxDevice(hostname, username, password, timeout=60, optional_args=optional_args) + self.running_format = ( + optional_args.get("running_format", "json") if optional_args else "json" + ) + self.device = SRLinuxDevice( + hostname, username, password, timeout=60, optional_args=optional_args + ) def open(self) -> None: self.device.open() @@ -59,17 +62,17 @@ def close(self) -> None: def get_arp_table(self, vrf: Optional[AnyStr] = "") -> list: """ - Returns a list of dictionaries having the following set of keys: - interface (string) - mac (string) - ip (string) - age (float) - ‘vrf’ of null-string will default to all VRFs. - Specific ‘vrf’ will return the ARP table entries for that VRFs - (including potentially ‘default’ or ‘global’). + Returns a list of dictionaries having the following set of keys: + interface (string) + mac (string) + ip (string) + age (float) + ‘vrf’ of null-string will default to all VRFs. + Specific ‘vrf’ will return the ARP table entries for that VRFs + (including potentially ‘default’ or ‘global’). - In all cases the same data structure is returned and no reference to the VRF that was - used is included in the output. + In all cases the same data structure is returned and no reference to the VRF that was + used is included in the output. """ raise NotImplementedError @@ -98,16 +101,11 @@ def get_bgp_neighbors(self) -> dict: uptime of the last active BGP session. """ - return_data = { - "global": { - "router_id": "", - "peers": {} - } - } + return_data = {"global": {"router_id": "", "peers": {}}} jrpc_output = self.device.get_paths( ["/network-instance[name=*]/protocols/bgp", "/system/information"], - SRLinuxDevice.RPCDatastore.STATE + SRLinuxDevice.RPCDatastore.STATE, ) # TODO: handle exception @@ -130,25 +128,34 @@ def get_bgp_neighbors(self) -> dict: instance_name = "global" router_id = NokiaSRLinuxDriver._get_value_from_jsonpath( - "$.protocols.srl_nokia-bgp:bgp.router-id", network_instance) + "$.protocols.srl_nokia-bgp:bgp.router-id", network_instance + ) global_asn = NokiaSRLinuxDriver._get_value_from_jsonpath( - "$.protocols.srl_nokia-bgp:bgp.autonomous-system", network_instance) + "$.protocols.srl_nokia-bgp:bgp.autonomous-system", network_instance + ) return_data.update({instance_name: {"router_id": router_id, "peers": {}}}) # extract BGP Neighbours bgp_neighbors = NokiaSRLinuxDriver._get_by_jsonpath( - "$.protocols.srl_nokia-bgp:bgp.neighbor[*]", - network_instance + "$.protocols.srl_nokia-bgp:bgp.neighbor[*]", network_instance ) for neighbor in bgp_neighbors: cur_neighbor = { - "local_as": neighbor.get("local-as", {}).get("as-number", global_asn), + "local_as": neighbor.get("local-as", {}).get( + "as-number", global_asn + ), "remote_as": neighbor.get("peer-as", global_asn), - "remote_id": neighbor.get("peer-remote-id", neighbor.get("peer-address")), - "is_up": True if neighbor.get("session-state", "nil") == "established" else False, - "is_enabled": True if neighbor.get("admin-state", False) == "enable" else False, + "remote_id": neighbor.get( + "peer-remote-id", neighbor.get("peer-address") + ), + "is_up": True + if neighbor.get("session-state", "nil") == "established" + else False, + "is_enabled": True + if neighbor.get("admin-state", False) == "enable" + else False, "description": neighbor.get("description", ""), "uptime": -1, "address_family": {}, @@ -156,9 +163,11 @@ def get_bgp_neighbors(self) -> dict: if cur_neighbor["is_up"]: last_established = datetime.datetime.strptime( - neighbor.get("last-established"), - "%Y-%m-%dT%H:%M:%S.%fZ") - cur_neighbor["uptime"] = (system_date_time - last_established).seconds + neighbor.get("last-established"), "%Y-%m-%dT%H:%M:%S.%fZ" + ) + cur_neighbor["uptime"] = ( + system_date_time - last_established + ).seconds for afi_safi in neighbor.get("afi-safi", []): # IPv4 @@ -176,7 +185,9 @@ def get_bgp_neighbors(self) -> dict: "accepted_prefixes": afi_safi.get("accepted-routes", 0), } - return_data[instance_name]["peers"][neighbor.get("peer-address")] = cur_neighbor + return_data[instance_name]["peers"][neighbor.get("peer-address")] = ( + cur_neighbor + ) return return_data def get_bgp_neighbors_detail(self, neighbor_address: Optional[AnyStr] = "") -> dict: @@ -264,25 +275,26 @@ def get_facts(self): def get_interfaces(self) -> dict: """ - Returns a dictionary of dictionaries. - The keys for the first dictionary will be the interfaces in the devices. - The inner dictionary contains the following data for each interface: - is_up (True/False) - is_enabled (True/False) - description (string) - last_flapped (float in seconds) - speed (float in Mbit) - MTU (in Bytes) - mac_address (string) + Returns a dictionary of dictionaries. + The keys for the first dictionary will be the interfaces in the devices. + The inner dictionary contains the following data for each interface: + is_up (True/False) + is_enabled (True/False) + description (string) + last_flapped (float in seconds) + speed (float in Mbit) + MTU (in Bytes) + mac_address (string) """ interfaces = {} json_data = self.device.get_paths( - ["/interface[name=*]", - "/system/information", - ], - SRLinuxDevice.RPCDatastore.STATE + [ + "/interface[name=*]", + "/system/information", + ], + SRLinuxDevice.RPCDatastore.STATE, ) # TODO: handle exception @@ -293,35 +305,38 @@ def get_interfaces(self) -> dict: for interface in interfaces_json.get("srl_nokia-interfaces:interface"): interfaces[interface.get("name")] = { "is_up": True if interface.get("oper-state") == "up" else False, - "is_enabled": True if interface.get("admin-state") == "enable" else False, + "is_enabled": True + if interface.get("admin-state") == "enable" + else False, "description": interface.get("description"), "last-flapped": NokiaSRLinuxDriver._calculate_time_since( - system_data.get("current-datetime"), - interface.get("last-change") + system_data.get("current-datetime"), interface.get("last-change") + ), + "speed": NokiaSRLinuxDriver._port_speed_to_mbits( + interface.get("ethernet", {}).get("port-speed") ), - "speed": NokiaSRLinuxDriver._port_speed_to_mbits(interface.get("ethernet", {}).get("port-speed")), "mtu": interface.get("mtu"), - "mac_address": interface.get("ethernet", {}).get("hw-mac-address") + "mac_address": interface.get("ethernet", {}).get("hw-mac-address"), } return interfaces def get_interfaces_counters(self): """ - Returns a dictionary of dictionaries where the first key is an interface name - and the inner dictionary contains the following keys: - tx_errors (int) - rx_errors (int) - tx_discards (int) - rx_discards (int) - tx_octets (int) - rx_octets (int) - tx_unicast_packets (int) - rx_unicast_packets (int) - tx_multicast_packets (int) - rx_multicast_packets (int) - tx_broadcast_packets (int) - rx_broadcast_packets (int) + Returns a dictionary of dictionaries where the first key is an interface name + and the inner dictionary contains the following keys: + tx_errors (int) + rx_errors (int) + tx_discards (int) + rx_discards (int) + tx_octets (int) + rx_octets (int) + tx_unicast_packets (int) + rx_unicast_packets (int) + tx_multicast_packets (int) + rx_multicast_packets (int) + tx_broadcast_packets (int) + rx_broadcast_packets (int) """ raise NotImplementedError @@ -359,11 +374,10 @@ def get_lldp_neighbors(self) -> dict: """ lldp_neighbors = {} json_output = self.device.get_paths( - ["/system/lldp"], - SRLinuxDevice.RPCDatastore.STATE + ["/system/lldp"], SRLinuxDevice.RPCDatastore.STATE ) - #TODO: Handle exception + # TODO: Handle exception if not json_output: # no lldp interfaces @@ -381,7 +395,7 @@ def get_lldp_neighbors(self) -> dict: neighbors.append( { "port": neighor.get("port-id"), - "hostname": neighor.get("system-name") + "hostname": neighor.get("system-name"), } ) lldp_neighbors[interface.get("name")] = neighbors @@ -412,11 +426,10 @@ def get_lldp_neighbors_detail(self, interface: Optional[AnyStr] = "") -> dict: docsis-cable-device station remote_system_enabled_capab (list) - """ + """ lldp_neighbors = {} json_output = self.device.get_paths( - ["/system/lldp"], - SRLinuxDevice.RPCDatastore.STATE + ["/system/lldp"], SRLinuxDevice.RPCDatastore.STATE ) # TODO: handle exception @@ -442,9 +455,13 @@ def get_lldp_neighbors_detail(self, interface: Optional[AnyStr] = "") -> dict: "remote_port_description": neighor.get("port-description", ""), "remote_chassis_id": neighor.get("chassis-id", ""), "remote_system_name": neighor.get("system-name", ""), - "remote_system_description": neighor.get("system-description", ""), - "remote_system_capab": [cap.get("name").split(":")[1].lower() for cap in - neighor.get("capability", [])] + "remote_system_description": neighor.get( + "system-description", "" + ), + "remote_system_capab": [ + cap.get("name").split(":")[1].lower() + for cap in neighor.get("capability", []) + ], } ) lldp_neighbors[interface.get("name")] = neighbors @@ -453,17 +470,17 @@ def get_lldp_neighbors_detail(self, interface: Optional[AnyStr] = "") -> dict: def get_network_instances(self, name=""): """ - Return a dictionary of network instances (VRFs) configured, including default/global - Parameters: name (string) – - Returns: - name (dict) - name (unicode) - type (unicode) - state (dict) - route_distinguisher (unicode) - interfaces (dict) - interface (dict) - interface name: (dict) + Return a dictionary of network instances (VRFs) configured, including default/global + Parameters: name (string) – + Returns: + name (dict) + name (unicode) + type (unicode) + state (dict) + route_distinguisher (unicode) + interfaces (dict) + interface (dict) + interface name: (dict) """ raise NotImplementedError @@ -482,32 +499,38 @@ def get_users(self) -> dict: users_dict = {} paths_data = self.device.get_paths( - ["/system/aaa/authentication/admin-user", - "/system/aaa/authentication/user[username=*]"], - SRLinuxDevice.RPCDatastore.STATE + [ + "/system/aaa/authentication/admin-user", + "/system/aaa/authentication/user[username=*]", + ], + SRLinuxDevice.RPCDatastore.STATE, ) # TODO: handle thrown exception # first result is the admin user admin_user = paths_data[0] - users_dict.update({ - "admin": { - "level": 0, # Not supported by SRLinux - "password": admin_user["password"], - "ssh-keys": [k for k in admin_user["ssh-key"]] + users_dict.update( + { + "admin": { + "level": 0, # Not supported by SRLinux + "password": admin_user["password"], + "ssh-keys": [k for k in admin_user["ssh-key"]], + } } - }) + ) # all other users for user in paths_data[1]["user"]: - users_dict.update({ - user["username"]: { - "level": 0, - "password": user["password"], - "ssh-keys": [k for k in user.get("ssh-key", [])] + users_dict.update( + { + user["username"]: { + "level": 0, + "password": user["password"], + "ssh-keys": [k for k in user.get("ssh-key", [])], + } } - }) + ) return users_dict @@ -533,7 +556,13 @@ def get_snmp_information(self): """ raise NotImplementedError - def get_config(self, retrieve: str = "all", full: bool = False, sanitized: bool = False, format: str = "text"): + def get_config( + self, + retrieve: str = "all", + full: bool = False, + sanitized: bool = False, + format: str = "text", + ): """ :param retrieve: Which configuration type you want to populate, default is all of them. The rest will be set to “”. :param full:Retrieve all the configuration. For instance, on ios, “sh run all”. @@ -574,7 +603,7 @@ def get_mac_address_table(self): """ raise NotImplementedError - def get_route_to(self, destination='', protocol='', longer=False): + def get_route_to(self, destination="", protocol="", longer=False): """ Returns a dictionary of dictionaries containing details of all available routes to a destination. """ @@ -586,19 +615,24 @@ def is_alive(self) -> dict: """ try: alive = self.device.open() - return {'is_alive': alive} + return {"is_alive": alive} except Exception: - return {'is_alive': False} + return {"is_alive": False} def traceroute(self, destination, source="", ttl=255, timeout=2, vrf=""): raise NotImplementedError - def ping(self, destination: str, source: Optional[str] = "", ttl: Optional[int] = 255, - timeout: Optional[int] = 2, - size: Optional[int] = 100, - count: Optional[int] = 5, - vrf: Optional[AnyStr] = "default", - source_interface: Optional[AnyStr] = "") -> dict: + def ping( + self, + destination: str, + source: Optional[str] = "", + ttl: Optional[int] = 255, + timeout: Optional[int] = 2, + size: Optional[int] = 100, + count: Optional[int] = 5, + vrf: Optional[AnyStr] = "default", + source_interface: Optional[AnyStr] = "", + ) -> dict: """ Executes a ping against the provided destination Returns a dictionary in the required NAPALM format. @@ -611,46 +645,46 @@ def ping(self, destination: str, source: Optional[str] = "", ttl: Optional[int] elif source: ping_src = source - ping_cmd = [f"ping {destination}", - f"-I {ping_src}" if ping_src else "", - f"-t {ttl}" if ttl else "", - f"-W {timeout}" if timeout else "", - f"-s {size}" if size else "", - f"-c {count}" if count else "", - f"network-instance {vrf}"] + ping_cmd = [ + f"ping {destination}", + f"-I {ping_src}" if ping_src else "", + f"-t {ttl}" if ttl else "", + f"-W {timeout}" if timeout else "", + f"-s {size}" if size else "", + f"-c {count}" if count else "", + f"network-instance {vrf}", + ] try: - result = self.device.run_cli_commands( - [" ".join(ping_cmd)] - ) + result = self.device.run_cli_commands([" ".join(ping_cmd)]) except Exception as e: - return { - 'error': str(e) - } + return {"error": str(e)} ping_text = result[0].get("text") re_pattern = "(\d+) packets transmitted, (\d+) received, (\d*\.?\d*)% packet loss, time (\w+)ms(\nrtt min/avg/max/mdev = (\d*\.?\d*)/(\d*\.?\d*)/(\d*\.?\d*)/(\d*\.?\d*))?" re_match = re.search(re_pattern, ping_text) # If DNS doesn't resolve or a host isn't in the route-table, fail the request. if not re_match: - return {'error': 'Unable to complete request'} + return {"error": "Unable to complete request"} groups = re_match.groups() - pings_pattern = '(\d+\.\d+\.\d+\.\d+)\)?: icmp_seq=\d+ ttl=\d+ time=(\d+\.\d+) ms' + pings_pattern = ( + "(\d+\.\d+\.\d+\.\d+)\)?: icmp_seq=\d+ ttl=\d+ time=(\d+\.\d+) ms" + ) pings = re.findall(pings_pattern, ping_text) # SRL doesn't print stats if at least one ping isn't successful. has_stats = len(groups) == 9 - ping_results = [{'ip_address': p[0], 'rtt': p[1]} for p in pings] + ping_results = [{"ip_address": p[0], "rtt": p[1]} for p in pings] return { - 'success': { - 'probes_sent': groups[0], - 'packet_loss': int(groups[0]) - int(groups[1]), - 'rtt_min': groups[5] if has_stats else -1.0, - 'rtt_max': groups[7] if has_stats else -1.0, - 'rtt_avg': groups[6] if has_stats else -1.0, - 'rtt_stddev': groups[8] if has_stats else -1.0, - 'results': ping_results + "success": { + "probes_sent": groups[0], + "packet_loss": int(groups[0]) - int(groups[1]), + "rtt_min": groups[5] if has_stats else -1.0, + "rtt_max": groups[7] if has_stats else -1.0, + "rtt_avg": groups[6] if has_stats else -1.0, + "rtt_stddev": groups[8] if has_stats else -1.0, + "results": ping_results, } } @@ -676,15 +710,15 @@ def load_replace_candidate(self, filename=None, config=None): def load_merge_candidate(self, filename=None, config=None): """ - Accepts either a native JSON formatted config (interpreted as 'update /') - or a gNMI style JSON config containing any number of 'deletes','replaces','updates' - """ + Accepts either a native JSON formatted config (interpreted as 'update /') + or a gNMI style JSON config containing any number of 'deletes','replaces','updates' + """ raise NotImplementedError - def commit_config(self, message='', revert_in=None): + def commit_config(self, message="", revert_in=None): + """ + This method creates a system-wide checkpoint containing the current state before this configuration change. """ - This method creates a system-wide checkpoint containing the current state before this configuration change. - """ raise NotImplementedError def discard_config(self): @@ -718,19 +752,19 @@ def _jsonpath_expr(jsonpath: AnyStr) -> jsonpath_ng.jsonpath.Child: quoted_keys = [] for k in keys: # find keys with [...] at the end - if '[' in k and ':' in k: + if "[" in k and ":" in k: x = re.findall("(.*)(\[.*])", k) # quote the key portion, leaving the slice indicator unquoted quoted_key = f"['{x[0][0]}']{x[0][1]}" quoted_keys.append(quoted_key) - elif ':' in k: + elif ":" in k: # quote keys with : in them quoted_keys.append(f"['{k}']") else: # don't touch otherwise quoted_keys.append(k) - return jsonpath_ng.parse('.'.join(quoted_keys)) + return jsonpath_ng.parse(".".join(quoted_keys)) @staticmethod def _get_by_jsonpath(jsonpath: AnyStr, data: dict) -> list: @@ -757,8 +791,12 @@ def _calculate_time_since(system_time: AnyStr, reference_time: AnyStr) -> int: Calculate the difference between a timestamp and the system's time. SRL timestamps are in the format "%Y-%m-%dT%H:%M:%S.%fZ" """ - system_datetime = datetime.datetime.strptime(system_time, "%Y-%m-%dT%H:%M:%S.%fZ") - ref_datetime = datetime.datetime.strptime(reference_time, "%Y-%m-%dT%H:%M:%S.%fZ") + system_datetime = datetime.datetime.strptime( + system_time, "%Y-%m-%dT%H:%M:%S.%fZ" + ) + ref_datetime = datetime.datetime.strptime( + reference_time, "%Y-%m-%dT%H:%M:%S.%fZ" + ) return (ref_datetime - system_datetime).seconds @staticmethod @@ -793,6 +831,7 @@ class RPCMethod(str, enum.Enum): """ Enum class used to represent RPC Methods """ + GET = "get" SET = "set" VALIDATE = "validate" @@ -802,6 +841,7 @@ class RPCAction(str, enum.Enum): """ Enum class used to represent RPC Actions """ + REPLACE = "replace" UPDATE = "update" DELETE = "delete" @@ -810,13 +850,20 @@ class RPCDatastore(str, enum.Enum): """ Enum class used to represent SRL Data stores for RPC calls. """ + CANDIDATE = "candidate" RUNNING = "running" STATE = "state" TOOLS = "tools" - def __init__(self, hostname: str, username: str, password: str, timeout: Optional[int] = 60, - optional_args: Optional[dict] = None): + def __init__( + self, + hostname: str, + username: str, + password: str, + timeout: Optional[int] = 60, + optional_args: Optional[dict] = None, + ): """Constructor.""" self.device = None self.hostname = hostname @@ -841,20 +888,25 @@ def __init__(self, hostname: str, username: str, password: str, timeout: Optiona # Warn about incompatible/oddball settings if self.jsonrpc_port == 80: if not self.insecure: - logging.warning("Secure JSON RPC uses port 443, not 80." + - "Set 'insecure=True' flag to indicate this is ok") + logging.warning( + "Secure JSON RPC uses port 443, not 80." + + "Set 'insecure=True' flag to indicate this is ok" + ) elif self.jsonrpc_port != 443: logging.warning( - f"Non-default JSON RPC port configured ({self.jsonrpc_port}), typically only 443(default) or 80 are used") + f"Non-default JSON RPC port configured ({self.jsonrpc_port}), typically only 443(default) or 80 are used" + ) if not self.insecure: if not self.tls_ca: - logging.warning("Incompatible settings: insecure=False " + - "requires certificate parameter 'tls_ca' to be set " + - "when using self-signed certificates") + logging.warning( + "Incompatible settings: insecure=False " + + "requires certificate parameter 'tls_ca' to be set " + + "when using self-signed certificates" + ) def open(self): - """ Check the supplied init params actually work, throw an exception if not.""" + """Check the supplied init params actually work, throw an exception if not.""" # Set up a JSON RPC Client and test connectivity to the endpoint. path = "/system/information/version" ok, data = self.get_paths([path], SRLinuxDevice.RPCDatastore.STATE) @@ -862,10 +914,12 @@ def open(self): if ok: return True else: - raise Exception("Error opening connection. Error: " + data.get("error").get("message")) + raise Exception( + "Error opening connection. Error: " + data.get("error").get("message") + ) def close(self): - """Cleanup the HTTP Client """ + """Cleanup the HTTP Client""" self.jsonrpc_session.close() def get_paths(self, paths: list, datastore: RPCDatastore) -> list: @@ -876,14 +930,15 @@ def get_paths(self, paths: list, datastore: RPCDatastore) -> list: commands = [{"path": p, "datastore": datastore} for p in paths] ok, result = self._jsonrpc_request( - SRLinuxDevice.RPCMethod.GET, - {"commands": commands} + SRLinuxDevice.RPCMethod.GET, {"commands": commands} ) if ok: return result.get("result") else: - raise Exception("Error getting subtrees from YANG path. Error: " + result.get("error")) + raise Exception( + "Error getting subtrees from YANG path. Error: " + result.get("error") + ) def run_cli_commands(self, commands: list) -> list: """ @@ -891,8 +946,7 @@ def run_cli_commands(self, commands: list) -> list: a command isn't valid or fails. Returns a list of results. """ ok, response = self._jsonrpc_request( - SRLinuxDevice.RPCMethod.CLI, - {"commands": commands} + SRLinuxDevice.RPCMethod.CLI, {"commands": commands} ) if ok: @@ -912,15 +966,24 @@ def _jsonrpc_request(self, method: RPCMethod, params: dict) -> (bool, dict): request_data = { "jsonrpc": "2.0", - "id": datetime.datetime.now().strftime('%s'), + "id": datetime.datetime.now().strftime("%s"), "method": method, "params": params, } - proto = "https" if (self.jsonrpc_port == 443 or (self.jsonrpc_port != 80 and not self.insecure)) else "http" + proto = ( + "https" + if ( + self.jsonrpc_port == 443 + or (self.jsonrpc_port != 80 and not self.insecure) + ) + else "http" + ) url = f"{proto}://{self.hostname}:{self.jsonrpc_port}/jsonrpc" - result = self.jsonrpc_session.post(url, headers=headers, json=request_data, timeout=self.timeout) + result = self.jsonrpc_session.post( + url, headers=headers, json=request_data, timeout=self.timeout + ) if result.status_code == httpx.codes.OK and result.json().get("error"): return False, result.json() @@ -937,13 +1000,13 @@ def _new_jsonrpc_client(self): """ cert = None if not self.insecure: - cert = (self.tls_cert_path, self.tls_key_path, self.tls_key_password) \ - if self.tls_key_password else (self.tls_cert_path, self.tls_key_path) + cert = ( + (self.tls_cert_path, self.tls_key_path, self.tls_key_password) + if self.tls_key_password + else (self.tls_cert_path, self.tls_key_path) + ) - opts = { - "verify": (not self.insecure), - "auth": (self.username, self.password) - } + opts = {"verify": (not self.insecure), "auth": (self.username, self.password)} if cert: opts["cert"] = cert From 97edb773115903de8cee71b5e9a486c70216a1eb Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 00:51:55 +0300 Subject: [PATCH 04/13] use standard single quote char --- napalm_srlinux/srlinux.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py index 95637eb..9d649ff 100644 --- a/napalm_srlinux/srlinux.py +++ b/napalm_srlinux/srlinux.py @@ -39,7 +39,7 @@ class NokiaSRLinuxDriver(NetworkDriver): - """Napalm driver for SRLinux.""" + """Napalm driver for Nokia SR Linux.""" def __init__(self, hostname, username, password, timeout=60, optional_args=None): """Constructor.""" @@ -67,9 +67,9 @@ def get_arp_table(self, vrf: Optional[AnyStr] = "") -> list: mac (string) ip (string) age (float) - ‘vrf’ of null-string will default to all VRFs. - Specific ‘vrf’ will return the ARP table entries for that VRFs - (including potentially ‘default’ or ‘global’). + 'vrf' of null-string will default to all VRFs. + Specific 'vrf' will return the ARP table entries for that VRFs + (including potentially 'default' or 'global'). In all cases the same data structure is returned and no reference to the VRF that was used is included in the output. @@ -93,7 +93,7 @@ def get_bgp_neighbors(self) -> dict: uptime (int in seconds) address_family (dictionary) - A dictionary of address families available for the neighbor. - So far it can be ‘ipv4’ or ‘ipv6’ + So far it can be 'ipv4' or 'ipv6' received_prefixes (int) accepted_prefixes (int) sent_prefixes (int) @@ -241,13 +241,13 @@ def get_environment(self): Returns a dictionary where: fans is a dictionary of dictionaries where the key is the location and the values: - status (True/False) - True if it’s ok, false if it’s broken + status (True/False) - True if it's ok, false if it's broken temperature is a dict of dictionaries where the key is the location and the values: temperature (float) - Temperature in celsius the sensor is reporting. is_alert (True/False) - True if the temperature is above the alert threshold is_critical (True/False) - True if the temp is above the critical threshold power is a dictionary of dictionaries where the key is the PSU id and the values: - status (True/False) - True if it’s ok, false if it’s broken + status (True/False) - True if it's ok, false if it's broken capacity (float) - Capacity in W that the power supply can support output (float) - Watts drawn by the system cpu is a dictionary of dictionaries where the key is the ID and the values @@ -345,7 +345,7 @@ def get_interfaces_ip(self): Returns all configured IP addresses on all interfaces as a dictionary of dictionaries. of the main dictionary represent the name of the interface. Values of the main dictionary represent are dictionaries that may consist of two keys - ‘ipv4’ and ‘ipv6’ (one, both or none) which are themselves dictionaries with the IP addresses as keys. + 'ipv4' and 'ipv6' (one, both or none) which are themselves dictionaries with the IP addresses as keys. Each IP Address dictionary has the following keys: prefix_length (int) """ @@ -407,7 +407,7 @@ def get_lldp_neighbors_detail(self, interface: Optional[AnyStr] = "") -> dict: Returns a detailed view of the LLDP neighbors as a dictionary containing lists of dictionaries for each interface. - Empty entries are returned as an empty string (e.g. ‘’) or list where applicable. + Empty entries are returned as an empty string (e.g. '') or list where applicable. Inner dictionaries contain fields: parent_interface (string) @@ -440,7 +440,7 @@ def get_lldp_neighbors_detail(self, interface: Optional[AnyStr] = "") -> dict: lldp_interfaces = json_output[0].get("interface") - # TODO: respect the `interface` param + # TODO: respect the 'interface' param for interface in lldp_interfaces: if not interface.get("neighbor"): continue @@ -823,7 +823,7 @@ def _port_speed_to_mbits(port_speed: str) -> float: class SRLinuxDevice(object): """ - Represents an SRLinux device and abstracts the connection Protocol + Represents a Nokia SR Linux device and abstracts the connection Protocol used to talk to the device. """ From 53d5b9a27657da1b58b200211cc9abbe252bc387 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 01:33:00 +0300 Subject: [PATCH 05/13] added private dir to ignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 890cd3b..6de30a3 100644 --- a/.gitignore +++ b/.gitignore @@ -65,4 +65,7 @@ venv .idea # pyenv -.python-version \ No newline at end of file +.python-version + +# personal dir +private/ \ No newline at end of file From 452e31ae827026de2cbe519faec9a87c11af7037 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 01:52:51 +0300 Subject: [PATCH 06/13] type hint the device --- napalm_srlinux/srlinux.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py index 9d649ff..093af2d 100644 --- a/napalm_srlinux/srlinux.py +++ b/napalm_srlinux/srlinux.py @@ -50,7 +50,7 @@ def __init__(self, hostname, username, password, timeout=60, optional_args=None) self.running_format = ( optional_args.get("running_format", "json") if optional_args else "json" ) - self.device = SRLinuxDevice( + self.device: SRLinuxDevice = SRLinuxDevice( hostname, username, password, timeout=60, optional_args=optional_args ) @@ -848,7 +848,7 @@ class RPCAction(str, enum.Enum): class RPCDatastore(str, enum.Enum): """ - Enum class used to represent SRL Data stores for RPC calls. + Enum class used to represent SR Linux Data stores for RPC calls. """ CANDIDATE = "candidate" From a226d15fb9e7ed8764c601c2c732fe52b86ba1a4 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 01:54:40 +0300 Subject: [PATCH 07/13] rename rpcdatastore to datastore --- napalm_srlinux/srlinux.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py index 093af2d..d76a523 100644 --- a/napalm_srlinux/srlinux.py +++ b/napalm_srlinux/srlinux.py @@ -105,7 +105,7 @@ def get_bgp_neighbors(self) -> dict: jrpc_output = self.device.get_paths( ["/network-instance[name=*]/protocols/bgp", "/system/information"], - SRLinuxDevice.RPCDatastore.STATE, + SRLinuxDevice.Datastore.STATE, ) # TODO: handle exception @@ -294,7 +294,7 @@ def get_interfaces(self) -> dict: "/interface[name=*]", "/system/information", ], - SRLinuxDevice.RPCDatastore.STATE, + SRLinuxDevice.Datastore.STATE, ) # TODO: handle exception @@ -374,7 +374,7 @@ def get_lldp_neighbors(self) -> dict: """ lldp_neighbors = {} json_output = self.device.get_paths( - ["/system/lldp"], SRLinuxDevice.RPCDatastore.STATE + ["/system/lldp"], SRLinuxDevice.Datastore.STATE ) # TODO: Handle exception @@ -429,7 +429,7 @@ def get_lldp_neighbors_detail(self, interface: Optional[AnyStr] = "") -> dict: """ lldp_neighbors = {} json_output = self.device.get_paths( - ["/system/lldp"], SRLinuxDevice.RPCDatastore.STATE + ["/system/lldp"], SRLinuxDevice.Datastore.STATE ) # TODO: handle exception @@ -503,7 +503,7 @@ def get_users(self) -> dict: "/system/aaa/authentication/admin-user", "/system/aaa/authentication/user[username=*]", ], - SRLinuxDevice.RPCDatastore.STATE, + SRLinuxDevice.Datastore.STATE, ) # TODO: handle thrown exception @@ -846,7 +846,7 @@ class RPCAction(str, enum.Enum): UPDATE = "update" DELETE = "delete" - class RPCDatastore(str, enum.Enum): + class Datastore(str, enum.Enum): """ Enum class used to represent SR Linux Data stores for RPC calls. """ @@ -909,7 +909,7 @@ def open(self): """Check the supplied init params actually work, throw an exception if not.""" # Set up a JSON RPC Client and test connectivity to the endpoint. path = "/system/information/version" - ok, data = self.get_paths([path], SRLinuxDevice.RPCDatastore.STATE) + ok, data = self.get_paths([path], SRLinuxDevice.Datastore.STATE) if ok: return True @@ -922,7 +922,7 @@ def close(self): """Cleanup the HTTP Client""" self.jsonrpc_session.close() - def get_paths(self, paths: list, datastore: RPCDatastore) -> list: + def get_paths(self, paths: list, datastore: Datastore) -> list: """ Get the subtrees from a list of YANG paths from the specified datastore. Returns a list of results. From 6c53bef19383aceaa912426f9cfbf05c0615a497 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 02:03:04 +0300 Subject: [PATCH 08/13] unindent stub exceptions --- napalm_srlinux/srlinux.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py index d76a523..04934fb 100644 --- a/napalm_srlinux/srlinux.py +++ b/napalm_srlinux/srlinux.py @@ -913,10 +913,10 @@ def open(self): if ok: return True - else: - raise Exception( - "Error opening connection. Error: " + data.get("error").get("message") - ) + + raise Exception( + "Error opening connection. Error: " + data.get("error").get("message") + ) def close(self): """Cleanup the HTTP Client""" @@ -935,14 +935,14 @@ def get_paths(self, paths: list, datastore: Datastore) -> list: if ok: return result.get("result") - else: - raise Exception( - "Error getting subtrees from YANG path. Error: " + result.get("error") - ) + + raise Exception( + "Error getting subtrees from YANG path. Error: " + result.get("error") + ) def run_cli_commands(self, commands: list) -> list: """ - Runs a list of CLI commands on the device, returns the result or raises an exception if + Runs a list of CLI commands on the device, returns the result or raises an exception if a command isn't valid or fails. Returns a list of results. """ ok, response = self._jsonrpc_request( @@ -951,10 +951,10 @@ def run_cli_commands(self, commands: list) -> list: if ok: return response.get("result") - else: - raise Exception(response.get("error", {}).get("message")) - def _jsonrpc_request(self, method: RPCMethod, params: dict) -> (bool, dict): + raise Exception(response.get("error", {}).get("message")) + + def _jsonrpc_request(self, method: RPCMethod, params: dict) -> tuple[bool, dict]: """ Make a JSON RPC request, raise an exception if the HTTP request returns anything other than 2xx Return a boolean success value (if HTTP 2xx) and the result. From 2865c38c47a8742e48bc4057df2d37e604daf137 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 02:17:46 +0300 Subject: [PATCH 09/13] make use of pydantic types for interface data --- napalm_srlinux/srlinux.py | 24 ++++++++++++------------ napalm_srlinux/types.py | 11 +++++++++++ 2 files changed, 23 insertions(+), 12 deletions(-) create mode 100644 napalm_srlinux/types.py diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py index 04934fb..45635b9 100644 --- a/napalm_srlinux/srlinux.py +++ b/napalm_srlinux/srlinux.py @@ -37,6 +37,8 @@ ReplaceConfigException, ) +from napalm_srlinux import types + class NokiaSRLinuxDriver(NetworkDriver): """Napalm driver for Nokia SR Linux.""" @@ -273,7 +275,7 @@ def get_facts(self): raise NotImplementedError - def get_interfaces(self) -> dict: + def get_interfaces(self) -> dict[str, types.Interface]: """ Returns a dictionary of dictionaries. The keys for the first dictionary will be the interfaces in the devices. @@ -303,21 +305,19 @@ def get_interfaces(self) -> dict: system_data = json_data[1] for interface in interfaces_json.get("srl_nokia-interfaces:interface"): - interfaces[interface.get("name")] = { - "is_up": True if interface.get("oper-state") == "up" else False, - "is_enabled": True - if interface.get("admin-state") == "enable" - else False, - "description": interface.get("description"), - "last-flapped": NokiaSRLinuxDriver._calculate_time_since( + interfaces[interface.get("name")] = types.Interface( + is_up=interface.get("oper-state") == "up", + is_enabled=interface.get("admin-state") == "enable", + description=interface.get("description"), + last_flapped=NokiaSRLinuxDriver._calculate_time_since( system_data.get("current-datetime"), interface.get("last-change") ), - "speed": NokiaSRLinuxDriver._port_speed_to_mbits( + speed=NokiaSRLinuxDriver._port_speed_to_mbits( interface.get("ethernet", {}).get("port-speed") ), - "mtu": interface.get("mtu"), - "mac_address": interface.get("ethernet", {}).get("hw-mac-address"), - } + mtu=interface.get("mtu"), + mac_address=interface.get("ethernet", {}).get("hw-mac-address"), + ) return interfaces diff --git a/napalm_srlinux/types.py b/napalm_srlinux/types.py new file mode 100644 index 0000000..5cdc212 --- /dev/null +++ b/napalm_srlinux/types.py @@ -0,0 +1,11 @@ +from pydantic import BaseModel + + +class Interface(BaseModel): + is_up: bool + is_enabled: bool + description: str | None + last_flapped: float + speed: float | None + mtu: int | None + mac_address: str | None From 54efb90590a0613aeb9485dd99f5a069e72f368d Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 02:27:44 +0300 Subject: [PATCH 10/13] formatting of stale files --- test/unit/TestNokiaSRLDriver.py | 28 ++++++++++++++++------------ test/unit/conftest.py | 29 +++++++++++++++-------------- test/unit/test_getters.py | 6 ++---- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/test/unit/TestNokiaSRLDriver.py b/test/unit/TestNokiaSRLDriver.py index e2f0bd4..eadf668 100644 --- a/test/unit/TestNokiaSRLDriver.py +++ b/test/unit/TestNokiaSRLDriver.py @@ -14,44 +14,50 @@ # the License. import unittest + import pytest -from napalm_srlinux import srlinux -from napalm.base.test.base import TestConfigNetworkDriver from napalm.base.exceptions import ( MergeConfigException, ) +from napalm.base.test.base import TestConfigNetworkDriver + +from napalm_srlinux import srlinux + + class TestConfigSRLDriver(unittest.TestCase, TestConfigNetworkDriver): @classmethod def setUpClass(cls): hostname = "172.20.20.10" username = "admin" password = "admin" - cls.vendor = "test/unit/" + "srl" #to facilitate executing test without errors prepended path + cls.vendor = ( + "test/unit/" + "srl" + ) # to facilitate executing test without errors prepended path optional_args = { "port": 57400, "target_name": "srl", - "tls_cert":"/root/gnmic_certs/srl_certs/clientCert.crt", + "tls_cert": "/root/gnmic_certs/srl_certs/clientCert.crt", "tls_ca": "/etc/containerlab/lab-examples/srlceos01/clab-srlceos01/ca/root/root-ca.pem", "tls_key": "/root/gnmic_certs/srl_certs/clientKey.pem", # "skip_verify": True, # "insecure": False - "encoding": "JSON_IETF" + "encoding": "JSON_IETF", } - cls.device = srl.NokiaSRLinuxDriver( + cls.device = srlinux.NokiaSRLinuxDriver( hostname, username, password, timeout=60, optional_args=optional_args ) cls.device.open() cls.device.load_replace_candidate(filename="%s/initial.conf" % cls.vendor) - #auto commit for load replace - #cls.device.commit_config() + # auto commit for load replace + # cls.device.commit_config() def test_merge_configuration(self): intended_diff = self.read_file("%s/merge_good.diff" % self.vendor) self.device.load_merge_candidate(filename="%s/merge_good.conf" % self.vendor) - #self.device.commit_config() + # self.device.commit_config() # Reverting changes @@ -64,7 +70,7 @@ def test_merge_configuration(self): self.assertEqual(str(diff).strip(), intended_diff) def test_merge_configuration_typo_and_rollback(self): - #because of autocommit in load_replace_candidate - this requires a discard_config before test begins + # because of autocommit in load_replace_candidate - this requires a discard_config before test begins result = False try: self.device.discard_config() @@ -89,5 +95,3 @@ def test_load_template(self): def test_replacing_config_and_diff_and_discard(self): # because of autocommit in load_replace_candidate - this test case cannot be passed pytest.skip("Constraint due to auto commit in load_replace_candidate") - - \ No newline at end of file diff --git a/test/unit/conftest.py b/test/unit/conftest.py index 51d865a..771b494 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -3,32 +3,36 @@ # SPDX-License-Identifier: Apache-2.0 """Test fixtures.""" + +import json +import os from builtins import super import pytest -import os from napalm.base.test import conftest as parent_conftest - from napalm.base.test.double import BaseTestDouble from napalm_srlinux import srlinux -import json + @pytest.fixture(scope="session", autouse=True) def setenv(): # Set timezone such that timestamps are generated/parsed correctly os.environ["TZ"] = "GMT" -@pytest.fixture(scope='class') + +@pytest.fixture(scope="class") def set_device_parameters(request): """Set up the class.""" + def fin(): request.cls.device.close() + request.addfinalizer(fin) - request.cls.driver = srl.NokiaSRLinuxDriver + request.cls.driver = srlinux.NokiaSRLinuxDriver request.cls.patched_driver = PatchedsrlDriver - request.cls.vendor = 'srl' + request.cls.vendor = "srlinux" parent_conftest.set_device_parameters(request) @@ -37,19 +41,18 @@ def pytest_generate_tests(metafunc): parent_conftest.pytest_generate_tests(metafunc, __file__) -class PatchedsrlDriver(srl.NokiaSRLinuxDriver): +class PatchedsrlDriver(srlinux.NokiaSRLinuxDriver): """Patched Skeleton Driver.""" def __init__(self, hostname, username, password, timeout=60, optional_args=None): """Patched Skeleton Driver constructor.""" super().__init__(hostname, username, password, timeout, optional_args) - self.patched_attrs = ['device'] + self.patched_attrs = ["device"] self.device = FakesrlDevice() class FakesrlDevice(BaseTestDouble): - def _jsonrpcRunCli(self, command_list): """Fake run_commands.""" # @@ -59,9 +62,7 @@ def _jsonrpcRunCli(self, command_list): full_path = self.find_file(filename) with open(full_path) as f: out.append(json.load(f)) - result = { - "result":out - } + result = {"result": out} print(result) return result @@ -75,11 +76,11 @@ def _gnmiGet(self, prefix, path, pathType): def open(self): pass + def close(self): pass - - def _jsonrpcGet(self,cmds, other_params=None): + def _jsonrpcGet(self, cmds, other_params=None): filename = "{}.txt".format(self.sanitize_text(str(sorted(cmds)).strip("{}' "))) full_path = self.find_file(filename) with open(full_path) as f: diff --git a/test/unit/test_getters.py b/test/unit/test_getters.py index 765332b..9f97200 100644 --- a/test/unit/test_getters.py +++ b/test/unit/test_getters.py @@ -4,16 +4,14 @@ """Tests for getters.""" -from napalm.base.test.getters import BaseTestGetters - - import pytest +from napalm.base.test.getters import BaseTestGetters @pytest.mark.usefixtures("set_device_parameters") class TestGetter(BaseTestGetters): """Test get_* methods.""" + def test_get_route_to_longer(self): pytest.skip("Longer option not Supported") return - From 09b63f2679048c375a485b160585014ba82499c3 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 12:24:15 +0300 Subject: [PATCH 11/13] remove methods pdf. The docs will move to learn.srlinux --- Summary_of_Methods.pdf | Bin 423342 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 Summary_of_Methods.pdf diff --git a/Summary_of_Methods.pdf b/Summary_of_Methods.pdf deleted file mode 100755 index f43c1f58869386688f40c7760e87cfdae55d938d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423342 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

lEs-`E@@M?hMQ8!sV<(9`mWU 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�osgjl&>`#4a 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 XZ%>Eer6Sy&*30TnyeD^>{nY&nZ9D!h From f5de746700d9e5706b82934a004c89d063207325 Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 12:24:49 +0300 Subject: [PATCH 12/13] use helper functions to determine jsonrpc port and url use head when testing the connection in the open method --- VERSION | 2 +- examples/example.py | 77 ++++++++++++++++++++++++++++++++++++++ examples/example_script.py | 64 ------------------------------- napalm_srlinux/srlinux.py | 76 ++++++++++++++++++++++++------------- 4 files changed, 127 insertions(+), 92 deletions(-) create mode 100644 examples/example.py delete mode 100644 examples/example_script.py diff --git a/VERSION b/VERSION index 90a27f9..227cea2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.5 +2.0.0 diff --git a/examples/example.py b/examples/example.py new file mode 100644 index 0000000..fe3ab78 --- /dev/null +++ b/examples/example.py @@ -0,0 +1,77 @@ +# Copyright 2020 Nokia +# Licensed under the Apache License 2.0. +# SPDX-License-Identifier: Apache-2.0 +""" +This is a simple example of how to use napalm-srlinux. +First, deploy the SR Linux container using containerlab: + +``` +CLAB_LABDIR_BASE=/tmp \ +sudo -E clab deploy -c -t srlinux.dev/clab-srl +``` + +Then uncomment the NAPALM API calls that you want to run and run this script: + +python examples/example.py +""" + +from napalm import get_network_driver + +# using rich to pretty print the output +# feel free to remove it if you don't want to install it +from rich import print_json + +driver = get_network_driver("srlinux") +optional_args = { + # "jsonrpc_port": 80, + # "skip_verify": True, + "insecure": True +} +with driver("srl", "admin", "NokiaSrl1!", optional_args=optional_args) as device: + # print_json(data=device.get_bgp_config(neighbor="", group="")) #Done + # print_json(data=device.get_bgp_config(neighbor="", group="ebgp")) #Done + # print_json(data=device.get_bgp_config(neighbor="10.1.1.2", group="")) #Done + # print_json(data=device.get_config(retrieve="all", full=False, sanitized=False)) + # print_json(data=device.get_config(retrieve="running", full=False, sanitized=False)) + # print_json(data=device.get_config(retrieve="candidate", full=False, sanitized=False)) + # print_json(data=device.get_config(retrieve="state", full=False, sanitized=False)) + # print_json(data=device.get_ntp_stats()) + # print_json(data=device.get_optics()) + # print_json(data=device.get_route_to()) + # print_json(data=device.get_route_to("1.0.4.0/24")) + # print_json(data=device.get_route_to("100.100.100.100")) + # print_json(data=device.get_route_to(destination="172.20.20.0/24")) + # print_json(data=device.get_route_to(protocol="bgp")) + # print_json(data=device.get_route_to(protocol="host")) + # print_json(data=device.get_mac_address_table()) #Done + # print_json(data=device.get_snmp_information()) + # print(device.is_alive()) + # print_json(data=device.cli(["date","info system information","show network-instance default protocols bgp neighbor"])) + # print(device.load_merge_candidate(filename="/root/syed/backup/napalm-srl-dev/demo_merge.json")) + # print(device.load_replace_candidate(filename="/home/nuage/json_compare/srl2_2000_Ori_WithBGP.json")) + # print_json(data=device.commit_config("test commit")) + # print_json(data=device.compare_config()) + # print_json(data=device.discard_config()) + # print_json(data=device.rollback()) + # print_json(data=device.ping(destination="11.1.1.2")) + # print_json(data=device.ping(destination="11.1.1.2",source="10.1.1.1",ttl=2, timeout=2, size=64, count=2, vrf="default")) + # print_json(data=device.traceroute(destination="11.1.1.2",vrf = "")) + # print_json(data=device.traceroute(destination="21.1.1.2",ttl=5, vrf = "ip_vrf1")) + # print_json(data=device.get_arp_table()) + # print_json(data=device.get_arp_table("ip_vrf1")) + # print_json(data=device.get_bgp_neighbors()) + # print_json(data=device.get_bgp_neighbors_detail()) + # print_json(data=device.get_bgp_neighbors_detail("10.1.1.2")) + # print_json(data=device.get_environment()) + # print_json(data=device.get_facts()) + # print_json(data=device.get_interfaces()) + # print_json(data=device.get_interfaces_counters()) + # print_json(data=device.get_interfaces_ip()) + # print_json(data=device.get_ipv6_neighbors_table())#----------TBD + # print_json(data=device.get_lldp_neighbors()) + # print_json(data=device.get_lldp_neighbors_detail()) + # print_json(data=device.get_lldp_neighbors_detail("ethernet-1/3")) + # print_json(data=device.get_network_instances()) + # print_json(data=device.get_network_instances()) + print_json(data=device.get_users()) + # print_json(data=device.test()) diff --git a/examples/example_script.py b/examples/example_script.py deleted file mode 100644 index 171025b..0000000 --- a/examples/example_script.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 2020 Nokia -# Licensed under the Apache License 2.0. -# SPDX-License-Identifier: Apache-2.0 - -from napalm import get_network_driver -import json - -driver = get_network_driver("srlinux") -optional_args = { - "jsonrpc_port": 80, - #"skip_verify": True, - #"insecure": False -} -device = driver("172.20.20.2", "admin", "admin", 60, optional_args) -device.open() -#print(json.dumps(device.get_bgp_config(neighbor="", group=""))) #Done -#print(json.dumps(device.get_bgp_config(neighbor="", group="ebgp"))) #Done -#print(json.dumps(device.get_bgp_config(neighbor="10.1.1.2", group=""))) #Done -#print(json.dumps(device.get_config(retrieve="all", full=False, sanitized=False))) -#print(json.dumps(device.get_config(retrieve="running", full=False, sanitized=False))) -#print(json.dumps(device.get_config(retrieve="candidate", full=False, sanitized=False))) -#print(json.dumps(device.get_config(retrieve="state", full=False, sanitized=False))) -#print(json.dumps(device.get_ntp_stats())) -#print(json.dumps(device.get_optics())) -#print(json.dumps(device.get_route_to())) -#print(json.dumps(device.get_route_to("1.0.4.0/24"))) -#print(json.dumps(device.get_route_to("100.100.100.100"))) -#print(json.dumps(device.get_route_to(destination="172.20.20.0/24"))) -#print(json.dumps(device.get_route_to(protocol="bgp"))) -#print(json.dumps(device.get_route_to(protocol="host"))) -#print(json.dumps(device.get_mac_address_table())) #Done -#print(json.dumps(device.get_snmp_information())) -#print(device.is_alive()) -#print(json.dumps(device.cli(["date","info system information","show network-instance default protocols bgp neighbor"]))) -#print(device.load_merge_candidate(filename="/root/syed/backup/napalm-srl-dev/demo_merge.json")) -#print(device.load_replace_candidate(filename="/home/nuage/json_compare/srl2_2000_Ori_WithBGP.json")) -#print(json.dumps(device.commit_config("test commit"))) -#print(json.dumps(device.compare_config())) -#print(json.dumps(device.discard_config())) -#print(json.dumps(device.rollback())) -#print(json.dumps(device.ping(destination="11.1.1.2"))) -#print(json.dumps(device.ping(destination="11.1.1.2",source="10.1.1.1",ttl=2, timeout=2, size=64, count=2, vrf="default"))) -#print(json.dumps(device.traceroute(destination="11.1.1.2",vrf = ""))) -#print(json.dumps(device.traceroute(destination="21.1.1.2",ttl=5, vrf = "ip_vrf1"))) -#print(json.dumps(device.get_arp_table())) -#print(json.dumps(device.get_arp_table("ip_vrf1"))) -#print(json.dumps(device.get_bgp_neighbors())) -#print(json.dumps(device.get_bgp_neighbors_detail())) -#print(json.dumps(device.get_bgp_neighbors_detail("10.1.1.2"))) -#print(json.dumps(device.get_environment())) -#print(json.dumps(device.get_facts())) -#print(json.dumps(device.get_interfaces())) -#print(json.dumps(device.get_interfaces_counters())) -#print(json.dumps(device.get_interfaces_ip())) -#print(json.dumps(device.get_ipv6_neighbors_table()))#----------TBD -#print(json.dumps(device.get_lldp_neighbors())) -#print(json.dumps(device.get_lldp_neighbors_detail())) -#print(json.dumps(device.get_lldp_neighbors_detail("ethernet-1/3"))) -#print(json.dumps(device.get_network_instances())) -#print(json.dumps(device.get_network_instances())) -#print(json.dumps(device.get_users())) -#print(json.dumps(device.test())) - -device.close() diff --git a/napalm_srlinux/srlinux.py b/napalm_srlinux/srlinux.py index 45635b9..314976d 100644 --- a/napalm_srlinux/srlinux.py +++ b/napalm_srlinux/srlinux.py @@ -24,7 +24,7 @@ import enum import logging import re -from typing import AnyStr, Optional, Union +from typing import Any, AnyStr, Optional, Union import httpx import jsonpath_ng @@ -875,7 +875,7 @@ def __init__( optional_args = {} # Optional Arguments - self.jsonrpc_port = optional_args.get("jsonrpc_port", 443) + self.jsonrpc_port = self._determine_jsonrpc_port(optional_args) self.skip_verify = optional_args.get("skip_verify", False) self.insecure = optional_args.get("insecure", False) self.tls_ca = optional_args.get("tls_ca", "") @@ -883,7 +883,8 @@ def __init__( self.tls_key_path = optional_args.get("tls_key_path", "") self.tls_key_password = optional_args.get("tls_key_password", "") - self.jsonrpc_session = self._new_jsonrpc_client() + self.jsonrpc_client = self._new_jsonrpc_client() + self.jsonrpc_url = self._compose_jsonrpc_url() # Warn about incompatible/oddball settings if self.jsonrpc_port == 80: @@ -907,22 +908,18 @@ def __init__( def open(self): """Check the supplied init params actually work, throw an exception if not.""" - # Set up a JSON RPC Client and test connectivity to the endpoint. - path = "/system/information/version" - ok, data = self.get_paths([path], SRLinuxDevice.Datastore.STATE) - - if ok: - return True - - raise Exception( - "Error opening connection. Error: " + data.get("error").get("message") - ) + try: + self.jsonrpc_client.head(self.jsonrpc_url) + except httpx.RequestError as exc: + raise ConnectionError( + "Error opening http(s) connection to JSON-RPC server" + ) from exc def close(self): """Cleanup the HTTP Client""" - self.jsonrpc_session.close() + self.jsonrpc_client.close() - def get_paths(self, paths: list, datastore: Datastore) -> list: + def get_paths(self, paths: list, datastore: Datastore) -> Any: """ Get the subtrees from a list of YANG paths from the specified datastore. Returns a list of results. @@ -971,18 +968,8 @@ def _jsonrpc_request(self, method: RPCMethod, params: dict) -> tuple[bool, dict] "params": params, } - proto = ( - "https" - if ( - self.jsonrpc_port == 443 - or (self.jsonrpc_port != 80 and not self.insecure) - ) - else "http" - ) - url = f"{proto}://{self.hostname}:{self.jsonrpc_port}/jsonrpc" - - result = self.jsonrpc_session.post( - url, headers=headers, json=request_data, timeout=self.timeout + result = self.jsonrpc_client.post( + self.jsonrpc_url, headers=headers, json=request_data, timeout=self.timeout ) if result.status_code == httpx.codes.OK and result.json().get("error"): @@ -1012,3 +999,38 @@ def _new_jsonrpc_client(self): opts["cert"] = cert return httpx.Client(**opts) + + def _compose_jsonrpc_url(self): + """ + Compose the JSON RPC URL, based on the initialized arguments. + """ + + proto = ( + "https" + if ( + self.jsonrpc_port == 443 + or (self.jsonrpc_port != 80 and not self.insecure) + ) + else "http" + ) + url = f"{proto}://{self.hostname}:{self.jsonrpc_port}/jsonrpc" + # print(url) + + return url + + def _determine_jsonrpc_port(self, opt_args): + """ + Determine the JSON RPC port based on the optional arguments. + """ + + # by default assume 443 port is used by jsonrpc server + port: int = 443 + + # if jsonrpc_port is specified, use that + if opt_args.get("jsonrpc_port"): + port = opt_args.get("jsonrpc_port") + # when insecure is set and jsonrpc_port is not specified, use 80 + elif opt_args.get("insecure"): + port = 80 + + return port From 0cda04cb4ed8b89e4d1dd72ca972e5d2aa1aa94a Mon Sep 17 00:00:00 2001 From: Roman Dodin Date: Sat, 24 Aug 2024 12:45:11 +0300 Subject: [PATCH 13/13] added pytest for ports --- setup.cfg | 4 ++-- test/unit/jsonrpc_client.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 test/unit/jsonrpc_client.py diff --git a/setup.cfg b/setup.cfg index cfd8fc5..e0a0d11 100644 --- a/setup.cfg +++ b/setup.cfg @@ -21,8 +21,8 @@ python_files = *_test.py tests.py addopts = - --cov=napalm - --cov-report term-missing + # --cov=napalm + # --cov-report term-missing -vs ; --pylama json_report = report.json diff --git a/test/unit/jsonrpc_client.py b/test/unit/jsonrpc_client.py new file mode 100644 index 0000000..e36d454 --- /dev/null +++ b/test/unit/jsonrpc_client.py @@ -0,0 +1,34 @@ +""" +Determines the JSON-RPC port to use based on the provided configuration. + +Args: + config (dict): A dictionary containing the configuration options. + +Returns: + int: The JSON-RPC port to use. +""" + +import pytest + +from napalm_srlinux.srlinux import NokiaSRLinuxDriver + + +@pytest.fixture +def driver(): + return NokiaSRLinuxDriver("hostname", "username", "password") + + +def test_determine_jsonrpc_port(driver): + # Test default case + assert driver._determine_jsonrpc_port({}) == 443 + + # Test when jsonrpc_port is specified + assert driver._determine_jsonrpc_port({"jsonrpc_port": 8080}) == 8080 + + # Test when insecure is set and jsonrpc_port is not specified + assert driver._determine_jsonrpc_port({"insecure": True}) == 80 + + # Test when both jsonrpc_port and insecure are set + assert ( + driver._determine_jsonrpc_port({"jsonrpc_port": 9000, "insecure": True}) == 9000 + )