diff --git a/mininet/test/test_switchdpidassignment.py b/mininet/test/test_switchdpidassignment.py new file mode 100644 index 0000000000000000000000000000000000000000..29ae9e54237096f1b4f6337ff7f07d660f912095 --- /dev/null +++ b/mininet/test/test_switchdpidassignment.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +"""Package: mininet + Regression tests for switch dpid assignment.""" + +import unittest +from functools import partial +import re + +from mininet.net import Mininet +from mininet.node import Host, Controller +from mininet.node import UserSwitch, OVSSwitch, OVSLegacyKernelSwitch, IVSSwitch +from mininet.topo import Topo +from mininet.log import setLogLevel +from mininet.util import quietRun + + +class testSwitchDpidAssignmentCommon ( object ): + """Verify Switch dpid assignment.""" + + switchClass = None # overridden in subclasses + + def testDefaultDpid ( self ): + """Verify that the default dpid is assigned using a valid provided + canonical switchname if no dpid is passed in switch creation.""" + switch = Mininet( Topo(), self.switchClass, Host, Controller ).addSwitch( 's1' ) + self.assertEqual( switch.defaultDpid(), switch.dpid ) + + def testActualDpidAssignment( self ): + """Verify that Switch dpid is the actual dpid assigned if dpid is + passed in switch creation.""" + switch = Mininet( Topo(), self.switchClass, Host, Controller ).addSwitch( 'A', dpid = '000000000000ABCD' ) + self.assertEqual( switch.dpid, '000000000000ABCD' ) + + def testDefaultDpidAssignmentFailure( self ): + """Verify that Default dpid assignment raises an Exception if the + name of the switch does not contin a digit. Also verify the + exception message.""" + with self.assertRaises( Exception ) as raises_cm: + switch = Mininet( Topo(), self.switchClass, Host, Controller ).addSwitch( 'A' ) + self.assertEqual(raises_cm.exception.message, 'Unable to derive ' + 'default datapath ID - please either specify a dpid ' + 'or use a canonical switch name such as s23.') + + def testDefaultDpidLen( self ): + """Verify that Default dpid length is 16 characters consisting of + 16 - len(hex of first string of contiguous digits passed in switch + name) 0's followed by hex of first string of contiguous digits passed + in switch name.""" + switch = Mininet( Topo(), self.switchClass, Host, Controller ).addSwitch( 's123' ) + dpid = hex( int(re.findall( r'\d+', switch.name ) [0]) ) [ 2: ] + try: + if issubclass(UserSwitch, self.switchClass): + # Dpid lenght of UserSwitch = 12 + self.assertEqual( switch.dpid, '0' * (12 - len(dpid)) + str(dpid) ) + else: + self.assertEqual( switch.dpid, '0' * (16 - len(dpid)) + str(dpid) ) + except TypeError: + # Switch is OVS User Switch + self.assertEqual( switch.dpid, '0' * (16 - len(dpid)) + str(dpid) ) + + +class testSwitchOVSKernel( testSwitchDpidAssignmentCommon, unittest.TestCase ): + """Test dpid assignnment of OVS Kernel Switch.""" + switchClass = OVSSwitch + +class testSwitchOVSUser( testSwitchDpidAssignmentCommon, unittest.TestCase ): + """Test dpid assignnment of OVS User Switch.""" + switchClass = partial(OVSSwitch, datapath = 'user') + +@unittest.skipUnless( quietRun( 'which ovs-openflowd' ), 'OVS Legacy Kernel switch is not installed' ) +class testSwitchOVSLegacyKernel( testSwitchDpidAssignmentCommon, unittest.TestCase ): + """Test dpid assignnment of OVS Legacy Kernel Switch.""" + switchClass = OVSLegacyKernelSwitch + +@unittest.skipUnless( quietRun( 'which ivs-ctl' ), 'IVS switch is not installed' ) +class testSwitchIVS( testSwitchDpidAssignmentCommon, unittest.TestCase ): + """Test dpid assignment of IVS switch.""" + switchClass = IVSSwitch + +@unittest.skipUnless( quietRun( 'which ofprotocol' ), 'Reference user switch is not installed' ) +class testSwitchUserspace( testSwitchDpidAssignmentCommon, unittest.TestCase ): + """Test dpid assignment of Userspace switch.""" + switchClass = UserSwitch + + +if __name__ == '__main__': + setLogLevel( 'warning' ) + unittest.main()