Refactor ONOS Drivers
Changes include:
        Include component handle in log messages
        Replace carriage returns with new line characters
        Remove static IP addresses and passwords
        Add exception handling to prevent TestON crashes
        Delete old tests and duplicate files

Onoscli driver
        Remove assert from isup()
        Parameterize REST port and set default to 8080
        Add ONOS home directory, default to ~/ONOS
        Merge onosrestapidriver.py into onosclidriver.py
        Remove ctrl_one and ctrl_none functions
        Improve git_pull() error checking
        Parameterize the interface for tcpdump
        Print more information in get_version
        Parameterize the scp source username and password for add_flow
        Remove Link_up and Link_down - see link() in mininet driver

Mininet Driver
        assign_sw_controller takes COUNT to indicate how many controllers to assign to a switch - requires change to each test that uses this function to assign more than 1 controller to a switch
        remove static password
        doubled timeout for cleanup(larger networks can take longer to clean)

Zookeeper Driver
        Remove start() call from connect()
        add Zookeeper home directory, with default as ~/zookeeper-3.4.5

Cassandra Driver
        Improve logic of status function
        Check if self is up in isup instead of 4 instances running
diff --git a/TestON/drivers/common/api/onosrestapidriver.py b/TestON/drivers/common/api/onosrestapidriver.py
deleted file mode 100644
index 39c649c..0000000
--- a/TestON/drivers/common/api/onosrestapidriver.py
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python
-'''
-Created on 4-Jun-2013
-
-@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
-
-
-    TestON is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
-
-    TestON is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.        
-
-
-onosrestapidriver is the basic driver which will handle the onorestapi functions
-'''
-
-import struct
-import fcntl
-import os
-import signal
-import re
-import sys
-import time 
-import json
-
-sys.path.append("../")
-from drivers.common.apidriver import API
-import urllib
-import __builtin__
-
-
-class OnosRestApiDriver(API):
-
-    def __init__(self):
-        super(API, self).__init__()
-                                                
-
-    def connect(self,**connectargs):
-        for key in connectargs:
-            vars(self)[key] = connectargs[key]
-        
-        self.name = self.options['name']
-        self.handle = super(OnosRestApiDriver,self).connect()
-        main.log.info(self.options['topology_url'])
-        try :
-            self.handle = urllib.urlopen(self.options['topology_url'])
-        except Exception,e:
-            main.log.error(e)
-            
-        self.logFileName = main.logdir+"/"+self.name+".session"
-        
-        if self.handle:
-            return self.handle
-        else :
-            return main.FALSE
-
-    def execute(self):
-        main.log.info(self.options['topology_url'])
-        response = main.FALSE
-        for i in [1,2] :
-            time.sleep(2)
-            response = self.http_request()
-        return response
-        
-    def http_request(self):
-        try :
-            self.handle = urllib.urlopen(self.options['topology_url'])
-
-            resonse_lines = self.handle.readlines()
-            print resonse_lines
-            return resonse_lines
-        except Exception,e:
-            main.log.error(e)
-            return "url error"
-   
-    def disconnect(self,handle):
-        response = ''
-        '''
-        if self.handle:
-            self.handle = handle
-            response = self.execute(cmd="exit",prompt="(.*)",timeout=120)
-        else :
-            main.log.error("Connection failed to the host")
-            response = main.FALSE
-        '''
-        return response  
-    
-    def find_host(self,RestIP,RestPort,RestAPI,hostIP):
-	retcode = 0
-        retswitch = []
-        retport = []
-        retmac = []
-        foundIP = []
-	##### device rest API is: 'host:8080/wm/core/topology/switches/all/json' ###
-	url ="http://%s:%s%s" %(RestIP,RestPort,RestAPI)
-		
-	try:
-	    command = "curl -s %s" % (url)
-	    result = os.popen(command).read()
-	    parsedResult = json.loads(result)
-            # print parsedResult
-	except:
-	    print "REST IF %s has issue" % command
-	    parsedResult = ""  
-
-    	if parsedResult == "":
-	    return (retcode, "Rest API has an error")	
-	else:
-            for switch in enumerate(parsedResult):
-                for port in enumerate(switch[1]['ports']):
-                    if ( port[1]['devices'] != [] ):
-                        try:
-                            foundIP =  port[1]['devices'][0]['ipv4addresses'][0]['ipv4']
-                        except:
-                            print "Error in detecting IP address."
-                        if foundIP == hostIP:
-	                    retswitch.append(switch[1]['dpid'])
-                            retport.append(port[1]['desc'])
-                            retmac.append(port[1]['devices'][0]['mac'])
-                            retcode = retcode +1
-                            foundIP =''
-        return(retcode, retswitch, retport, retmac)
-
diff --git a/TestON/drivers/common/api/onosrestapidriver.py_bak b/TestON/drivers/common/api/onosrestapidriver.py_bak
deleted file mode 100644
index 4af2603..0000000
--- a/TestON/drivers/common/api/onosrestapidriver.py_bak
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python
-'''
-Created on 4-Jun-2013
-
-@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
-
-
-    TestON is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
-
-    TestON is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with TestON.  If not, see <http://www.gnu.org/licenses/>.        
-
-
-onosrestapidriver is the basic driver which will handle the onorestapi functions
-'''
-
-import struct
-import fcntl
-import os
-import signal
-import re
-import sys
-import time 
-import json
-
-sys.path.append("../")
-from drivers.common.apidriver import API
-import urllib
-import __builtin__
-
-
-class OnosRestApiDriver(API):
-
-    def __init__(self):
-        super(API, self).__init__()
-                                                
-
-    def connect(self,**connectargs):
-        for key in connectargs:
-            vars(self)[key] = connectargs[key]
-        
-        self.name = self.options['name']
-        self.handle = super(OnosRestApiDriver,self).connect()
-        main.log.info(self.options['topology_url'])
-        try :
-            self.handle = urllib.urlopen(self.options['topology_url'])
-        except Exception,e:
-            main.log.error(e)
-            
-        self.logFileName = main.logdir+"/"+self.name+".session"
-        
-        if self.handle:
-            return self.handle
-        else :
-            return main.FALSE
-
-    def execute(self):
-        main.log.info(self.options['topology_url'])
-        response = main.FALSE
-        for i in [1,2] :
-            time.sleep(2)
-            response = self.http_request()
-        return response
-        
-    def http_request(self):
-        try :
-            self.handle = urllib.urlopen(self.options['topology_url'])
-
-            resonse_lines = self.handle.readlines()
-            print resonse_lines
-            return resonse_lines
-        except Exception,e:
-            main.log.error(e)
-            return "url error"
-   
-    def disconnect(self,handle):
-        response = ''
-        '''
-        if self.handle:
-            self.handle = handle
-            response = self.execute(cmd="exit",prompt="(.*)",timeout=120)
-        else :
-            main.log.error("Connection failed to the host")
-            response = main.FALSE
-        '''
-        return response  
-    
-    def find_host(self,RestIP,RestPort,RestAPI,hostIP):
-	retcode = 0
-        retswitch = ''
-        retport = ''
-        retmac = ''
-        foundIP = ''
-	##### device rest API is: 'host:8080/wm/core/topology/switches/all/json' ###
-	url ="http://%s:%s%s" %(RestIP,RestPort,RestAPI)
-		
-	try:
-	    command = "curl -s %s" % (url)
-	    result = os.popen(command).read()
-	    parsedResult = json.loads(result)
-            # print parsedResult
-	except:
-	    print "REST IF %s has issue" % command
-	    parsedResult = ""  
-
-    	if parsedResult == "":
-	    return (retcode, "Rest API has an error")	
-	else:
-            for switch in enumerate(parsedResult):
-                for port in enumerate(switch[1]['ports']):
-                    if ( port[1]['devices'] != [] ):
-                        try:
-                            foundIP =  port[1]['devices'][0]['ipv4addresses'][0]['ipv4']
-                        except:
-                            print "Error in detecting IP address."
-                        if foundIP == hostIP:
-                            retcode = retcode +1
-	                    retswitch = switch[1]['dpid']
-                            retport = port[1]['desc']
-                            retmac = port[1]['devices'][0]['mac']
-                            foundIP =''
-        return(retcode, retswitch, retport, retmac)
-
diff --git a/TestON/drivers/common/cli/cassandraclidriver.py b/TestON/drivers/common/cli/cassandraclidriver.py
index 6a961ee..bad8c4e 100644
--- a/TestON/drivers/common/cli/cassandraclidriver.py
+++ b/TestON/drivers/common/cli/cassandraclidriver.py
@@ -58,8 +58,8 @@
             #self.start()
             return main.TRUE
         else :
-            main.log.error("Connection failed to the host "+self.user_name+"@"+self.ip_address) 
-            main.log.error("Failed to connect to the Onos system")
+            main.log.error(self.name + ": Connection failed to the host "+self.user_name+"@"+self.ip_address) 
+            main.log.error(self.name + ": Failed to connect to the Onos system")
             return main.FALSE
    
  
@@ -67,7 +67,7 @@
         '''
         This Function will start the Cassandra
         '''
-        main.log.info( "Starting Cassandra" )
+        main.log.info(self.name + ": Starting Cassandra" )
         self.handle.sendline("")
         self.handle.expect("\$")
         self.handle.sendline("~/ONOS/start-cassandra.sh start")
@@ -76,10 +76,10 @@
         response = self.handle.before + self.handle.after
         time.sleep(5)
         if re.search("Starting\scassandra(.*)", response):
-            main.log.info("Cassandra Started ")
+            main.log.info(self.name + ": Cassandra Started ")
             return main.TRUE
         else:
-            main.log.error("Failed to start Cassandra"+ response)
+            main.log.error(self.name + ": Failed to start Cassandra"+ response)
             return main.FALSE
         
     def status(self):
@@ -87,33 +87,40 @@
         This Function will return the Status of the Cassandra
         '''
         time.sleep(5)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         response = self.execute(cmd="~/ONOS/start-cassandra.sh status ",prompt="\d+\sinstance\sof\scassandra\srunning(.*)",timeout=10)
         
 
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        return response
+        #self.execute(cmd="\n",prompt="\$",timeout=10)
+        #return response
         
-        if re.search("0\sinstance\sof\scassandra\srunning(.*)") :
-            main.log.info("Cassandra not running")
+        if re.search("0\sinstance\sof\scassandra\srunning(.*)",response) :
+            main.log.info(self.name + ": Cassandra not running")
+            return main.FALSE
+        elif re.search("1\sinstance\sof\scassandra\srunning(.*)",response):
+            main.log.warn(self.name + ": Cassandra Running")
             return main.TRUE
-        elif re.search("1\sinstance\sof\scassandra\srunning(.*)"):
-            main.log.warn("Cassandra Running")
+        elif re.search("\sinstance\sof\scassandra\srunning(.*)",response):
+            main.log.warn(self.name + ": Multiple instances of Cassandra Running on the same machine!")
+            #Known bug: Once ONOS starts the script shows 2 instances
             return main.TRUE
+	else: 
+	    main.log.warn(self.name + ": Cannot determine cassandra status")
+	    return main.False
             
     def stop(self):
         '''
         This Function will stop the Cassandra if it is Running
         ''' 
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         time.sleep(5)
         response = self.execute(cmd="~/ONOS/start-cassandra.sh stop ",prompt="Killed\sexisting\sprosess(.*)",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         if re.search("Killed\sexisting\sprosess(.*)",response):
-            main.log.info("Cassandra Stopped")
+            main.log.info(self.name + ": Cassandra Stopped")
             return main.TRUE
         else:
-            main.log.warn("Cassndra is not Running")
+            main.log.warn(self.name + ": Cassndra is not Running")
             return main.FALSE
             
     def disconnect(self):
@@ -125,7 +132,7 @@
             self.handle.sendline("exit")
             self.handle.expect("closed")
         else :
-            main.log.error("Connection failed to the host")
+            main.log.error(self.name + ": Connection failed to the host")
             response = main.FALSE
         return response 
 
@@ -136,16 +143,17 @@
         returns TRUE if it sees four occurances of both Up, and Normal 
         '''
         tries = 5
-        main.log.info("trying %i times" % tries )
+        main.log.info(self.name + ": trying %i times" % tries )
         for i in range(tries):
-            self.execute(cmd="\r",prompt="\$",timeout=10)
+            self.execute(cmd="\n",prompt="\$",timeout=10)
             self.handle.sendline("")
             self.handle.expect("\$") 
             self.handle.sendline("~/ONOS/start-cassandra.sh status")
             self.handle.expect("sh status") 
             self.handle.expect("\$") 
             result = self.handle.before + self.handle.after 
-            pattern = '(.*)Up(.*)Normal(.*)\n(.*)Up(.*)Normal(.*)\n(.*)Up(.*)Normal(.*)\n(.*)Up(.*)Normal(.*)'
+            #pattern = '(.*)Up(.*)Normal(.*)\n(.*)Up(.*)Normal(.*)\n(.*)Up(.*)Normal(.*)\n(.*)Up(.*)Normal(.*)'
+	    pattern = '(' + self.ip_address.replace('.', '\\.') + '.*)Up(.*)Normal(.*)'
             if re.search(pattern, result): 
                 return main.TRUE
         return main.FALSE
diff --git a/TestON/drivers/common/cli/emulator/flowvisordriver.py b/TestON/drivers/common/cli/emulator/flowvisordriver.py
index 8df7338..66946bd 100644
--- a/TestON/drivers/common/cli/emulator/flowvisordriver.py
+++ b/TestON/drivers/common/cli/emulator/flowvisordriver.py
@@ -91,7 +91,7 @@
         else :
             self.execute(cmd="clear",prompt="\$",timeout=10)
             self.execute(cmd="./fvctl.sh removeFlowSpace "+id,prompt="passwd:",timeout=10)
-            self.execute(cmd="\r",prompt="\$",timeout=10)
+            self.execute(cmd="\n",prompt="\$",timeout=10)
             main.log.info("Removed flowSpace which is having id :"+id)
             
         return main.TRUE
@@ -129,7 +129,7 @@
 
         #self.execute(cmd="clear",prompt="\$",timeout=10)
         self.execute(cmd="./fvctl.sh addFlowSpace "+flowspace,prompt="passwd:",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         sucess_match = re.search("success\:\s+(\d+)", main.last_response)
         if sucess_match :
             main.log.info("Added flow Space and id is "+sucess_match.group(1))
@@ -142,7 +142,7 @@
     def listFlowSpace(self):
         self.execute(cmd="clear",prompt="\$",timeout=10)
         self.execute(cmd="./fvctl.sh listFlowSpace ",prompt="passwd:",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         flow_space = main.last_response
         flow_space = self.remove_contol_chars( flow_space)
         flow_space = re.sub("rule\s(\d+)\:", "\nrule "+r'\1'+":",flow_space)
@@ -153,7 +153,7 @@
     def listDevices(self):
         #self.execute(cmd="clear",prompt="\$",timeout=10)
         #self.execute(cmd="./fvctl.sh listDevices ",prompt="passwd:",timeout=10)
-        #self.execute(cmd="\r",prompt="\$",timeout=10)
+        #self.execute(cmd="\n",prompt="\$",timeout=10)
         devices_list = ''
         last_response = re.findall("(Device\s\d+\:\s((\d|[a-z])(\d|[a-z])\:)+(\d|[a-z])(\d|[a-z]))", main.last_response)
         
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index 59fae79..34e5841 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -61,11 +61,11 @@
             main.log.info("Clearing any residual state or processes")
             self.handle.sendline("sudo mn -c")
 
-            i=self.handle.expect(['password\sfor\sadmin','Cleanup\scomplete',pexpect.EOF,pexpect.TIMEOUT],60)
+            i=self.handle.expect(['password\sfor\sadmin','Cleanup\scomplete',pexpect.EOF,pexpect.TIMEOUT],120)
             if i==0:
                 main.log.info("sending sudo password")
-                self.handle.sendline('onos_test')
-                i=self.handle.expect(['admin:','\$',pexpect.EOF,pexpect.TIMEOUT],60)
+                self.handle.sendline(pwd)
+                i=self.handle.expect(['admin:','\$',pexpect.EOF,pexpect.TIMEOUT],120)
             if i==1:
                 main.log.info("Clean")
 
@@ -77,7 +77,6 @@
             #cmdString = "sudo mn --topo "+self.options['topo']+","+self.options['topocount']+" --mac --switch "+self.options['switch']+" --controller "+self.options['controller']
             #cmdString = "sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --controller remote --ip 192.168.56.102 --port 6633 --topo mytopo"
             main.log.info("building fresh mininet") 
-
             #### for reactive/PARP enabled tests
             cmdString = "sudo mn " + self.options['arg1'] + " " + self.options['arg2'] +  " --mac --controller " + self.options['controller']
             #### for proactive flow with static ARP entries
@@ -154,8 +153,9 @@
         
         args = utilities.parse_args(["SRC","TARGET"],**pingParams)
         #command = args["SRC"] + " ping -" + args["CONTROLLER"] + " " +args ["TARGET"]
-        command = args["SRC"] + " ping "+args ["TARGET"]+" -c 1 -i .2"
+        command = args["SRC"] + " ping "+args ["TARGET"]+" -c 1 -i 1"
         response = self.execute(cmd=command,prompt="mininet",timeout=10 )
+        main.log.info("Ping Response: "+ response )
         if utilities.assert_matches(expect=',\s0\%\spacket\sloss',actual=response,onpass="No Packet loss",onfail="Host is not reachable"):
             main.log.info("NO PACKET LOSS, HOST IS REACHABLE")
             main.last_result = main.TRUE 
@@ -164,7 +164,6 @@
             main.log.error("PACKET LOST, HOST IS NOT REACHABLE")
             main.last_result = main.FALSE
             return main.FALSE
-        
     
     def checkIP(self,host):
         '''
@@ -334,40 +333,29 @@
         main.log.info(self.execute(cmd=command,prompt="mininet>",timeout=10))
 
     def assign_sw_controller(self,**kwargs):
-        args = utilities.parse_args(["SW","IP1","PORT1","IP2","PORT2","IP3","PORT3","IP4","PORT4","IP5","PORT5","IP6","PORT6","IP7","PORT7","IP8","PORT8"],**kwargs)
+        '''
+        count is only needed if there is more than 1 controller
+        '''
+        args = utilities.parse_args(["COUNT"],**kwargs)
+        count = args["COUNT"] if args!={} else 1
+
+        argstring = "SW"
+        for j in range(count):
+            argstring = argstring + ",IP" + str(j+1) + ",PORT" + str(j+1)
+        args = utilities.parse_args(argstring.split(","),**kwargs)
+
         sw = args["SW"] if args["SW"] != None else ""
-        ip1 = args["IP1"] if args["IP1"] != None else ""
-        ip2 = args["IP2"] if args["IP2"] != None else ""
-        ip3 = args["IP3"] if args["IP3"] != None else ""
-        ip4 = args["IP4"] if args["IP4"] != None else ""
-        ip5 = args["IP5"] if args["IP5"] != None else ""
-        ip6 = args["IP6"] if args["IP6"] != None else ""
-        ip7 = args["IP7"] if args["IP7"] != None else ""
-        ip8 = args["IP8"] if args["IP8"] != None else ""
-       # master = args["MASTER"] if args["MASTER"] != None else ""
-        port1 = args["PORT1"] if args["PORT1"] != None else ""
-        port2 = args["PORT2"] if args["PORT2"] != None else ""
-        port3 = args["PORT3"] if args["PORT3"] != None else ""
-        port4 = args["PORT4"] if args["PORT4"] != None else ""
-        port5 = args["PORT5"] if args["PORT5"] != None else ""
-        port6 = args["PORT6"] if args["PORT6"] != None else ""
-        port7 = args["PORT7"] if args["PORT7"] != None else ""
-        port8 = args["PORT8"] if args["PORT8"] != None else ""
         ptcpA = int(args["PORT1"])+int(sw) if args["PORT1"] != None else ""
-        ptcpB = "ptcp:"+str(ptcpA) if ip1 != "" else ""
-        tcp1 = "tcp:"+str(ip1)+":"+str(port1) if ip1 != "" else ""
-        tcp2 = "tcp:"+str(ip2)+":"+str(port2) if ip2 != "" else ""
-        tcp3 = "tcp:"+str(ip3)+":"+str(port3) if ip3 != "" else ""
-        tcp4 = "tcp:"+str(ip4)+":"+str(port4) if ip4 != "" else ""
-        tcp5 = "tcp:"+str(ip5)+":"+str(port5) if ip5 != "" else ""
-        tcp6 = "tcp:"+str(ip6)+":"+str(port6) if ip6 != "" else ""
-        tcp7 = "tcp:"+str(ip7)+":"+str(port7) if ip7 != "" else ""
-        tcp8 = "tcp:"+str(ip8)+":"+str(port8) if ip8 != "" else ""
-       # master1 = tcp1+" role master " if args["MASTER"] == 1 else ""
-       # master2 = tcp2+" role master " if args["MASTER"] == 2 else ""
-       # master3 = tcp3+" role master " if args["MASTER"] == 3 else ""
-       # master4 = tcp4+" role master " if args["MASTER"] == 4 else ""
-        command = "sh ovs-vsctl set-controller s"+str(sw)+" "+ptcpB+" "+tcp1+" "+tcp2+" "+tcp3+" "+tcp4+" "+tcp5+" "+tcp6+" "+tcp7+" "+tcp8
+        ptcpB = "ptcp:"+str(ptcpA) if ptcpA != "" else ""
+        
+        command = "sh ovs-vsctl set-controller s" + str(sw) + " " + ptcpB + " "
+        for j in range(count):
+            i=j+1
+            args = utilities.parse_args(["IP"+str(i),"PORT"+str(i)],**kwargs)
+            ip = args["IP"+str(i)] if args["IP"+str(i)] != None else ""
+            port = args["PORT" + str(i)] if args["PORT" + str(i)] != None else ""
+            tcp = "tcp:" + str(ip) + ":" + str(port) + " " if ip != "" else ""
+            command = command + tcp
         self.execute(cmd=command,prompt="mininet>",timeout=5)
 
     def disconnect(self):
diff --git a/TestON/drivers/common/cli/onoscli/__init__.py b/TestON/drivers/common/cli/onoscli/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/TestON/drivers/common/cli/onoscli/__init__.py
+++ /dev/null
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index dadaf67..b43b9f4 100644
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -22,9 +22,9 @@
 import time
 import pexpect
 import struct, fcntl, os, sys, signal
-import sys
 import re
 import json
+import traceback
 sys.path.append("../")
 from drivers.common.clidriver import CLI
 
@@ -37,110 +37,129 @@
 	'''
         Creates ssh handle for ONOS. 
         '''
-        for key in connectargs:
-           vars(self)[key] = connectargs[key]
+        try:
+            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
 
-        
-        self.name = self.options['name']
-        self.handle = super(OnosCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
+            
+            self.name = self.options['name']
+            self.handle = super(OnosCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd, home = self.home)
 
-        if self.handle:
-            #self.start()
-            #self.start_rest()
-            return self.handle
-        else :
-            main.log.info("NO HANDLE")
-            return main.FALSE
+            if self.handle:
+                #self.start()
+                #self.start_rest()
+                return self.handle
+            else :
+                main.log.info("NO ONOS HANDLE")
+                return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
         
     def start(self):
         '''
         Starts ONOS on remote machine.
         Returns false if any errors were encountered. 
         '''
-        self.handle.sendline("")
-        self.handle.expect("\$")
-        self.handle.sendline("~/ONOS/start-onos.sh start")
-        self.handle.expect("onos.sh start")
-        i=self.handle.expect(["Starting\sONOS\scontroller","Cassandra\sis\snot\srunning"])
-        if i==0:
-            try: 
-                self.handle.expect("\$", timeout=60)
-                main.log.info("ONOS Started ") 
-            except:  
-                main.log.info("ONOS NOT Started, stuck while waiting for it to start ") 
+        try: 
+            self.handle.sendline("")
+            self.handle.expect("\$")
+            self.handle.sendline(self.home + "/start-onos.sh start")
+            self.handle.expect("onos.sh start")
+            i=self.handle.expect(["Starting\sONOS\scontroller","Cassandra\sis\snot\srunning"])
+            if i==0:
+                try:
+                    self.handle.expect("\$", timeout=60)
+                    main.log.info(self.name + ": ONOS Started ")
+                except:
+                    main.log.info(self.name + ": ONOS NOT Started, stuck while waiting for it to start ")
+                    return main.FALSE
+                return main.TRUE
+            elif i==1:
+                main.log.error(self.name + ": ONOS didn't start because cassandra wasn't running.")
                 return main.FALSE
-            return main.TRUE
-        elif i==1:
-            main.log.error("ONOS didn't start because cassandra wasn't running.") 
+                raise
+            main.log.error(self.name + ": ONOS expect script missed something... ") 
             return main.FALSE
-        
-        main.log.error("ONOS expect script missed something... ") 
-        return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
  
     def start_embedded(self):
-        self.handle.sendline("")
-        self.handle.expect("\$")
-        self.handle.sendline("~/ONOS/start-onos-embedded.sh start")
+        '''
+        Starts ONOS on remote machine with cassandra embedded.
+        Returns false if any errors were encountered.
+        '''
         try:
-            self.handle.expect("start...")
-            main.log.info("Embedded ONOS started")
+            self.handle.sendline("")
+            self.handle.expect("\$")
+            self.handle.sendline("~/ONOS/start-onos-embedded.sh start")
+            try:
+                self.handle.expect("start...")
+                main.log.info(self.name + ": Embedded ONOS started")
+            except:
+                main.log.info(self.name + ": Embedded ONOS failed to start")
+                return main.FALSE
         except:
-            main.log.info("Embedded ONOS failed to start")
-
-    def link_down(self, **linkParams):
-        '''
-        Specifically used for the ONOS demo on the HW.
-        Should be replaced by actual switch drivers in the future.
-        '''
-        args = utilities.parse_args(["SDPID","SPORT","DDPID","DPORT"], **linkParams)
-        sdpid = args["SDPID"] if args["SDPID"] != None else "00:00:00:00:ba:5e:ba:13"
-        sport = args["SPORT"] if args["SPORT"] != None else "22"
-        ddpid = args["DDPID"] if args["DDPID"] != None else "00:00:20:4e:7f:51:8a:35"
-        dport = args["DPORT"] if args["DPORT"] != None else "22"
-       
-        cmd = "curl -s  10.128.4.11:9000/gui/link/down/" + sdpid + "/" + sport + "/" + ddpid + "/" + dport + " > /tmp/log &"
-        os.popen( cmd ) 
-
-    def link_up(self, **linkParams):
-        '''
-        Specifically used for the ONOS demo on the HW.
-        Should be replaced by actual switch drivers in the future.
-        '''
-        args = utilities.parse_args(["SDPID","SPORT","DDPID","DPORT"], **linkParams)
-        sdpid = args["SDPID"] if args["SDPID"] != None else "00:00:00:00:ba:5e:ba:13"
-        sport = args["SPORT"] if args["SPORT"] != None else "22"
-        ddpid = args["DDPID"] if args["DDPID"] != None else "00:00:20:4e:7f:51:8a:35"
-        dport = args["DPORT"] if args["DPORT"] != None else "22"
-       
-        cmd = "curl -s  10.128.4.11:9000/gui/link/up/" + sdpid + "/" + sport + "/" + ddpid + "/" + dport + " > /tmp/log &"
-        os.popen( cmd ) 
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
     def start_rest(self):
         '''
         Starts the rest server on ONOS.
-        '''
-        response = self.execute(cmd="~/ONOS/start-rest.sh start",prompt="\$",timeout=10)
-        if re.search("admin",response):
-            main.log.info("Rest Server Started Successfully")
-            time.sleep(5)
-            return main.TRUE
-        else :
-            main.log.warn("Failed to start Rest Server")   
-            return main.FALSE     
-        
+        ''' 
+        try:
+            response = self.execute(cmd= self.home + "/start-rest.sh start",prompt="\$",timeout=10)
+            if re.search("admin",response):
+                main.log.info(self.name + ": Rest Server Started Successfully")
+                time.sleep(5)
+                return main.TRUE
+            else :
+                main.log.warn(self.name + ": Failed to start Rest Server")   
+                return main.FALSE     
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+    
     def status(self):
         '''
         Called start-onos.sh status and returns TRUE/FALSE accordingly 
         '''
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        response = self.execute(cmd="~/ONOS/start-onos.sh status ",prompt="\d+\sinstance\sof\sonos\srunning",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        if re.search("1\sinstance\sof\sonos\srunning",response):
-            return main.TRUE
-        elif re.search("0\sinstance\sof\sonos\srunning",response):
-            return main.FALSE
-        else :
-            return main.FALSE
+        try:
+            self.execute(cmd="\n",prompt="\$",timeout=10)
+            response = self.execute(cmd= self.home + "/start-onos.sh status ",prompt="\d+\sinstance\sof\sonos\srunning",timeout=10)
+            self.execute(cmd="\n",prompt="\$",timeout=10)
+            if re.search("1\sinstance\sof\sonos\srunning",response):
+                return main.TRUE
+            elif re.search("0\sinstance\sof\sonos\srunning",response):
+                return main.FALSE
+            else :
+                main.log.info( self.name + " WARNING: status recieved unknown response")
+                return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+
 
     def isup(self):
         '''
@@ -150,77 +169,113 @@
         Third, it makes sure the logs are actually moving. 
         returns TRUE/FALSE accordingly.
         '''
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        response = self.execute(cmd="~/ONOS/start-onos.sh status ",prompt="running",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        tail1 = self.execute(cmd="tail ~/ONOS/onos-logs/onos.*.log",prompt="\$",timeout=10)
-        time.sleep(30)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        tail2 = self.execute(cmd="tail ~/ONOS/onos-logs/onos.*.log",prompt="\$",timeout=10)
-        pattern = '(.*)1 instance(.*)'
-        pattern2 = '(.*)Exception: Connection refused(.*)'
-        if utilities.assert_matches(expect=pattern,actual=response,onpass="ONOS process is running...",onfail="ONOS process not running..."):
-            if tail1 == tail2:
-                main.log.error("ONOS is frozen...")
-                return main.FALSE
-            elif re.search( pattern2,tail1 ):
-                main.log.info("Connection Refused found in onos log") 
-                return main.FALSE
-            elif re.search( pattern2,tail2 ):
-                main.log.info("Connection Refused found in onos log") 
-                return main.FALSE
+        try:
+            self.execute(cmd="\n",prompt="\$",timeout=10)
+            response = self.execute(cmd= self.home + "/start-onos.sh status ",prompt="running",timeout=10)
+            self.execute(cmd="\n",prompt="\$",timeout=10)
+            tail1 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
+            time.sleep(30)
+            self.execute(cmd="\n",prompt="\$",timeout=10)
+            tail2 = self.execute(cmd="tail " + self.home + "/onos-logs/onos.*.log",prompt="\$",timeout=10)
+            pattern = '(.*)1 instance(.*)'
+            pattern2 = '(.*)Exception: Connection refused(.*)'
+           # if utilities.assert_matches(expect=pattern,actual=response,onpass="ONOS process is running...",onfail="ONOS process not running..."):
+            
+            if re.search(pattern, response):
+                main.log.info(self.name + ": ONOS process is running...")
+                if tail1 == tail2:
+                    main.log.error(self.name + ": ONOS is frozen...")#logs aren't moving
+                    return main.FALSE
+                elif re.search( pattern2,tail1 ):
+                    main.log.info(self.name + ": Connection Refused found in onos log") 
+                    return main.FALSE
+                elif re.search( pattern2,tail2 ):
+                    main.log.info(self.name + ": Connection Refused found in onos log") 
+                    return main.FALSE
+                else:
+                    main.log.info(self.name + ": Onos log is moving! It's looking good!")
+                    return main.TRUE
             else:
-                main.log.info("Onos log is moving! It's looking good!")
-                return main.TRUE
-        else:
-            return main.FALSE
+                main.log.error(self.name + ": ONOS process not running...")
+                return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    
+
+        
     def rest_status(self): 
         '''
         Checks if the rest server is running. 
         '''
-        response = self.execute(cmd="~/ONOS/start-rest.sh status ",prompt="running",timeout=10)
-        if re.search("rest\sserver\sis\srunning",response):
-            main.log.info("Rest Server is running")
-        elif re.search("rest\sserver\sis\snot\srunning",response):
-            main.log.warn("Rest Server is not Running")
-        else :
-            main.log.error("No response" +response)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        
-        return response
-    
+        try:
+            response = self.execute(cmd= self.home + "/start-rest.sh status ",prompt="running",timeout=10)
+            if re.search("rest\sserver\sis\srunning",response):
+                main.log.info(self.name + ": Rest Server is running")
+            elif re.search("rest\sserver\sis\snot\srunning",response):
+                main.log.warn(self.name + ": Rest Server is not Running")
+            else :
+                main.log.error(self.name + ": No response" +response)
+            self.execute(cmd="\n",prompt="\$",timeout=10)
+            
+            return response
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+       
+
     def stop(self):
         '''
         Runs ./start-onos.sh stop to stop ONOS
         '''
-        self.handle.sendline("")
-        self.handle.expect("\$")
-        self.handle.sendline("~/ONOS/start-onos.sh stop")
-        self.handle.expect("stop", 2)
-        result = self.handle.before 
-        self.handle.expect("\$", 60)
-        if re.search("Killed", result):
-            main.log.info("ONOS Killed Successfully")
-            return main.TRUE
-        else :
-            main.log.warn("ONOS wasn't running")
-            return main.FALSE
+        try:
+            self.handle.sendline("")
+            self.handle.expect("\$")
+            self.handle.sendline(self.home + "/start-onos.sh stop")
+            self.handle.expect("stop", 2)
+            result = self.handle.before 
+            self.handle.expect("\$", 60)
+            if re.search("Killed", result):
+                main.log.info(self.name + ": ONOS Killed Successfully")
+                return main.TRUE
+            else :
+                main.log.warn(self.name + ": ONOS wasn't running")
+                return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+    
     
     def rest_stop(self):
         '''
         Runs ./start-rest.sh stop to stop ONOS rest server
         '''
-        response = self.execute(cmd="~/ONOS/start-rest.sh stop ",prompt="killing",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        if re.search("killing", response):
-            main.log.info("Rest Server Stopped")
-            return main.TRUE
-        else :
-            main.log.error("Failed to Stop, Rest Server is not Running")
-            return main.FALSE
-        
+        try:
+            response = self.execute(cmd= self.home + "/start-rest.sh stop ",prompt="killing",timeout=10)
+            self.execute(cmd="\n",prompt="\$",timeout=10)
+            if re.search("killing", response):
+                main.log.info(self.name + ": Rest Server Stopped")
+                return main.TRUE
+            else :
+                main.log.error(self.name + ": Failed to Stop, Rest Server is not Running")
+                return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+
+
     def disconnect(self):
         '''
         Called when Test is complete to disconnect the ONOS handle.  
@@ -230,7 +285,7 @@
             self.handle.sendline("exit")
             self.handle.expect("closed")
         except: 
-            main.log.error("Connection failed to the host")
+            main.log.error(self.name + ": Connection failed to the host")
             response = main.FALSE
         return response
  
@@ -238,56 +293,98 @@
         ''' 
         Writes the COMMIT number to the report to be parsed by Jenkins data collecter.  
         '''
-        self.handle.sendline("export TERM=xterm-256color")
-        self.handle.expect("xterm-256color")
-        self.handle.expect("\$") 
-        self.handle.sendline("cd ONOS; git log -1 | grep -A 3 \"commit\"; cd \.\.")
-        self.handle.expect("cd ..")
-        self.handle.expect("\$")
-        main.log.report( str(self.handle.before + self.handle.after))
+        try:
+            self.handle.sendline("export TERM=xterm-256color")
+            self.handle.expect("xterm-256color")
+            self.handle.expect("\$") 
+            self.handle.sendline("cd " + self.home + "; git log -1 --pretty=fuller; cd \.\.")
+            self.handle.expect("cd ..")
+            self.handle.expect("\$")
+            main.log.report(self.name +": \n"+ str(self.handle.before + self.handle.after))
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    def add_flow(self, path):
+    def add_flow(self, testONip, user, password, flowDef):
         ''' 
         Copies the flowdef file from TestStation -> ONOS machine
         Then runs ./add_flow.py to add the flows to ONOS
         ''' 
-        main.log.info("Adding Flows...")
-        self.handle.sendline("scp admin@10.128.7.7:%s /tmp/flowtmp" % path) 
-        self.handle.expect("100%")
-        self.handle.expect("\$", 30)
-        self.handle.sendline("~/ONOS/web/add_flow.py -m onos -f /tmp/flowtmp") 
-        self.handle.expect("add_flow")
-        self.handle.expect("\$", 1000)
-        main.log.info("Flows added")
+        try:
+            main.log.info("Adding Flows...")
+            self.handle.sendline("scp %s@%s:%s /tmp/flowtmp" %(user,testONip,flowDef))
+            i=self.handle.expect(['[pP]assword:', '100%', pexpect.TIMEOUT],30)
+            if(i==0):
+                    self.handle.sendline("%s" %(password))
+                    self.handle.sendline("")
+                    self.handle.expect("100%")
+                    self.handle.expect("\$", 30)
+                    self.handle.sendline(self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
+                    self.handle.expect("\$", 1000)
+                    main.log.info("Flows added")
+                    return main.TRUE
+
+            elif(i==1):
+                    self.handle.sendline("")
+                    self.handle.expect("\$", 10)
+                    self.handle.sendline( self.home + "/web/add_flow.py -m onos -f /tmp/flowtmp")
+                    self.handle.expect("\$", 1000)
+                    main.log.info("Flows added")
+                    return main.TRUE
+
+            elif(i==2):
+                    main.log.error("Flow Def file SCP Timed out...")
+                    return main.FALSE
+
+            else:
+                    main.log.error("Failed to add flows...")
+                    return main.FALSE            
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+
 
     def delete_flow(self, *delParams):
         '''
         Deletes a specific flow, a range of flows, or all flows.
         '''
-        if len(delParams)==1:
-             if str(delParams[0])=="all":
-                  main.log.info("Deleting ALL flows...")
-                  #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh all",prompt="done",timeout=150)
-                  self.handle.sendline("~/ONOS/web/delete_flow.py all")
-                  self.handle.expect("delete_flow")
-                  self.handle.expect("\$",1000)
-                  main.log.info("Flows deleted")
-             else:
-                  main.log.info("Deleting flow "+str(delParams[0])+"...")
-                  #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0]),prompt="done",timeout=150)
-                  #self.execute(cmd="\n",prompt="\$",timeout=60)
-                  self.handle.sendline("~/ONOS/web/delete_flow.py %d" % int(delParams[0]))
-                  self.handle.expect("delete_flow")
-                  self.handle.expect("\$",60)
-                  main.log.info("Flow deleted")
-        elif len(delParams)==2:
-             main.log.info("Deleting flows "+str(delParams[0])+" through "+str(delParams[1])+"...")
-             #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0])+" "+str(delParams[1]),prompt="done",timeout=150)
-             #self.execute(cmd="\n",prompt="\$",timeout=60)
-             self.handle.sendline("~/ONOS/web/delete_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
-             self.handle.expect("delete_flow")
-             self.handle.expect("\$",600)
-             main.log.info("Flows deleted")
+        try:
+            if len(delParams)==1:
+                if str(delParams[0])=="all":
+                    main.log.info(self.name + ": Deleting ALL flows...")
+                    #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh all",prompt="done",timeout=150)
+                    self.handle.sendline(self.home + "/web/delete_flow.py all")
+                    self.handle.expect("delete_flow")
+                    self.handle.expect("\$",1000)
+                    main.log.info(self.name + ": Flows deleted")
+                else:
+                    main.log.info(self.name + ": Deleting flow "+str(delParams[0])+"...")
+                    #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0]),prompt="done",timeout=150)
+                    #self.execute(cmd="\n",prompt="\$",timeout=60)
+                    self.handle.sendline(self.home +"/web/delete_flow.py %d" % int(delParams[0]))
+                    self.handle.expect("delete_flow")
+                    self.handle.expect("\$",60)
+                    main.log.info(self.name + ": Flow deleted")
+            elif len(delParams)==2:
+                 main.log.info(self.name + ": Deleting flows "+str(delParams[0])+" through "+str(delParams[1])+"...")
+                 #self.execute(cmd="~/ONOS/scripts/TestON_delete_flow.sh "+str(delParams[0])+" "+str(delParams[1]),prompt="done",timeout=150)
+                 #self.execute(cmd="\n",prompt="\$",timeout=60)
+                 self.handle.sendline(self.home + "/web/delete_flow.py %d %d" % (int(delParams[0]), int(delParams[1])))
+                 self.handle.expect("delete_flow")
+                 self.handle.expect("\$",600)
+                 main.log.info(self.name + ": Flows deleted")
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
     def check_flow(self):
         '''
@@ -296,64 +393,78 @@
           - That there are no "NOT"s found
         returns TRUE/FALSE 
         '''
-        flowEntryDetect = 1
-        count = 0
-        self.handle.sendline("clear")
-        time.sleep(1)
-        self.handle.sendline("~/ONOS/web/get_flow.py all")
-        self.handle.expect("get_flow")
-        while 1:
-            i=self.handle.expect(['FlowPath','FlowEntry','NOT','\$',pexpect.TIMEOUT],timeout=180)
-            if i==0:
-                count = count + 1
-                if flowEntryDetect == 0:
-                    main.log.info("FlowPath without FlowEntry")
+        try:
+            flowEntryDetect = 1
+            count = 0
+            self.handle.sendline("clear")
+            time.sleep(1)
+            self.handle.sendline(self.home + "/web/get_flow.py all")
+            self.handle.expect("get_flow")
+            while 1:
+                i=self.handle.expect(['FlowPath','FlowEntry','NOT','\$',pexpect.TIMEOUT],timeout=180)
+                if i==0:
+                    count = count + 1
+                    if flowEntryDetect == 0:
+                        main.log.info(self.name + ": FlowPath without FlowEntry")
+                        return main.FALSE
+                    else:
+                        flowEntryDetect = 0
+                elif i==1:
+                    flowEntryDetect = 1
+                elif i==2:
+                    main.log.error(self.name + ": Found a NOT")
                     return main.FALSE
-                else:
-                    flowEntryDetect = 0
-            elif i==1:
-                flowEntryDetect = 1
-            elif i==2:
-                main.log.error("Found a NOT")
-                return main.FALSE
-            elif i==3:
-                if count == 0:
-                    main.log.info("There don't seem to be any flows here...")
-                    return main.FALSE
-                else:
-                    main.log.info("All flows pass")
-                    main.log.info("Number of FlowPaths: "+str(count))
-                    return main.TRUE
-            elif i==4:
-                main.log.error("Command Timeout!")
-                return main.FALSE
+                elif i==3:
+                    if count == 0:
+                        main.log.info(self.name + ": There don't seem to be any flows here...")
+                        return main.FALSE
+                    else:
+                        main.log.info(self.name + ": All flows pass")
+                        main.log.info(self.name + ": Number of FlowPaths: "+str(count))
+                        return main.TRUE
+                elif i==4:
+                    main.log.error(self.name + ":Check_flow() -  Command Timeout!")
+            return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
     def get_flow(self, *flowParams):
          '''
          Returns verbose output of ./get_flow.py
          '''
-         if len(flowParams)==1:
-              if str(flowParams[0])=="all":
-                   self.execute(cmd="\n",prompt="\$",timeout=60)
-                   main.log.info("Getting all flow data...")
-                   data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh all",prompt="done",timeout=150)
-                   self.execute(cmd="\n",prompt="\$",timeout=60)
-                   return data
-              else:
-                   main.log.info("Retrieving flow "+str(flowParams[0])+" data...")
-                   data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0]),prompt="done",timeout=150)
-                   self.execute(cmd="\n",prompt="\$",timeout=60)
-                   return data
-         elif len(flowParams)==5:
-              main.log.info("Retrieving flow installer data...")
-              data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3])+" "+str(flowParams[4]),prompt="done",timeout=150)
-              self.execute(cmd="\n",prompt="\$",timeout=60)
-              return data
-         elif len(flowParams)==4:
-              main.log.info("Retrieving flow endpoints...")
-              data = self.execute(cmd="~/ONOS/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3]),prompt="done",timeout=150)
-              self.execute(cmd="\n",prompt="\$",timeout=60)
-              return data
+         try:
+             if len(flowParams)==1:
+                  if str(flowParams[0])=="all":
+                       self.execute(cmd="\n",prompt="\$",timeout=60)
+                       main.log.info(self.name + ": Getting all flow data...")
+                       data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh all",prompt="done",timeout=150)
+                       self.execute(cmd="\n",prompt="\$",timeout=60)
+                       return data
+                  else:
+                       main.log.info(self.name + ": Retrieving flow "+str(flowParams[0])+" data...")
+                       data = self.execute(cmd=self.home +"/scripts/TestON_get_flow.sh "+str(flowParams[0]),prompt="done",timeout=150)
+                       self.execute(cmd="\n",prompt="\$",timeout=60)
+                       return data
+             elif len(flowParams)==5:
+                  main.log.info(self.name + ": Retrieving flow installer data...")
+                  data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3])+" "+str(flowParams[4]),prompt="done",timeout=150)
+                  self.execute(cmd="\n",prompt="\$",timeout=60)
+                  return data
+             elif len(flowParams)==4:
+                  main.log.info(self.name + ": Retrieving flow endpoints...")
+                  data = self.execute(cmd=self.home + "/scripts/TestON_get_flow.sh "+str(flowParams[0])+" "+str(flowParams[1])+" "+str(flowParams[2])+" "+str(flowParams[3]),prompt="done",timeout=150)
+                  self.execute(cmd="\n",prompt="\$",timeout=60)
+                  return data
+         except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
 
 # http://localhost:8080/wm/core/topology/switches/all/json
@@ -366,257 +477,351 @@
         Helper functions used to parse the json output of a rest call 
         '''
         try:
-            command = "curl -s %s" % (url)
-            result = os.popen(command).read()
-            parsedResult = json.loads(result)
+            try:
+                command = "curl -s %s" % (url)
+                result = os.popen(command).read()
+                parsedResult = json.loads(result)
+            except:
+                print "REST IF %s has issue" % command
+                parsedResult = ""
+        
+            if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
+                print "REST %s returned code %s" % (command, parsedResult['code'])
+                parsedResult = ""
+            return parsedResult 
         except:
-            print "REST IF %s has issue" % command
-            parsedResult = ""
-    
-        if type(parsedResult) == 'dict' and parsedResult.has_key('code'):
-            print "REST %s returned code %s" % (command, parsedResult['code'])
-            parsedResult = ""
-        return parsedResult 
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    def check_switch(self,RestIP,correct_nr_switch ):
+    def check_switch(self,RestIP,correct_nr_switch, RestPort ="8080" ):
         ''' 
         Used by check_status 
         ''' 
-        buf = ""
-        retcode = 0
-        RestPort="8080"
-        url="http://%s:%s/wm/onos/topology/switches/all/json" % (RestIP, RestPort)
-        parsedResult = self.get_json(url)
-        if parsedResult == "":
-            retcode = 1
-            return (retcode, "Rest API has an issue")
-        url = "http://%s:%s/wm/onos/registry/switches/json" % (RestIP, RestPort)
-        registry = self.get_json(url)
-    
-        if registry == "":
-            retcode = 1
-            return (retcode, "Rest API has an issue")
-    
-        cnt = 0
-        active = 0
+        try:
+            buf = ""
+            retcode = 0
+            #RestPort="8080"
+            url="http://%s:%s/wm/onos/topology/switches/all/json" % (RestIP, RestPort)
+            parsedResult = self.get_json(url)
+            if parsedResult == "":
+                retcode = 1
+                return (retcode, "Rest API has an issue")
+            url = "http://%s:%s/wm/onos/registry/switches/json" % (RestIP, RestPort)
+            registry = self.get_json(url)
+        
+            if registry == "":
+                retcode = 1
+                return (retcode, "Rest API has an issue")
+        
+            cnt = 0
+            active = 0
 
-        for s in parsedResult:
-            cnt += 1
-            if s['state']  == "ACTIVE":
-               active += 1
+            for s in parsedResult:
+                cnt += 1
+                if s['state']  == "ACTIVE":
+                   active += 1
 
-        buf += "switch: network %d : %d switches %d active\n" % (0+1, cnt, active)
-        if correct_nr_switch != cnt:
-            buf += "switch fail: network %d should have %d switches but has %d\n" % (1, correct_nr_switch, cnt)
-            retcode = 1
+            buf += "switch: network %d : %d switches %d active\n" % (0+1, cnt, active)
+            if correct_nr_switch != cnt:
+                buf += "switch fail: network %d should have %d switches but has %d\n" % (1, correct_nr_switch, cnt)
+                retcode = 1
 
-        if correct_nr_switch != active:
-            buf += "switch fail: network %d should have %d active switches but has %d\n" % (1, correct_nr_switch, active)
-            retcode = 1
-    
-        return (retcode, buf)
+            if correct_nr_switch != active:
+                buf += "switch fail: network %d should have %d active switches but has %d\n" % (1, correct_nr_switch, active)
+                retcode = 1
+        
+            return (retcode, buf)
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    def check_link(self,RestIP, nr_links):
+    def check_link(self,RestIP, nr_links, RestPort = "8080"):
         ''' 
         Used by check_status 
         ''' 
-        RestPort = "8080"
-        buf = ""
-        retcode = 0
-    
-        url = "http://%s:%s/wm/onos/topology/links/json" % (RestIP, RestPort)
-        parsedResult = self.get_json(url)
-    
-        if parsedResult == "":
-            retcode = 1
-            return (retcode, "Rest API has an issue")
-    
-        buf += "link: total %d links (correct : %d)\n" % (len(parsedResult), nr_links)
-        intra = 0
-        interlink=0
-    
-        for s in parsedResult:
-            intra = intra + 1 
-    
-        if intra != nr_links:
-            buf += "link fail\n"
-            retcode = 1
-    
-        return (retcode, buf)
+        try:
+            buf = ""
+            retcode = 0
+        
+            url = "http://%s:%s/wm/onos/topology/links/json" % (RestIP, RestPort)
+            parsedResult = self.get_json(url)
+        
+            if parsedResult == "":
+                retcode = 1
+                return (retcode, "Rest API has an issue")
+        
+            buf += "link: total %d links (correct : %d)\n" % (len(parsedResult), nr_links)
+            intra = 0
+            interlink=0
+        
+            for s in parsedResult:
+                intra = intra + 1 
+        
+            if intra != nr_links:
+                buf += "link fail\n"
+                retcode = 1
+        
+            return (retcode, buf)
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    def check_status_report(self, ip, numoswitch, numolink):
+    def check_status_report(self, ip, numoswitch, numolink, port="8080"):
         ''' 
         Checks the number of swithes & links that ONOS sees against the supplied values.
         Writes to the report log.  
-        ''' 
-        main.log.info("Making some rest calls...") 
-        switch = self.check_switch(ip, int(numoswitch))
-        link = self.check_link(ip, int(numolink))
-        value = switch[0]
-        value += link[0]
-        main.log.report( "\n-----\n%s%s-----\n" % ( switch[1], link[1]) )
-        if value != 0:
-            return 0
-        else: 
-            # "PASS"
-            return 1
+        '''
+        try:
+            main.log.info(self.name + ": Making some rest calls...") 
+            switch = self.check_switch(ip, int(numoswitch), port)
+            link = self.check_link(ip, int(numolink), port)
+            value = switch[0]
+            value += link[0]
+            main.log.report( self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
+            if value != 0:
+                return main.FALSE
+            else: 
+                # "PASS"
+                return main.TRUE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    def check_status(self, ip, numoswitch, numolink):
+    def check_status(self, ip, numoswitch, numolink, port = "8080"):
         ''' 
         Checks the number of swithes & links that ONOS sees against the supplied values.
         Writes to the main log.  
         ''' 
-        main.log.info("Making some rest calls...") 
-        switch = self.check_switch(ip, int(numoswitch))
-        link = self.check_link(ip, int(numolink))
-        value = switch[0]
-        value += link[0]
-        main.log.info( "\n-----\n%s%s-----\n" % ( switch[1], link[1]) )
-        if value != 0:
-            return 0
-        else: 
-            # "PASS"
-            return 1
+        try:
+            main.log.info(self.name + ": Making some rest calls...") 
+            switch = self.check_switch(ip, int(numoswitch), port)
+            link = self.check_link(ip, int(numolink), port)
+            value = switch[0]
+            value += link[0]
+            main.log.info(self.name + ": \n-----\n%s%s-----\n" % ( switch[1], link[1]) )
+            if value != 0:
+                return main.FALSE
+            else: 
+                # "PASS"
+                return main.TRUE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
  
     def drop_keyspace(self):
         '''
         Drops the ONOS keyspace
         '''
-        self.handle.sendline("~/ONOS/scripts/test-drop-keyspace.sh")
-        self.handle.expect("keyspace")
-        self.handle.sendline("")
-        self.handle.expect("\$")
-        self.handle.expect("\$")
-        main.log.info("Keyspace dropped")
+        try:
+            self.handle.sendline(self.home + "/scripts/drop-keyspace.sh")
+            self.handle.expect("keyspace")
+            self.handle.sendline("")
+            self.handle.expect("\$")
+            self.handle.expect("\$")
+            main.log.info(self.name + ": Keyspace dropped")
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    def ctrl_none(self):
-        '''
-        Points all the mininet swithces to no controllers 
-        *NOTE will only work if CLUSTER is set up on ONOS nodes
-        '''
-        self.execute(cmd="switch none", prompt="\$",timeout=10)
-
-    def ctrl_one(self, ip):
-        '''
-        Points all the mininet swithces to all controllers 
-        *NOTE will only work if CLUSTER is set up on ONOS nodes
-        '''
-        self.execute(cmd="switch one", prompt="\$",timeout=10)
-
+    
     def check_for_no_exceptions(self):
         '''
+        TODO: Rewrite
         Used by CassndraCheck.py to scan ONOS logs for Exceptions
         '''
-        self.handle.sendline("dsh 'grep Exception ~/ONOS/onos-logs/onos.*.log'")
-        self.handle.expect("\$ dsh") 
-        self.handle.expect("\$")
-        output = self.handle.before
-        main.log.info( output ) 
-        if re.search("Exception",output):
-            return main.FALSE
-        else :
-            return main.TRUE
- 
+        try:
+            self.handle.sendline("dsh 'grep Exception ~/ONOS/onos-logs/onos.*.log'")
+            self.handle.expect("\$ dsh") 
+            self.handle.expect("\$")
+            output = self.handle.before
+            main.log.info(self.name + ": " + output ) 
+            if re.search("Exception",output):
+                return main.FALSE
+            else :
+                return main.TRUE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+
+
     def git_pull(self):
         '''
         Stops the ONOS, pulls the latest code, and builds with mvn. 
         Assumes that "git pull" works without login 
         '''
-        main.log.info("Stopping onos") 
-        self.stop()
-        self.handle.sendline("cd ~/ONOS") 
-        self.handle.expect("ONOS\$")
-        self.handle.sendline("git pull")
-       
-        uptodate = 0 
-        i=self.handle.expect(['fatal','Username\sfor\s(.*):\s','Unpacking\sobjects',pexpect.TIMEOUT,'Already up-to-date','Aborting'],timeout=180)
-        if i==0:
-            main.log.error("Git pull had some issue...") 
-            return main.FALSE
-        elif i==1:
-            main.log.error("Asking for username!!! BADD!") 
-            return false 
-            
-            self.handle.expect('Password\sfor\s(.*):\s')
-            j = self.handle.expect(['Unpacking\sobjects','Already up-to-date'])
-            if j == 0:
-                main.log.info("pulling repository now")
-            elif j == 1:
-                main.log.info("Up to date!")
+        try:
+            main.log.info(self.name + ": Stopping ONOS") 
+            self.stop()
+            self.handle.sendline("cd " + self.home)
+            self.handle.expect("ONOS\$")
+            self.handle.sendline("git pull")
+           
+            uptodate = 0 
+            i=self.handle.expect(['fatal','Username\sfor\s(.*):\s','Unpacking\sobjects',pexpect.TIMEOUT,'Already up-to-date','Aborting'],timeout=180)
+            #debug
+           #main.log.report(self.name +": \n"+"git pull response: " +  str(self.handle.before) + str(self.handle.after))
+            if i==0:
+                main.log.error(self.name + ": Git pull had some issue...") 
+                return main.FALSE
+            elif i==1:
+                main.log.error(self.name + ": Git Pull Asking for username!!! BADD!") 
+                return main.FALSE 
+            elif i==2:
+                main.log.info(self.name + ": Git Pull - pulling repository now")
+                self.handle.expect("ONOS\$", 120)
+            elif i==3:
+                main.log.error(self.name + ": Git Pull - TIMEOUT")
+                return main.FALSE
+            elif i==4:
+                main.log.info(self.name + ": Git Pull - Already up to date")
+                uptodate = 1 
+            elif i==5:
+                main.log.info(self.name + ": Git Pull - Aborting... Are there conflicting git files?")
+                return main.FALSE
             else:
-                main.log.error("something went wrong")
+                main.log.error(self.name + ": Git Pull - Unexpected response, check for pull errors")
                 return main.FALSE
-            self.handle.expect("ONOS\$", 120)
-        elif i==2:
-            main.log.info("pulling repository now")
-            self.handle.expect("ONOS\$", 120)
-        elif i==3:
-            main.log.error("TIMEOUT")
-            return main.FALSE
-        elif i==4:
-            main.log.info("Already up to date")
-            uptodate = 1 
-        elif i==5:
-            main.log.info("Aborting... Are there conflicting git files?")
-            return main.FALSE
-        
-        '''        
-        main.log.info("./setup-local-maven.sh")
-        self.handle.sendline("./setup-local-maven.sh")
-        self.handle.expect("local-maven.sh")
-        while 1: 
-            i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=90)
-            if i == 0:
-                main.log.error("Build failure!")
-                return main.FALSE
-            elif i == 1:
-                main.log.info("Build success!")
-            elif i == 2:
-                main.log.info("Build complete") 
-                break;
-            elif i == 3:
-                main.log.error("TIMEOUT!")
-                return main.FALSE
-        '''      
-        if uptodate == 0:
-            main.log.info("mvn clean") 
-            self.handle.sendline("mvn clean")
-            while 1: 
-                i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
-                if i == 0:
-                    main.log.error("Build failure!")
-                    return main.FALSE
-                elif i == 1:
-                    main.log.info("Build success!")
-                elif i == 2:
-                    main.log.info("Build complete") 
-                    break;
-                elif i == 3:
-                    main.log.error("TIMEOUT!")
-                    return main.FALSE
-        
-            main.log.info("mvn compile") 
-            self.handle.sendline("mvn compile")
-            while 1: 
-                i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
-                if i == 0:
-                    main.log.error("Build failure!")
-                    return main.FALSE
-                elif i == 1:
-                    main.log.info("Build success!")
-                elif i == 2:
-                    main.log.info("Build complete") 
-                    break;
-                elif i == 3:
-                    main.log.error("TIMEOUT!")
-                    return main.FALSE
+            
+            if uptodate == 0:
+                main.log.info(self.name + ": mvn clean") 
+                self.handle.sendline("mvn clean")
+                while 1: 
+                    i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=30)
+                    if i == 0:
+                        main.log.error(self.name + ": Build failure!")
+                        return main.FALSE
+                    elif i == 1:
+                        main.log.info(self.name + ": Build success!")
+                    elif i == 2:
+                        main.log.info(self.name + ": Build complete") 
+                        break;
+                    elif i == 3:
+                        main.log.error(self.name + ": mvn clean TIMEOUT!")
+                        return main.FALSE
+            
+                main.log.info(self.name + ": mvn compile") 
+                self.handle.sendline("mvn compile")
+                while 1: 
+                    i=self.handle.expect(['BUILD\sFAILURE','BUILD\sSUCCESS','ONOS\$',pexpect.TIMEOUT],timeout=60)
+                    if i == 0:
+                        main.log.error(self.name + ": Build failure!")
+                        return main.FALSE
+                    elif i == 1:
+                        main.log.info(self.name + ": Build success!")
+                        return main.TRUE
+                    elif i == 2:
+                        main.log.info(self.name + ": Build complete") 
+                        return main.TRUE
+                    elif i == 3:
+                        main.log.error(self.name + ": mvn compile TIMEOUT!")
+                        return main.FALSE
+                    else:
+                        pass
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
 
-    def tcpdump(self):
-        self.handle.sendline("")
-        self.handle.expect("\$")
-        self.handle.sendline("sudo tcpdump -n -i eth0 -s0 -w onos-logs/tcpdump &")
-  
+
+    def tcpdump(self, intf = "eth0"):
+        try:
+            self.handle.sendline("")
+            self.handle.expect("\$")
+            self.handle.sendline("sudo tcpdump -n -i "+ intf + " -s0 -w onos-logs/tcpdump &")
+            i=self.handle.expect(['No\ssuch\device','listening\son',pexpect.TIMEOUT],timeout=10)
+            if i == 0:
+                main.log.error(self.name + ": tcpdump - No such device exists. tcpdump attempted on: " + intf)
+                return main.FALSE
+            elif i == 1: 
+                main.log.info(self.name + ": tcpdump started on " + intf)
+                return main.TRUE
+            elif i == 2: 
+                main.log.error(self.name + ": tcpdump command timed out! Check interface name, given interface was: " + intf)
+                return main.FALSE
+            else:
+                main.log.error(self.name + ": tcpdump - unexpected response")
+            return main.FALSE
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+
     def kill_tcpdump(self):
-        self.handle.sendline("")
-        self.handle.expect("\$")
-        self.handle.sendline("sudo kill -9 `ps -ef | grep \"tcpdump -n\" | grep -v grep | awk '{print $2}'`")
+        try:
+            self.handle.sendline("")
+            self.handle.expect("\$")
+            self.handle.sendline("sudo kill -9 `ps -ef | grep \"tcpdump -n\" | grep -v grep | awk '{print $2}'`")
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
+
+    def find_host(self,RestIP,RestPort,RestAPI,hostIP):
+        retcode = 0
+        retswitch = []
+        retport = []
+        retmac = []
+        foundIP = []
+        try:
+            ##### device rest API is: 'host:8080/wm/core/topology/switches/all/json' ###
+            url ="http://%s:%s%s" %(RestIP,RestPort,RestAPI)
+
+            try:
+                command = "curl -s %s" % (url)
+                result = os.popen(command).read()
+                parsedResult = json.loads(result)
+                # print parsedResult
+            except:
+                print "REST IF %s has issue" % command
+                parsedResult = ""
+
+            if parsedResult == "":
+                return (retcode, "Rest API has an error")
+            else:
+                for switch in enumerate(parsedResult):
+                    for port in enumerate(switch[1]['ports']):
+                        if ( port[1]['devices'] != [] ):
+                            try:
+                                foundIP =  port[1]['devices'][0]['ipv4addresses'][0]['ipv4']
+                            except:
+                                print "Error in detecting IP address."
+                            if foundIP == hostIP:
+                                retswitch.append(switch[1]['dpid'])
+                                retport.append(port[1]['desc'])
+                                retmac.append(port[1]['devices'][0]['mac'])
+                                retcode = retcode +1
+                                foundIP =''
+            return(retcode, retswitch, retport, retmac)
+        except:
+            main.log.info(self.name + ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.log.error( traceback.print_exc() )
+            main.log.info(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::")
+            main.cleanup()
+            main.exit()
diff --git a/TestON/drivers/common/cli/remotesysdriver.py b/TestON/drivers/common/cli/remotesysdriver.py
index ab11f6a..374e502 100644
--- a/TestON/drivers/common/cli/remotesysdriver.py
+++ b/TestON/drivers/common/cli/remotesysdriver.py
@@ -40,13 +40,13 @@
         self.handle = super(RemoteSysDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
         '''
         if self.handle:
-            self.execute(cmd= "\r",prompt= "\$|>|#",timeout= 10)
+            self.execute(cmd= "\n",prompt= "\$|>|#",timeout= 10)
             self.execute(cmd= "ssh -l paxterra 10.128.4.1",prompt= "paxterra@10.128.4.1's password:",timeout= 10)
-            self.execute(cmd= "\r",prompt= "paxterra@10.128.4.1's password:",timeout= 10)
+            self.execute(cmd= "\n",prompt= "paxterra@10.128.4.1's password:",timeout= 10)
             self.execute(cmd = "0nLab_gu3st",prompt = "\$",timeout = 10)
             self.execute(cmd = "cd TestON/bin/",prompt = "\$",timeout = 10)
             self.execute(cmd = "./cli.py run Assert example 1",prompt = "\$",timeout = 10)
-            self.execute(cmd= "\r",prompt= "$",timeout= 10)
+            self.execute(cmd= "\n",prompt= "$",timeout= 10)
             #self.execute(cmd = "help",prompt = ">",timeout = 10)
             
             #self.execute(cmd = "~.",prompt= ".*",timeout= 10)
diff --git a/TestON/drivers/common/cli/remotetestbeddriver.py b/TestON/drivers/common/cli/remotetestbeddriver.py
index 5ade2ec..79fbf1c 100644
--- a/TestON/drivers/common/cli/remotetestbeddriver.py
+++ b/TestON/drivers/common/cli/remotetestbeddriver.py
@@ -45,12 +45,12 @@
                                                               port = remote_port, pwd = remote_pwd)
         
         if self.handle:
-            self.execute(cmd= "\r",prompt= "\$|>|#",timeout= 10)
+            self.execute(cmd= "\n",prompt= "\$|>|#",timeout= 10)
             self.execute(cmd= "SET CYGWIN=notty",prompt= "\$|>|#",timeout= 10)
-            self.execute(cmd= "\r",prompt= "\$|>|#",timeout= 10)
+            self.execute(cmd= "\n",prompt= "\$|>|#",timeout= 10)
             main.log.info("ssh "+self.vm_user_name+'@'+self.vm_ip_address)
             self.execute(cmd= "ssh "+self.vm_user_name+'@'+self.vm_ip_address,prompt= "(.*)",timeout= 10)
-            self.execute(cmd= "\r",prompt= "assword:",timeout= 10)
+            self.execute(cmd= "\n",prompt= "assword:",timeout= 10)
             self.execute(cmd = self.vm_pwd,prompt = "\$",timeout = 10)
             
             return self.handle
diff --git a/TestON/drivers/common/cli/zookeeperclidriver.py b/TestON/drivers/common/cli/zookeeperclidriver.py
index 2a575ae..b7fe4ba 100644
--- a/TestON/drivers/common/cli/zookeeperclidriver.py
+++ b/TestON/drivers/common/cli/zookeeperclidriver.py
@@ -49,17 +49,21 @@
         self.port = None
         for key in connectargs:
             vars(self)[key] = connectargs[key]       
+        self.home = "~/zookeeper-3.4.5"
+        for key in self.options:
+            if key == "home":
+                self.home = self.options['home']
+                break
         
         self.name = self.options['name']
-        self.handle = super(ZookeeperCliDriver, self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
+        self.handle = super(ZookeeperCliDriver, self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd, home = self.home)
         
         self.ssh_handle = self.handle
         if self.handle :
-            self.start()
             return main.TRUE
         else :
             main.log.error("Connection failed to the host "+self.user_name+"@"+self.ip_address) 
-            main.log.error("Failed to connect to the Onos system")
+            main.log.error(self.name + ": Failed to connect to Zookeeper")
             return main.FALSE
    
  
@@ -67,20 +71,21 @@
         '''
         This Function will start the Zookeeper
         '''
-        main.log.info( "Starting Zookeeper" )
+        main.log.info(self.name + ": Starting Zookeeper" )
         self.handle.sendline("")
         self.handle.expect("\$")
-        self.handle.sendline("~/zookeeper-3.4.5/bin/zkServer.sh start")
+        self.handle.sendline(self.home + "/bin/zkServer.sh start")
         self.handle.expect("zkServer.sh start") 
         self.handle.expect("\$")
         response = self.handle.before + self.handle.after 
         if re.search("STARTED", response):
-            main.log.info("Zookeeper Started ")
+            main.log.info(self.name + ": Zookeeper Started ")
             return main.TRUE
         elif re.search("running", response):
-            main.log.warn("zookeeper ... already running")
+            main.log.warn(self.name +": zookeeper ... already running")
+            return main.TRUE
         else:
-            main.log.error("Failed to start Zookeeper"+ response)
+            main.log.error(self.name + ": Failed to start Zookeeper"+ response)
             return main.FALSE
         
     def status(self):
@@ -88,25 +93,25 @@
         This Function will return the Status of the Zookeeper 
         '''
         time.sleep(5)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
-        response = self.execute(cmd="~/zookeeper-3.4.5/bin/zkServer.sh status ",prompt="JMX",timeout=10)
-        
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
+        response = self.execute(cmd=self.home + "/bin/zkServer.sh status ",prompt="JMX",timeout=10)
+       
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         return response
         
     def stop(self):
         '''
         This Function will stop the Zookeeper if it is Running
         ''' 
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         time.sleep(5)
-        response = self.execute(cmd="~/zookeeper-3.4.5/bin/zkServer.sh stop ",prompt="STOPPED",timeout=10)
-        self.execute(cmd="\r",prompt="\$",timeout=10)
+        response = self.execute(cmd=self.home + "/bin/zkServer.sh stop ",prompt="STOPPED",timeout=10)
+        self.execute(cmd="\n",prompt="\$",timeout=10)
         if re.search("STOPPED",response):
-            main.log.info("Zookeeper Stopped")
+            main.log.info(self.name + ": Zookeeper Stopped")
             return main.TRUE
         else:
-            main.log.warn("No zookeeper to stop")
+            main.log.warn(self.name + ": No zookeeper to stop")
             return main.FALSE
             
     def disconnect(self):
@@ -118,7 +123,7 @@
             self.handle.sendline("exit")
             self.handle.expect("closed")
         else :
-            main.log.error("Connection failed to the host")
+            main.log.error(self.name + ": Connection failed to the host")
             response = main.FALSE
         return response 
 
@@ -127,11 +132,13 @@
         Calls the zookeeper status and returns TRUE if it has an assigned Mode to it. 
         '''
         self.execute(cmd="\n",prompt="\$",timeout=10)
-        response = self.execute(cmd="~/zookeeper-3.4.5/bin/zkServer.sh status ",prompt="Mode",timeout=10)
+        response = self.execute(cmd=self.home + "/bin/zkServer.sh status ",prompt="Mode",timeout=10)
         pattern = '(.*)Mode(.*)'
-        if re.search(pattern, response):  
+        if re.search(pattern, response): 
+	    main.log.info(self.name + ": Zookeeper is up.") 
             return main.TRUE
         else:
+	    main.log.info(self.name + ": Zookeeper is down.") 
             return main.FALSE