@@ -1442,6 +1442,7 @@ def update(self, data=None, read_from_netbox=False, source=None):
14421442
14431443 super ().update (data = data , read_from_netbox = read_from_netbox , source = source )
14441444
1445+
14451446class NBVLANGroup (NetBoxObject ):
14461447 name = "VLANGroup"
14471448 api_path = "ipam/vlan-groups"
@@ -1477,8 +1478,9 @@ def resolve_relations(self):
14771478
14781479 if isinstance (o_id , int ) and o_type is not None and self .data_model_relation .get (o_type ) is not None :
14791480 self .data ["scope_id" ] = self .inventory .get_by_id (self .data_model_relation .get (o_type ), nb_id = o_id )
1480- elif not isinstance (o_id , NetBoxObject ):
1481- log .debug (f"{ self .name } '{ self .data .get ('name' )} ' scope type '{ o_type } ' for '{ grab (self , 'data.scope.name' )} ' is currently not supported" )
1481+ elif o_id is not None and not isinstance (o_id , NetBoxObject ):
1482+ log .debug (f"{ self .name } '{ self .data .get ('name' )} ' scope type '{ o_type } ' for "
1483+ f"'{ grab (self , 'data.scope.name' )} ' is currently not supported" )
14821484 self .data ["scope_id" ] = ""
14831485
14841486 super ().resolve_relations ()
@@ -1500,16 +1502,16 @@ def matches_site_cluster(self, site=None, cluster=None) -> bool:
15001502
15011503 """
15021504 if isinstance (site , NBSite ):
1503- if isinstance (self .data [ "scope_id" ] , NBSite ) and self .data [ "scope_id" ] == site :
1505+ if isinstance (self .data . get ( "scope_id" ) , NBSite ) and self .data . get ( "scope_id" ) == site :
15041506 return True
1505- if (isinstance (self .data [ "scope_id" ] , NBSiteGroup ) and
1507+ if (isinstance (self .data . get ( "scope_id" ) , NBSiteGroup ) and
15061508 self .data ["scope_id" ] == grab (site , "data.group" )):
15071509 return True
15081510
15091511 if isinstance (cluster , NBCluster ):
1510- if isinstance (self .data [ "scope_id" ] , NBCluster ) and self .data [ "scope_id" ] == cluster :
1512+ if isinstance (self .data . get ( "scope_id" ) , NBCluster ) and self .data . get ( "scope_id" ) == cluster :
15111513 return True
1512- if (isinstance (self .data [ "scope_id" ] , NBClusterGroup ) and
1514+ if (isinstance (self .data . get ( "scope_id" ) , NBClusterGroup ) and
15131515 self .data ["scope_id" ] == grab (cluster , "data.group" )):
15141516 return True
15151517
@@ -1545,19 +1547,29 @@ def __init__(self, *args, **kwargs):
15451547 self .data_model = {
15461548 "prefix" : [IPv4Network , IPv6Network ],
15471549 "site" : NBSite ,
1550+ "scope_type" : ["dcim.site" , "dcim.sitegroup" ],
1551+ "scope_id" : [NBSite , NBSiteGroup ],
15481552 "tenant" : NBTenant ,
15491553 "vlan" : NBVLAN ,
15501554 "vrf" : NBVRF ,
15511555 "description" : 200 ,
15521556 "tags" : NBTagList
15531557 }
1558+ # add relation between two attributes
1559+ self .data_model_relation = {
1560+ "dcim.site" : NBSite ,
1561+ "dcim.sitegroup" : NBSiteGroup ,
1562+ NBSite : "dcim.site" ,
1563+ NBSiteGroup : "dcim.sitegroup" ,
1564+ }
1565+
15541566 super ().__init__ (* args , ** kwargs )
15551567
15561568 def update (self , data = None , read_from_netbox = False , source = None ):
15571569
15581570 # prefixes are parsed into ip_networks
15591571 data_prefix = data .get (self .primary_key )
1560- if data_prefix is not None and not isinstance (data_prefix , (IPv4Network , IPv6Network )):
1572+ if not isinstance (data_prefix , (IPv4Network , IPv6Network )) and data_prefix is not None :
15611573 try :
15621574 data [self .primary_key ] = ip_network (data_prefix )
15631575 except ValueError as e :
@@ -1569,6 +1581,47 @@ def update(self, data=None, read_from_netbox=False, source=None):
15691581 if read_from_netbox is False :
15701582 raise ValueError (f"Adding { self .name } by this program is currently not implemented." )
15711583
1584+ def resolve_relations (self ):
1585+
1586+ o_id = self .data .get ("scope_id" )
1587+ o_type = self .data .get ("scope_type" )
1588+
1589+ if isinstance (o_id , int ) and o_type is not None and self .data_model_relation .get (o_type ) is not None :
1590+ self .data ["scope_id" ] = self .inventory .get_by_id (self .data_model_relation .get (o_type ), nb_id = o_id )
1591+ elif o_id is not None and not isinstance (o_id , NetBoxObject ):
1592+ log .debug (f"{ self .name } '{ self .data .get ('name' )} ' scope type '{ o_type } ' for "
1593+ f"'{ grab (self , 'data.scope.name' )} ' is currently not supported" )
1594+ self .data ["scope_id" ] = ""
1595+
1596+ super ().resolve_relations ()
1597+
1598+ def matches_site (self , site = None ) -> bool :
1599+ """
1600+ tries to figure out if this prefix matches a certain site or site group
1601+
1602+ Parameters
1603+ ----------
1604+ site: NBSite
1605+ the site object to match to
1606+
1607+ Returns
1608+ -------
1609+ bool: True if matches one of the params
1610+
1611+ """
1612+ if isinstance (site , NBSite ):
1613+ if isinstance (self .data .get ("scope_id" ), NBSite ) and self .data .get ("scope_id" ) == site :
1614+ return True
1615+ if (isinstance (self .data .get ("scope_id" ), NBSiteGroup ) and
1616+ self .data ["scope_id" ] == grab (site , "data.group" )):
1617+ return True
1618+
1619+ # compatible for NetBox versions < 4.2.0
1620+ if self .data .get ("site" ) == site :
1621+ return True
1622+
1623+ return False
1624+
15721625
15731626class NBManufacturer (NetBoxObject ):
15741627 name = "manufacturer"
@@ -1686,7 +1739,7 @@ def __init__(self, *args, **kwargs):
16861739 "type" : NBClusterType ,
16871740 "tenant" : NBTenant ,
16881741 "group" : NBClusterGroup ,
1689- "scope_type" : ["dcim.site" , "dcim.sitegroup" , "dcim.location" , "dcim.region" ],
1742+ "scope_type" : ["dcim.site" , "dcim.sitegroup" ],
16901743 "scope_id" : NBSite ,
16911744 "tags" : NBTagList
16921745 }
0 commit comments