blob: 057a3f165ef8443aa8f32cb910b7bec7a4e349b9 [file] [log] [blame]
"""
Driver for blank dataplane VMs. Created for SDNIP test.
"""
import time
import pexpect
import struct
import fcntl
import os
import sys
import 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