blob: 8da17007091e59dcaa2b64808a5cfba44176f5c8 [file] [log] [blame]
#!/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()