Fixes and improvements to intent, link and pingall checking functions

- Fixed intent checking logic
- Enabled link checking on all ONOS nodes
- Move some functions to dependencies, including installing host/point
  intents, checking intent state, links and pingall
- Parameter changes and other minor changes

Change-Id: Iec94b7d4d90b37495970896a26f6397bff709e27
diff --git a/TestON/tests/CHOtest/Dependencies/CHOtestFunctions.py b/TestON/tests/CHOtest/Dependencies/CHOtestFunctions.py
new file mode 100644
index 0000000..7441a5b
--- /dev/null
+++ b/TestON/tests/CHOtest/Dependencies/CHOtestFunctions.py
@@ -0,0 +1,152 @@
+"""
+Wrapper functions for CHOtest
+Author: you@onlab.us
+"""
+
+def __init__( self ):
+    self.default = ''
+
+def installHostIntents():
+    """
+    Install one host intent for each combination of hosts in the topology
+    """
+    import itertools
+    import time
+
+    hostCombos = list( itertools.combinations( main.hostMACs, 2 ) )
+    intentIdList = []
+    for i in xrange( 0, len( hostCombos ), int( main.numCtrls ) ):
+        pool = []
+        for cli in main.CLIs:
+            if i >= len( hostCombos ):
+                break
+            t = main.Thread( target=cli.addHostIntent,
+                             threadID=main.threadID,
+                             name="addHostIntent",
+                             args=[hostCombos[i][0],
+                                   hostCombos[i][1]])
+            pool.append(t)
+            t.start()
+            i = i + 1
+            main.threadID = main.threadID + 1
+        for thread in pool:
+            thread.join()
+            intentIdList.append( thread.result )
+
+    return intentIdList
+
+def installPointIntents():
+    """
+    Install one point intent for each permutation of devices in the topology
+    """
+    import itertools
+    import time
+
+    if main.prefix == 2:
+        # Spine-leaf topology is a special case
+        for i in range( len( main.hostMACs ) ):
+            main.MACsDict[ main.deviceDPIDs[ i+10 ] ] = main.hostMACs[ i ].split('/')[0]
+        deviceCombos = list( itertools.permutations( main.deviceDPIDs[10:], 2 ) )
+    else:
+        deviceCombos = list( itertools.permutations( main.deviceDPIDs, 2 ) )
+    intentIdList = []
+    time1 = time.time()
+    for i in xrange( 0, len( deviceCombos ), int( main.numCtrls ) ):
+        pool = []
+        for cli in main.CLIs:
+            if i >= len( deviceCombos ):
+                break
+            t = main.Thread( target=cli.addPointIntent,
+                             threadID=main.threadID,
+                             name="addPointIntent",
+                             args=[ deviceCombos[i][0],
+                                    deviceCombos[i][1],
+                                    1, 1, '',
+                                    main.MACsDict.get( deviceCombos[i][0] ),
+                                    main.MACsDict.get( deviceCombos[i][1] ) ] )
+            pool.append(t)
+            t.start()
+            i = i + 1
+            main.threadID = main.threadID + 1
+        for thread in pool:
+            thread.join()
+            intentIdList.append( thread.result )
+    time2 = time.time()
+    main.log.info("Time taken for adding point intents: %2f seconds" %( time2 - time1 ) )
+
+    return intentIdList
+
+def checkIntents():
+    """
+    Check if all the intents are in INSTALLED state
+    """
+    import time
+
+    intentResult = main.TRUE
+    for i in range( main.intentCheck ):
+        if i != 0:
+            main.log.warn( "Verification failed. Retrying..." )
+        main.log.info("Waiting for onos to install intents...")
+        time.sleep( main.checkIntentsDelay )
+
+        intentResult = main.TRUE
+        for e in range(int(main.numCtrls)):
+            main.log.info( "Checking intents on CLI %s" % (e+1) )
+            intentResultIndividual = main.CLIs[e].checkIntentState( intentsId=main.intentIds )
+            if not intentResultIndividual:
+                main.log.warn( "Not all intents installed on ONOS%s" % (e+1) )
+            intentResult = intentResult and intentResultIndividual
+        if intentResult:
+            break
+    if not intentResult:
+        main.log.info( "**** Intent Summary ****\n" + str(main.ONOScli1.intents( jsonFormat=False, summary=True)) )
+
+    return intentResult
+
+def checkPingall( protocol="IPv4" ):
+    """
+    Verify ping across all hosts
+    """
+    import time
+
+    pingResult = main.TRUE
+    for i in range( main.numPings ):
+        if i != 0:
+            main.log.warn( "Pingall failed. Retrying..." )
+            main.log.info( "Giving ONOS some time...")
+            time.sleep( main.pingSleep )
+
+        pingResult = main.Mininet1.pingall( protocol=protocol, timeout=main.pingTimeout )
+        if pingResult:
+            break
+
+    return pingResult
+
+def checkLinkEvents( linkEvent, linkNum ):
+    """
+    Verify link down/up events are correctly discovered by ONOS
+    linkNum: the correct link number after link down/up
+    """
+    import time
+
+    linkResult = main.TRUE
+    for i in range( main.linkCheck ):
+        if i != 0:
+            main.log.warn( "Verification failed. Retrying..." )
+            main.log.info( "Giving ONOS some time..." )
+            time.sleep( main.linkSleep )
+
+        linkResult = main.TRUE
+        for e in range( int( main.numCtrls ) ):
+            main.log.info( "Checking link number on ONOS%s" % (e+1) )
+            topology_output = main.CLIs[e].topology()
+            linkResultIndividual = main.ONOSbench.checkStatus( topology_output,
+                                                               main.numMNswitches,
+                                                               str( linkNum ) )
+            if not linkResultIndividual:
+                main.log.warn( "Link %s not discovered by ONOS%s" % ( linkEvent, (e+1) ) )
+            linkResult = linkResult and linkResultIndividual
+        if linkResult:
+            break
+
+    return linkResult