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