| @@ -59,6 +59,14 @@ def checkchanges(module): | |||
| for i in mods: | |||
| switch = SNMPSwitch(i.host, i.community) | |||
| portmapping = switch.getportmapping() | |||
| invportmap = { y: x for x, y in portmapping.iteritems() } | |||
| portlist = getportlist(i._vlanconf, invportmap.__getitem__) | |||
| ports = set(portmapping.iterkeys()) | |||
| if ports != portlist: | |||
| raise ValueError('missing or extra ports found: %s' % `ports.symmetric_difference(portlist)`) | |||
| def getpvidmapping(data, lookupfun): | |||
| '''Return a mapping from vlan based table to a port: vlan | |||
| @@ -166,7 +174,7 @@ class SNMPSwitch(object): | |||
| '''Return a port name mapping. Keys are the port index | |||
| and the value is the name from the ifName entry.''' | |||
| return dict((x[0][-1], str(x[1])) for x in self._walk('IF-MIB', 'ifName')) | |||
| return { x[0][-1]: str(x[1]) for x in self._walk('IF-MIB', 'ifName') } | |||
| def findport(self, name): | |||
| '''Look up a port name and return it's port index. This | |||
| @@ -193,16 +201,23 @@ class SNMPSwitch(object): | |||
| int(vlan)), 6) # destroy(6) | |||
| def getvlans(self): | |||
| '''Return all the vlans.''' | |||
| '''Return an iterator with all the vlan ids.''' | |||
| return (x[0][-1] for x in self._walk('Q-BRIDGE-MIB', 'dot1qVlanStatus')) | |||
| def staticvlans(self): | |||
| '''Return the staticly defined/configured vlans. This | |||
| sometimes excludes special built in vlans, like vlan 1.''' | |||
| '''Return an iterator of the staticly defined/configured | |||
| vlans. This sometimes excludes special built in vlans, | |||
| like vlan 1.''' | |||
| return (x[0][-1] for x in self._walk('Q-BRIDGE-MIB', 'dot1qVlanStaticName')) | |||
| def getpvid(self): | |||
| '''Returns a dictionary w/ the interface index as the key, | |||
| and the pvid of the interface.''' | |||
| return { x[0][-1]: int(x[1]) for x in self._walk('Q-BRIDGE-MIB', 'dot1qPvid') } | |||
| class _TestMisc(unittest.TestCase): | |||
| def setUp(self): | |||
| import test_data | |||
| @@ -242,16 +257,24 @@ class _TestMisc(unittest.TestCase): | |||
| @mock.patch('importlib.import_module') | |||
| def test_checkchanges(self, imprt, portmapping): | |||
| def tmp(*args, **kwargs): | |||
| print `args` | |||
| return self._test_data | |||
| imprt.side_effect = tmp | |||
| checkchanges('data') | |||
| ports = { x: 'g%d' % x for x in xrange(1, 24) } | |||
| ports[30] = 'lag1' | |||
| ports[31] = 'lag2' | |||
| portmapping.side_effect = [ ports, ports ] | |||
| self.assertRaises(ValueError, checkchanges, 'data') | |||
| imprt.assert_called_with('data') | |||
| portmapping.assert_called() | |||
| _skipSwitchTests = True | |||
| del ports[31] | |||
| checkchanges('data') | |||
| _skipSwitchTests = False | |||
| class _TestSwitch(unittest.TestCase): | |||
| def setUp(self): | |||
| @@ -294,6 +317,10 @@ class _TestSwitch(unittest.TestCase): | |||
| self.assertTrue(set(switch.staticvlans()).issubset(existingvlans)) | |||
| pvidres = { x: 1 for x in xrange(1, 9) } | |||
| pvidres.update({ x: 1 for x in xrange(14, 18) }) | |||
| self.assertEqual(switch.getpvid(), pvidres) | |||
| testname = 'Sometestname' | |||
| # Create test vlan | |||