19
19
from django .conf import settings
20
20
from napalm import get_network_driver
21
21
from napalm .base .exceptions import ConnectionException , CommandErrorException
22
+ from napalm .base .netmiko_helpers import netmiko_args
22
23
from netmiko .ssh_autodetect import SSHDetect
23
24
from netmiko .ssh_exception import NetMikoAuthenticationException
24
25
from netmiko .ssh_exception import NetMikoTimeoutException
@@ -62,7 +63,15 @@ class NetdevKeeper:
62
63
"""Used to maintain information about the network device during the onboarding process."""
63
64
64
65
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 ,
66
75
):
67
76
"""Initialize the network device keeper instance and ensure the required configuration parameters are provided.
68
77
@@ -83,17 +92,21 @@ def __init__( # pylint: disable=R0913
83
92
self .hostname = hostname
84
93
self .port = port
85
94
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
89
98
self .napalm_driver = napalm_driver
99
+ self .optional_args = optional_args
90
100
91
101
self .facts = None
92
102
self .ip_ifs = None
93
103
self .netmiko_device_type = None
94
104
self .onboarding_class = StandaloneOnboarding
95
105
self .driver_addon_result = None
96
106
107
+ # Enable loading driver extensions
108
+ self .load_driver_extension = True
109
+
97
110
def check_reachability (self ):
98
111
"""Ensure that the device at the mgmt-ipaddr provided is reachable.
99
112
@@ -120,14 +133,25 @@ def guess_netmiko_device_type(self):
120
133
"""Guess the device type of host, based on Netmiko."""
121
134
guessed_device_type = None
122
135
136
+ netmiko_optional_args = netmiko_args (self .optional_args )
137
+
123
138
remote_device = {
124
139
"device_type" : "autodetect" ,
125
140
"host" : self .hostname ,
126
141
"username" : self .username ,
127
142
"password" : self .password ,
128
- "secret" : self . secret ,
143
+ ** netmiko_optional_args ,
129
144
}
130
145
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
+
131
155
try :
132
156
logger .info ("INFO guessing device type: %s" , self .hostname )
133
157
guesser = SSHDetect (** remote_device )
@@ -201,8 +225,13 @@ def get_onboarding_facts(self):
201
225
self .check_napalm_driver_name ()
202
226
203
227
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
206
235
207
236
napalm_device = driver (
208
237
hostname = self .hostname ,
@@ -222,7 +251,7 @@ def get_onboarding_facts(self):
222
251
223
252
module_name = PLUGIN_SETTINGS ["onboarding_extensions_map" ].get (self .napalm_driver )
224
253
225
- if module_name :
254
+ if module_name and self . load_driver_extension :
226
255
try :
227
256
module = importlib .import_module (module_name )
228
257
driver_addon_class = module .OnboardingDriverExtensions (napalm_device = napalm_device )
0 commit comments