1717import re
1818import socket
1919
20- from first import first
2120from napalm import get_network_driver
2221from napalm .base .exceptions import ConnectionException , CommandErrorException
2322
@@ -217,6 +216,9 @@ def get_required_info(self):
217216 try :
218217 platform_slug = self .get_platform_slug ()
219218 platform_object = self .get_platform_object_from_netbox (platform_slug = platform_slug )
219+ if self .ot .platform != platform_object :
220+ self .ot .platform = platform_object
221+ self .ot .save ()
220222
221223 driver_name = platform_object .napalm_driver
222224
@@ -248,17 +250,18 @@ def get_required_info(self):
248250 # locate the interface assigned with the mgmt_ipaddr value and retain
249251 # the interface name and IP prefix-length so that we can use it later
250252 # when creating the IPAM IP-Address instance.
253+ # Note that in some cases (e.g., NAT) the mgmt_ipaddr may differ than
254+ # the interface addresses present on the device. We need to handle this.
251255
252- try :
253- mgmt_ifname , mgmt_pflen = first (
254- ( if_name , if_addr_data [ "prefix_length" ])
255- for if_name , if_data in ip_ifs .items ()
256- for if_addr , if_addr_data in if_data [ "ipv4" ]. items ()
257- if if_addr == mgmt_ipaddr
258- )
256+ def get_mgmt_info () :
257+ """Get the interface name and prefix length for the management interface."""
258+ for if_name , if_data in ip_ifs . items ():
259+ for if_addr , if_addr_data in if_data [ "ipv4" ] .items ():
260+ if if_addr == mgmt_ipaddr :
261+ return ( if_name , if_addr_data [ "prefix_length" ])
262+ return ( "PLACEHOLDER" , 0 )
259263
260- except Exception as exc :
261- raise OnboardException (reason = "fail-general" , message = str (exc ))
264+ mgmt_ifname , mgmt_pflen = get_mgmt_info ()
262265
263266 # retain the attributes that will be later used by NetBox processing.
264267
@@ -322,14 +325,14 @@ def ensure_device_type(
322325 # instance.
323326
324327 try :
325- self .manufacturer = Manufacturer .objects .get (slug = self .netdev .vendor )
328+ self .manufacturer = Manufacturer .objects .get (slug = self .netdev .vendor . lower () )
326329 except Manufacturer .DoesNotExist :
327330 if not create_manufacturer :
328331 raise OnboardException (
329332 reason = "fail-config" , message = f"ERROR manufacturer not found: { self .netdev .vendor } "
330333 )
331334
332- self .manufacturer = Manufacturer .objects .create (name = self .netdev .vendor , slug = self .netdev .vendor )
335+ self .manufacturer = Manufacturer .objects .create (name = self .netdev .vendor , slug = self .netdev .vendor . lower () )
333336 self .manufacturer .save ()
334337
335338 # Now see if the device type (slug) already exists,
@@ -343,7 +346,9 @@ def ensure_device_type(
343346 logging .warning ("device model is now: %s" , self .netdev .model )
344347
345348 try :
346- self .device_type = DeviceType .objects .get (slug = self .netdev .model )
349+ self .device_type = DeviceType .objects .get (slug = self .netdev .model .lower ())
350+ self .netdev .ot .device_type = self .device_type .slug
351+ self .netdev .ot .save ()
347352 except DeviceType .DoesNotExist :
348353 if not create_device_type :
349354 raise OnboardException (
@@ -352,9 +357,11 @@ def ensure_device_type(
352357
353358 logging .info ("CREATE: device-type: %s" , self .netdev .model )
354359 self .device_type = DeviceType .objects .create (
355- slug = self .netdev .model , model = self .netdev .model .upper (), manufacturer = self .manufacturer
360+ slug = self .netdev .model . lower () , model = self .netdev .model .upper (), manufacturer = self .manufacturer
356361 )
357362 self .device_type .save ()
363+ self .netdev .ot .device_type = self .device_type .slug
364+ self .netdev .ot .save ()
358365 return
359366
360367 if self .device_type .manufacturer .id != self .manufacturer .id :
@@ -398,6 +405,7 @@ def ensure_device_role(
398405
399406 def ensure_device_instance (self ):
400407 """Ensure that the device instance exists in NetBox and is assigned the provided device role or DEFAULT_ROLE."""
408+ # TODO: this can create duplicate entries in NetBox...
401409 device , _ = Device .objects .get_or_create (
402410 name = self .netdev .hostname ,
403411 device_type = self .device_type ,
@@ -409,7 +417,7 @@ def ensure_device_instance(self):
409417 device .serial = self .netdev .serial_number
410418 device .save ()
411419
412- self .netdev .ot .device = device
420+ self .netdev .ot .created_device = device
413421 self .netdev .ot .save ()
414422
415423 self .device = device
0 commit comments