Skip to content

Commit

Permalink
Move canonical_interface_name, base_interfaces to netutils (#1904)
Browse files Browse the repository at this point in the history
Co-authored-by: itdependsnetworks <ken@celenza.org>
  • Loading branch information
ktbyers and itdependsnetworks committed Apr 20, 2023
1 parent 7544274 commit 8e7d663
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 341 deletions.
5 changes: 2 additions & 3 deletions napalm/base/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from typing_extensions import Literal

from netmiko import ConnectHandler, NetMikoTimeoutException
from netutils.interface import canonical_interface_name

# local modules
import napalm.base.exceptions
Expand Down Expand Up @@ -1805,8 +1806,6 @@ def compliance_report(
def _canonical_int(self, interface: str) -> str:
"""Expose the helper function within this class."""
if self.use_canonical_interface is True:
return napalm.base.helpers.canonical_interface_name(
interface, addl_name_map=None
)
return canonical_interface_name(interface, addl_name_map=None)
else:
return interface
157 changes: 4 additions & 153 deletions napalm/base/canonical_map.py
Original file line number Diff line number Diff line change
@@ -1,153 +1,4 @@
base_interfaces = {
"ATM": "ATM",
"AT": "ATM",
"B": "Bdi",
"Bd": "Bdi",
"Bdi": "Bdi",
"EOBC": "EOBC",
"EO": "EOBC",
"Ethernet": "Ethernet",
"Eth": "Ethernet",
"eth": "Ethernet",
"Et": "Ethernet",
"et": "Ethernet",
"FastEthernet": "FastEthernet",
"FastEth": "FastEthernet",
"FastE": "FastEthernet",
"Fast": "FastEthernet",
"Fas": "FastEthernet",
"FE": "FastEthernet",
"Fa": "FastEthernet",
"fa": "FastEthernet",
"Fddi": "Fddi",
"FD": "Fddi",
"FortyGigabitEthernet": "FortyGigabitEthernet",
"FortyGigEthernet": "FortyGigabitEthernet",
"FortyGigEth": "FortyGigabitEthernet",
"FortyGigE": "FortyGigabitEthernet",
"FortyGig": "FortyGigabitEthernet",
"FGE": "FortyGigabitEthernet",
"FO": "FortyGigabitEthernet",
"Fo": "FortyGigabitEthernet",
"FiftyGigabitEthernet": "FiftyGigabitEthernet",
"FiftyGigEthernet": "FiftyGigabitEthernet",
"FiftyGigEth": "FiftyGigabitEthernet",
"FiftyGigE": "FiftyGigabitEthernet",
"FI": "FiftyGigabitEthernet",
"Fi": "FiftyGigabitEthernet",
"fi": "FiftyGigabitEthernet",
"GigabitEthernet": "GigabitEthernet",
"GigEthernet": "GigabitEthernet",
"GigEth": "GigabitEthernet",
"GigE": "GigabitEthernet",
"Gig": "GigabitEthernet",
"GE": "GigabitEthernet",
"Ge": "GigabitEthernet",
"ge": "GigabitEthernet",
"Gi": "GigabitEthernet",
"gi": "GigabitEthernet",
"HundredGigabitEthernet": "HundredGigabitEthernet",
"HundredGigEthernet": "HundredGigabitEthernet",
"HundredGigEth": "HundredGigabitEthernet",
"HundredGigE": "HundredGigabitEthernet",
"HundredGig": "HundredGigabitEthernet",
"Hu": "HundredGigabitEthernet",
"TwentyFiveGigabitEthernet": "TwentyFiveGigabitEthernet",
"TwentyFiveGigEthernet": "TwentyFiveGigabitEthernet",
"TwentyFiveGigEth": "TwentyFiveGigabitEthernet",
"TwentyFiveGigE": "TwentyFiveGigabitEthernet",
"TwentyFiveGig": "TwentyFiveGigabitEthernet",
"TF": "TwentyFiveGigabitEthernet",
"Tf": "TwentyFiveGigabitEthernet",
"tf": "TwentyFiveGigabitEthernet",
"TwoHundredGigabitEthernet": "TwoHundredGigabitEthernet",
"TwoHundredGigEthernet": "TwoHundredGigabitEthernet",
"TwoHundredGigEth": "TwoHundredGigabitEthernet",
"TwoHundredGigE": "TwoHundredGigabitEthernet",
"TwoHundredGig": "TwoHundredGigabitEthernet",
"TH": "TwoHundredGigabitEthernet",
"Th": "TwoHundredGigabitEthernet",
"th": "TwoHundredGigabitEthernet",
"FourHundredGigabitEthernet": "FourHundredGigabitEthernet",
"FourHundredGigEthernet": "FourHundredGigabitEthernet",
"FourHundredGigEth": "FourHundredGigabitEthernet",
"FourHundredGigE": "FourHundredGigabitEthernet",
"FourHundredGig": "FourHundredGigabitEthernet",
"F": "FourHundredGigabitEthernet",
"f": "FourHundredGigabitEthernet",
"Loopback": "Loopback",
"loopback": "Loopback",
"Lo": "Loopback",
"lo": "Loopback",
"Management": "Management",
"Mgmt": "Management",
"mgmt": "Management",
"Ma": "Management",
"Management_short": "Ma",
"MFR": "MFR",
"Multilink": "Multilink",
"Mu": "Multilink",
"n": "nve",
"nv": "nve",
"nve": "nve",
"PortChannel": "Port-channel",
"Port-channel": "Port-channel",
"Port-Channel": "Port-channel",
"port-channel": "Port-channel",
"po": "Port-channel",
"Po": "Port-channel",
"POS": "POS",
"PO": "POS",
"Serial": "Serial",
"Se": "Serial",
"S": "Serial",
"TenGigabitEthernet": "TenGigabitEthernet",
"TenGigEthernet": "TenGigabitEthernet",
"TenGigEth": "TenGigabitEthernet",
"TenGig": "TenGigabitEthernet",
"TeGig": "TenGigabitEthernet",
"Ten": "TenGigabitEthernet",
"T": "TenGigabitEthernet",
"Te": "TenGigabitEthernet",
"te": "TenGigabitEthernet",
"Tunnel": "Tunnel",
"Tun": "Tunnel",
"Tu": "Tunnel",
"Twe": "TwentyFiveGigE",
"Tw": "TwoGigabitEthernet",
"Two": "TwoGigabitEthernet",
"Virtual-Access": "Virtual-Access",
"Vi": "Virtual-Access",
"Virtual-Template": "Virtual-Template",
"Vt": "Virtual-Template",
"VLAN": "VLAN",
"V": "VLAN",
"Vl": "VLAN",
"Wlan-GigabitEthernet": "Wlan-GigabitEthernet",
}

reverse_mapping = {
"ATM": "At",
"EOBC": "EO",
"Ethernet": "Et",
"FastEthernet": "Fa",
"Fddi": "FD",
"FortyGigabitEthernet": "Fo",
"GigabitEthernet": "Gi",
"HundredGigabitEthernet": "Hu",
"Loopback": "Lo",
"Management": "Ma",
"MFR": "MFR",
"Multilink": "Mu",
"Port-channel": "Po",
"POS": "PO",
"Serial": "Se",
"TenGigabitEthernet": "Te",
"Tunnel": "Tu",
"TwoGigabitEthernet": "Two",
"TwentyFiveGigE": "Twe",
"Virtual-Access": "Vi",
"Virtual-Template": "Vt",
"VLAN": "Vl",
"Wlan-GigabitEthernet": "Wl-Gi",
}
# Do not remove the below imports, functions were moved to netutils, but to not
# break backwards compatibility, these should remain
from netutils.constants import BASE_INTERFACES as base_interfaces # noqa
from netutils.constants import REVERSE_MAPPING as reverse_mapping # noqa
96 changes: 9 additions & 87 deletions napalm/base/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@
from netaddr import mac_unix
from netutils.config.parser import IOSConfigParser

# Do not remove the below imports, functions were moved to netutils, but to not
# break backwards compatibility, these should remain
from netutils.interface import abbreviated_interface_name # noqa
from netutils.interface import canonical_interface_name # noqa
from netutils.constants import BASE_INTERFACES as base_interfaces # noqa
from netutils.constants import REVERSE_MAPPING as reverse_mapping # noqa
from netutils.interface import split_interface as _split_interface

try:
from ttp import quick_parse as ttp_quick_parse

Expand All @@ -30,7 +38,6 @@
from napalm.base import constants
from napalm.base.models import ConfigDict
from napalm.base.utils.jinja_filters import CustomJinjaFilters
from napalm.base.canonical_map import base_interfaces, reverse_mapping

T = TypeVar("T")
R = TypeVar("R")
Expand Down Expand Up @@ -564,92 +571,7 @@ def as_number(as_number_val: str) -> int:

def split_interface(intf_name: str) -> Tuple[str, str]:
"""Split an interface name based on first digit, slash, or space match."""
head = intf_name.rstrip(r"/\0123456789. ")
tail = intf_name[len(head) :].lstrip()
return (head, tail)


def canonical_interface_name(
interface: str, addl_name_map: Optional[Dict[str, str]] = None
) -> str:
"""Function to return an interface's canonical name (fully expanded name).
Use of explicit matches used to indicate a clear understanding on any potential
match. Regex and other looser matching methods were not implmented to avoid false
positive matches. As an example, it would make sense to do "[P|p][O|o]" which would
incorrectly match PO = POS and Po = Port-channel, leading to a false positive, not
easily troubleshot, found, or known.
:param interface: The interface you are attempting to expand.
:param addl_name_map: A dict containing key/value pairs that updates
the base mapping. Used if an OS has specific differences. e.g. {"Po": "PortChannel"} vs
{"Po": "Port-Channel"}
:type addl_name_map: optional
"""

name_map = {}
name_map.update(base_interfaces)
interface_type, interface_number = split_interface(interface)

if isinstance(addl_name_map, dict):
name_map.update(addl_name_map)
# check in dict for mapping
if name_map.get(interface_type):
long_int = name_map.get(interface_type)
assert isinstance(long_int, str)
return long_int + str(interface_number)
# if nothing matched, return the original name
else:
return interface


def abbreviated_interface_name(
interface: str,
addl_name_map: Optional[Dict[str, str]] = None,
addl_reverse_map: Optional[Dict[str, str]] = None,
) -> str:
"""Function to return an abbreviated representation of the interface name.
:param interface: The interface you are attempting to abbreviate.
:param addl_name_map: A dict containing key/value pairs that updates
the base mapping. Used if an OS has specific differences. e.g. {"Po": "PortChannel"} vs
{"Po": "Port-Channel"}
:type addl_name_map: optional
:param addl_reverse_map: A dict containing key/value pairs that updates
the reverse mapping. Used if an OS has specific differences. e.g. {"PortChannel": "Po"} vs
{"PortChannel": "po"}
:type addl_reverse_map: optional
"""

name_map = {}
name_map.update(base_interfaces)
interface_type, interface_number = split_interface(interface)

if isinstance(addl_name_map, dict):
name_map.update(addl_name_map)

rev_name_map = {}
rev_name_map.update(reverse_mapping)

if isinstance(addl_reverse_map, dict):
rev_name_map.update(addl_reverse_map)

# Try to ensure canonical type.
if name_map.get(interface_type):
canonical_type = name_map.get(interface_type)
else:
canonical_type = interface_type

assert isinstance(canonical_type, str)

try:
abbreviated_name = rev_name_map[canonical_type] + str(interface_number)
return abbreviated_name
except KeyError:
pass

# If abbreviated name lookup fails, return original name
return interface
return _split_interface(interface=intf_name)


def transform_lldp_capab(capabilities: Union[str, Any]) -> List[str]:
Expand Down
8 changes: 5 additions & 3 deletions napalm/ios/ios.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,17 @@
CommitConfirmException,
)
from napalm.base.helpers import (
canonical_interface_name,
transform_lldp_capab,
textfsm_extractor,
split_interface,
abbreviated_interface_name,
generate_regex_or,
sanitize_configs,
)
from netaddr.core import AddrFormatError
from netutils.interface import (
abbreviated_interface_name,
canonical_interface_name,
split_interface,
)
from napalm.base.netmiko_helpers import netmiko_args

# Easier to store these as constants
Expand Down
11 changes: 4 additions & 7 deletions napalm/nxos/nxos.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
from netmiko import file_transfer
from requests.exceptions import ConnectionError
from netutils.config.compliance import diff_network_config
from netutils.interface import canonical_interface_name

import napalm.base.constants as c

Expand Down Expand Up @@ -682,7 +683,7 @@ def get_lldp_neighbors_detail(
lldp_entry["remote_system_enable_capab"]
)
# Turn the interfaces into their long version
local_intf = napalm.base.helpers.canonical_interface_name(local_intf)
local_intf = canonical_interface_name(local_intf)
lldp.setdefault(local_intf, [])
lldp[local_intf].append(lldp_entry) # type: ignore

Expand Down Expand Up @@ -738,13 +739,9 @@ def _parse_vlan_ports(self, vlan_s: Union[str, List]) -> List:
find = re.findall(find_regexp, vls.strip())
if find:
for i in range(int(find[0][1]), int(find[0][2]) + 1):
vlans.append(
napalm.base.helpers.canonical_interface_name(
find[0][0] + str(i)
)
)
vlans.append(canonical_interface_name(find[0][0] + str(i)))
else:
vlans.append(napalm.base.helpers.canonical_interface_name(vls.strip()))
vlans.append(canonical_interface_name(vls.strip()))
return vlans

@abstractmethod
Expand Down

0 comments on commit 8e7d663

Please sign in to comment.