Skip to content
This repository was archived by the owner on Sep 17, 2019. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
161 changes: 91 additions & 70 deletions napalm_base/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@

# Python std lib
import sys
import inspect
import importlib
import pkg_resources

# Verify Python Version that is running
Expand All @@ -32,83 +30,106 @@
except AttributeError:
raise RuntimeError('NAPALM requires Python 2.7 or Python3')

# NAPALM base
from napalm_base.base import NetworkDriver
from napalm_base.exceptions import ModuleImportError
from napalm_base.mock import MockDriver
from napalm_base.utils import py23_compat
# Try to import napalm
try:
import napalm
HAS_NAPALM = True
try:
NAPALM_MAJOR = int(napalm.__version__.split('.')[0])
except AttributeError:
NAPALM_MAJOR = 0
except ImportError:
HAS_NAPALM = False

try:
__version__ = pkg_resources.get_distribution('napalm-base').version
except pkg_resources.DistributionNotFound:
__version__ = "Not installed"


__all__ = [
'get_network_driver', # export the function
'NetworkDriver' # also export the base class
]

if HAS_NAPALM and NAPALM_MAJOR >= 2:
# If napalm >= 2.0.0 is installed, then import get_network_driver
from napalm import get_network_driver
from napalm.base import NetworkDriver
else:
# Import std lib
import inspect
import importlib

# Import local modules
from napalm_base.exceptions import ModuleImportError
from napalm_base.mock import MockDriver
from napalm_base.utils import py23_compat
from napalm_base.base import NetworkDriver

def get_network_driver(module_name, prepend=True):
"""
Searches for a class derived form the base NAPALM class NetworkDriver in a specific library.
The library name must repect the following pattern: napalm_[DEVICE_OS].
NAPALM community supports a list of devices and provides the corresponding libraries; for
full reference please refer to the `Supported Network Operation Systems`_ paragraph on
`Read the Docs`_.

.. _`Supported Network Operation Systems`: \
http://napalm.readthedocs.io/en/latest/#supported-network-operating-systems
.. _`Read the Docs`: \
http://napalm.readthedocs.io/

module_name
The name of the device operating system or the name of the library.

:return: The first class derived from NetworkDriver, found in the library.

:raise ModuleImportError: When the library is not installed or a derived class from \
NetworkDriver was not found.

Example:

.. code-block:: python

>>> get_network_driver('junos')
<class 'napalm_junos.junos.JunOSDriver'>
>>> get_network_driver('IOS-XR')
<class 'napalm_iosxr.iosxr.IOSXRDriver'>
>>> get_network_driver('napalm_eos')
<class 'napalm_eos.eos.EOSDriver'>
>>> get_network_driver('wrong')
napalm_base.exceptions.ModuleImportError: Cannot import "napalm_wrong". Is the library \
installed?
"""
if module_name == "mock":
return MockDriver

if not (isinstance(module_name, py23_compat.string_types) and len(module_name) > 0):
raise ModuleImportError('Please provide a valid driver name.')

try:
# Only lowercase allowed
module_name = module_name.lower()
# Try to not raise error when users requests IOS-XR for e.g.
module_install_name = module_name.replace('-', '')
# Can also request using napalm_[SOMETHING]
if 'napalm_' not in module_install_name and prepend is True:
module_install_name = 'napalm_{name}'.format(name=module_install_name)
module = importlib.import_module(module_install_name)
except ImportError:
raise ModuleImportError(
'Cannot import "{install_name}". Is the library installed?'.format(
install_name=module_install_name
)
)

def get_network_driver(module_name, prepend=True):
"""
Searches for a class derived form the base NAPALM class NetworkDriver in a specific library.
The library name must repect the following pattern: napalm_[DEVICE_OS].
NAPALM community supports a list of devices and provides the corresponding libraries; for
full reference please refer to the `Supported Network Operation Systems`_ paragraph on
`Read the Docs`_.

.. _`Supported Network Operation Systems`: \
http://napalm.readthedocs.io/en/latest/#supported-network-operating-systems
.. _`Read the Docs`: \
http://napalm.readthedocs.io/

:param module_name: the name of the device operating system or the name of the library.
:return: the first class derived from NetworkDriver, found in the library.
:raise ModuleImportError: when the library is not installed or a derived class from \
NetworkDriver was not found.

Example::

.. code-block:: python

>>> get_network_driver('junos')
<class 'napalm_junos.junos.JunOSDriver'>
>>> get_network_driver('IOS-XR')
<class 'napalm_iosxr.iosxr.IOSXRDriver'>
>>> get_network_driver('napalm_eos')
<class 'napalm_eos.eos.EOSDriver'>
>>> get_network_driver('wrong')
napalm_base.exceptions.ModuleImportError: Cannot import "napalm_wrong". Is the library \
installed?
"""
if module_name == "mock":
return MockDriver

if not (isinstance(module_name, py23_compat.string_types) and len(module_name) > 0):
raise ModuleImportError('Please provide a valid driver name.')
for name, obj in inspect.getmembers(module):
if inspect.isclass(obj) and issubclass(obj, NetworkDriver):
return obj

try:
# Only lowercase allowed
module_name = module_name.lower()
# Try to not raise error when users requests IOS-XR for e.g.
module_install_name = module_name.replace('-', '')
# Can also request using napalm_[SOMETHING]
if 'napalm_' not in module_install_name and prepend is True:
module_install_name = 'napalm_{name}'.format(name=module_install_name)
module = importlib.import_module(module_install_name)
except ImportError:
# looks like you don't have any Driver class in your module...
raise ModuleImportError(
'Cannot import "{install_name}". Is the library installed?'.format(
install_name=module_install_name
)
)
'No class inheriting "napalm_base.base.NetworkDriver" found in "{install_name}".'
.format(install_name=module_install_name))

for name, obj in inspect.getmembers(module):
if inspect.isclass(obj) and issubclass(obj, NetworkDriver):
return obj

# looks like you don't have any Driver class in your module...
raise ModuleImportError(
'No class inheriting "napalm_base.base.NetworkDriver" found in "{install_name}".'
.format(install_name=module_install_name))
__all__ = [
'get_network_driver', # export the function
'NetworkDriver' # also export the base class
]
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

setup(
name="napalm-base",
version='0.25.0',
version='1.0.0',
packages=find_packages(),
author="David Barroso, Kirk Byers, Mircea Ulinic",
author_email="dbarrosop@dravetech.com, ping@mirceaulinic.net, ktbyers@twb-tech.com",
Expand Down