#!/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(intfs)+" 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()

