Added a cleanup case to allow the reuse of dpids
- Created two drivers to remove hosts and devices
- Removed the unique dpids from the topologies

Change-Id: I10cfcc34da545fd34e7635bd86527f23e50ed10e
diff --git a/TestON/tests/CHOtest/CHOtest.py b/TestON/tests/CHOtest/CHOtest.py
index 9feb9b8..dca0585 100644
--- a/TestON/tests/CHOtest/CHOtest.py
+++ b/TestON/tests/CHOtest/CHOtest.py
@@ -40,9 +40,10 @@
         main.pingSleep = int( main.params['timers']['pingSleep'] )
         main.topoCheckDelay = int( main.params['timers']['topoCheckDelay'] )
         main.pingTimeout = int( main.params['timers']['pingTimeout'] )
+        main.remHostDelay = int( main.params['timers']['remHostDelay'] )
+        main.remDevDelay = int( main.params['timers']['remDevDelay'] )
         main.newTopo = ""
         main.CLIs = []
-        main.prefix = 0
 
         main.failSwitch = True if main.failSwitch == "on" else False
         main.emailOnStop = True if main.emailOnStop == "on" else False
@@ -190,11 +191,6 @@
         main.case(
             "Assign and Balance all Mininet switches across controllers" )
 
-        main.step( "Stop any previous Mininet network topology" )
-        cliResult = main.TRUE
-        if main.newTopo == main.params['TOPO3']['topo']:
-            stopStatus = main.Mininet1.stopNet( fileName = "topoSpine" )
-
         main.step( "Start Mininet with Att topology" )
         main.newTopo = main.params['TOPO1']['topo']
         mininetDir = main.Mininet1.home + "/custom/"
@@ -260,9 +256,6 @@
         main.case(
             "Assign and Balance all Mininet switches across controllers" )
 
-        main.step( "Stop any previous Mininet network topology" )
-        stopStatus = main.Mininet1.stopNet(fileName = "topoAtt" )
-
         main.step("Start Mininet with Chordal topology")
         mininetDir = main.Mininet1.home + "/custom/"
         topoPath = main.testDir + "/" + main.TEST  + "/Dependencies/" + main.newTopo
@@ -324,10 +317,7 @@
             "Load Spine and Leaf topology and Balance all Mininet switches across controllers" )
         main.log.report(
             "________________________________________________________________________" )
-        main.case(
-            "Assign and Balance all Mininet switches across controllers" )
-        main.step( "Stop any previous Mininet network topology" )
-        stopStatus = main.Mininet1.stopNet(fileName = "topoChordal" )
+        main.case( "Assign and Balance all Mininet switches across controllers" )
 
         main.step("Start Mininet with Spine topology")
         mininetDir = main.Mininet1.home + "/custom/"
@@ -336,9 +326,6 @@
         topoPath = mininetDir + main.newTopo
         startStatus = main.Mininet1.startNet(topoFile = topoPath)
 
-        time.sleep(60)
-        main.step( "Assign switches to controllers" )
-
         for i in range( 1, ( main.numMNswitches + 1 ) ):  # 1 to ( num of switches +1 )
             main.Mininet1.assignSwController(
                 sw="s" + str( i ),
@@ -402,7 +389,7 @@
             if ( ( main.numMNswitches == int(numOnosDevices) ) and ( main.numMNlinks == int(numOnosLinks) ) ):
                 main.step( "Store Device DPIDs" )
                 for i in range( 1, (main.numMNswitches+1) ):
-                    main.deviceDPIDs.append( "of:" + str(main.prefix) + "0000000000000%02d" % i )
+                    main.deviceDPIDs.append( "of:00000000000000" + format( i, "02x" ) )
                 print "Device DPIDs in Store: \n", str( main.deviceDPIDs )
 
                 main.step( "Store Host MACs" )
@@ -433,7 +420,7 @@
                     for cli in main.CLIs:
                         if i >=  main.numMNswitches + 1:
                             break
-                        dpid = "of:" + str(main.prefix) + "0000000000000%02d" % i
+                        dpid = "of:00000000000000" + format( i, "02x" )
                         t = main.Thread(target = cli.getDevicePortsEnabledCount,threadID = main.threadID, name = "getDevicePortsEnabledCount",args = [dpid])
                         t.start()
                         pool.append(t)
@@ -455,7 +442,7 @@
                     for cli in main.CLIs:
                         if i >=  main.numMNswitches + 1:
                             break
-                        dpid = "of:" + str(main.prefix) + "0000000000000%02d" % i
+                        dpid = "of:00000000000000" + format( i, "02x" )
                         t = main.Thread( target = cli.getDeviceLinksActiveCount,
                                          threadID = main.threadID,
                                          name = "getDevicePortsEnabledCount",
@@ -491,6 +478,56 @@
                                  onfail="Saving ONOS topology data test FAIL" )
 
 
+
+    def CASE200( self, main ):
+
+        import time
+        main.log.report( "Clean up ONOS" )
+        main.log.case( "Stop topology and remove hosts and devices" )
+
+        main.step( "Stop Topology" )
+        stopStatus = main.Mininet1.stopNet()
+        utilities.assert_equals( expect=main.TRUE, actual=stopStatus,
+                                 onpass="Stopped mininet",
+                                 onfail="Failed to stop mininet" )
+
+
+        main.log.info( "Constructing host id list" )
+        hosts = []
+        for i in range( main.numMNhosts ):
+            hosts.append( "h" + str(i+1) )
+
+        main.step( "Getting host ids" )
+        hostList = main.CLIs[0].getHostsId( hosts )
+        hostIdResult = True if hostList else False
+        utilities.assert_equals( expect=True, actual=hostIdResult,
+                                 onpass="Successfully obtained the host ids.",
+                                 onfail="Failed to obtain the host ids" )
+
+        main.step( "Removing hosts" )
+        hostResult = main.CLIs[0].removeHost( hostList )
+        utilities.assert_equals( expect=main.TRUE, actual=hostResult,
+                                 onpass="Successfully removed hosts",
+                                 onfail="Failed remove hosts" )
+
+        time.sleep( main.remHostDelay )
+
+        main.log.info( "Constructing device uri list" )
+        deviceList = []
+        for i in range( main.numMNswitches ):
+            deviceList.append( "of:00000000000000" + format( i+1, "02x" ) )
+
+        main.step( "Removing devices" )
+        deviceResult = main.CLIs[0].removeDevice( deviceList )
+        utilities.assert_equals( expect=main.TRUE, actual=deviceResult,
+                                 onpass="Successfully removed devices",
+                                 onfail="Failed remove devices" )
+
+        time.sleep( main.remDevDelay )
+
+        main.log.info( "Summary\n{}".format( main.CLIs[0].summary( jsonFormat=False ) ) )
+
+
     def CASE40( self, main ):
         """
         Verify Reactive forwarding
@@ -868,7 +905,7 @@
                 for cli in main.CLIs:
                     if i >=  main.numMNswitches + 1:
                         break
-                    dpid = "of:" + str(main.prefix) + "0000000000000%02d" % i
+                    dpid = "of:00000000000000" + format( i, "02x" )
                     t = main.Thread(target = cli.getDevicePortsEnabledCount,
                             threadID = main.threadID,
                             name = "getDevicePortsEnabledCount",
@@ -906,7 +943,7 @@
                 for cli in main.CLIs:
                     if i >=  main.numMNswitches + 1:
                         break
-                    dpid = "of:" + str(main.prefix) + "0000000000000%02d" % i
+                    dpid = "of:00000000000000" + format( i, "02x" )
                     t = main.Thread(target = cli.getDeviceLinksActiveCount,
                             threadID = main.threadID,
                             name = "getDeviceLinksActiveCount",