aboutsummaryrefslogtreecommitdiffstats
path: root/nfvbench/network.py
blob: 6c02f04e199ede02300b0b957f95fc4109e491f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# Copyright 2016 Cisco Systems, Inc.  All rights reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.
#


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 = {
            'tx': tx_packets,
            'rx': rx_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