blob: 1e7015c9d9c17c803849e85b6c16ba06cf3be104 [file] [log] [blame]
'''
Driver for blank dataplane VMs. Created for SDNIP test.
'''
import time
import pexpect
import struct, fcntl, os, sys, signal
import sys
import re
import json
sys.path.append("../")
from drivers.common.clidriver import CLI
class DPCliDriver(CLI):
def __init__(self):
super(CLI, self).__init__()
def connect(self,**connectargs):
for key in connectargs:
vars(self)[key] = connectargs[key]
self.name = self.options['name']
self.handle = super(DPCliDriver,self).connect(user_name = self.user_name, ip_address = self.ip_address,port = self.port, pwd = self.pwd)
if self.handle:
return self.handle
else :
main.log.info("NO HANDLE")
return main.FALSE
def create_interfaces(self, net, number, start):
'''
Creates a number,specified by 'number,' of subinterfaces on eth0. Ip addresses start at 'net'.'start'.1.1 with a 24 bit netmask. Addresses increment sequentially in the third quad,
therefore all interfaces are in different subnets on the same machine. When the third quad reaches 255, it is reset to 1 and the second quad is incremented.
Every single ip address is placed in a file in /tmp titled 'ip_table{net}.txt'
The file is used by 'pingall_interfaces()' as a fping argument
This method returns true if all interfaces are created without a hitch, and false if a single interface has issues
'''
self.handle.sendline("")
self.handle.expect("\$")
self.handle.sendline("rm /tmp/local_ip.txt")
self.handle.expect("\$")
self.handle.sendline("touch /tmp/local_ip.txt")
self.handle.expect("\$")
main.log.info("Creating interfaces")
k = 0
intf = 0
while number != 0:
k= k + 1
if k == 256:
k = 1
start = start + 1
number = number - 1
intf = intf + 1
ip = net+"."+str(start)+"."+str(k)+".1"
self.handle.sendline("sudo ifconfig eth0:"+str(intf)+" "+ip+" netmask 255.255.255.0")
i = self.handle.expect(["\$","password",pexpect.TIMEOUT,pexpect.EOF], timeout = 120)
if i == 0:
self.handle.sendline("echo "+str(ip)+" >> /tmp/local_ip.txt")
self.handle.expect("\$")
elif i == 1:
main.log.info("Sending sudo password")
self.handle.sendline(self.pwd)
self.handle.expect("\$")
else:
main.log.error("INTERFACES NOT CREATED")
return main.FALSE
def pingall_interfaces(self, netsrc, netstrt, netdst, destlogin, destip):
'''
Copies the /tmp/ip_table{net}.txt file from the machine you wish to ping, then runs fping with a source address of {netsrc}.{netstrt}.1.1 on the copied file.
Check every single response for reachable or unreachable. If all are reachable, function returns true. If a SINGLE host is unreachable, then the function stops and returns false
If fping is not installed, this function will install fping then run the same command
'''
self.handle.sendline("")
self.handle.expect("\$")
self.handle.sendline("scp "+str(destlogin)+"@"+str(destip)+":/tmp/local_ip.txt /tmp/ip_table"+str(net)+".txt")
i = self.handle.expect(["100%","password",pexpect.TIMEOUT], timeout = 30)
if i == 0:
main.log.info("Copied ping file successfully")
elif i == 1:
self.handle.sendline(self.pwd)
self.handle.expect("100%")
main.log.info("Copied ping file successfully")
elif i == 2:
main.log.error("COULD NOT COPY PING FILE FROM "+str(destip))
result = main.FALSE
return result
self.handle.sendline("")
self.handle.expect("\$")
main.log.info("Pinging interfaces on the "+str(netdst)+" network from "+str(netsrc)+"."+str(netstrt)+".1.1")
self.handle.sendline("sudo fping -S "+str(netsrc)+"."+str(netstrt)+".1.1 -f /tmp/ip_table"+str(netdst)+".txt")
while 1:
i = self.handle.expect(["reachable","unreachable","\$","password",pexpect.TIMEOUT,"not installed"], timeout=45)
if i == 0:
result = main.TRUE
elif i == 1:
main.log.error("An interface was unreachable")
result = main.FALSE
return result
elif i == 2:
main.log.info("All interfaces reachable")
return result
elif i == 3:
self.handle.sendline(self.pwd)
elif i == 4:
main.log.error("Unable to fping")
result = main.FALSE
return result
elif i == 5:
main.log.info("fping not installed, installing fping")
self.handle.sendline("sudo apt-get install fping")
i = self.handle.expect(["password","\$",pexpect.TIMEOUT], timeout = 60)
if i == 0:
self.handle.sendline(self.pwd)
self.handle.expect("\$", timeout = 30)
main.log.info("fping installed, now pinging interfaces")
self.handle.sendline("sudo fping -S "+str(netsrc)+"."+str(netstrt)+".1.1 -f /tmp/ip_table"+str(netdst)+".txt")
elif i == 1:
main.log.info("fping installed, now pinging interfaces")
self.handle.sendline("sudo fping -S "+str(netsrc)+"."+str(netstrt)+".1.1 -f /tmp/ip_table"+str(netdst)+".txt")
elif i == 2:
main.log.error("Could not install fping")
result = main.FALSE
return result
def disconnect(self):
response = ''
try:
self.handle.sendline("exit")
self.handle.expect("closed")
except:
main.log.error("Connection failed to the host")
response = main.FALSE
return response