From deaa55c45321065c24fa789dbfe07a6db1bb6dfc Mon Sep 17 00:00:00 2001 From: John-Mark Gurney Date: Wed, 25 Sep 2019 15:28:05 -0700 Subject: [PATCH] handle multiple switches in a single module properly... --- vlanmang.py | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/vlanmang.py b/vlanmang.py index 2abf349..b31fd06 100644 --- a/vlanmang.py +++ b/vlanmang.py @@ -183,13 +183,18 @@ def checkchanges(module): ''' mod = importlib.import_module(module) - mods = [ i for i in mod.__dict__.itervalues() if isinstance(i, vlanmang.SwitchConfig) ] + mods = [ (k, v) for k, v in mod.__dict__.iteritems() if isinstance(v, vlanmang.SwitchConfig) ] res = [] - for i in mods: + for name, i in mods: + print 'probing %s' % `name` vlans = i.vlanconf.keys() switch = SNMPSwitch(i.host, i.community) + #print `switch` + switchpvid = switch.getpvid() + #print `switchpvid` + #import pdb; pdb.set_trace() portmapping = switch.getportmapping() invportmap = { y: x for x, y in portmapping.iteritems() } lufun = invportmap.__getitem__ @@ -208,7 +213,7 @@ def checkchanges(module): pvidmap = getpvidmapping(i.vlanconf, lufun) switchpvid = switch.getpvid() - res.extend(('setpvid', idx, vlan, switchpvid[idx]) for idx, vlan in + res.extend((switch, name, 'setpvid', idx, vlan, switchpvid[idx]) for idx, vlan in pvidmap.iteritems() if switchpvid[idx] != vlan) # compare egress & untagged @@ -218,11 +223,11 @@ def checkchanges(module): untagged = getuntagged(i.vlanconf, lufun) for i in vlans: if not _cmpbits(switchegress[i], egress[i]): - res.append(('setegress', i, egress[i], switchegress[i])) + res.append((switch, name, 'setegress', i, egress[i], switchegress[i])) if not _cmpbits(switchuntagged[i], untagged[i]): - res.append(('setuntagged', i, untagged[i], switchuntagged[i])) + res.append((switch, name, 'setuntagged', i, untagged[i], switchuntagged[i])) - return res, switch + return res def getidxs(lst, lookupfun): '''Take a list of ports, and if any are a string, replace them w/ @@ -282,6 +287,9 @@ class SNMPSwitch(object): self._cd = auth self._targ = UdpTransportTarget((host, 161)) + def __repr__(self): + return '' % (`self._cd`, `self._targ`) + def _getmany(self, *oids): woids = [ ObjectIdentity(*oid) for oid in oids ] [ oid.resolveWithMib(_mvc) for oid in woids ] @@ -291,7 +299,7 @@ class SNMPSwitch(object): ContextData(), *(ObjectType(oid) for oid in woids))) if errorInd: # pragma: no cover - raise ValueError(errorIndication) + raise ValueError(errorInd) elif errorStatus: if str(errorStatus) == 'tooBig' and len(oids) > 1: # split the request in two @@ -329,7 +337,7 @@ class SNMPSwitch(object): ContextData(), ObjectType(oid, value))) if errorInd: # pragma: no cover - raise ValueError(errorIndication) + raise ValueError(errorInd) elif errorStatus: # pragma: no cover raise ValueError('%s at %s' % (errorStatus.prettyPrint(), errorIndex and @@ -464,17 +472,17 @@ class SNMPSwitch(object): self._set(('Q-BRIDGE-MIB', 'dot1qVlanStaticUntaggedPorts', int(vlan)), value) -if __name__ == '__main__': # pragma: no cover +def main(): import pprint import sys - changes, switch = checkchanges('data') + changes = checkchanges('data') if not changes: print 'No changes to apply.' sys.exit(0) - pprint.pprint(changes) + pprint.pprint([ x[1:] for x in changes ]) res = raw_input('Apply the changes? (type yes to apply): ') if res != 'yes': @@ -483,7 +491,12 @@ if __name__ == '__main__': # pragma: no cover print 'applying...' failed = [] - for verb, arg1, arg2, oldarg in changes: + prevname = None + for switch, name, verb, arg1, arg2, oldarg in changes: + if prevname != name: + print 'Configuring switch %s...' % `name` + prevname = name + print '%s: %s %s' % (verb, arg1, `arg2`) try: fun = getattr(switch, verb) @@ -498,6 +511,9 @@ if __name__ == '__main__': # pragma: no cover for verb, arg1, arg2, e in failed: print '%s: %s %s: %s' % (verb, arg1, arg2, `e`) +if __name__ == '__main__': # pragma: no cover + main() + class _TestMisc(unittest.TestCase): def setUp(self): import test_data @@ -630,10 +646,16 @@ class _TestMisc(unittest.TestCase): 283: '00000000111111111110011', } ] - res, switch = checkchanges('data') + res = checkchanges('data') + + # Make sure that the first one are all instances of SNMPSwitch + # XXX make sure args for them are correct. + self.assertTrue(all(isinstance(x[0], SNMPSwitch) for x in res)) - self.assertIsInstance(switch, SNMPSwitch) + # Make sure that the name provided is correct + self.assertTrue(all(x[1] == 'distswitch' for x in res)) + res = [ x[2:] for x in res ] validres = [ ('setpvid', x, 5, 283) for x in xrange(1, 9) ] + \ [ ('setpvid', 20, 1, 283), ('setpvid', 21, 1, 283),