diff --git a/validator/interface.py b/validator/interface.py index 8bc0f1d..702d60a 100644 --- a/validator/interface.py +++ b/validator/interface.py @@ -21,6 +21,33 @@ class NullHandler(logging.Handler): def emit(self, record): pass +def get_qinx_parent_by_name(yaml, ifname): + """ Returns the sub-interface which matches a QinAD or QinQ outer tag, or None + if that sub-interface doesn't exist. """ + + if not is_qinx(yaml, ifname): + return None + qinx_iface = get_by_name(yaml, ifname) + if not qinx_iface: + return None + + qinx_encap = get_encapsulation(yaml, ifname) + if not qinx_encap: + return None + + for ifname, iface in yaml['interfaces'].items(): + for subid, sub_iface in iface['sub-interfaces'].items(): + sub_ifname = "%s.%d" % (ifname, subid) + sub_encap = get_encapsulation(yaml, sub_ifname) + if not sub_encap: + continue + if qinx_encap['dot1q'] > 0 and sub_encap['dot1q'] == qinx_encap['dot1q']: + return sub_ifname + if qinx_encap['dot1ad'] > 0 and sub_encap['dot1ad'] == qinx_encap['dot1ad']: + return sub_ifname + return None + + def get_parent_by_name(yaml, ifname): """ Returns the sub-interface's parent, or None if the sub-int doesn't exist. """ if not '.' in ifname: diff --git a/validator/test_interface.py b/validator/test_interface.py index 64848b2..46c5787 100644 --- a/validator/test_interface.py +++ b/validator/test_interface.py @@ -114,3 +114,11 @@ class TestInterfaceMethods(unittest.TestCase): def test_l3(self): self.assertTrue(interface.is_l3(self.cfg, "GigabitEthernet1/0/0")) self.assertFalse(interface.is_l3(self.cfg, "GigabitEthernet3/0/0")) + + def test_qinx_parent(self): + self.assertEqual(interface.get_qinx_parent_by_name(self.cfg, "GigabitEthernet1/0/1.202"), "GigabitEthernet1/0/1.200") + self.assertEqual(interface.get_qinx_parent_by_name(self.cfg, "GigabitEthernet1/0/1.203"), "GigabitEthernet1/0/1.201") + self.assertIsNone(interface.get_qinx_parent_by_name(self.cfg, "GigabitEthernet1/0/1")) + self.assertIsNone(interface.get_qinx_parent_by_name(self.cfg, "GigabitEthernet1/0/1.100")) + self.assertIsNone(interface.get_qinx_parent_by_name(self.cfg, "GigabitEthernet1/0/1.200")) + self.assertIsNone(interface.get_qinx_parent_by_name(self.cfg, "GigabitEthernet1/0/1.201"))