def setInterfaceUp(device,RouterPid,intfList): #Brings the interfaces up #flushBuffer(1,device) j = 0 i = 1 maxiter = len(intfList) while j != maxiter: if j % 2 == 0: flushBuffer(1,device) cmd = """sudo ip link set %s netns %s sudo ip netns exec %s ip link set %s up""" %(intfList[j],RouterPid[0],RouterPid[0],intfList[j]) device.sendline(cmd) device.expect(['w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) logToFile.info(' Interface %s of Router1 UP',intfList[j]) logger.info(device.before,also_console=True) j = j+1 else: flushBuffer(1,device) cmd = """sudo ip link set %s netns %s sudo ip netns exec %s ip link set %s up""" %(intfList[j],RouterPid[i],RouterPid[i],intfList[j]) device.sendline(cmd) device.expect(['w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) logToFile.info(' Interface %s of Router%d UP',intfList[j],i+1) logger.info(device.before,also_console=True) j = j+1 i = i+1 return
def addLinks(iterator, child, RouterPid, InterfaceList): i = iterator flushBuffer(1, child) intfs = 'eth%d' % i InterfaceList.append(intfs) child.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=1) cmd2 = """ln -s /proc/%s/ns/net /var/run/netns/%s""" % (RouterPid[i], RouterPid[i]) child.sendline(cmd2) cmd3 = """sudo ip link add eth%d type veth peer eth%d sudo ip link set %s netns %s sudo ip netns exec %s ip link set %s up""" % (i, i + 1, intfs, RouterPid[i], RouterPid[i], intfs) child.sendline(cmd3) child.expect(['w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=8) print child.before output = child.before status = re.search('Cannot find device', output) count = 3 while count > 0: if status: addLinks(i, child, RouterPid) count = count - 1 else: print "Links added" return InterfaceList break raise RuntimeError("Some error : Unable to add links") return InterfaceList
def executeCmd(self, child, cmds): flushBuffer(1, child) child.sendcontrol('m') child.sendline(cmds) flag = child.expect([ '/w+@.*/#', '\"Result\"\:\"Success\"', 'Failed to connect to localhost port 8080', 'system not ready', 'Internal error processing CreateBGPv4Neighbor\:', pexpect.EOF, pexpect.TIMEOUT ], timeout=8) print child.before if flag == 0 or flag == 1: print "Result=Success" elif flag == 2: print "ERROR:Failed to connect to localhost port 8080" while count > 0: self.count = self.count - 1 self.restartSwitch(child) self.execCmd(child, cmds) raise RuntimeError('Unable to boot the flexswitch') elif flag == 3: print "ERROR:System not ready,Daemons still restarting" time.sleep(20) self.execCmd(child, cmds) elif flag == 4: print "Configurations not done properly" return
def createNodes(iterator, child): i = iterator flushBuffer(1, child) child.sendcontrol('m') child.expect(['/#', pexpect.EOF, pexpect.TIMEOUT], timeout=1) cmd = """sudo docker run -dt --privileged --log-driver=syslog --cap-add=ALL --name Router%d -P snapos/flex:flex2""" % ( i) child.sendline(cmd) child.expect(['/d+', pexpect.EOF, pexpect.TIMEOUT], timeout=5) print child.before flushBuffer(1, child) child.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=1) cmd1 = """sudo docker inspect -f '{{.State.Pid}}' Router%d""" % (i) child.sendline(cmd1) child.expect(['/d+', pexpect.EOF, pexpect.TIMEOUT], timeout=8) print child.before output = child.before pid = re.search('(\d\d[\d$]+)\s', output) count = 3 while count > 0: if pid: print "PID assigned(Container created for Router%d)" % (i) print "PID = %s" % (pid.group(1)) return pid.group(1) break else: createNodes(iterator, child) count = count - 1 raise RuntimeError( "Some error : Unable to instantiate container:-Please manually check for errors" )
def configureIP(RouterInst,Interface,IP_address): #This method will configure IP address flushBuffer(1,RouterInst) RouterInst.sendcontrol('m') RouterInst.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) config = """curl -H "Content-Type: application/json" -d '{"IpAddr": "%s", "IntfRef": "%s"}' http://localhost:8080/public/v1/config/IPv4Intf""" % (IP_address,Interface) Exe = Execute() Exe.executeCmd(RouterInst,config) return RouterInst
def switchToRouter(child,RouterInst): flushBuffer(1,child) child.sendcontrol('m') child.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) cmd = """sudo docker exec -it %s bash""" %(RouterInst) child.sendline(cmd) child.expect(['\d+',pexpect.EOF,pexpect.TIMEOUT],timeout=5) print child.before return child
def checkInterface(RouterInst,Interface): flushBuffer(1,RouterInst) RouterInst.sendcontrol('m') #RouterInst.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) RouterInst.sendline("ifconfig") RouterInst.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) print child.before output = child.before status = re.search(Interface,output) if status = True: print "Interface %s of %s is up" %(Interface,RouterInst) return
def preliminaryInstalls(child): flushBuffer(1,child) child.sendcontrol('m') child.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) child.sendline("sudo apt-get update") time.sleep(15) child.sendline("sudo apt-get install curl -y") time.sleep(40) child.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=5) print child.before return child
def preliminaryInstalls(RouterInst): #Performs preliminary installations such as curl_installation flushBuffer(1,RouterInst) RouterInst.sendcontrol('m') RouterInst.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=2) RouterInst.sendline("sudo apt-get update") time.sleep(15) RouterInst.sendline("sudo apt-get install curl -y") time.sleep(50) RouterInst.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=2) logger.info(RouterInst.before,also_console=True) return RouterInst
def checkBGPRoute(RouterInst): var = 'checkBGPRoute' flushBuffer(1, RouterInst) RouterInst.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) config = """curl -i -H "Content-Type: application/json" "http://*****:*****@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) logger.info(RouterInst.before, also_console=True) output = RouterInst.before outputCheck(RouterInst, var, output) return RouterInst
def checkAllBGPNeighbors(RouterInst): var = 'checkAllBGPNeighbors' flushBuffer(1, RouterInst) RouterInst.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) config = """curl -H "Accept: application/json" "http://*****:*****@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) logger.info(RouterInst.before, also_console=True) output = RouterInst.before outputCheck(RouterInst, var, output) return RouterInst
def docker_kill(): with open('variable.json') as data_file: data = json.load(data_file) Number_of_instances = data["number_of_instances"] child = pexpect.spawn("/bin/bash") for i in range(1,(Number_of_instances+1)): flushBuffer(1,child) cmd = """sudo docker rm -f Router%d""" %(i) child.sendline(cmd) child.expect(['/w+',pexpect.EOF,pexpect.TIMEOUT],timeout=1) print child.before
def switchToRouter(device, Router): #Logins to specific Router flushBuffer(1, device) device.sendcontrol('m') device.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) cmd = """sudo docker exec -it %s bash""" % (Router) device.sendline(cmd) device.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) logger.info(device.before, also_console=True) output = device.before search = "Errorresponse from daemon: %s" % (Router) if re.search(search, output): raise RuntimeError(search) return device
def checkIPV4Route( RouterInst ): #Check BGP Neighbors are learnt and populated in IPv4table var = 'checkIPV4Route' flushBuffer(1, RouterInst) RouterInst.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) config = """curl -H "Accept: application/json" "http://*****:*****@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) logger.info(RouterInst.before) output = RouterInst.before outputCheck(RouterInst, var, output) return RouterInst
def BGPglobal(RouterInst, AS_Num, RouterId): #Performs Global BGP configuration var = 'BGPglobal' flushBuffer(1, RouterInst) RouterInst.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) config = """curl -X PATCH "Content-Type: application/json" -d '{"ASNum":"%s","RouterId":"%s"}' http://localhost:8080/public/v1/config/BGPGlobal""" % ( AS_Num, RouterId) RouterInst = executeCmd(RouterInst, config) RouterInst.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) logger.info(RouterInst.before, also_console=True) output = RouterInst.before outputCheck(RouterInst, var, output) return RouterInst
def checkInterface(RouterInst,Interface,IPaddress): #Checks if interfaces are UP flushBuffer(1,RouterInst) RouterInst.sendcontrol('m') RouterInst.sendline("ifconfig") RouterInst.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=1) logger.info(RouterInst.before,also_console=True) output = RouterInst.before ip = "inet addr:%s" %(IPaddress) status = re.search(Interface,output) con = re.search(ip,output) if (status and con): return else: logToFile.info("Interface %s not UP",Interface) raise RuntimeError("Some error : Interface is not UP")
def addLinks(device,intfList): #Adds Links between devices flushBuffer(1,device) i = 0 ; j = 2 maxiter = len(intfList) while i != maxiter: cmd = """sudo ip link add %s type veth peer name %s""" %(intfList[i],intfList[i+1]) device.sendline(cmd) device.expect(['w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=8) logger.info(device.before,also_console=True) logToFile.info(" link Router1(%s)-----------------------------%s(Router%d)",intfList[i],intfList[i+1],j) i = i + 2 j = j + 1 return
def bootUpDevices(iterator, child): i = iterator flushBuffer(1, child) child.sendcontrol('m') print "STARTING FLEXSWITCH TO PICK UP THE INTERFACES" print "##############################" print "#######Router%d FS restart######" % (i) print "##############################" child.expect(['/#', pexpect.EOF, pexpect.TIMEOUT], timeout=8) cmd4 = """sudo docker exec Router%d sh -c "/etc/init.d/flexswitch restart" """ % ( i) child.sendline(cmd4) time.sleep(10) child.expect(['IOError:', pexpect.EOF, pexpect.TIMEOUT], timeout=8) print child.before return
def createNodes(iterator,device): #Instantiates a docker container that emulates a network device(say Router) i = iterator flushBuffer(1,device) device.sendcontrol('m') device.expect(['/#',pexpect.EOF,pexpect.TIMEOUT],timeout=1) cmd = """sudo docker run -dt --privileged --log-driver=syslog --cap-add=ALL --name Router%d -P snapos/flex:flex2""" %(i+1) #Instantiates the container device.sendline(cmd) device.expect(['/d+',pexpect.EOF,pexpect.TIMEOUT],timeout=2) logger.info(device.before,also_console=True) flushBuffer(1,device) device.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=1) cmd1 = """sudo docker inspect -f '{{.State.Pid}}' Router%d""" %(i+1) #Gets PID for the container device.sendline(cmd1) device.expect(['/d+',pexpect.EOF,pexpect.TIMEOUT],timeout=8) logger.info(device.before,also_console=True) output = device.before pid = re.search('(\d\d[\d$]+)\s',output) #Searches for the PID value return pid
def createBGPV4Neighbor(RouterInst, PeerAS, NeighborAddress, Interface, BfdEnable=False, PeerGroup='', MultiHopTTL=0, LocalAS='', KeepaliveTime=0, AddPathsRx=False, UpdateSource='', RouteReflectorClient=False, MaxPrefixesRestartTimer=0, Description='', MultiHopEnable=False, AuthPassword='', RouteReflectorClusterId=0, AdjRIBOutFilter='', MaxPrefixesDisconnect=False, AddPathsMaxTx=0, AdjRIBInFilter='', MaxPrefixes=0, MaxPrefixesThresholdPct=80, BfdSessionParam='default', NextHopSelf=False, Disabled=False, HoldTime=0, ConnectRetryTime=0): var = 'createBGPV4Neighbor' flushBuffer(1, RouterInst) RouterInst.expect(['/w+@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) config = """curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"PeerAS":"%s", "NeighborAddress":"%s","IntfRef":"%s", "IfIndex":0,"RouteReflectorClusterId":0, "MultiHopTTL":0,"ConnectRetryTime":60,"HoldTime":180,"KeepaliveTime":60,"AddPathsMaxTx":0}' 'http://*****:*****@.*/#', pexpect.EOF, pexpect.TIMEOUT], timeout=3) logger.info(RouterInst.before, also_console=True) output = RouterInst.before outputCheck(RouterInst, var, output) return RouterInst
def ping(RouterInst,IPAddress): #Performs ping test to verify configuration of IP address on interfaces IP = IPAddress.split('/') flushBuffer(1,RouterInst) RouterInst.sendcontrol('m') RouterInst.expect(['/w+@.*/#',pexpect.EOF,pexpect.TIMEOUT],timeout=3) cmd = "ping -c 3 %s" %(IP[0]) RouterInst.sendline(cmd) RouterInst.sendcontrol('m') RouterInst.expect(['min/avg/max/mdev',pexpect.EOF,pexpect.TIMEOUT],timeout=3) output = RouterInst.before logger.info(RouterInst.before,also_console=True) if re.search("0% packet loss",output): logToFile.info("Ping Success: Device Reachable") else: logToFile.debug("Device Unreachable : Check IP address Configuration") raise RuntimeError("Error : Device Unreachable") return
def executeCmd(child, cmds): flushBuffer(1, child) child.sendcontrol('m') child.sendline(cmds) return child