From 7ae82c297cd3ae3b0608fa2d225fab3666ede0f8 Mon Sep 17 00:00:00 2001 From: Pim van Pelt Date: Tue, 22 Mar 2022 13:04:56 +0000 Subject: [PATCH] Add get_lcps() to enumerate all LCP names in the system --- unittest/test_lcp.yaml | 17 +++++++++++++++++ validator/lcp.py | 33 +++++++++++++++++++++------------ validator/test_lcp.py | 11 +++++++++-- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/unittest/test_lcp.yaml b/unittest/test_lcp.yaml index 81f79ca..b828a62 100644 --- a/unittest/test_lcp.yaml +++ b/unittest/test_lcp.yaml @@ -23,3 +23,20 @@ interfaces: GigabitEthernet2/0/0: description: "This interface has no sub-ints" lcp: "e2" + + GigabitEthernet2/0/1: + description: "This LCP also on gi2/0/2" + lcp: "twice" + + GigabitEthernet2/0/2: + description: "This LCP also on gi2/0/1" + lcp: "twice" + + GigabitEthernet2/0/3: + description: "This LCP also on loop0" + lcp: "thrice" + +loopbacks: + loop0: + description: "This LCP also on gi2/0/3" + lcp: "thrice" diff --git a/validator/lcp.py b/validator/lcp.py index 2d9d236..aa1e170 100644 --- a/validator/lcp.py +++ b/validator/lcp.py @@ -13,23 +13,32 @@ # import logging -def is_unique(yaml, lcpname): - """ Returns True if there is at most one occurence of the LCP name in the entire config.""" - ncount=0 +def get_lcps(yaml): + """ Returns a list of all LCPs configured in the system, or an empty list if there are none. """ + + ret = [] if 'interfaces' in yaml: for ifname, iface in yaml['interfaces'].items(): - if 'lcp' in iface and iface['lcp'] == lcpname: - ncount = ncount + 1 + if 'lcp' in iface: + ret.append(iface['lcp']) if 'sub-interfaces' in iface: for sub_ifname, sub_iface in iface['sub-interfaces'].items(): - if 'lcp' in sub_iface and sub_iface['lcp'] == lcpname: - ncount = ncount + 1 + if 'lcp' in sub_iface: + ret.append(sub_iface['lcp']) + if 'loopbacks' in yaml: for ifname, iface in yaml['loopbacks'].items(): - if 'lcp' in iface and iface['lcp'] == lcpname: - ncount = ncount + 1 + if 'lcp' in iface: + ret.append(iface['lcp']) if 'bridgedomains' in yaml: for ifname, iface in yaml['bridgedomains'].items(): - if 'lcp' in iface and iface['lcp'] == lcpname: - ncount = ncount + 1 - return ncount < 2 + if 'lcp' in iface: + ret.append(iface['lcp']) + + return ret + +def is_unique(yaml, lcpname): + """ Returns True if there is at most one occurence of the LCP name in the entire config.""" + + lcps = get_lcps(yaml) + return lcps.count(lcpname) < 2 diff --git a/validator/test_lcp.py b/validator/test_lcp.py index 87682a7..aeeb4fb 100644 --- a/validator/test_lcp.py +++ b/validator/test_lcp.py @@ -8,12 +8,19 @@ class TestLCPMethods(unittest.TestCase): with open("unittest/test_lcp.yaml", "r") as f: self.cfg = yaml.load(f, Loader = yaml.FullLoader) + def test_enumerators(self): + lcps = lcp.get_lcps(self.cfg) + self.assertIn("e1", lcps) + self.assertIn("foo", lcps) + self.assertIn("e2", lcps) + def test_lcp(self): self.assertTrue(lcp.is_unique(self.cfg, "e1")) self.assertTrue(lcp.is_unique(self.cfg, "foo")) + self.assertTrue(lcp.is_unique(self.cfg, "notexist")) - ## TODO(pim) - ensure that is_unique also takes synthesized LCPs into account - ## self.assertFalse(lcp.is_unique(self.cfg, "e1.1000")) + self.assertFalse(lcp.is_unique(self.cfg, "twice")) + self.assertFalse(lcp.is_unique(self.cfg, "thrice")) def test_qinx(self): qinx_ifname, qinx_iface = interface.get_by_name(self.cfg, "GigabitEthernet1/0/1.201")