Skip to content

Commit fa9e365

Browse files
authored
Merge pull request #91 from networktocode/psi-20200916
Fixes onboarding_extensions_map issue Render right_page onboarding template correctly Improves Logging for netdev_keeper.py
2 parents 7d118e7 + e992186 commit fa9e365

File tree

6 files changed

+62
-35
lines changed

6 files changed

+62
-35
lines changed

development/base_configuration.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,20 @@
114114

115115
# Enable custom logging. Please see the Django documentation for detailed guidance on configuring custom logs:
116116
# https://docs.djangoproject.com/en/1.11/topics/logging/
117-
LOGGING = {}
117+
LOGGING = {
118+
"version": 1,
119+
"disable_existing_loggers": False,
120+
"formatters": {"rq_console": {"format": "%(asctime)s %(message)s", "datefmt": "%H:%M:%S",},},
121+
"handlers": {
122+
"rq_console": {
123+
"level": "DEBUG",
124+
"class": "rq.utils.ColorizingStreamHandler",
125+
"formatter": "rq_console",
126+
"exclude": ["%(asctime)s"],
127+
},
128+
},
129+
"loggers": {"rq.worker": {"handlers": ["rq_console"], "level": "DEBUG"},},
130+
}
118131

119132
# Setting this to True will permit only authenticated users to access any part of NetBox. By default, anonymous users
120133
# are permitted to access most data in NetBox (excluding secrets) but not make any changes.

netbox_onboarding/netbox_keeper.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
from .constants import NETMIKO_TO_NAPALM_STATIC
2626
from .exceptions import OnboardException
2727

28+
logger = logging.getLogger("rq.worker")
29+
2830
PLUGIN_SETTINGS = settings.PLUGINS_CONFIG["netbox_onboarding"]
2931

3032

@@ -149,9 +151,9 @@ def ensure_device_type(
149151

150152
slug = self.netdev_model
151153
if self.netdev_model and re.search(r"[^a-zA-Z0-9\-_]+", slug):
152-
logging.warning("device model is not sluggable: %s", slug)
154+
logger.warning("device model is not sluggable: %s", slug)
153155
self.netdev_model = slug.replace(" ", "-")
154-
logging.warning("device model is now: %s", self.netdev_model)
156+
logger.warning("device model is now: %s", self.netdev_model)
155157

156158
# Use declared device type or auto-discovered model
157159
nb_device_type_text = self.netdev_nb_device_type_slug or self.netdev_model
@@ -172,7 +174,7 @@ def ensure_device_type(
172174

173175
except DeviceType.DoesNotExist:
174176
if create_device_type:
175-
logging.info("CREATE: device-type: %s", self.netdev_model)
177+
logger.info("CREATE: device-type: %s", self.netdev_model)
176178
self.nb_device_type = DeviceType.objects.create(
177179
slug=nb_device_type_slug, model=nb_device_type_slug.upper(), manufacturer=self.nb_manufacturer,
178180
)
@@ -237,7 +239,7 @@ def ensure_device_platform(self, create_platform_if_missing=PLUGIN_SETTINGS["cre
237239

238240
self.nb_platform = Platform.objects.get(slug=self.netdev_nb_platform_slug)
239241

240-
logging.info("PLATFORM: found in NetBox %s", self.netdev_nb_platform_slug)
242+
logger.info("PLATFORM: found in NetBox %s", self.netdev_nb_platform_slug)
241243

242244
except Platform.DoesNotExist:
243245
if create_platform_if_missing:
@@ -278,7 +280,7 @@ def ensure_device_instance(self, default_status=PLUGIN_SETTINGS["default_device_
278280
if self.netdev_mgmt_ip_address:
279281
onboarded_device = Device.objects.get(primary_ip4__address__net_host=self.netdev_mgmt_ip_address)
280282
except Device.DoesNotExist:
281-
logging.info(
283+
logger.info(
282284
"Could not find existing NetBox device for requested primary IP address (%s)",
283285
self.netdev_mgmt_ip_address,
284286
)
@@ -291,7 +293,7 @@ def ensure_device_instance(self, default_status=PLUGIN_SETTINGS["default_device_
291293
if onboarded_device:
292294
# Construct lookup arguments if onboarded device already exists in NetBox
293295

294-
logging.info(
296+
logger.info(
295297
"Found existing NetBox device (%s) for requested primary IP address (%s)",
296298
onboarded_device.name,
297299
self.netdev_mgmt_ip_address,
@@ -328,9 +330,9 @@ def ensure_device_instance(self, default_status=PLUGIN_SETTINGS["default_device_
328330
self.device, created = Device.objects.update_or_create(**lookup_args)
329331

330332
if created:
331-
logging.info("CREATED device: %s", self.netdev_hostname)
333+
logger.info("CREATED device: %s", self.netdev_hostname)
332334
else:
333-
logging.info("GOT/UPDATED device: %s", self.netdev_hostname)
335+
logger.info("GOT/UPDATED device: %s", self.netdev_hostname)
334336

335337
except Device.MultipleObjectsReturned:
336338
raise OnboardException(
@@ -350,7 +352,7 @@ def ensure_primary_ip(self):
350352
)
351353

352354
if created or not self.nb_primary_ip in self.nb_mgmt_ifname.ip_addresses.all():
353-
logging.info("ASSIGN: IP address %s to %s", self.nb_primary_ip.address, self.nb_mgmt_ifname.name)
355+
logger.info("ASSIGN: IP address %s to %s", self.nb_primary_ip.address, self.nb_mgmt_ifname.name)
354356
self.nb_mgmt_ifname.ip_addresses.add(self.nb_primary_ip)
355357
self.nb_mgmt_ifname.save()
356358

netbox_onboarding/netdev_keeper.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
from .constants import NETMIKO_TO_NAPALM_STATIC
3333
from .exceptions import OnboardException
3434

35+
logger = logging.getLogger("rq.worker")
36+
3537
PLUGIN_SETTINGS = settings.PLUGINS_CONFIG["netbox_onboarding"]
3638

3739

@@ -144,7 +146,7 @@ def check_reachability(self):
144146
OnboardException('fail-connect'):
145147
When device unreachable
146148
"""
147-
logging.info("CHECK: IP %s:%s", self.hostname, self.port)
149+
logger.info("CHECK: IP %s:%s", self.hostname, self.port)
148150

149151
try:
150152
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -169,32 +171,32 @@ def guess_netmiko_device_type(self):
169171
}
170172

171173
try:
172-
logging.info("INFO guessing device type: %s", self.hostname)
174+
logger.info("INFO guessing device type: %s", self.hostname)
173175
guesser = SSHDetect(**remote_device)
174176
guessed_device_type = guesser.autodetect()
175-
logging.info("INFO guessed device type: %s", guessed_device_type)
177+
logger.info("INFO guessed device type: %s", guessed_device_type)
176178

177179
except NetMikoAuthenticationException as err:
178-
logging.error("ERROR %s", err)
180+
logger.error("ERROR %s", err)
179181
raise OnboardException(reason="fail-login", message=f"ERROR: {str(err)}")
180182

181183
except (NetMikoTimeoutException, SSHException) as err:
182-
logging.error("ERROR: %s", str(err))
184+
logger.error("ERROR: %s", str(err))
183185
raise OnboardException(reason="fail-connect", message=f"ERROR: {str(err)}")
184186

185187
except Exception as err:
186-
logging.error("ERROR: %s", str(err))
188+
logger.error("ERROR: %s", str(err))
187189
raise OnboardException(reason="fail-general", message=f"ERROR: {str(err)}")
188190

189-
logging.info("INFO device type is: %s", guessed_device_type)
191+
logger.info("INFO device type is: %s", guessed_device_type)
190192

191193
return guessed_device_type
192194

193195
def set_napalm_driver_name(self):
194196
"""Sets napalm driver name."""
195197
if not self.napalm_driver:
196198
netmiko_device_type = self.guess_netmiko_device_type()
197-
logging.info("Guessed Netmiko Device Type: %s", netmiko_device_type)
199+
logger.info("Guessed Netmiko Device Type: %s", netmiko_device_type)
198200

199201
self.netmiko_device_type = netmiko_device_type
200202

@@ -234,7 +236,7 @@ def get_onboarding_facts(self):
234236

235237
self.check_reachability()
236238

237-
logging.info("COLLECT: device information %s", self.hostname)
239+
logger.info("COLLECT: device information %s", self.hostname)
238240

239241
try:
240242
# Get Napalm Driver with Netmiko if needed
@@ -257,20 +259,32 @@ def get_onboarding_facts(self):
257259

258260
napalm_device.open()
259261

260-
logging.info("COLLECT: device facts")
262+
logger.info("COLLECT: device facts")
261263
self.facts = napalm_device.get_facts()
262264

263-
logging.info("COLLECT: device interface IPs")
265+
logger.info("COLLECT: device interface IPs")
264266
self.ip_ifs = napalm_device.get_interfaces_ip()
265267

266-
try:
267-
module_name = PLUGIN_SETTINGS["onboarding_extensions_map"].get(self.napalm_driver)
268-
module = importlib.import_module(module_name)
269-
driver_addon_class = module.OnboardingDriverExtensions(napalm_device=napalm_device)
270-
self.onboarding_class = driver_addon_class.onboarding_class
271-
self.driver_addon_result = driver_addon_class.ext_result
272-
except ImportError as exc:
273-
logging.info("No onboarding extension found for driver %s", self.napalm_driver)
268+
module_name = PLUGIN_SETTINGS["onboarding_extensions_map"].get(self.napalm_driver)
269+
270+
if module_name:
271+
try:
272+
module = importlib.import_module(module_name)
273+
driver_addon_class = module.OnboardingDriverExtensions(napalm_device=napalm_device)
274+
self.onboarding_class = driver_addon_class.onboarding_class
275+
self.driver_addon_result = driver_addon_class.ext_result
276+
except ModuleNotFoundError as exc:
277+
raise OnboardException(
278+
reason="fail-general",
279+
message=f"ERROR: ModuleNotFoundError: Onboarding extension for napalm driver {self.napalm_driver} configured but can not be imported per configuration",
280+
)
281+
except ImportError as exc:
282+
raise OnboardException(reason="fail-general", message="ERROR: ImportError: %s" % exc.args[0])
283+
else:
284+
logger.info(
285+
"INFO: No onboarding extension defined for napalm driver %s, using default napalm driver",
286+
self.napalm_driver,
287+
)
274288

275289
except ConnectionException as exc:
276290
raise OnboardException(reason="fail-login", message=exc.args[0])

netbox_onboarding/template_content.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def right_page(self):
2525
"""Show table on right side of view."""
2626
onboarding = OnboardingDevice.objects.filter(device=self.context["object"]).first()
2727

28-
if not onboarding.enabled:
29-
return None
28+
if not onboarding or not onboarding.enabled:
29+
return ""
3030

3131
status = onboarding.status
3232
last_check_attempt_date = onboarding.last_check_attempt_date

netbox_onboarding/views.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
from .models import OnboardingTask
2626
from .tables import OnboardingTaskTable, OnboardingTaskFeedBulkTable
2727

28-
log = logging.getLogger("rq.worker")
29-
log.setLevel(logging.DEBUG)
28+
logger = logging.getLogger("rq.worker")
3029

3130

3231
if NETBOX_RELEASE_CURRENT < NETBOX_RELEASE_29:

netbox_onboarding/worker.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
from .onboard import OnboardingManager
2727

2828
logger = logging.getLogger("rq.worker")
29-
logger.setLevel(logging.DEBUG)
3029

3130

3231
@job("default")
@@ -80,7 +79,7 @@ def onboard_device(task_id, credentials): # pylint: disable=too-many-statements
8079
if onboarded_device:
8180
ot.created_device = onboarded_device
8281

83-
logger.error("Onboarding Error - OnboardException")
82+
logger.error("%s", exc)
8483
ot.status = OnboardingStatusChoices.STATUS_FAILED
8584
ot.failed_reason = exc.reason
8685
ot.message = exc.message

0 commit comments

Comments
 (0)