FUNCflow test suite

Change-Id: I9dd2ce19736a702fd22549dd93933052ca6a6858
diff --git a/TestON/tests/FUNCflow/Dependency/topo-flow.py b/TestON/tests/FUNCflow/Dependency/topo-flow.py
new file mode 100755
index 0000000..2299d9e
--- /dev/null
+++ b/TestON/tests/FUNCflow/Dependency/topo-flow.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+
+"""
+Custom topology for Mininet
+"""
+from mininet.topo import Topo
+from mininet.net import Mininet
+from mininet.node import Host, RemoteController
+from mininet.node import Node
+from mininet.node import CPULimitedHost
+from mininet.link import TCLink
+from mininet.cli import CLI
+from mininet.log import setLogLevel
+from mininet.util import dumpNodeConnections
+from mininet.node import ( UserSwitch, OVSSwitch, IVSSwitch )
+
+class MyTopo( Topo ):
+
+    def __init__( self ):
+        # Initialize topology
+        Topo.__init__( self )
+        # Switch S5 Hosts
+        host1=self.addHost( 'h1', ip='10.1.0.1/24' )
+        host2=self.addHost( 'h2', ip='10.1.0.2/24' )
+        #host3=self.addHost( 'h3', ip='10.1.0.3/24', v6Addr='1000::3/64' )
+        #host4=self.addHost( 'h4', ip='10.1.0.4/24', v6Addr='1000::4/64' )
+
+        s1 = self.addSwitch( 's1' )
+        #s2 = self.addSwitch( 's2' )
+
+        self.addLink(s1, host1)
+        self.addLink(s1, host2)
+        #self.addLink(s1, host3)
+        #self.addLink(s1, host4)
+
+
+        topos = { 'mytopo': ( lambda: MyTopo() ) }
+
+def setupNetwork():
+    "Create network"
+    topo = MyTopo()
+    network = Mininet(topo=topo, autoSetMacs=True, controller=None)
+    network.start()
+    CLI( network )
+    network.stop()
+
+if __name__ == '__main__':
+    setLogLevel('info')
+    #setLogLevel('debug')
+    setupNetwork()
diff --git a/TestON/tests/FUNCflow/FUNCflow.params b/TestON/tests/FUNCflow/FUNCflow.params
index 396686e..e0dde55 100755
--- a/TestON/tests/FUNCflow/FUNCflow.params
+++ b/TestON/tests/FUNCflow/FUNCflow.params
@@ -7,38 +7,37 @@
     # 9 - Report logs
     # 10 - Start mininet and assign switches to controller
     # 1000 - Add flows
-    # 2000 - Delete flows
-    # 3000 - Modify flow rule selectors
-    # 4000 - Modify flow rule treatments
-    # 5000 - flow rule controller
-    # 100 - Compare switch flow table with ONOS
-    <testcases>1,2,10,8,1000</testcases>
+    # 2000 - Verify flows are in the ADDED state
+    # 3000 - Delete flows
+    <testcases>1,2,10,11,1000,2000,3000,100</testcases>
 
     <SCALE>
-        <max>3</max>
+        <max>1</max>
     </SCALE>
 
     <DEPENDENCY>
         <path>/tests/FUNCflow/Dependency/</path>
         <wrapper1>startUp</wrapper1>
         <wrapper2>topo</wrapper2>
-        <topology>flow-2sw.py</topology>
+        <topology>topo-flow.py</topology>
     </DEPENDENCY>
 
 
     <TOPO>
         <numSwitches>1</numSwitches>
         <numHosts>2</numHosts>
-        <numLinks>2</numLinks>
+        <numLinks>0</numLinks>
+    </TOPO>
+
+    <MININET>
         <deviceId>of:0000000000000001</deviceId>
         <hostMac1>00:00:00:00:00:01</hostMac1>
         <hostMac2>00:00:00:00:00:02</hostMac2>
-        <ethType>IPV4</ethType>
-    </TOPO>
+    </MININET>
 
     <ENV>
         <cellName>productionCell</cellName>
-        <cellApps>drivers,openflow,fwd</cellApps>
+        <cellApps>drivers,openflow</cellApps>
     </ENV>
 
     <GIT>
diff --git a/TestON/tests/FUNCflow/FUNCflow.py b/TestON/tests/FUNCflow/FUNCflow.py
index 30608a6..fdd2c1f 100644
--- a/TestON/tests/FUNCflow/FUNCflow.py
+++ b/TestON/tests/FUNCflow/FUNCflow.py
@@ -203,7 +203,42 @@
                                  onpass="Successfully start ONOS cli",
                                  onfail="Failed to start ONOS cli" )
 
-    def CASE8( self, main ):
+    def CASE10( self, main ):
+        '''
+            Start Mininet
+        '''
+        main.case( "Setup mininet and assign switches to controllers" )
+        main.step( "Setup Mininet Topology" )
+        topology = main.Mininet1.home + '/custom/' + main.topology
+        mnCmd = 'mn --custom ' + topology + ' --mac --arp'
+        stepResult1 = main.Mininet1.startNet( mnCmd=mnCmd )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult1,
+                                 onpass="Successfully loaded topology",
+                                 onfail="Failed to load topology" )
+
+        main.step( "Assign switches to controllers" )
+        for i in range( main.numSwitches ):
+            stepResult2 = main.Mininet1.assignSwController(
+                                            sw="s" + str( i+1 ),
+                                            ip=main.ONOSip )
+            if not stepResult2:
+                break
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult2,
+                                 onpass="Controller assignment successfull",
+                                 onfail="Controller assignment failed" )
+
+        time.sleep(5)
+
+        caseResult = stepResult1 and stepResult2
+        if not caseResult:
+            main.cleanup()
+            main.exit()
+
+    def CASE11( self, main ):
         '''
             Compare topology
         '''
@@ -244,9 +279,9 @@
             utilities.assert_equals( expect=main.TRUE,
                                      actual=currentDevicesResult,
                                      onpass="ONOS" + controllerStr +
-                                     " Switches view is correct",
+                                            " Switches view is correct",
                                      onfail="ONOS" + controllerStr +
-                                     " Switches view is incorrect" )
+                                            " Switches view is incorrect" )
             if links[ controller ] and "Error" not in links[ controller ]:
                 currentLinksResult = main.Mininet1.compareLinks(
                         mnSwitches, mnLinks,
@@ -256,9 +291,9 @@
             utilities.assert_equals( expect=main.TRUE,
                                      actual=currentLinksResult,
                                      onpass="ONOS" + controllerStr +
-                                     " links view is correct",
+                                            " links view is correct",
                                      onfail="ONOS" + controllerStr +
-                                     " links view is incorrect" )
+                                            " links view is incorrect" )
 
             if hosts[ controller ] or "Error" not in hosts[ controller ]:
                 currentHostsResult = main.Mininet1.compareHosts(
@@ -269,21 +304,85 @@
             utilities.assert_equals( expect=main.TRUE,
                                      actual=currentHostsResult,
                                      onpass="ONOS" + controllerStr +
-                                     " hosts exist in Mininet",
+                                            " hosts exist in Mininet",
                                      onfail="ONOS" + controllerStr +
-                                     " hosts don't match Mininet")
+                                            " hosts don't match Mininet")
 
-        main.step( "Deactiviate reactive fwd" )
-        stepResult = main.CLIs[0].deactivateApp( 'org.onosproject.fwd' )
+
+
+    def CASE1000( self, main ):
+        '''
+            Add flows
+        '''
+
+        main.step("Add flows through rest")
+
+        deviceId = main.params['MININET']['deviceId']
+        host1_mac = main.params['MININET']['hostMac1']
+        host2_mac = main.params['MININET']['hostMac2']
+
+        # Add flows that connects host1 to host 2
+        stepResult = main.ONOSrest.addFlow( deviceId=deviceId,
+                                            egressPort=2,
+                                            ingressPort=1,
+                                            ethSrc=host1_mac,
+                                            ethDst=host2_mac)
+
+        stepResult = stepResult and main.ONOSrest.addFlow( deviceId=deviceId,
+                                                           egressPort=1,
+                                                           ingressPort=2,
+                                                           ethSrc=host2_mac,
+                                                           ethDst=host1_mac)
+
         utilities.assert_equals( expect=main.TRUE,
                                  actual=stepResult,
-                                 onpass="Successfully deactived fwd app",
-                                 onfail="Failed to deactivate fwd app" )
+                                 onpass="Successfully added flows",
+                                 onfail="Failed add flows" )
 
-        main.log.info("Wait for the flows to dissappear")
-        time.sleep(5)
+    def CASE2000( self, main ):
+        '''
+            Check flows are ADDED
+        '''
+        import json
+        main.step("Check flows  are in the ADDED state")
+        main.log.info("Check only the flows added through REST")
 
-    def CASE9( self, main ):
+        flows = json.loads( main.ONOSrest.flows() )
+
+        stepResult = main.TRUE
+        for f in flows:
+            if "rest" in f.get("appId"):
+                if "ADDED" in f.get("state"):
+                    stepResult = stepResult and main.ONOSrest.removeFlow( deviceId, flowId )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="All flows are in the ADDED state",
+                                 onfail="All flows are in the ADDED state" )
+
+    def CASE3000( self, main ):
+        '''
+            Delete flows that were added through REST
+        '''
+        import json
+        main.step("Remove flows")
+        main.log.info("Remove the flows that were added through rest")
+
+        flows = json.loads( main.ONOSrest.flows() )
+
+        stepResult = main.TRUE
+        for f in flows:
+            if "rest" in f.get("appId"):
+                flowId = f.get("id")
+                deviceId = f.get("deviceId")
+                stepResult = stepResult and main.ONOSrest.removeFlow( deviceId, flowId )
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=stepResult,
+                                 onpass="Successfully removed all rest flows",
+                                 onfail="Failed to remove rest flows" )
+
+    def CASE100( self, main ):
         '''
             Report errors/warnings/exceptions
         '''
@@ -295,123 +394,5 @@
                                     "flow",
                                     "ERROR",
                                     "Except" ],
-                                 "s" )
+                                  "s" )
 
-    def CASE10( self, main ):
-        '''
-            Start Mininet
-        '''
-        main.case( "Setup mininet and assign switches to controllers" )
-        main.step( "Setup Mininet Topology" )
-        topology = main.Mininet1.home + '/custom/' + main.topology
-        stepResult1 = main.Mininet1.startNet( topoFile=topology )
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult1,
-                                 onpass="Successfully loaded topology",
-                                 onfail="Failed to load topology" )
-
-        main.step( "Assign switches to controllers" )
-        for i in range( main.numSwitches ):
-            stepResult2 = main.Mininet1.assignSwController(
-                                            sw="s" + str( i+1 ),
-                                            ip=main.ONOSip )
-            if not stepResult2:
-                break
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult2,
-                                 onpass="Controller assignment successfull",
-                                 onfail="Controller assignment failed" )
-
-        time.sleep(5)
-
-        main.step( "Pingall hosts for discovery" )
-        stepResult3 = main.Mininet1.pingall()
-        if not stepResult3:
-            stepResult3 = main.Mininet1.pingall()
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=stepResult3,
-                                 onpass="Pingall successfull",
-                                 onfail="Pingall unsuccessfull" )
-
-        caseResult = stepResult1 and stepResult2 and stepResult3
-        if not caseResult:
-            main.cleanup()
-            main.exit()
-
-    def CASE1000( self, main ):
-        '''
-            Add flows
-        '''
-
-        main.step("Add some flows")
-
-        deviceId = main.params['TOPO']['deviceId']
-        host1_mac = main.params['TOPO']['hostMac1']
-        host2_mac = main.params['TOPO']['hostMac2']
-
-
-        flowResult1 = main.ONOSrest.addFlow( deviceId=deviceId,
-                                             egressPort=-3,
-                                             ethType="IPV4" )
-
-        flowResult2 = main.ONOSrest.addFlow( deviceId=deviceId,
-                                             egressPort=2,
-                                             ingressPort=1,
-                                             ethSrc=host1_mac,
-                                             ethDst=host2_mac)
-
-        flowResult3 = main.ONOSrest.addFlow( deviceId=deviceId,
-                                             egressPort=1,
-                                             ingressPort=2,
-                                             ethSrc=host2_mac,
-                                             ethDst=host1_mac)
-
-        flowResult = flowResult1 and flowResult2 and flowResult3
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=flowResult,
-                                 onpass="Successfully added flows",
-                                 onfail="Failed add flows" )
-
-        main.step("Verify flows with pingall")
-        main.log.info("wait for flows to install")
-        time.sleep(5)
-
-        pingResult = main.Mininet1.pingall()
-        if not pingResult:
-            main.log.warn("First pingall failed. Retrying")
-            pingResult = main.Mininet1.pingall()
-
-        utilities.assert_equals( expect=main.TRUE,
-                                 actual=pingResult,
-                                 onpass="Pingall successfull",
-                                 onfail="Pingall failed" )
-
-        time.sleep(100)
-
-    def CASE2000( self, main ):
-        '''
-            Delete flows
-        '''
-
-    def CASE3000( self, main ):
-        '''
-            Modify flow rule selectors
-        '''
-
-    def CASE4000( self, main ):
-        '''
-            Modify flow rule treatment
-        '''
-
-    def CASE5000( self, main ):
-        '''
-            Modify flow rule controller
-        '''
-
-    def CASE100( self, main ):
-        '''
-            Compare switch flow table with ONOS
-        '''
diff --git a/TestON/tests/FUNCflow/FUNCflow.topo b/TestON/tests/FUNCflow/FUNCflow.topo
index 7c17bcb..9ea3d19 100755
--- a/TestON/tests/FUNCflow/FUNCflow.topo
+++ b/TestON/tests/FUNCflow/FUNCflow.topo
@@ -21,26 +21,6 @@
             </COMPONENTS>
         </ONOScli1>
 
-        <ONOScli2>
-            <host>localhost</host>
-            <user>admin</user>
-            <password>onos_test</password>
-            <type>OnosCliDriver</type>
-            <connect_order>3</connect_order>
-            <COMPONENTS>
-            </COMPONENTS>
-        </ONOScli2>
-
-         <ONOScli3>
-            <host>localhost</host>
-            <user>admin</user>
-            <password>onos_test</password>
-            <type>OnosCliDriver</type>
-            <connect_order>4</connect_order>
-            <COMPONENTS>
-            </COMPONENTS>
-        </ONOScli3>
-
         <Mininet1>
             <host>localhost</host>
             <user>admin</user>