Update comments and imports after DataChangeListener changes
[openflowplugin.git] / test-scripts / oper_data_test.py
index d28437125261947a95d85c13b857eb9fc2cfc4fb..c6ed4a253b4d34e05f98c8b8c04f79306e359523 100644 (file)
@@ -1,65 +1,54 @@
-import unittest
-import os
-import re
-import sys
+import argparse
 import logging
+import sys
 import time
-import argparse
-import requests
-
-import xml.dom.minidom as md
+import unittest
 from xml.etree import ElementTree as ET
 
+from openvswitch.flow_tools import FlowAdderThread, FlowRemoverThread, MapNames, \
+    WAIT_TIME
 from openvswitch.mininet_tools import MininetTools
-from openvswitch.flow_tools import  FlowAdderThread, FlowRemoverThread, MapNames, loglevels, TO_GET, WAIT_TIME, OPERATIONAL_DELAY, FLOWS_PER_SECOND
-from openvswitch.testclass_templates import TestClassAdd, TestClassRemove
-from openvswitch.testclass_components import CheckConfigFlowsComponent, CheckOperFlowsComponent
 
-class MultiTest(unittest.TestCase, TestClassAdd, TestClassRemove, CheckConfigFlowsComponent, CheckOperFlowsComponent):
 
-    log = logging.getLogger('MultiTest')
-    total_errors = 0
+# Delay time value is important for slow machines 
+# value mean nr. of seconds for waiting for controller 
+CONTROLLER_DELAY = 50
+# value mean nr. of seconds for waiting for mininet 
+MININET_START_DELAY = 15
 
-    id_maps = dict()
-    active_map = dict()
 
-    def setUp(self):
-        MultiTest.log.info('test setup...')
-        self.__start_MN()
+class MultiTest(unittest.TestCase):
 
-       MultiTest.id_maps[MapNames.TEST] = dict()
-       MultiTest.id_maps[MapNames.DUMMY] = dict()
+    log = logging.getLogger('MultiTest')
+    total_errors = 0
+    total_flows = 0
+    ids = []
 
-       MultiTest.active_map = MultiTest.id_maps[MapNames.TEST]
+    def setUp(self):
+        MultiTest.log.info('setUp')
+        self.threads_count = 50
+        self.thread_pool = list()
 
+        self.__start_MN()
+        self.__setup_threads()
+        self.__run_threads()
 
     def tearDown(self):
-        MultiTest.log.info('test cleanup...')
-       self.__set_active_map(MapNames.DUMMY)
-        self.remover = FlowRemoverThread(self, 1, self.host, self.port, self.net, list(MultiTest.active_map.items()))
-        self.remover.run()
-
-       for k, v in MultiTest.id_maps.items():
-            if len(v) > 0:
-                MultiTest.log.warning('not all flows were deleted, remaining test flows: {0}, from map: {1}'.format(len(v),k))
+        MultiTest.log.info('tearDown')
+        self.net.stop()
 
-    def __set_active_map(self, key):
-       try:    
-           MultiTest.active_map = MultiTest.id_maps[key]
-       except KeyError as e:
-           MultiTest.log.warning('Error switching between map ids: {0}'.format(str(e)))
-
-
-    def inc_error(self, value=1):
+    @staticmethod
+    def inc_error(value=1):
         MultiTest.total_errors += value
 
-    def inc_flow(self, flow_id= None, cookie_id=1):
-        if flow_id is not None and cookie_id is not None:
-           #we dont care about actual value, just need to store flow_id as unique identifier           
-            MultiTest.active_map[flow_id] = flow_id
+    @staticmethod
+    def inc_flow(value=1):
+        MultiTest.total_flows += 1
 
-    def delete_flow_from_map(self, flow_id, cookie_id=None):
-        del MultiTest.active_map[flow_id]
+    @staticmethod
+    def add_flow_id(flow_id=None):
+        if (flow_id > None) :
+            MultiTest.ids.append(flow_id)
 
     def __start_MN(self):
         self.net = MininetTools.create_network(self.host, self.mn_port)
@@ -69,12 +58,12 @@ class MultiTest(unittest.TestCase, TestClassAdd, TestClassRemove, CheckConfigFlo
         time.sleep(WAIT_TIME)
 
     def test(self):
-       # add dummy flows to test removal when there are already some flows in operational
-       self.__set_active_map(MapNames.DUMMY)
-       self.adder = FlowAdderThread(self, 0, self.host, self.port, self.net, MultiTest.flows + 1, MultiTest.flows + 11)
+        # add dummy flows to test removal when there are already some flows in operational
+        self.__set_active_map(MapNames.DUMMY)
+        self.adder = FlowAdderThread(self, 0, self.host, self.port, self.net, MultiTest.flows + 1, MultiTest.flows + 11)
         self.adder.run()
 
-       self.__set_active_map(MapNames.TEST)
+        self.__set_active_map(MapNames.TEST)
         self.adder = FlowAdderThread(self, 1, self.host, self.port, self.net, 1, MultiTest.flows + 1)
         self.adder.run()
 
@@ -103,35 +92,55 @@ class MultiTest(unittest.TestCase, TestClassAdd, TestClassRemove, CheckConfigFlo
         # if we didn't manage to get any flows on controller there is no point doing test
         assert flows_oper_after == len(MultiTest.active_map), 'Number of flows added during test stored in operational should be {0}, is {1}'.format(len(MultiTest.active_map), flows_oper_after)
 
+    def __setup_threads(self):
+        if in_args.threads is not None:
+            self.threads_count = int(in_args.threads)
 
-if __name__ == '__main__':
+        for i in range(0, self.threads_count):
+            #thread will have predetermined flows id to avoid using shared resource
+            t = FlowAdderThread(i, self.host, self.port, self.net, flows_ids_from=i*MultiTest.flows + 1, flows_ids_to=(i+1)*MultiTest.flows + 1)
 
-    requests_log = logging.getLogger("requests")
-    requests_log.setLevel(logging.WARNING)
+            self.thread_pool.append(t)
+
+    def __run_threads(self):
+        # start threads
+        for t in self.thread_pool:
+            t.start()
+
+        # wait for them to finish
+        for t in self.thread_pool:
+            t.join()
+
+        # collect results
+        #for t in self.thread_pool:
+        #    MultiTest.inc_flow(t.flows)
+        #    MultiTest.inc_error(t.errors)
+
+if __name__ == '__main__':
+    logging.basicConfig(level=logging.INFO)
 
     # parse cmdline arguments
-    parser = argparse.ArgumentParser(description='End to end stress tests of flows '
-                        'addition from multiple connections')
+    parser = argparse.ArgumentParser(description='Test for flow addition to'
+                        ' switch after the switch has been restarted')
     parser.add_argument('--odlhost', default='127.0.0.1', help='host where '
-                        'odl controller is running  (default = 127.0.0.1) ')
+                        'odl controller is running (default is 127.0.0.1)')
     parser.add_argument('--odlport', type=int, default=8080, help='port on '
-                        'which odl\'s RESTCONF is listening  (default = 8080) ')
+                        'which odl\'s RESTCONF is listening (default is 8080)')
     parser.add_argument('--mnport', type=int, default=6653, help='port on '
-                        'which odl\'s controller is listening  (default = 6653)')
-    parser.add_argument('--flows', default=100, help='how many flows will be added'
-                        ' (default = 100)')
-    parser.add_argument('--log', default='info', help='log level, permitted values are'
-                        ' debug/info/warning/error  (default = info)')
-    args = parser.parse_args()
-
-    #logging.basicConfig(level=logging.DEBUG)
-    logging.basicConfig(level=loglevels.get(args.log, logging.INFO))
+                        'which odl\'s controller is listening (default is 6653)')
+    parser.add_argument('--xmls', default=None, help='generete tests only '
+                        'from some xmls (i.e. 1,3,34) (default is None - use internal template)')
+    parser.add_argument('--threads', default=5, help='how many threads '
+                        'should be used (default is 5)')
+    parser.add_argument('--flows', default=2, help='how many flows will add'
+                        ' one thread (default is 10)')
+    in_args = parser.parse_args()
 
     # set host and port of ODL controller for test cases
-    MultiTest.port = args.odlport
-    MultiTest.host = args.odlhost
-    MultiTest.mn_port = args.mnport
-    MultiTest.flows = int(args.flows)
+    MultiTest.port = in_args.odlport
+    MultiTest.host = in_args.odlhost
+    MultiTest.mn_port = in_args.mnport
+    MultiTest.flows = int(in_args.flows)
 
     del sys.argv[1:]
 
@@ -144,4 +153,4 @@ if __name__ == '__main__':
         #unittest.main()
     finally:
         test.net.stop()
-        print 'end'
+        print 'end'
\ No newline at end of file