Stratum Support for Segement Rounting Suite

- Add Stratum Bmv2 switch support for SRDhcpRelay and SRRouting tests
- Add Support for 0x1 topology on a Stratum Tofino HW switch
- Support for dockerized mininet with Stratum BMv2 switches
- Update scapy driver to work with newer versions of scapy
- Simple parsing for scapy ping output
- Add support for fetching and installing external onos apps
- Add support for onos-diagnostics profiles
- Move onos log levels to params file
- Add onos cfg settings to SR tests

Change-Id: I7c4a71484c8fd5735da9ef09b96d8990283b199b
(cherry picked from commit bef6d9bd943996483fed32130cb30ad26a06aac0)
diff --git a/TestON/drivers/common/cli/hostdriver.py b/TestON/drivers/common/cli/hostdriver.py
index 7c7cd80..e14a38d 100644
--- a/TestON/drivers/common/cli/hostdriver.py
+++ b/TestON/drivers/common/cli/hostdriver.py
@@ -22,11 +22,7 @@
 
 import pexpect
 import re
-import sys
-import types
 import os
-import time
-from math import pow
 from drivers.common.cli.emulator.scapyclidriver import ScapyCliDriver
 
 class HostDriver( ScapyCliDriver ):
@@ -60,7 +56,7 @@
             self.interfaces.append( { 'ips': [ self.options[ 'ip' ] ],
                                       'isUp': True,
                                       'mac': self.options[ 'mac' ],
-                                      'name': None } )
+                                      'name': self.options.get( 'interfaceName', None ) } )
 
             try:
                 if os.getenv( str( self.ip_address ) ) is not None:
@@ -121,18 +117,18 @@
                     i = self.handle.expect( [ "closed", pexpect.TIMEOUT ] )
                     if i == 1:
                         main.log.error( self.name + ": timeout when waiting for response" )
-                        main.log.error( "response: " + str( self.handle.before ) )
+                        main.log.error( self.name + ": response: " + str( self.handle.before ) )
                 else:
                     self.handle.sendline( "" )
                     i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ], timeout=2 )
                     if i == 1:
                         main.log.warn( self.name + ": timeout when waiting for response" )
-                        main.log.warn( "response: " + str( self.handle.before ) )
+                        main.log.warn( self.name + ": response: " + str( self.handle.before ) )
                     self.handle.sendline( "exit" )
                     i = self.handle.expect( [ "closed", pexpect.TIMEOUT ], timeout=2 )
                     if i == 1:
                         main.log.warn( self.name + ": timeout when waiting for response" )
-                        main.log.warn( "response: " + str( self.handle.before ) )
+                        main.log.warn( self.name + ": response: " + str( self.handle.before ) )
                 return main.TRUE
         except TypeError:
             main.log.exception( self.name + ": Object not as expected" )
@@ -201,7 +197,7 @@
             i = self.handle.expect( [ "closed", pexpect.TIMEOUT ], timeout=2 )
             if i == 1:
                 main.log.error( self.name + ": timeout when waiting for response" )
-                main.log.error( "response: " + str( self.handle.before ) )
+                main.log.error( self.name + ": response: " + str( self.handle.before ) )
             return main.TRUE
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )
@@ -212,7 +208,7 @@
             main.log.error( self.name + ":     " + self.handle.before )
             return main.FALSE
 
-    def ping( self, dst, ipv6=False, wait=3 ):
+    def ping( self, dst, ipv6=False, interface=None, wait=3 ):
         """
         Description:
             Ping from this host to another
@@ -220,10 +216,13 @@
             dst: IP address of destination host
         Optional:
             ipv6: will use ping6 command if True; otherwise use ping command
+            interface: Specify which interface to use for the ping
             wait: timeout for ping command
         """
         try:
             command = "ping6" if ipv6 else "ping"
+            if interface:
+                command += " -I %s " % interface
             command += " -c 1 -i 1 -W " + str( wait ) + " " + str( dst )
             main.log.info( self.name + ": Sending: " + command )
             self.handle.sendline( command )
@@ -233,7 +232,7 @@
                 main.log.error(
                     self.name +
                     ": timeout when waiting for response" )
-                main.log.error( "response: " + str( self.handle.before ) )
+                main.log.error( self.name + ": response: " + str( self.handle.before ) )
             self.handle.sendline( "" )
             self.handle.expect( self.prompt )
             response = self.handle.before
@@ -314,7 +313,7 @@
                 main.log.error(
                     self.name +
                     ": timeout when waiting for response" )
-                main.log.error( "response: " + str( self.handle.before ) )
+                main.log.error( self.name + ": response: " + str( self.handle.before ) )
             response = self.handle.before
             return response
         except pexpect.EOF:
@@ -337,7 +336,7 @@
                                     timeout=wait + 5 )
             if i == 1:
                 main.log.error( self.name + ": timeout when waiting for response" )
-                main.log.error( "response: " + str( self.handle.before ) )
+                main.log.error( self.name + ": response: " + str( self.handle.before ) )
             response = self.handle.before
             return response
         except pexpect.EOF:
@@ -348,7 +347,7 @@
             main.log.exception( self.name + ": uncaught exception!" )
             main.cleanAndExit()
 
-    def command( self, cmd, wait=3 ):
+    def command( self, cmd, wait=3, debug=False):
         """
         Run shell command on host and return output
         Required:
@@ -359,10 +358,12 @@
             self.handle.sendline( cmd )
             i = self.handle.expect( [ self.prompt, pexpect.TIMEOUT ],
                                     timeout=wait + 5 )
+            response = self.handle.before
+            if debug:
+                main.log.debug( response )
             if i == 1:
                 main.log.error( self.name + ": timeout when waiting for response" )
-                main.log.error( "response: " + str( self.handle.before ) )
-            response = self.handle.before
+                main.log.error( self.name + ": response: " + str( response ) )
             return response
         except pexpect.EOF:
             main.log.error( self.name + ": EOF exception found" )