Browse Source

handle multiple switches in a single module properly...

ssh-lenovo
John-Mark Gurney 5 years ago
parent
commit
deaa55c453
1 changed files with 36 additions and 14 deletions
  1. +36
    -14
      vlanmang.py

+ 36
- 14
vlanmang.py View File

@@ -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 '<SNMPSwitch: auth=%s, targ=%s>' % (`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),


Loading…
Cancel
Save