#!/usr/bin/env python

'''
This driver handles the optical switch emulator linc-oe.

Please follow the coding style demonstrated by existing
functions and document properly.

If you are a contributor to the driver, please
list your email here for future contact:

    andrew@onlab.us
    shreya@onlab.us

OCT 20 2014
'''

import traceback
import pexpect
import struct
import fcntl
import os
import signal
import re
import sys
import core.teston
import time
sys.path.append("../")
from math import pow
from drivers.common.cli.emulatordriver import Emulator
from drivers.common.clidriver import CLI

class LincOEDriver(Emulator):
    '''
    LincOEDriver class will handle all emulator functions    
    '''
    def __init__(self):
        super(Emulator, self).__init__()
        self.handle = self
        self.wrapped = sys.modules[__name__]
        self.flag = 0

    def connect(self, **connectargs):
        '''
        Create ssh handle for Linc-OE cli
        '''
        import time

        for key in connectargs:
            vars(self)[key] = connectargs[key]       
        
        self.name = self.options['name']
        self.handle = \
                super(LincOEDriver, self).connect(\
                user_name = self.user_name,
                ip_address = self.ip_address,
                port = None, 
                pwd = self.pwd)
        
        self.ssh_handle = self.handle
        
        if self.handle :
            main.log.info("Handle successfully created")
            self.home = "~/linc-oe"
         
            self.handle.sendline("cd "+self.home)
            self.handle.expect("oe$")
          
            #self.handle.sendline("pgrep -g linc")
            #self.handle.expect("\$")
            print "handle = ", self.handle.before            
            
            return main.TRUE 
            ''' 
            main.log.info("Building Linc-OE")
            self.handle.sendline("make rel")
            i = self.handle.expect(["ERROR","linc-oe\$"],timeout=60)
            if i == 0:
                self.handle.sendline("sudo pkill -9 epmd")
                self.handle.expect("\$")
                self.handle.sendline("make rel")
                x = self.handle.expect(["\$",pexpect.EOF,pexpect.TIMEOUT])
                main.log.info("make rel returned: "+ str(x))
            else: 
            
            main.log.info(self.name+": Starting Linc-OE CLI.. This may take a while")
            time.sleep(30)
            self.handle.sendline("sudo ./rel/linc/bin/linc console")
            j = self.handle.expect(["linc@",pexpect.EOF,pexpect.TIMEOUT])
            if j == 0:
                main.log.info("Linc-OE CLI started")
                return main.TRUE
            '''
        else:
            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 Linc-OE")
            return main.FALSE


    def start_console(self):
        import time
        main.log.info(self.name+": Starting Linc-OE CLI.. This may take a while")
        time.sleep(30)
        self.handle.sendline("sudo ./rel/linc/bin/linc console")
        j = self.handle.expect(["linc@",pexpect.EOF,pexpect.TIMEOUT])
        start_result = self.handle.before
        if j == 0:
            main.log.info("Linc-OE CLI started")
            return main.TRUE
        else:
            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 Linc-OE")
            return main.FALSE



    def build(self):
        '''
        Build Linc-OE with the specified settings
        '''
        try:
            self.handle.sendline("make rel")
            i = self.handle.expect([
                "ERROR",
                "\$"])

            if i == 0:
                #If error, try to resolve the most common error
                #(epmd running and cannot compile)
                self.handle.sendline("sudo pkill -9 epmd")
                self.handle.sendline("make rel")
                self.handle.expect("\$")
                    
                handle = self.handle.before
                return handle

            else:
                return main.TRUE

        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()

    def set_interface_up(self, intfs):
        '''
        Specify interface to bring up.
        When Linc-OE is started, tap interfaces should
        be created. They must be brought up manually
        '''
        try:
            self.handle.sendline("ifconfig "+str(intf)+" up")
            self.handle.expect("linc@")
   
            handle = self.handle.before

            return handle

        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()

    def start_switch(self, sw_id):
        '''
        Start a logical switch using switch id
        '''
        try:
            self.handle.sendline("linc:start_switch("+str(sw_id)+").")
            self.handle.expect("linc@")

            handle = self.handle.before

        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()

    def stop_switch(self, sw_id):
        '''
        Stop a logical switch using switch id
        '''
        try:
            self.handle.sendline("linc:stop_switch("+str(sw_id)+").")
            self.handle.expect("linc@")

            handle = self.handle.before

        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()
     
    def get_datapath_id(self, sw_id):
        '''
        Get datapath id of a specific switch by switch id
        '''
        try:
            self.handle.sendline("linc_logic:get_datapath_id("+
                    str(sw_id)+").")
            self.handle.expect("linc@")

            handle = self.handle.before
        
        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()

    def list_ports(self, sw_id):
        '''
        List all ports of a switch by switch id
        '''
        try:
            self.handle.sendline("linc:ports("+str(sw_id)+").")
            self.handle.expect("linc@")

            handle = self.handle.before

        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()

    def port_up(self, sw_id, pt_id):
        '''
        Bring port up using switch id and port id
        '''
        try:
            self.handle.sendline("linc:port_up("+
                    str(sw_id)+", "+str(pt_id)+").")
            self.handle.expect("linc@")

            handle = self.handle.before

        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()
    
    def port_down(self, sw_id, pt_id):
        '''
        Bring port down using switch id and port id
        '''
        try:
            self.handle.sendline("linc:port_down("+
                    str(sw_id)+", "+str(pt_id)+").")
            self.handle.expect("linc@")

            handle = self.handle.before

        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()
    
    def stopLincOEConsole(self):
        '''
        This function is only used for packet optical testing
        Send disconnect prompt to Linc-OE CLI
        (CTRL+C) and kill the linc process
        '''
        try:
            cmd = "pgrep -f linc"
            self.handle.sendline("pgrep -f linc")
            self.handle.expect("linc") 
            print "stophandle = ", self.handle.before
        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before) 

    def disconnect(self):
        '''
        Send disconnect prompt to Linc-OE CLI
        (CTRL+C) and kill the linc process
        '''
        try:
            #Send CTRL+C twice to exit CLI
            self.handle.send("\x03")
            self.handle.send("\x03")
            self.handle.expect("\$")
            handle1 = self.handle.before
            cmd = "pgrep -f linc"
            self.handle.sendline(cmd)
            self.handle.expect("\$")
            handle2 = self.handle.before
            main.log.info("pid's = "+handle2)
            cmd = "sudo kill -9 `pgrep -f linc`"
            self.handle.sendline(cmd)
            self.handle.expect("\$")
            
        except pexpect.EOF:
            main.log.error(self.name+ ": EOF exception")
            main.log.error(self.name+ ":    " + self.handle.before)
            main.cleanup()
            main.exit()
        except:
            main.log.info(self.name+" :::::::")
            main.log.error( traceback.print_exc())
            main.log.info(self.name+" :::::::")
            main.cleanup()
            main.exit()

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

