Skip to content

Commit 1d26790

Browse files
authored
Merge pull request #108 from networktocode/develop-2.0-napalm-support
Napalm and Netmiko optional arguments support
2 parents ed63156 + b184a9f commit 1d26790

File tree

3 files changed

+56
-12
lines changed

3 files changed

+56
-12
lines changed

netbox_onboarding/netdev_keeper.py

+37-8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from django.conf import settings
2020
from napalm import get_network_driver
2121
from napalm.base.exceptions import ConnectionException, CommandErrorException
22+
from napalm.base.netmiko_helpers import netmiko_args
2223
from netmiko.ssh_autodetect import SSHDetect
2324
from netmiko.ssh_exception import NetMikoAuthenticationException
2425
from netmiko.ssh_exception import NetMikoTimeoutException
@@ -62,7 +63,15 @@ class NetdevKeeper:
6263
"""Used to maintain information about the network device during the onboarding process."""
6364

6465
def __init__( # pylint: disable=R0913
65-
self, hostname, port=None, timeout=None, username=None, password=None, secret=None, napalm_driver=None
66+
self,
67+
hostname,
68+
port=None,
69+
timeout=None,
70+
username=None,
71+
password=None,
72+
secret=None,
73+
napalm_driver=None,
74+
optional_args=None,
6675
):
6776
"""Initialize the network device keeper instance and ensure the required configuration parameters are provided.
6877
@@ -83,17 +92,21 @@ def __init__( # pylint: disable=R0913
8392
self.hostname = hostname
8493
self.port = port
8594
self.timeout = timeout
86-
self.username = username or settings.NAPALM_USERNAME
87-
self.password = password or settings.NAPALM_PASSWORD
88-
self.secret = secret or settings.NAPALM_ARGS.get("secret", None)
95+
self.username = username
96+
self.password = password
97+
self.secret = secret
8998
self.napalm_driver = napalm_driver
99+
self.optional_args = optional_args
90100

91101
self.facts = None
92102
self.ip_ifs = None
93103
self.netmiko_device_type = None
94104
self.onboarding_class = StandaloneOnboarding
95105
self.driver_addon_result = None
96106

107+
# Enable loading driver extensions
108+
self.load_driver_extension = True
109+
97110
def check_reachability(self):
98111
"""Ensure that the device at the mgmt-ipaddr provided is reachable.
99112
@@ -120,14 +133,25 @@ def guess_netmiko_device_type(self):
120133
"""Guess the device type of host, based on Netmiko."""
121134
guessed_device_type = None
122135

136+
netmiko_optional_args = netmiko_args(self.optional_args)
137+
123138
remote_device = {
124139
"device_type": "autodetect",
125140
"host": self.hostname,
126141
"username": self.username,
127142
"password": self.password,
128-
"secret": self.secret,
143+
**netmiko_optional_args,
129144
}
130145

146+
if self.secret:
147+
remote_device["secret"] = self.secret
148+
149+
if self.port:
150+
remote_device["port"] = self.port
151+
152+
if self.timeout:
153+
remote_device["timeout"] = self.timeout
154+
131155
try:
132156
logger.info("INFO guessing device type: %s", self.hostname)
133157
guesser = SSHDetect(**remote_device)
@@ -201,8 +225,13 @@ def get_onboarding_facts(self):
201225
self.check_napalm_driver_name()
202226

203227
driver = get_network_driver(self.napalm_driver)
204-
optional_args = settings.NAPALM_ARGS.copy()
205-
optional_args["secret"] = self.secret
228+
229+
optional_args = self.optional_args.copy()
230+
if self.port:
231+
optional_args["port"] = self.port
232+
233+
if self.secret:
234+
optional_args["secret"] = self.secret
206235

207236
napalm_device = driver(
208237
hostname=self.hostname,
@@ -222,7 +251,7 @@ def get_onboarding_facts(self):
222251

223252
module_name = PLUGIN_SETTINGS["onboarding_extensions_map"].get(self.napalm_driver)
224253

225-
if module_name:
254+
if module_name and self.load_driver_extension:
226255
try:
227256
module = importlib.import_module(module_name)
228257
driver_addon_class = module.OnboardingDriverExtensions(napalm_device=napalm_device)

netbox_onboarding/onboard.py

+18-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
limitations under the License.
1313
"""
1414

15+
import json
16+
1517
from django.conf import settings
1618

1719
from .netdev_keeper import NetdevKeeper
@@ -34,6 +36,16 @@ def napalm_driver(self):
3436

3537
return None
3638

39+
@property
40+
def optional_args(self):
41+
"""Return platform optional args."""
42+
if self.ot.platform and self.ot.platform.napalm_args:
43+
napalm_args = json.loads(self.ot.platform.napalm_args)
44+
45+
return napalm_args
46+
47+
return {}
48+
3749
@property
3850
def ip_address(self):
3951
"""Return ot's ip address."""
@@ -75,13 +87,13 @@ class OnboardingManager:
7587

7688
def __init__(self, ot, username, password, secret):
7789
"""Inits class."""
78-
self.username = username
79-
self.password = password
80-
self.secret = secret
81-
8290
# Create instance of Onboarding Task Manager class:
8391
otm = OnboardingTaskManager(ot)
8492

93+
self.username = username or settings.NAPALM_USERNAME
94+
self.password = password or settings.NAPALM_PASSWORD
95+
self.secret = secret or otm.optional_args.get("secret", None) or settings.NAPALM_ARGS.get("secret", None)
96+
8597
netdev = NetdevKeeper(
8698
hostname=otm.ip_address,
8799
port=otm.port,
@@ -90,6 +102,7 @@ def __init__(self, ot, username, password, secret):
90102
password=self.password,
91103
secret=self.secret,
92104
napalm_driver=otm.napalm_driver,
105+
optional_args=otm.optional_args or settings.NAPALM_ARGS,
93106
)
94107

95108
netdev.get_onboarding_facts()
@@ -116,6 +129,7 @@ def __init__(self, ot, username, password, secret):
116129
}
117130

118131
onboarding_cls = netdev_dict["onboarding_class"]()
132+
onboarding_cls.credentials = {"username": self.username, "password": self.password, "secret": self.secret}
119133
onboarding_cls.run(onboarding_kwargs=onboarding_kwargs)
120134

121135
self.created_device = onboarding_cls.created_device

netbox_onboarding/onboarding/onboarding.py

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Onboarding:
2121
def __init__(self):
2222
"""Init the class."""
2323
self.created_device = None
24+
self.credentials = None
2425

2526
def run(self, onboarding_kwargs):
2627
"""Implement run method."""

0 commit comments

Comments
 (0)