#/usr/bin/env python
"""
Created on 26-Nov-2012

author:: Raghav Kashyap( raghavkashyap@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/>.



DPCTL driver class provides the basic functions of DPCTL controller
"""
import pexpect
import struct
import fcntl
import os
import sys
import signal
import sys
from drivers.common.cli.toolsdriver import Tools
import pydoc
from drivers.common.clidriver import CLI
import re
import os
import sys


class DpctlCliDriver( Tools ):

    """
     DpctlCliDriver driver class provides the basic functions of DPCTL controller
    """
    def __init__( self ):
        super( DpctlCliDriver, self ).__init__()
        self.handle = self
        self.wrapped = sys.modules[ __name__ ]

    def connect( self, **connectargs ):

        for key in connectargs:
            vars( self )[ key ] = connectargs[ key ]

        self.name = self.options[ 'name' ]

        self.handle = super( 
		      DpctlCliDriver, self ).connect( user_name=self.user_name,
         	      ip_address=self.ip_address,
         	      port=None,
         	      pwd=self.pwd )
        if self.handle:
            main.log.info( "Connected to the host" )
            return main.TRUE
        else:
            main.log.error(
                "Connection failed to the host " +
                self.user_name +
                "@" +
                self.ip_address )
            return main.FALSE

    def addFlow( self, **flowParameters ):
        """
         addFlow create a new flow entry into flow table using "dpctl"
        """
        args = utilities.parse_args( [
				     "TCPIP",
                                     "TCPPORT",
                                     "INPORT",
                                     "ACTION",
                                     "TIMEOUT" ],
            			     **flowParameters )

        cmd = "dpctl add-flow tcp:"
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        timeOut = args[ "TIMEOUT" ] if args[ "TIMEOUT" ] is not None else 120
        cmd = cmd + tcpIP + ":" + tcpPort + " in_port=" + \
            str( args[ "INPORT" ] ) + ",idle_timeout=" + str(
                args[ "TIMEOUT" ] ) + ",actions=" + args[ "ACTION" ]
        response = self.execute( cmd=cmd, prompt="\~\$", timeout=60 )
        if utilities.assert_matches( expect="openflow", actual=response, onpass="Flow Added Successfully", onfail="Adding Flow Failed!!!" ):
            return main.TRUE
        else:
            return main.FALSE

    def showFlow( self, **flowParameters ):
        """
         showFlow dumps the flow entries of flow table using "dpctl"
        """
        args = utilities.parse_args( [ "TCPIP", "TCPPORT" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        command = "dpctl show tcp:" + str( tcpIP ) + ":" + str( tcpPort )
        response = self.execute(
            cmd=command,
            prompt="get_config_reply",
            timeout=240 )
        if utilities.assert_matches( expect='features_reply', actual=response, onpass="Show flow executed", onfail="Show flow execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def dumpFlow( self, **flowParameters ):
        """
         dumpFlow  gives installed flow information
        """
        args = utilities.parse_args( [ "TCPIP", "TCPPORT" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        command = "dpctl dump-flows tcp:" + str( tcpIP ) + ":" + str( tcpPort )
        response = self.execute( cmd=command, prompt="type=", timeout=240 )
        if utilities.assert_matches( expect='stats_reply', actual=response, onpass="Dump flow executed", onfail="Dump flow execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def dumpTables( self, **flowParameters ):
        """
         dumpTables gives statistics for each of the flow tables used by datapath switch.
        """
        args = utilities.parse_args( [ "TCPIP", "TCPPORT" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        command = "dpctl dump-tables tcp:" + \
            str( tcpIP ) + ":" + str( tcpPort )
        response = self.execute( cmd=command, prompt="matched", timeout=240 )
        if utilities.assert_matches( expect='lookup=3', actual=response, onpass="Dump Tables executed", onfail="Dump Tables execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def dumpPorts( self, **flowParameters ):
        """
         dumpPorts gives ports information
        """
        args = utilities.parse_args( [ "TCPIP", "TCPPORT" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        command = "dpctl dump-ports tcp:" + str( tcpIP ) + ":" + str( tcpPort )
        response = self.execute( cmd=command, prompt="rx pkts", timeout=240 )
        if utilities.assert_matches( expect='ports', actual=response, onpass="Dump Ports executed", onfail="Dump Ports execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def dumpAggregate( self, **flowParameters ):
        """
         dumpAggregate  gives installed flow information.ggregate statistics for flows in datapath WITCH's tables that match flows.
         If flows is omitted, the statistics are aggregated across all flows in the datapath's flow tables
        """
        args = utilities.parse_args(
            [ "TCPIP", "TCPPORT", "FLOW" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        flow = args[ "FLOW" ] if args[ "FLOW" ] is not None else ""
        command = "dpctl dump-aggregate tcp:" + \
            str( tcpIP ) + ":" + str( tcpPort ) + " " + str( flow )
        response = self.execute(
            cmd=command,
            prompt="flow_count=",
            timeout=240 )
        if utilities.assert_matches( expect='stats_reply', actual=response, onpass="Dump Aggregate executed", onfail="Dump Aggregate execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def delFlow( self, **flowParameters ):
        """
         delFlow Deletes entries from the datapath switch's tables that match flow
        """
        args = utilities.parse_args(
            [ "TCPIP", "TCPPORT", "FLOW" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        flow = args[ "FLOW" ] if args[ "FLOW" ] is not None else ""
        command = "dpctl del-flows tcp:" + \
            str( tcpIP ) + ":" + str( tcpPort ) + " " + str( flow )
        response = self.execute(
            cmd=command,
            prompt="ETH-Tutorial",
            timeout=240 )
        if utilities.assert_matches( expect='@', actual=response, onpass="Delete flow executed", onfail="Delete flow execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def show( self, **flowParameters ):
        """
         show gives information on datapath switch including information on its flow tables and ports.
        """
        args = utilities.parse_args( [ "TCPIP", "TCPPORT" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        command = "dpctl show tcp:" + str( tcpIP ) + ":" + str( tcpPort )
        response = self.execute(
            cmd=command,
            prompt="miss_send_len=",
            timeout=240 )
        if utilities.assert_matches( expect='get_config_reply', actual=response, onpass="show command executed", onfail="show command execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def showStatus( self, **flowParameters ):
        """
         showStatus gives a series of key-value pairs that report the status of switch.
         If key is specified, only the key-value pairs whose key names begin with key are printed.
        """
        args = utilities.parse_args(
            [ "TCPIP", "TCPPORT", "KEY" ], **flowParameters )
        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        key = args[ "KEY" ] if args[ "KEY" ] is not None else ""
        command = "dpctl status tcp:" + \
            str( tcpIP ) + ":" + str( tcpPort ) + " " + key
        response = self.execute( cmd=command, prompt="(.*)", timeout=240 )
        if utilities.assert_matches( expect='(.*)', actual=response, onpass="show command executed", onfail="show command execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def desc_set( self, **flowParameters ):
        """
         desc_set Sets the switch description ( as returned in ofp_desc_stats ) to string ( max length is DESC_STR_LEN )
        """
        args = utilities.parse_args( [
				     "TCPIP",
                                     "TCPPORT",
                                     "STRING" ],
           			     **flowParameters )

        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        string = " " + args[ "STRING" ] if args[
            "STRING" ] is not None else " DESC_STR_LEN"
        command = "dpctl desc tcp:" + \
            str( tcpIP ) + ":" + str( tcpPort ) + str( string )
        response = self.execute(
            cmd=command,
            prompt="ETH-Tutorial",
            timeout=240 )
        if utilities.assert_matches( expect='@', actual=response, onpass="desc command executed", onfail="desc command execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

    def dumpDesc( self, **flowParameters ):
        """
         dumpDesc Sets the switch description ( as returned in ofp_desc_stats ) to string ( max length is DESC_STR_LEN )
        """
        args = utilities.parse_args( [
				     "TCPIP",
                                     "TCPPORT",
                                     "STRING" ],
            			     **flowParameters )

        tcpIP = args[ "TCPIP" ] if args[ "TCPIP" ] is not None else "127.0.0.1"
        tcpPort = args[ "TCPPORT" ] if args[
            "TCPPORT" ] is not None else "6634"
        command = "dpctl dump-desc tcp:" + str( tcpIP ) + ":" + str( tcpPort )
        response = self.execute(
            cmd=command,
            prompt="Serial Num:",
            timeout=240 )
        if utilities.assert_matches( expect='stats_reply', actual=response, onpass="desc command executed", onfail="desc command execution Failed" ):
            main.last_result = main.TRUE
            return main.TRUE
        else:
            main.last_result = main.FALSE
            return main.FALSE

if __name__ != "__main__":
    import sys
    sys.modules[ __name__ ] = DpctlCliDriver()

