diff --git a/TestON/drivers/common/cli/quaggaclidriver.py.fixed b/TestON/drivers/common/cli/quaggaclidriver.py.fixed
deleted file mode 100644
index 09b7614..0000000
--- a/TestON/drivers/common/cli/quaggaclidriver.py.fixed
+++ /dev/null
@@ -1,596 +0,0 @@
-#!/usr/bin/env python
-
-import time
-import pexpect
-import struct
-import fcntl
-import os
-import sys
-import signal
-import sys
-import re
-import json
-sys.path.append( "../" )
-from drivers.common.clidriver import CLI
-
-
-class QuaggaCliDriver( CLI ):
-
-    def __init__( self ):
-        super( CLI, self ).__init__()
-
-    # TODO: simplify this method
-    def connect( self, **connectargs ):
-        for key in connectargs:
-            vars( self )[ key ] = connectargs[ key ]
-
-        self.name = self.options[ 'name' ]
-        # self.handle = super( QuaggaCliDriver,self ).connect(
-        # user_name=self.user_name, ip_address=self.ip_address,port=self.port,
-        # pwd=self.pwd )
-        self.handle = super(
-            QuaggaCliDriver,
-            self ).connect(
-                user_name=self.user_name,
-         ip_address="1.1.1.1",
-         port=self.port,
-         pwd=self.pwd )
-        main.log.info(
-            "connect parameters:" + str(
-                self.user_name ) + ";" + str(
-                    self.ip_address ) + ";" + str(
-                 self.port ) + ";" + str(
-                     self.pwd ) )
-
-        if self.handle:
-            # self.handle.expect( "",timeout=10 )
-            # self.handle.expect( "\$",timeout=10 )
-            self.handle.sendline( "telnet localhost 2605" )
-            # self.handle.expect( "Password:", timeout=5 )
-            self.handle.expect( "Password:" )
-            self.handle.sendline( "hello" )
-            # self.handle.expect( "bgpd", timeout=5 )
-            self.handle.expect( "bgpd" )
-            self.handle.sendline( "enable" )
-            # self.handle.expect( "bgpd#", timeout=5 )
-            self.handle.expect( "bgpd#" )
-            return self.handle
-        else:
-            main.log.info( "NO HANDLE" )
-            return main.FALSE
-
-    def loginQuagga( self, ip_address ):
-        self.name = self.options[ 'name' ]
-        self.handle = super( QuaggaCliDriver, self ).connect(
-            user_name=self.user_name, ip_address=ip_address,
-            port=self.port, pwd=self.pwd )
-        main.log.info( "connect parameters:" + str( self.user_name ) + ";"
-                       + str( self.ip_address ) + ";" + str( self.port ) + ";" + str( self.pwd ) )
-
-        if self.handle:
-            # self.handle.expect( "" )
-            # self.handle.expect( "\$" )
-            self.handle.sendline( "telnet localhost 2605" )
-            # self.handle.expect( "Password:", timeout=5 )
-            self.handle.expect( "Password:" )
-            self.handle.sendline( "hello" )
-            # self.handle.expect( "bgpd", timeout=5 )
-            self.handle.expect( "bgpd" )
-            self.handle.sendline( "enable" )
-            # self.handle.expect( "bgpd#", timeout=5 )
-            self.handle.expect( "bgpd#" )
-            main.log.info( "I in quagga on host " + str( ip_address ) )
-
-            return self.handle
-        else:
-            main.log.info( "NO HANDLE" )
-            return main.FALSE
-
-    def enter_config( self, asn ):
-        main.log.info( "I am in enter_config method!" )
-        try:
-            self.handle.sendline( "" )
-            self.handle.expect( "bgpd#" )
-        except:
-            main.log.warn( "Probably not currently in enable mode!" )
-            self.disconnect()
-            return main.FALSE
-        self.handle.sendline( "configure terminal" )
-        self.handle.expect( "config", timeout=5 )
-        routerAS = "router bgp " + str( asn )
-        try:
-            self.handle.sendline( routerAS )
-            self.handle.expect( "config-router", timeout=5 )
-            return main.TRUE
-        except:
-            return main.FALSE
-
-    def generate_prefixes( self, net, numRoutes ):
-        main.log.info( "I am in generate_prefixes method!" )
-
-        # each IP prefix will be composed by "net" + "." + m + "." + n + "." + x
-        # the length of each IP prefix is 24
-        routes = []
-        routes_gen = 0
-        m = numRoutes / 256
-        n = numRoutes % 256
-
-        for i in range( 0, m ):
-            for j in range( 0, 256 ):
-                network = str(
-                    net ) + "." + str(
-                        i ) + "." + str(
-                            j ) + ".0/24"
-                routes.append( network )
-                routes_gen = routes_gen + 1
-
-        for j in range( 0, n ):
-            network = str( net ) + "." + str( m ) + "." + str( j ) + ".0/24"
-            routes.append( network )
-            routes_gen = routes_gen + 1
-
-        if routes_gen == numRoutes:
-            main.log.info( "Successfully generated " + str( numRoutes )
-                           + " prefixes!" )
-            return routes
-        return main.FALSE
-
-    # This method generates a multiple to single point intent(
-    # MultiPointToSinglePointIntent ) for a given route
-    def generate_expected_singleRouteIntent(
-        self,
-     prefix,
-     nextHop,
-     nextHopMac,
-     sdnip_data ):
-
-        ingress = []
-        egress = ""
-        for peer in sdnip_data[ 'bgpPeers' ]:
-            if peer[ 'ipAddress' ] == nextHop:
-                egress = "of:" + str(
-                    peer[ 'attachmentDpid' ] ).replace( ":",
-                                                        "" ) + ":" + str( peer[ 'attachmentPort' ] )
-            else:
-                ingress.append(
-                    "of:" + str( peer[ 'attachmentDpid' ] ).replace( ":",
-                                                                     "" ) + ":" + str( peer[ 'attachmentPort' ] ) )
-
-        selector = "ETH_TYPE{ethType=800},IPV4_DST{ip=" + prefix + "}"
-        treatment = "[ETH_DST{mac=" + str( nextHopMac ) + "}]"
-
-        intent = egress + "/" + \
-            str( sorted( ingress ) ) + "/" + selector + "/" + treatment
-        return intent
-
-    def generate_expected_onePeerRouteIntents(
-        self,
-     prefixes,
-     nextHop,
-     nextHopMac,
-     sdnip_json_file_path ):
-        intents = []
-        sdnip_json_file = open( sdnip_json_file_path ).read()
-
-        sdnip_data = json.loads( sdnip_json_file )
-
-        for prefix in prefixes:
-            intents.append(
-                self.generate_expected_singleRouteIntent(
-                    prefix,
-                    nextHop,
-                    nextHopMac,
-                    sdnip_data ) )
-        return sorted( intents )
-
-    # TODO
-    # This method generates all expected route intents for all BGP peers
-    def generate_expected_routeIntents( self ):
-        intents = []
-        return intents
-
-    # This method extracts all actual routes from ONOS CLI
-    def extract_actual_routes( self, get_routes_result ):
-        routes_json_obj = json.loads( get_routes_result )
-
-        allRoutes_actual = []
-        for route in routes_json_obj:
-            if route[ 'prefix' ] == '172.16.10.0/24':
-                continue
-            allRoutes_actual.append(
-                route[ 'prefix' ] + "/" + route[ 'nextHop' ] )
-
-        return sorted( allRoutes_actual )
-
-    # This method extracts all actual route intents from ONOS CLI
-    def extract_actual_routeIntents( self, get_intents_result ):
-        intents = []
-        # TODO: delete the line below when change to Mininet demo script
-        # get_intents_result=open( "../tests/SdnIpTest/intents.json" ).read()
-        intents_json_obj = json.loads( get_intents_result )
-
-        for intent in intents_json_obj:
-            if intent[ 'appId' ] != "org.onosproject.sdnip":
-                continue
-            if intent[ 'type' ] == "MultiPointToSinglePointIntent" and intent[ 'state' ] == 'INSTALLED':
-                egress = str( intent[ 'egress' ][ 'device' ] ) + ":" + str(
-                    intent[ 'egress' ][ 'port' ] )
-                ingress = []
-                for attachmentPoint in intent[ 'ingress' ]:
-                    ingress.append(
-                        str( attachmentPoint[ 'device' ] ) + ":" + str( attachmentPoint[ 'port' ] ) )
-
-                selector = intent[ 'selector' ].replace(
-                    "[", "" ).replace( "]", "" ).replace( " ", "" )
-                if str( selector ).startswith( "IPV4" ):
-                    str1, str2 = str( selector ).split( "," )
-                    selector = str2 + "," + str1
-
-                intent = egress + "/" + \
-                    str( sorted( ingress ) ) + "/" + \
-                        selector + "/" + intent[ 'treatment' ]
-                intents.append( intent )
-        return sorted( intents )
-
-    # This method extracts all actual BGP intents from ONOS CLI
-    def extract_actual_bgpIntents( self, get_intents_result ):
-        intents = []
-        # TODO: delete the line below when change to Mininet demo script
-        # get_intents_result=open( "../tests/SdnIpTest/intents.json" ).read()
-        intents_json_obj = json.loads( get_intents_result )
-
-        for intent in intents_json_obj:
-            if intent[ 'appId' ] != "org.onosproject.sdnip":
-                continue
-            if intent[ 'type' ] == "PointToPointIntent" and "protocol=6" in str( intent[ 'selector' ] ):
-                ingress = str( intent[ 'ingress' ][ 'device' ] ) + ":" + str(
-                    intent[ 'ingress' ][ 'port' ] )
-                egress = str( intent[ 'egress' ][ 'device' ] ) + ":" + str(
-                    intent[ 'egress' ][ 'port' ] )
-                selector = str(
-                    intent[ 'selector' ] ).replace( " ",
-                                                    "" ).replace( "[",
-                                                                  "" ).replace( "]",
-                                                                                "" ).split( "," )
-                intent = ingress + "/" + egress + \
-                    "/" + str( sorted( selector ) )
-                intents.append( intent )
-
-        return sorted( intents )
-
-    # This method generates a single point to single point intent(
-    # PointToPointIntent ) for BGP path
-    def generate_expected_bgpIntents( self, sdnip_json_file_path ):
-        from operator import eq
-
-        sdnip_json_file = open( sdnip_json_file_path ).read()
-        sdnip_data = json.loads( sdnip_json_file )
-
-        intents = []
-        bgpPeerAttachmentPoint = ""
-        bgpSpeakerAttachmentPoint = "of:" + str(
-            sdnip_data[ 'bgpSpeakers' ][ 0 ][ 'attachmentDpid' ] ).replace( ":",
-                                                                            "" ) + ":" + str( sdnip_data[ 'bgpSpeakers' ][ 0 ][ 'attachmentPort' ] )
-        for peer in sdnip_data[ 'bgpPeers' ]:
-            bgpPeerAttachmentPoint = "of:" + str(
-                peer[ 'attachmentDpid' ] ).replace( ":",
-                                                    "" ) + ":" + str( peer[ 'attachmentPort' ] )
-            # find out the BGP speaker IP address for this BGP peer
-            bgpSpeakerIpAddress = ""
-            for interfaceAddress in sdnip_data[ 'bgpSpeakers' ][ 0 ][ 'interfaceAddresses' ]:
-                # if eq( interfaceAddress[ 'interfaceDpid' ],sdnip_data[
-                # 'bgpSpeakers' ][ 0 ][ 'attachmentDpid' ] ) and eq(
-                # interfaceAddress[ 'interfacePort' ], sdnip_data[
-                # 'bgpSpeakers' ][ 0 ][ 'attachmentPort' ] ):
-                if eq( interfaceAddress[ 'interfaceDpid' ], peer[ 'attachmentDpid' ] ) and eq( interfaceAddress[ 'interfacePort' ], peer[ 'attachmentPort' ] ):
-                    bgpSpeakerIpAddress = interfaceAddress[ 'ipAddress' ]
-                    break
-                else:
-                    continue
-
-            # from bgpSpeakerAttachmentPoint to bgpPeerAttachmentPoint
-            # direction
-            selector_str = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," + "IPV4_DST{ip=" + peer[
-                'ipAddress' ] + "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}"
-            selector = selector_str.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
-            intent = bgpSpeakerAttachmentPoint + "/" + \
-                bgpPeerAttachmentPoint + "/" + str( sorted( selector ) )
-            intents.append( intent )
-
-            selector_str = "IPV4_SRC{ip=" + bgpSpeakerIpAddress + "/32}," + "IPV4_DST{ip=" + peer[
-                'ipAddress' ] + "/32}," + "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_SRC{tcpPort=179}"
-            selector = selector_str.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
-            intent = bgpSpeakerAttachmentPoint + "/" + \
-                bgpPeerAttachmentPoint + "/" + str( sorted( selector ) )
-            intents.append( intent )
-
-            # from bgpPeerAttachmentPoint to bgpSpeakerAttachmentPoint
-            # direction
-            selector_str = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," + \
-                "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}"
-            selector = selector_str.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
-            intent = bgpPeerAttachmentPoint + "/" + \
-                bgpSpeakerAttachmentPoint + "/" + str( sorted( selector ) )
-            intents.append( intent )
-
-            selector_str = "IPV4_SRC{ip=" + peer[ 'ipAddress' ] + "/32}," + "IPV4_DST{ip=" + bgpSpeakerIpAddress + "/32}," + \
-                "IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_SRC{tcpPort=179}"
-            selector = selector_str.replace( " ", "" ).replace(
-                "[", "" ).replace( "]", "" ).split( "," )
-            intent = bgpPeerAttachmentPoint + "/" + \
-                bgpSpeakerAttachmentPoint + "/" + str( sorted( selector ) )
-            intents.append( intent )
-
-        return sorted( intents )
-
-    def add_routes( self, routes, routeRate ):
-        main.log.info( "I am in add_routes method!" )
-
-        routes_added = 0
-        try:
-            self.handle.sendline( "" )
-            # self.handle.expect( "config-router" )
-            self.handle.expect( "config-router", timeout=5 )
-        except:
-            main.log.warn( "Probably not in config-router mode!" )
-            self.disconnect()
-        main.log.info( "Start to add routes" )
-
-        for i in range( 0, len( routes ) ):
-            routeCmd = "network " + routes[ i ]
-            try:
-                self.handle.sendline( routeCmd )
-                self.handle.expect( "bgpd", timeout=5 )
-            except:
-                main.log.warn( "Failed to add route" )
-                self.disconnect()
-            waitTimer = 1.00 / routeRate
-            time.sleep( waitTimer )
-        if routes_added == len( routes ):
-            main.log.info( "Finished adding routes" )
-            return main.TRUE
-        return main.FALSE
-
-    def delete_routes( self, routes, routeRate ):
-        main.log.info( "I am in delete_routes method!" )
-
-        routes_added = 0
-        try:
-            self.handle.sendline( "" )
-            # self.handle.expect( "config-router" )
-            self.handle.expect( "config-router", timeout=5 )
-        except:
-            main.log.warn( "Probably not in config-router mode!" )
-            self.disconnect()
-        main.log.info( "Start to delete routes" )
-
-        for i in range( 0, len( routes ) ):
-            routeCmd = "no network " + routes[ i ]
-            try:
-                self.handle.sendline( routeCmd )
-                self.handle.expect( "bgpd", timeout=5 )
-            except:
-                main.log.warn( "Failed to add route" )
-                self.disconnect()
-            waitTimer = 1.00 / routeRate
-            time.sleep( waitTimer )
-        if routes_added == len( routes ):
-            main.log.info( "Finished deleting routes" )
-            return main.TRUE
-        return main.FALSE
-
-    def ping_test( self, ip_address, ping_test_file, ping_test_result_file ):
-        main.log.info( "Start the ping test on host:" + str( ip_address ) )
-
-        self.name = self.options[ 'name' ]
-        self.handle = super( QuaggaCliDriver, self ).connect(
-            user_name=self.user_name, ip_address=ip_address,
-            port=self.port, pwd=self.pwd )
-        main.log.info( "connect parameters:" + str( self.user_name ) + ";"
-                       + str( self.ip_address ) + ";" + str( self.port ) + ";" + str( self.pwd ) )
-
-        if self.handle:
-            # self.handle.expect( "" )
-            # self.handle.expect( "\$" )
-            main.log.info( "I in host " + str( ip_address ) )
-            main.log.info(
-                ping_test_file +
-                " > " +
-                ping_test_result_file +
-                " &" )
-            self.handle.sendline(
-                ping_test_file +
-                " > " +
-                ping_test_result_file +
-                " &" )
-            self.handle.expect( "\$", timeout=60 )
-            handle = self.handle.before
-
-            return handle
-        else:
-            main.log.info( "NO HANDLE" )
-            return main.FALSE
-
-    # Please use the generate_routes plus add_routes instead of this one
-    def add_route( self, net, numRoutes, routeRate ):
-        try:
-            self.handle.sendline( "" )
-            self.handle.expect( "config-router" )
-        except:
-            main.log.warn( "Probably not in config-router mode!" )
-            self.disconnect()
-        main.log.info( "Adding Routes" )
-        j = 0
-        k = 0
-        while numRoutes > 255:
-            numRoutes = numRoutes - 255
-            j = j + 1
-        k = numRoutes % 254
-        routes_added = 0
-        if numRoutes > 255:
-            numRoutes = 255
-        for m in range( 1, j + 1 ):
-            for n in range( 1, numRoutes + 1 ):
-                network = str(
-                    net ) + "." + str(
-                        m ) + "." + str(
-                            n ) + ".0/24"
-                routeCmd = "network " + network
-                try:
-                    self.handle.sendline( routeCmd )
-                    self.handle.expect( "bgpd" )
-                except:
-                    main.log.warn( "failed to add route" )
-                    self.disconnect()
-                waitTimer = 1.00 / routeRate
-                time.sleep( waitTimer )
-                routes_added = routes_added + 1
-        for d in range( j + 1, j + 2 ):
-            for e in range( 1, k + 1 ):
-                network = str(
-                    net ) + "." + str(
-                        d ) + "." + str(
-                            e ) + ".0/24"
-                routeCmd = "network " + network
-                try:
-                    self.handle.sendline( routeCmd )
-                    self.handle.expect( "bgpd" )
-                except:
-                    main.log.warn( "failed to add route" )
-                    self.disconnect
-                waitTimer = 1.00 / routeRate
-                time.sleep( waitTimer )
-                routes_added = routes_added + 1
-        if routes_added == numRoutes:
-            return main.TRUE
-        return main.FALSE
-
-    def del_route( self, net, numRoutes, routeRate ):
-        try:
-            self.handle.sendline( "" )
-            self.handle.expect( "config-router" )
-        except:
-            main.log.warn( "Probably not in config-router mode!" )
-            self.disconnect()
-        main.log.info( "Deleting Routes" )
-        j = 0
-        k = 0
-        while numRoutes > 255:
-            numRoutes = numRoutes - 255
-            j = j + 1
-        k = numRoutes % 254
-        routes_deleted = 0
-        if numRoutes > 255:
-            numRoutes = 255
-        for m in range( 1, j + 1 ):
-            for n in range( 1, numRoutes + 1 ):
-                network = str(
-                    net ) + "." + str(
-                        m ) + "." + str(
-                            n ) + ".0/24"
-                routeCmd = "no network " + network
-                try:
-                    self.handle.sendline( routeCmd )
-                    self.handle.expect( "bgpd" )
-                except:
-                    main.log.warn( "Failed to delete route" )
-                    self.disconnect()
-                waitTimer = 1.00 / routeRate
-                time.sleep( waitTimer )
-                routes_deleted = routes_deleted + 1
-        for d in range( j + 1, j + 2 ):
-            for e in range( 1, k + 1 ):
-                network = str(
-                    net ) + "." + str(
-                        d ) + "." + str(
-                            e ) + ".0/24"
-                routeCmd = "no network " + network
-                try:
-                    self.handle.sendline( routeCmd )
-                    self.handle.expect( "bgpd" )
-                except:
-                    main.log.warn( "Failed to delete route" )
-                    self.disconnect()
-                waitTimer = 1.00 / routeRate
-                time.sleep( waitTimer )
-                routes_deleted = routes_deleted + 1
-        if routes_deleted == numRoutes:
-            return main.TRUE
-        return main.FALSE
-
-    def check_routes( self, brand, ip, user, pw ):
-        def pronto( ip, user, passwd ):
-            print "Connecting to Pronto switch"
-            child = pexpect.spawn( "telnet " + ip )
-            i = child.expect( [ "login:", "CLI#", pexpect.TIMEOUT ] )
-            if i == 0:
-                print "Username and password required. Passing login info."
-                child.sendline( user )
-                child.expect( "Password:" )
-                child.sendline( passwd )
-                child.expect( "CLI#" )
-            print "Logged in, getting flowtable."
-            child.sendline( "flowtable brief" )
-            for t in range( 9 ):
-                t2 = 9 - t
-                print "\r" + str( t2 )
-                sys.stdout.write( "\033[F" )
-                time.sleep( 1 )
-            print "Scanning flowtable"
-            child.expect( "Flow table show" )
-            count = 0
-            while True:
-                i = child.expect(
-                    [ '17\d\.\d{1,3}\.\d{1,3}\.\d{1,3}',
-                                'CLI#',
-                                pexpect.TIMEOUT ] )
-                if i == 0:
-                    count = count + 1
-                elif i == 1:
-                    print "Pronto flows: " + str( count ) + "\nDone\n"
-                    break
-                else:
-                    break
-
-        def cisco( ip, user, passwd ):
-            print "Establishing Cisco switch connection"
-            child = pexpect.spawn( "ssh " + user + "@" + ip )
-            i = child.expect( [ "Password:", "CLI#", pexpect.TIMEOUT ] )
-            if i == 0:
-                print "Password required. Passing now."
-                child.sendline( passwd )
-                child.expect( "#" )
-            print "Logged in. Retrieving flow table then counting flows."
-            child.sendline( "show openflow switch all flows all" )
-            child.expect( "Logical Openflow Switch" )
-            print "Flow table retrieved. Counting flows"
-            count = 0
-            while True:
-                i = child.expect( [ "nw_src=17", "#", pexpect.TIMEOUT ] )
-                if i == 0:
-                    count = count + 1
-                elif i == 1:
-                    print "Cisco flows: " + str( count ) + "\nDone\n"
-                    break
-                else:
-                    break
-            if brand == "pronto" or brand == "PRONTO":
-                pronto( ip, user, passwd )
-            # elif brand  == "cisco" or brand == "CISCO":
-            #    cisco( ip,user,passwd )
-
-    def disconnect( self ):
-        """
-        Called when Test is complete to disconnect the Quagga handle.
-        """
-        response = ''
-        try:
-            self.handle.close()
-        except:
-            main.log.error( "Connection failed to the host" )
-            response = main.FALSE
-        return response
-
diff --git a/TestON/drivers/common/cli/remotetestbed/hpswitchclidriver.py b/TestON/drivers/common/cli/remotetestbed/hpswitchclidriver.py
deleted file mode 100644
index 24d9696..0000000
--- a/TestON/drivers/common/cli/remotetestbed/hpswitchclidriver.py
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/usr/bin/env python
-'''
-Created on 24-June-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/>.        
-
-
-''' 
-import time
-import pexpect
-import struct, fcntl, os, sys, signal
-import sys
-import re
-sys.path.append("../")
-from drivers.common.clidriver import CLI
-
-class HPSwitch(CLI):
-    
-    def __init__(self):
-        super(CLI, self).__init__()
-        
-    def connect(self,**connectargs):
-        for key in connectargs:
-           vars(self)[key] = connectargs[key]
-
-        self.name = self.options['name']
-        self.handle = super(HPSwitch,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
-
-        return main.TRUE
-
-    def configure(self):
-        self.execute(cmd='configure', prompt = '\(config\)',timeout = 3)
-        if re.search('\(config\)', main.last_response):
-            main.log.info("Configure mode enabled"+main.last_response)
-        else : 
-            main.log.warn("Fail to enable configure mode"+main.last_response)
-        
-
-    def set_up_vlan(self,**vlanargs):
-        '''
-        Configure vlan.
-        '''
-        for key in vlanargs:
-           vars(self)[key] = vlanargs[key]
-           
-        self.execute(cmd='vlan '+self.vlan_id, prompt = '\(vlan-'+self.vlan_id+'\)',timeout = 3)
-        if re.search('\(vlan-'+self.vlan_id+'\)', main.last_response):
-            main.log.info("Configuring VLAN "+self.vlan_id)
-        else : 
-            main.log.warn("Fail to configure Vlan"+self.vlan_id+main.last_response)
-            return main.FALSE
-        
-        if self.vlan_name :
-            self.execute(cmd='name '+self.vlan_name, prompt = '\(vlan-'+self.vlan_id+'\)',timeout = 3)
-            if re.search('\(vlan-'+self.vlan_id+'\)', main.last_response):
-                main.log.info("Configuring "+self.vlan_id)
-                return main.TRUE
-            else : 
-                main.log.warn("Fail to configure Vlan"+self.vlan_id+main.last_response)
-                return main.FALSE
-        else :
-            main.log.error("Vlan Name not specified")
-            return main.FALSE
-        
-    def vlan_tagged(self, **taggedargs):
-        for key in taggedargs:
-           vars(self)[key] = taggedargs[key]
-        if self.vlan_id :
-            self.execute(cmd='vlan '+self.vlan_id, prompt = '\(vlan-'+self.vlan_id+'\)',timeout = 3)
-            
-            if re.search('\(vlan-'+self.vlan_id+'\)', main.last_response):
-                main.log.info("Configuring "+self.vlan_id)
-            else : 
-                main.log.warn("Fail to configure Vlan"+self.vlan_id+main.last_response)
-                return main.FALSE
-            if self.tagged :
-                self.execute(cmd='tagged '+self.vlan_id, prompt = '\(vlan-'+self.vlan_id+'\)',timeout = 3)
-                if re.search('\(vlan-'+self.vlan_id+'\)', main.last_response):
-                    main.log.info("VLAN tagged done "+self.tagged)
-                    return main.TRUE
-                else : 
-                    main.log.warn("Fail to tagged Vlan"+self.vlan_id+main.last_response)
-                    return main.FALSE
-            
-    def vlan_untagged(self, **untaggedargs):
-        for key in untaggedargs:
-           vars(self)[key] = untaggedargs[key]
-        if self.vlan_id :
-            self.execute(cmd='vlan '+self.vlan_id, prompt = '\(vlan-'+self.vlan_id+'\)',timeout = 3)
-            
-            if re.search('\(vlan-'+self.vlan_id+'\)', main.last_response):
-                main.log.info("Configuring "+self.vlan_id)
-            else : 
-                main.log.warn("Fail to configure Vlan"+self.vlan_id+main.last_response)
-                return main.FALSE
-            if self.tagged :
-                self.execute(cmd='untagged '+self.vlan_id, prompt = '\(vlan-'+self.vlan_id+'\)',timeout = 3)
-                if re.search('\(vlan-'+self.vlan_id+'\)', main.last_response):
-                    main.log.info("VLAN untagged done "+self.tagged)
-                    return main.TRUE
-                else : 
-                    main.log.warn("Fail to untagged Vlan"+self.vlan_id+main.last_response)
-                    return main.FALSE
-                
-    def openflow_mode(self):
-        self.configure()
-        self.execute(cmd='openflow', prompt = '\(openflow\)',timeout = 3)
-        if re.search('\(openflow\)', main.last_response):
-            main.log.info("Openflow mode enabled"+main.last_response)
-            return main.TRUE
-        else : 
-            main.log.warn("Fail to enable Openflow mode"+main.last_response)
-            return main.FALSE
-
-
-    def add_openflow_controller(self,**controllerargs):
-        for key in controllerargs:
-           vars(self)[key] = controllerargs[key]
-           
-        if not self.openflow_mode():
-            return main.FALSE
-            
-        contoller_details = 'controller-id '+ self.controller_id+'ip '+self.controller_ip + 'controller-interface vlan '+self.interface_vlan_id  
-        self.execute(cmd=contoller_details, prompt = '\(openflow\)',timeout = 3)
-        
-        if re.search('already\sconfigured', main.last_response):
-            main.log.warn("A controller is already configured with this ID."+main.last_response)
-            return main.FALSE
-        elif re.search('Incomplete\sinput',main.last_response ) :             
-            main.log.warn("Incomplete\sinput"+main.last_response)
-            return main.FALSE
-        else:
-            main.log.info("Successfully added Openflow Controller")
-            return main.TRUE
-        
-        
-    def create_openflow_instance(self,**instanceargs):
-        for key in instanceargs:
-           vars(self)[key] = instanceargs[key]
-        
-        if not self.openflow_mode():
-            return main.FALSE
-        
-        if self.instance_name :
-            self.execute(cmd='instance '+self.instance_name, prompt = '\(of-inst-'+self.instance_name+'\)',timeout = 3)
-            
-            if re.search('\(of-inst-'+self.instance_name+'\)', main.last_response):
-                main.log.info("Configuring Openflow instance "+self.instance_name)
-            else : 
-                main.log.warn("Fail to configure Openflow instance"+self.instance_name+"\n\n"+main.last_response)
-                return main.FALSE
-        if self.controller_id :
-            self.execute(cmd='controller-id '+self.controller_id, prompt = '\(of-inst-'+self.instance_name+'\)',timeout = 3)
-            main.log.info(main.last_response)
-        
-        if self.member :
-            self.execute(cmd='member vlan '+self.member_vlan_id, prompt = '\(of-inst-'+self.instance_name+'\)',timeout = 3)
-            main.log.info(main.last_response)
-    
-        if self.execute(cmd='enable', prompt = '\(of-inst-'+self.instance_name+'\)',timeout = 3):
-            return main.TRUE
-        else :
-            return main.FALSE
-    
-    def pair_vlan_with_openflow_instance(self,vlan_id):
-        self.configure()
-        self.execute(cmd='vlan '+vlan_id, prompt = '\(vlan-'+vlan_id+'\)',timeout = 3)
-        if re.search('\(vlan-'+vlan_id+'\)', main.last_response):
-            main.log.info("Configuring VLAN "+vlan_id)
-        else : 
-            main.log.warn("Fail to configure Vlan"+self.vlan_id+main.last_response)
-            return main.FALSE
-        
-        self.execute(cmd='openflow enable', prompt = '\(vlan-'+vlan_id+'\)',timeout = 3)
-        if re.search('\(vlan-'+vlan_id+'\)', main.last_response):
-            main.log.info("Configuring VLAN "+vlan_id)
-        else : 
-            main.log.warn("Fail to configure Vlan"+self.vlan_id+main.last_response)
-            return main.FALSE
-        
-    def show_openflow_instance(self,instance_name):
-        
-        self.execute(cmd='show openflow instance '+instance_name, prompt = '#',timeout = 3)
-        return main.TRUE
-    
-    def show(self, command):
-        self.execute(cmd=command, prompt = '#',timeout = 3)
-        return main.TRUE
-    
-    
-    def openflow_enable(self):
-        self.configure()
-        self.execute(cmd='openflow enable', prompt = '#',timeout = 3)
-        return main.TRUE
-    
-    def openflow_disable(self):
-        self.configure()
-        self.execute(cmd='openflow enable', prompt = '#',timeout = 3)
-        return main.TRUE
-    
-    def remove_controller(self,controller_id):
-        self.configure()
-        self.execute(cmd='no controller-id '+controller_id, prompt = '#',timeout = 3)
-        return main.TRUE
-    
-    def remove_vlan(self,vlan_id):
-        self.configure()
-        if self.execute(cmd='no vlan '+vlan_id, prompt = '#',timeout = 3):
-            return main.TRUE
-        else :
-            self.execute(cmd=' '+vlan_id, prompt = '#',timeout = 3)
-            return main.TRUE
-    
-    def remove_openflow_instance(self,instance_name):
-        self.configure()
-        self.execute(cmd='no openflow instance '+instance_name, prompt = '#',timeout = 3)
-        return main.TRUE
