def _clean_nxos_data(self, processed_data, _): drop_indices = [] entries = {} for i, entry in enumerate(processed_data): entry['peerHostname'] = re.sub(r'\(.*\)', '', entry['peerHostname']) entry['ifname'] = re.sub(r'^Eth?(\d)', r'Ethernet\g<1>', entry['ifname']) if entry['ifname'] in entries: # Description is sometimes filled in with CDP, but not LLDP if not entry.get('description', ''): old_entry = processed_data[entries[entry['ifname']]] entry['description'] = old_entry.get('description', '') entry['subtype'] = old_entry.get('subtype', '') drop_indices.append(entries[entry['ifname']]) else: entries[entry['ifname']] = i if entry.get('protocol', '') == 'cdp': entry['subtype'] = 'interface name' entry['peerIfname'] = expand_ios_ifname(entry.get( 'peerIfname', '')) if entry.get('mgmtIP', '') == "not advertised": entry['mgmtIP'] = '' # make it consistent with other NOS self._common_cleaner(entry) if not entry['peerHostname']: drop_indices.append(i) processed_data = np.delete(processed_data, drop_indices).tolist() return processed_data
def _clean_ios_data(self, processed_data, _): '''Massage the interface list''' vlan_dict = {} drop_indices = [] for i, entry in enumerate(processed_data): if entry.get('_entryType', '') == 'vlan': if entry['vlanName'] == 'default': entry['vlanName'] = f'vlan{entry["vlan"]}' if entry['interfaces']: newiflist = [] for ifname in entry['interfaces'].split(','): newiflist.append(expand_ios_ifname(ifname.strip())) entry['interfaces'] = newiflist else: entry['interfaces'] = [] entry['state'] = entry['state'].lower() if entry['state'] == 'act/unsup': entry['state'] = 'unsupported' vlan_dict[entry['vlan']] = entry else: drop_indices.append(i) vlans = entry.get('_nativeVlan', '') if not vlans: vlans = entry.get('_vlansStpFwd', '') if not vlans or vlans == 'none': continue ifname = expand_ios_ifname(entry.get('ifname', '')) vlans = sum(((list( range(*[int(j) + k for k, j in enumerate(i.split('-'))])) if '-' in i else [i]) for i in vlans.split(',')), []) for vlan in vlans: vlan_dict[str(vlan)]['interfaces'].append(ifname) processed_data = np.delete(processed_data, drop_indices).tolist() return processed_data
def _clean_common_ios_data(self, processed_data, _): for entry in processed_data: if entry['macaddr'] is None: entry['state'] = "failed" entry['macaddr'] = '00:00:00:00:00:00' else: entry['macaddr'] = convert_macaddr_format_to_colon( entry.get('macaddr', '0000.0000.0000')) entry['state'] = "reachable" if ':' in entry['ipAddress']: # We need to fix up the interface name for IPv6 ND entriie entry['oif'] = expand_ios_ifname(entry.get('oif', '')) return processed_data
def _clean_iosxe_data(self, processed_data, _): drop_indices = [] for i, entry in enumerate(processed_data): if not entry['ifname']: drop_indices.append(i) for field in ['ifname', 'peerIfname']: entry[field] = expand_ios_ifname(entry[field]) if ' ' in entry.get(field, ''): entry[field] = entry[field].replace(' ', '') self._common_cleaner(entry) processed_data = np.delete(processed_data, drop_indices).tolist() return processed_data
def _clean_iosxe_data(self, processed_data, _): for entry in processed_data: entry['macaddr'] = convert_macaddr_format_to_colon( entry.get('macaddr', '0000.0000.0000')) oifs = '' for oif in entry.get('oif', '').split(','): # Handle multicast entries oifs += f'{expand_ios_ifname(oif)} ' if oifs: entry['oif'] = oifs.strip() else: entry['oif'] = expand_ios_ifname(entry['oif']) entry['remoteVtepIp'] = '' if entry.get('vlan', ' ').strip() == "All": entry['vlan'] = 0 entry['flags'] = entry.get('flags', '').lower() self._add_mackey_protocol(entry) return processed_data
def _clean_iosxr_data(self, processed_data, raw_data): entry_dict = {} devtype = raw_data[0].get('devtype', 'iosxr') for _, entry in enumerate(processed_data): if entry.get('_entryType', '') == 'vrf': entry['master'] = '' entry['type'] = 'vrf' entry['mtu'] = -1 entry['state'] = entry['adminState'] = 'up' entry['macaddr'] = "00:00:00:00:00:00" entry['speed'] = NO_SPEED continue if entry.get('_bondMbrs', ''): bond_mbrs = ' '.join(entry['_bondMbrs']) else: bond_mbrs = '' state = entry.get('state', '') if 'up' in state: # IOSVL2 images show up as up (connected) entry['state'] = 'up' elif 'down' in state: if 'notconnect' in state: entry['state'] = 'notConnected' if 'Autostate Enabled' in state: entry['state'] = 'down' entry['reason'] = state.split(',')[1].strip() if 'err-disabled' in state: entry['state'] = 'errDisabled' iftype = entry.get('type', 'ethernet').lower() if '.' in entry.get('ifname', ''): iftype = 'subinterface' elif iftype in [ 'aggregated ethernet', 'gechannel', 'etherchannel' ]: iftype = 'bond' elif iftype in ['ethernet', 'igbe', 'csr']: iftype = 'ethernet' elif any(x in iftype for x in ['gigabit ethernet', 'rp management']): iftype = 'ethernet' elif iftype.endswith('gige'): iftype = 'ethernet' elif iftype.endswith('ge'): # Is this safe, assuming just ge ending means GigE? iftype = 'ethernet' elif iftype.endswith('ethernet'): iftype = 'ethernet' # More iftype processing below before setting it in entry speed = self._textfsm_valid_speed_value(entry) if speed != MISSING_SPEED: speed = int(speed) / 1000 # is in Kbps entry['speed'] = speed if iftype == 'bond' and bond_mbrs: for mbr in bond_mbrs.split(): mbr = mbr.strip() # expand the member name mbr = expand_ios_ifname(mbr) if mbr in entry_dict: mbr_entry = entry_dict[mbr] mbr_entry['type'] = 'bond_slave' mbr_entry['master'] = entry['ifname'] else: entry_dict[mbr] = { 'master': entry['ifname'], 'type': 'bond_slave' } if entry['adminState'] == 'administratively down': entry['state'] = 'down' entry['adminState'] = 'down' entry['macaddr'] = convert_macaddr_format_to_colon( entry.get('macaddr', '0000.0000.0000')) if not entry['macaddr']: entry['macaddr'] = '00:00:00:00:00:00' if entry['type'] == 'null': entry['macaddr'] = "00:00:00:00:00:00" entry['interfaceMac'] = convert_macaddr_format_to_colon( entry.get('interfaceMac', '0000.0000.0000')) lastChange = parse(entry.get('statusChangeTimestamp', ''), settings={ 'RELATIVE_BASE': datetime.fromtimestamp( (raw_data[0]['timestamp']) / 1000), }) if lastChange: entry['statusChangeTimestamp'] = int(lastChange.timestamp() * 1000) if 'ipAddressList' not in entry: entry['ipAddressList'] = [] entry['ip6AddressList'] = [] elif ':' in entry['ipAddressList']: entry['ip6AddressList'] = entry['ipAddressList'] entry['ipAddressList'] = [] elif devtype == 'iosxr': entry['ip6AddressList'] = [] if entry['ifname'].startswith('Vlan'): iftype = 'vlan' if entry.get('vlan', '') == '': entry['vlan'] = entry['ifname'].split('Vlan')[1].strip() if entry.get('vlan', '') and entry.get('innerVlan', ''): iftype = "qinq" entry['type'] = iftype # This is specifically for IOSXE/IOS devices where # the IPv6 address uses capital letters if devtype != 'iosxr': entry['ip6AddressList'] = [ x.lower() for x in entry.get('ip6AddressList', []) ] if entry['ifname'].endswith('.0'): entry['vlan'] = 0 if entry['ipAddressList'] == 'Unknown': entry['ipAddressList'] = [] entry['ip6AddressList'] = [] if entry['ipAddressList'] or entry['ip6AddressList']: entry['master'] = entry.get('vrf', '') if entry['ifname'] in entry_dict: add_info = entry_dict[entry['ifname']] entry['master'] = add_info.get('master', '') entry['type'] = add_info.get('type', '') else: entry_dict[entry['ifname']] = entry return processed_data