class Interface(object):
+ """A class to hold the RX and TX counters for a virtual or physical interface."""
def __init__(self, name, device, tx_packets, rx_packets):
+ """Create a new interface instance."""
self.name = name
self.device = device
self.packets = {
}
def set_packets(self, tx, rx):
+ """Set tx and rx counters for this interface."""
self.packets = {
'tx': tx,
'rx': rx
}
def set_packets_diff(self, tx, rx):
+ """Subtract current counters from new set of counters and update with results."""
self.packets = {
'tx': tx - self.packets['tx'],
'rx': rx - self.packets['rx'],
}
def is_no_op(self):
+ """Check if this interface is a no-opn interface."""
return self.name is None
def get_packet_count(self, traffic_type):
+ """Get packet count for given direction."""
return self.packets.get(traffic_type, 0)
@staticmethod
def no_op():
+ """Return an interface that doe snot pass any traffic."""
return Interface(None, None, 0, 0)
class Network(object):
+ """This class holds all interfaces that make up a logical neutron network.
+
+ A loopback packet path has exactly 2 networks.
+ The first interface is always one of the 2 traffic gen interface.
+ Subsequent interfaces are sorted along the path from the TG to the loopback point
+ which could be interfaces in a switch, a vswitch or a VM.
+ """
def __init__(self, interfaces=None, reverse=False):
+ """Create a network with initial interface list and direction.
+
+ :param interfaces: initial interface list
+ :param reverse: specifies the order of interfaces returned by get_interfaces
+ """
if interfaces is None:
interfaces = []
self.interfaces = interfaces
self.reverse = reverse
def add_interface(self, interface):
+ """Add one more interface to this network.
+
+ Order if important as interfaces must be added from traffic generator ports towards then
+ looping back device.
+ """
self.interfaces.append(interface)
def get_interfaces(self):
+ """Get interfaces associated to this network.
+
+ Returned interface list is ordered from traffic generator port towards looping device if
+ reverse is false. Else returms the list in the reverse order.
+ """
return self.interfaces[::-1] if self.reverse else self.interfaces