From 49d4f54d0dec4177cb05cfc5a9ec6e7ade5d800f Mon Sep 17 00:00:00 2001 From: Loke Berne Date: Wed, 2 Nov 2016 12:42:49 +0100 Subject: [PATCH 1/2] Fixes problem with get_interfaces_counters (#76) Fixes bug where you would get a KeyError if you had port-channel configured --- napalm_eos/eos.py | 50 +++---- .../normal/expected_result.json | 31 ++++- .../normal/show_interfaces.json | 125 ++++++++++++++++++ .../normal/show_interfaces_counters.json | 40 ------ .../show_interfaces_counters_errors.json | 31 ----- 5 files changed, 177 insertions(+), 100 deletions(-) create mode 100644 test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces.json delete mode 100644 test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters.json delete mode 100644 test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters_errors.json diff --git a/napalm_eos/eos.py b/napalm_eos/eos.py index 5ffc224..b08b377 100644 --- a/napalm_eos/eos.py +++ b/napalm_eos/eos.py @@ -23,7 +23,7 @@ import time from datetime import datetime - +from collections import defaultdict from netaddr import IPAddress from netaddr import IPNetwork @@ -270,34 +270,28 @@ def get_lldp_neighbors(self): return lldp def get_interfaces_counters(self): - commands = list() - - commands.append('show interfaces counters') - commands.append('show interfaces counters errors') - + commands = ['show interfaces'] output = self.device.run_commands(commands) - - interface_counters = dict() - - for interface, counters in output[0]['interfaces'].iteritems(): - interface_counters[interface] = dict() - - interface_counters[interface]['tx_octets'] = counters['outOctets'] - interface_counters[interface]['rx_octets'] = counters['inOctets'] - interface_counters[interface]['tx_unicast_packets'] = counters['outUcastPkts'] - interface_counters[interface]['rx_unicast_packets'] = counters['inUcastPkts'] - interface_counters[interface]['tx_multicast_packets'] = counters['outMulticastPkts'] - interface_counters[interface]['rx_multicast_packets'] = counters['inMulticastPkts'] - interface_counters[interface]['tx_broadcast_packets'] = counters['outBroadcastPkts'] - interface_counters[interface]['rx_broadcast_packets'] = counters['inBroadcastPkts'] - interface_counters[interface]['tx_discards'] = counters['outDiscards'] - interface_counters[interface]['rx_discards'] = counters['inDiscards'] - - # Errors come from a different command - errors = output[1]['interfaceErrorCounters'][interface] - interface_counters[interface]['tx_errors'] = errors['outErrors'] - interface_counters[interface]['rx_errors'] = errors['inErrors'] - + interface_counters = defaultdict(dict) + for interface, data in output[0]['interfaces'].iteritems(): + if data['hardware'] == 'subinterface': + # Subinterfaces will never have counters so no point in parsing them at all + continue + counters = data.get('interfaceCounters', {}) + interface_counters[interface].update( + tx_octets=counters.get('outOctets', -1), + rx_octets=counters.get('inOctets', -1), + tx_unicast_packets=counters.get('outUcastPkts', -1), + rx_unicast_packets=counters.get('inUcastPkts', -1), + tx_multicast_packets=counters.get('outMulticastPkts', -1), + rx_multicast_packets=counters.get('inMulticastPkts', -1), + tx_broadcast_packets=counters.get('outBroadcastPkts', -1), + rx_broadcast_packets=counters.get('inBroadcastPkts', -1), + tx_discards=counters.get('outDiscards', -1), + rx_discards=counters.get('inDiscards', -1), + tx_errors=counters.get('totalOutErrors', -1), + rx_errors=counters.get('totalInErrors', -1) + ) return interface_counters @staticmethod diff --git a/test/unit/mocked_data/test_get_interfaces_counters/normal/expected_result.json b/test/unit/mocked_data/test_get_interfaces_counters/normal/expected_result.json index ddcdb04..480ec14 100644 --- a/test/unit/mocked_data/test_get_interfaces_counters/normal/expected_result.json +++ b/test/unit/mocked_data/test_get_interfaces_counters/normal/expected_result.json @@ -1 +1,30 @@ -{"Ethernet2": {"tx_multicast_packets": 6745, "tx_discards": 0, "tx_octets": 852151, "tx_errors": 0, "rx_octets": 74942, "tx_unicast_packets": 0, "rx_errors": 0, "tx_broadcast_packets": 0, "rx_multicast_packets": 371, "rx_broadcast_packets": 0, "rx_discards": 0, "rx_unicast_packets": 0}, "Management1": {"tx_multicast_packets": 0, "tx_discards": 0, "tx_octets": 275633, "tx_errors": 0, "rx_octets": 387875, "tx_unicast_packets": 2118, "rx_errors": 0, "tx_broadcast_packets": 0, "rx_multicast_packets": 0, "rx_broadcast_packets": 1179, "rx_discards": 0, "rx_unicast_packets": 0}, "Ethernet1": {"tx_multicast_packets": 6745, "tx_discards": 0, "tx_octets": 852151, "tx_errors": 0, "rx_octets": 74942, "tx_unicast_packets": 0, "rx_errors": 0, "tx_broadcast_packets": 0, "rx_multicast_packets": 371, "rx_broadcast_packets": 0, "rx_discards": 0, "rx_unicast_packets": 0}} \ No newline at end of file +{ + "Ethernet1": { + "tx_multicast_packets": 0, + "tx_discards": 0, + "tx_octets": 0, + "tx_errors": 0, + "rx_octets": 0, + "tx_unicast_packets": 0, + "rx_errors": 0, + "tx_broadcast_packets": 0, + "rx_multicast_packets": 0, + "rx_broadcast_packets": 0, + "rx_discards": 0, + "rx_unicast_packets": 0 + }, + "Port-Channel1": { + "tx_multicast_packets": 0, + "tx_discards": 0, + "tx_octets": 0, + "tx_errors": 0, + "rx_octets": 0, + "tx_unicast_packets": 0, + "rx_errors": 0, + "tx_broadcast_packets": 0, + "rx_multicast_packets": 0, + "rx_broadcast_packets": 0, + "rx_discards": 0, + "rx_unicast_packets": 0 + } +} diff --git a/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces.json b/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces.json new file mode 100644 index 0000000..af84f35 --- /dev/null +++ b/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces.json @@ -0,0 +1,125 @@ +{ + "interfaces": { + "Ethernet1": { + "lastStatusChangeTimestamp": 1475664667.431372, + "name": "Ethernet1", + "interfaceStatus": "notconnect", + "autoNegotiate": "off", + "burnedInAddress": "44:4c:a8:cd:33:7e", + "loopbackMode": "loopbackNone", + "interfaceStatistics": { + "inBitsRate": 0.0, + "inPktsRate": 0.0, + "outBitsRate": 0.0, + "updateInterval": 300.0, + "outPktsRate": 0.0 + }, + "mtu": 9214, + "hardware": "ethernet", + "duplex": "duplexFull", + "bandwidth": 10000000000, + "forwardingModel": "dataLink", + "lineProtocolStatus": "down", + "interfaceCounters": { + "outBroadcastPkts": 0, + "linkStatusChanges": 2, + "totalOutErrors": 0, + "inMulticastPkts": 0, + "counterRefreshTime": 1478085320.927135, + "inBroadcastPkts": 0, + "outputErrorsDetail": { + "deferredTransmissions": 0, + "txPause": 0, + "collisions": 0, + "lateCollisions": 0 + }, + "inOctets": 0, + "outDiscards": 0, + "outOctets": 0, + "inUcastPkts": 0, + "inputErrorsDetail": { + "runtFrames": 0, + "rxPause": 0, + "fcsErrors": 0, + "alignmentErrors": 0, + "giantFrames": 0, + "symbolErrors": 0 + }, + "outUcastPkts": 0, + "outMulticastPkts": 0, + "totalInErrors": 0, + "inDiscards": 0 + }, + "interfaceMembership": "Member of Port-Channel1", + "interfaceAddress": [], + "physicalAddress": "44:4c:a8:cd:33:7e", + "description": "not available" + }, + "Port-Channel1": { + "lastStatusChangeTimestamp": 1475664568.7738712, + "name": "Port-Channel1", + "interfaceStatus": "notconnect", + "memberInterfaces": {}, + "interfaceStatistics": { + "inBitsRate": 0.0, + "inPktsRate": 0.0, + "outBitsRate": 0.0, + "updateInterval": 300.0, + "outPktsRate": 0.0 + }, + "mtu": 1500, + "hardware": "portChannel", + "bandwidth": 0, + "forwardingModel": "routed", + "fallbackEnabled": false, + "lineProtocolStatus": "lowerLayerDown", + "interfaceCounters": { + "outBroadcastPkts": 0, + "linkStatusChanges": 1, + "totalOutErrors": 0, + "inMulticastPkts": 0, + "counterRefreshTime": 1478085363.701278, + "inBroadcastPkts": 0, + "inOctets": 0, + "outDiscards": 0, + "outOctets": 0, + "inUcastPkts": 0, + "outUcastPkts": 0, + "outMulticastPkts": 0, + "totalInErrors": 0, + "inDiscards": 0 + }, + "fallbackEnabledType": "fallbackNone", + "interfaceAddress": [], + "physicalAddress": "44:4c:a8:cd:33:7d", + "description": "description not available" + }, + "Port-Channel1.20": { + "lastStatusChangeTimestamp": 1475664578.738529, + "name": "Port-Channel2.20", + "interfaceStatus": "notconnect", + "mtu": 1500, + "hardware": "subinterface", + "bandwidth": 0, + "forwardingModel": "routed", + "lineProtocolStatus": "lowerLayerDown", + "interfaceAddress": [ + { + "secondaryIpsOrderedList": [], + "broadcastAddress": "255.255.255.255", + "secondaryIps": {}, + "primaryIp": { + "maskLen": 31, + "address": "1.1.1.1" + }, + "virtualIp": { + "maskLen": 0, + "address": "0.0.0.0" + } + } + ], + "physicalAddress": "44:4c:a8:cd:33:7d", + "description": "Not available" + } + } +} diff --git a/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters.json b/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters.json deleted file mode 100644 index 043978b..0000000 --- a/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "interfaces": { - "Ethernet2": { - "inUcastPkts": 0, - "outMulticastPkts": 6745, - "outUcastPkts": 0, - "inMulticastPkts": 371, - "outBroadcastPkts": 0, - "inBroadcastPkts": 0, - "inDiscards": 0, - "inOctets": 74942, - "outDiscards": 0, - "outOctets": 852151 - }, - "Management1": { - "inUcastPkts": 0, - "outMulticastPkts": 0, - "outUcastPkts": 2118, - "inMulticastPkts": 0, - "outBroadcastPkts": 0, - "inBroadcastPkts": 1179, - "inDiscards": 0, - "inOctets": 387875, - "outDiscards": 0, - "outOctets": 275633 - }, - "Ethernet1": { - "inUcastPkts": 0, - "outMulticastPkts": 6745, - "outUcastPkts": 0, - "inMulticastPkts": 371, - "outBroadcastPkts": 0, - "inBroadcastPkts": 0, - "inDiscards": 0, - "inOctets": 74942, - "outDiscards": 0, - "outOctets": 852151 - } - } -} \ No newline at end of file diff --git a/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters_errors.json b/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters_errors.json deleted file mode 100644 index d5dfe21..0000000 --- a/test/unit/mocked_data/test_get_interfaces_counters/normal/show_interfaces_counters_errors.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "interfaceErrorCounters": { - "Ethernet2": { - "inErrors": 0, - "frameTooLongs": 0, - "outErrors": 0, - "frameTooShorts": 0, - "fcsErrors": 0, - "alignmentErrors": 0, - "symbolErrors": 0 - }, - "Management1": { - "inErrors": 0, - "frameTooLongs": 0, - "outErrors": 0, - "frameTooShorts": 0, - "fcsErrors": 0, - "alignmentErrors": 0, - "symbolErrors": 0 - }, - "Ethernet1": { - "inErrors": 0, - "frameTooLongs": 0, - "outErrors": 0, - "frameTooShorts": 0, - "fcsErrors": 0, - "alignmentErrors": 0, - "symbolErrors": 0 - } - } -} \ No newline at end of file From 62535b01afb5cd990ca0115d528cc1e64778dff4 Mon Sep 17 00:00:00 2001 From: David Barroso Date: Mon, 7 Nov 2016 21:02:09 +0100 Subject: [PATCH 2/2] Fix a typo on the optional_argument transport (#82) --- napalm_eos/eos.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/napalm_eos/eos.py b/napalm_eos/eos.py index b08b377..e35ce73 100644 --- a/napalm_eos/eos.py +++ b/napalm_eos/eos.py @@ -66,7 +66,7 @@ def __init__(self, hostname, username, password, timeout=60, optional_args=None) if self.transport == 'https': self.port = optional_args.get('port', 443) - elif self.transrpot == 'http': + elif self.transport == 'http': self.port = optional_args.get('port', 80) self.enablepwd = optional_args.get('enable_password', '') @@ -76,7 +76,7 @@ def open(self): try: if self.transport in ('http', 'https'): connection = pyeapi.client.connect( - transport='https', + transport=self.transport, host=self.hostname, username=self.username, password=self.password, diff --git a/setup.py b/setup.py index c83c605..00db2a5 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( name="napalm-eos", - version="0.4.2", + version="0.4.3", packages=find_packages(), author="David Barroso", author_email="dbarrosop@dravetech.com",