diff --git a/configure.ac b/configure.ac index 5e6495f..cbce296 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) -AC_INIT([opx-snmp], [1.2.2], [ops-dev@lists.openswitch.net]) +AC_INIT([opx-snmp], [1.2.3], [ops-dev@lists.openswitch.net]) AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) diff --git a/debian/changelog b/debian/changelog index dab6a24..7588f95 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +opx-snmp (1.2.3) unstable; urgency=medium + + * Bugfix: Fixed issue where OID not increasing during snmpwalk of interface MIB + + -- Dell EMC Tue, 03 Mar 2020 04:54:22 -0800 + opx-snmp (1.2.2) unstable; urgency=medium * Update: Display interface names in the same format as linux diff --git a/lib/python/opx_snmp/if_handlers.py b/lib/python/opx_snmp/if_handlers.py index 432a583..ac59ea6 100644 --- a/lib/python/opx_snmp/if_handlers.py +++ b/lib/python/opx_snmp/if_handlers.py @@ -19,18 +19,9 @@ # def if_name_get(idx, nextf): - k = {} - if idx is not None: - k['dell-base-if-cmn/if/interfaces/interface/if-index'] = idx - if nextf: - k['cps/object-group/get-next'] = 1 - r = cps_get('target', - 'dell-base-if-cmn/if/interfaces/interface', - k - ) - if r is None or len(r) == 0: + r = cps_get_if(idx, nextf) + if not r: return None - r = r[0] return (cps_key_attr_data_get(r, 'dell-base-if-cmn/if/interfaces/interface/if-index'), cps_key_attr_data_get(r, 'if/interfaces/interface/name') ) @@ -55,18 +46,10 @@ def result_get_next(name, pr): # def _if_idx_get(idx, nextf): - k = {} - if idx is not None: - k['dell-base-if-cmn/if/interfaces/interface/if-index'] = idx - if nextf: - k['cps/object-group/get-next'] = 1 - r = cps_get('target', - 'dell-base-if-cmn/if/interfaces/interface', - k - ) - if r is None or len(r) == 0: + r = cps_get_if(idx, nextf) + if not r: return None - return cps_key_attr_data_get(r[0], 'dell-base-if-cmn/if/interfaces/interface/if-index') + return cps_key_attr_data_get(r, 'dell-base-if-cmn/if/interfaces/interface/if-index') def if_idx_get(module, name): @@ -128,18 +111,9 @@ def if_descr_get_next(module, name): def _if_type_get(idx, nextf): - k = {} - if idx is not None: - k['dell-base-if-cmn/if/interfaces/interface/if-index'] = idx - if nextf: - k['cps/object-group/get-next'] = 1 - r = cps_get('target', - 'dell-base-if-cmn/if/interfaces/interface', - k - ) - if r is None or len(r) == 0: + r = cps_get_if(idx, nextf) + if not r: return None - r = r[0] return (cps_key_attr_data_get(r, 'dell-base-if-cmn/if/interfaces/interface/if-index'), Integer(if_type_map.get(cps_attr_data_get(r, 'if/interfaces/interface/type') , IANAIFTYPE_OTHER)) ) @@ -162,17 +136,9 @@ def if_type_get_next(module, name): # def _if_mtu_get(idx, nextf): - k = {} - if idx is not None: - k['dell-base-if-cmn/if/interfaces/interface/if-index'] = idx - if nextf: - k['cps/object-group/get-next'] = 1 - r = cps_get('target', - 'dell-base-if-cmn/if/interfaces/interface', - k) - if r is None or len(r) == 0: + r = cps_get_if(idx, nextf) + if not r: return None - r = r[0] mtu = cps_attr_data_get(r, 'dell-if/if/interfaces/interface/mtu') if mtu is None: mtu = 0 @@ -232,18 +198,9 @@ def if_speed_get_next(module, name): # def _if_phys_addr_get(idx, nextf): - k = {} - if idx is not None: - k['dell-base-if-cmn/if/interfaces/interface/if-index'] = idx - if nextf: - k['cps/object-group/get-next'] = 1 - r = cps_get('target', - 'dell-base-if-cmn/if/interfaces/interface', - k - ) - if r is None or len(r) == 0: + r = cps_get_if(idx, nextf) + if not r: return None - r = r[0] phys_addr = cps_attr_data_get(r, 'dell-if/if/interfaces/interface/phys-address'); if phys_addr is None: phys_addr = '' @@ -494,6 +451,56 @@ def if_out_errors_get_next(module, name): def if_deprecated(module, name): return None +def cps_get_if(idx, nextf): + ''' + Wrapper function get interface details via CPS. + Get all interfaces and return whichever is required + + NOTE: We can use cps/object-group/get-next for get-next, but + it is not honoured by nas backend so we simply get all + interfaces + ''' + k = {} + if idx is not None and not nextf: + # get exact idx + k['dell-base-if-cmn/if/interfaces/interface/if-index'] = idx + r = cps_get('target', + 'dell-base-if-cmn/if/interfaces/interface', + k + ) + + if not r: + return None + + if idx is None: + # get-first + r = get_next_if_from_cpslist(r, idx) + elif idx is not None and nextf: + # get-next + r = get_next_if_from_cpslist(r, idx) + else: + # get exact idx + r = r[0] + + return r + +def get_next_if_from_cpslist(intf_list, idx): + ''' + Get the next interface entry for the given interface index + Sort them based on interface index + ''' + sorted_list = sorted(intf_list, key = lambda i: cps_key_attr_data_get(i, 'dell-base-if-cmn/if/interfaces/interface/if-index')) + if not idx: + # get-first + return sorted_list[0] + filtered = [i for i in sorted_list + if cps_key_attr_data_get(i, 'dell-base-if-cmn/if/interfaces/interface/if-index') > idx] + + if not filtered: + return None + + return filtered[0] + ########################################################################### # # Table of handlers, for agent