Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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