Stability fixes for SR Tests and small fixes for running ONOS in docker

- move checkOptions to component driver
- use karafTimeout for SR tests
- Fix some docker options
- Make sure mn docker can resolve own hostname
- Fix config file ip format for DHCP relay app

Change-Id: I85e8c52384e0fb478462fa9bbaf0b31a599b632b
(cherry picked from commit 521ecde3f8d28288303ea11129faa0cfd86b9bcd)
diff --git a/TestON/drivers/common/cli/networkdriver.py b/TestON/drivers/common/cli/networkdriver.py
index 968973d..c151aab 100755
--- a/TestON/drivers/common/cli/networkdriver.py
+++ b/TestON/drivers/common/cli/networkdriver.py
@@ -53,11 +53,6 @@
         super( NetworkDriver, self ).__init__()
         self.graph = Graph()
 
-    def checkOptions( self, var, defaultVar ):
-        if var is None or var == "":
-            return defaultVar
-        return var
-
     def connect( self, **connectargs ):
         """
         Creates ssh handle for the SDN network "bench".
@@ -635,7 +630,7 @@
                             output = dstHost.checkFilter()
                             main.log.debug( output )
                             if output:
-                                #TODO: parse output?
+                                # TODO: parse output?
                                 packets = dstHost.readPackets()
                                 for packet in packets.splitlines():
                                     main.log.debug( packet )
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index 7a0641e..72ed62c 100755
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -58,15 +58,12 @@
         self.handle = None
         self.karafUser = None
         self.karafPass = None
+        self.karafTimeout = None
+
         self.dockerPrompt = None
         self.graph = Graph()
         super( OnosCliDriver, self ).__init__()
 
-    def checkOptions( self, var, defaultVar ):
-        if var is None or var == "":
-            return defaultVar
-        return var
-
     def connect( self, **connectargs ):
         """
         Creates ssh handle for ONOS cli.
@@ -85,10 +82,13 @@
                     self.karafPass = self.options[ key ]
                 elif key == "docker_prompt":
                     self.dockerPrompt = self.options[ key ]
+                elif key == "karaf_timeout":
+                    self.karafTimeout = self.options[ key ]
             self.home = self.checkOptions( self.home, "~/onos" )
             self.karafUser = self.checkOptions( self.karafUser, self.user_name )
             self.karafPass = self.checkOptions( self.karafPass, self.pwd )
             self.dockerPrompt = self.checkOptions( self.dockerPrompt, "~/onos#" )
+            self.karafTimeout = self.checkOptions( self.karafTimeout, 7200000  )
 
             for key in self.options:
                 if key == 'onosIp':
@@ -301,6 +301,7 @@
                 startCliCommand = "onos " + str( ONOSIp )
             self.handle.sendline( startCliCommand )
             tries = 0
+            setTimeout = False
             while tries < 5:
                 i = self.handle.expect( [
                     self.karafPrompt,
@@ -308,14 +309,17 @@
                     pexpect.TIMEOUT ], onosStartTimeout )
 
                 if i == 0:
-                    main.log.info( str( ONOSIp ) + " CLI Started successfully" )
+                    if setTimeout:
+                        main.log.info( str( ONOSIp ) + " CLI Started successfully" )
+                        return main.TRUE
                     if karafTimeout:
                         self.handle.sendline(
                             "config:property-set -p org.apache.karaf.shell\
                                      sshIdleTimeout " +
-                            karafTimeout )
-                        self.handle.expect( self.karafPrompt )
-                    return main.TRUE
+                            str( karafTimeout ) )
+                        self.handle.expect( "closed by remote host" )
+                        self.handle.sendline( startCliCommand )
+                        setTimeout = True
                 elif i == 1:
                     main.log.info( str( ONOSIp ) + " CLI asking for password" )
                     main.log.debug( "Sending %s" % self.karafPass )
@@ -6739,8 +6743,6 @@
                 if not ready:
                     self.handle.expect( self.dockerPrompt )
                 time.sleep( 1 )
-            #main.log.debug( "%s: It took %s tries for onos log folder to %sbe created" %
-            #                    ( self.name, retries, "" if ready else "NOT " ) )
 
             cmdList = []
             cmdList.append( "apt-get update" )
diff --git a/TestON/drivers/common/cli/onosclusterdriver.py b/TestON/drivers/common/cli/onosclusterdriver.py
index 520250b..6ca91b7 100755
--- a/TestON/drivers/common/cli/onosclusterdriver.py
+++ b/TestON/drivers/common/cli/onosclusterdriver.py
@@ -96,11 +96,6 @@
         self.nodes = []
         super( OnosClusterDriver, self ).__init__()
 
-    def checkOptions( self, var, defaultVar ):
-        if var is None or var == "":
-            return defaultVar
-        return var
-
     def connect( self, **connectargs ):
         """
         Creates ssh handle for ONOS "bench".
@@ -126,10 +121,16 @@
                     self.useDocker = "True" == self.options[ key ]
                 elif key == "docker_prompt":
                     self.dockerPrompt = self.options[ key ]
+                elif key == "web_user":
+                    self.webUser = self.options[ key ]
+                elif key == "web_pass":
+                    self.webPass = self.options[ key ]
 
             self.home = self.checkOptions( self.home, "~/onos" )
             self.karafUser = self.checkOptions( self.karafUser, self.user_name )
             self.karafPass = self.checkOptions( self.karafPass, self.pwd )
+            self.webUser = self.checkOptions( self.webUser, "onos" )
+            self.webPass = self.checkOptions( self.webPass, "rocks" )
             prefix = self.checkOptions( prefix, "ONOS" )
             self.useDocker = self.checkOptions( self.useDocker, False )
             self.dockerPrompt = self.checkOptions( self.dockerPrompt, "~/onos#" )
@@ -250,7 +251,6 @@
             main.componentDictionary[ name ][ 'host' ] = host
         main.componentDictionary[name]['type'] = "OnosCliDriver"
         main.componentDictionary[name]['connect_order'] = str( int( main.componentDictionary[name]['connect_order'] ) + 1 )
-        main.log.debug( main.componentDictionary[name] )
 
     def createCliComponent( self, name, host ):
         """
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index 6b13e3a..18540f0 100755
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -39,6 +39,11 @@
         """
         self.name = None
         self.home = None
+        self.maxNodes = None
+        self.karafUser = None
+        self.karafPass = None
+        self.webUser = None
+        self.webPass = None
         self.handle = None
         self.nicAddr = None
         super( OnosDriver, self ).__init__()
@@ -55,26 +60,26 @@
 
             for key in connectargs:
                 vars( self )[ key ] = connectargs[ key ]
-            self.home = "~/onos"
-            for key in self.options:
-                if key == "home":
-                    self.home = self.options[ 'home' ]
-                    break
-            if self.home is None or self.home == "":
-                self.home = "~/onos"
-
             self.name = self.options[ 'name' ]
 
             # The 'nodes' tag is optional and it is not required in .topo file
             for key in self.options:
-                if key == "nodes":
+                if key == "home":
+                    self.home = self.options[ 'home' ]
+                elif key == "nodes":
                     # Maximum number of ONOS nodes to run, if there is any
                     self.maxNodes = int( self.options[ 'nodes' ] )
-                    break
-                self.maxNodes = None
+                elif key == "web_user":
+                    self.webUser = self.options[ key ]
+                elif key == "web_pass":
+                    self.webPass = self.options[ key ]
 
-            if self.maxNodes is None or self.maxNodes == "":
-                self.maxNodes = 100
+            self.home = self.checkOptions( self.home, "~/onos" )
+            self.maxNodes = self.checkOptions( self.maxNodes, 100 )
+            self.karafUser = self.checkOptions( self.karafUser, self.user_name )
+            self.karafPass = self.checkOptions( self.karafPass, self.pwd )
+            self.webUser = self.checkOptions( self.webUser, "onos" )
+            self.webPass = self.checkOptions( self.webPass, "rocks" )
 
             # Grabs all OC environment variables based on max number of nodes
             self.onosIps = {}  # Dictionary of all possible ONOS ip
@@ -826,6 +831,8 @@
             # on here.
             appString = "export ONOS_APPS=" + appString
             onosGroup = "export ONOS_GROUP=" + onosUser
+            onosWebUser = "export ONOS_WEB_USER=" + self.webUser
+            onosWebPass = "export ONOS_WEB_PASS=" + self.webPass
             onosUser = "export ONOS_USER=" + onosUser
             if useSSH:
                 onosUseSSH = "export ONOS_USE_SSH=true"
@@ -871,6 +878,8 @@
             cellFile.write( appString + "\n" )
             cellFile.write( onosGroup + "\n" )
             cellFile.write( onosUser + "\n" )
+            cellFile.write( onosWebUser + "\n" )
+            cellFile.write( onosWebPass + "\n" )
             if useSSH:
                 cellFile.write( onosUseSSH + "\n" )
             cellFile.close()
@@ -2718,10 +2727,15 @@
             for ip in onosIPs:
                 cmd += " " + str( ip )
             self.handle.sendline( cmd )
-            self.handle.expect( self.prompt, timeout=timeout )
-            handle = self.handle.before
-            main.log.debug( handle )
+            i = 0
+            while i == 0:
+                i = self.handle.expect( [ "Password", self.prompt ], timeout=timeout )
+                handle = self.handle.before
+                main.log.debug( "%s: %s" % ( self.name, handle ) )
+                if i == 0:
+                    self.handle.sendline( self.pwd )
             assert handle is not None, "Error in sendline"
+            assert "The requested URL returned error" not in handle, handle
             assert "Command not found:" not in handle, handle
             assert "Exception:" not in handle, handle
             # Rename and move diags file to dstDir from /tmp
@@ -2730,7 +2744,7 @@
             self.handle.sendline( "mv /tmp/onos-diags.tar.gz " + str( dstDir ) + "onos-diags" + str( suffix ) + ".tar.gz" )
             self.handle.expect( self.prompt )
             handle = self.handle.before
-            main.log.debug( handle )
+            main.log.debug( "%s: %s" % ( self.name, handle ) )
             assert handle is not None, "Error in sendline"
             assert "No such file or directory" not in handle, handle
             return main.TRUE