summaryrefslogtreecommitdiffstats
path: root/yardstick/network_services/traffic_profile/ixia_rfc2544.py
blob: 5ba00180bcfc7b0908f10c2bc9f12e24472f9382 (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# Copyright (c) 2016-2017 Intel Corporation
#
# 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.

from __future__ import absolute_import
import logging
import json

from yardstick.network_services.traffic_profile.traffic_profile import \
    TrexProfile

LOG = logging.getLogger(__name__)


class IXIARFC2544Profile(TrexProfile):
    def _get_ixia_traffic_profile(self, profile_data, mac={},
                                  xfile=None, static_traffic={}):
        result = {}
        if xfile:
            with open(xfile, 'r') as stream:
                try:
                    static_traffic = json.load(stream)
                except Exception as exc:
                    LOG.debug(exc)

        for traffickey, trafficvalue in static_traffic.items():
            traffic = static_traffic[traffickey]
            # outer_l2
            index = 0
            for key, value in profile_data[traffickey].items():
                framesize = value['outer_l2']['framesize']
                traffic['outer_l2']['framesize'] = framesize
                traffic['framesPerSecond'] = True
                traffic['bidir'] = False
                traffic['outer_l2']['srcmac'] = \
                    mac["src_mac_{}".format(traffic['id'])]
                traffic['outer_l2']['dstmac'] = \
                    mac["dst_mac_{}".format(traffic['id'])]
                # outer_l3
                if "outer_l3v6" in list(value.keys()):
                    traffic['outer_l3'] = value['outer_l3v6']
                    srcip4 = value['outer_l3v6']['srcip6']
                    traffic['outer_l3']['srcip4'] = srcip4.split("-")[0]
                    dstip4 = value['outer_l3v6']['dstip6']
                    traffic['outer_l3']['dstip4'] = dstip4.split("-")[0]
                else:
                    traffic['outer_l3'] = value['outer_l3v4']
                    srcip4 = value['outer_l3v4']['srcip4']
                    traffic['outer_l3']['srcip4'] = srcip4.split("-")[0]
                    dstip4 = value['outer_l3v4']['dstip4']
                    traffic['outer_l3']['dstip4'] = dstip4.split("-")[0]

                traffic['outer_l3']['type'] = key
                # outer_l4
                traffic['outer_l4'] = value['outer_l4']
                index = index + 1
            result.update({traffickey: traffic})

        return result

    def _ixia_traffic_generate(self, traffic_generator, traffic, ixia_obj):
        for key, value in traffic.items():
            if "public" in key or "private" in key:
                traffic[key]["iload"] = str(self.rate)
        ixia_obj.ix_update_frame(traffic)
        ixia_obj.ix_update_ether(traffic)
        # ixia_obj.ix_update_ipv4(traffic)
        ixia_obj.ix_start_traffic()
        self.tmp_drop = 0
        self.tmp_throughput = 0

    def execute(self, traffic_generator, ixia_obj, mac={}, xfile=None):
        if self.first_run:
            self.full_profile = {}
            self.pg_id = 0
            self.profile = 'private_1'
            for key, value in self.params.items():
                if "private" in key or "public" in key:
                    self.profile_data = self.params[key]
                    self.get_streams(self.profile_data)
                    self.full_profile.update({key: self.profile_data})
            traffic = \
                self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
            self.max_rate = self.rate
            self.min_rate = 0
            self.get_multiplier()
            self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj)

    def get_multiplier(self):
        self.rate = round((self.max_rate + self.min_rate) / 2.0, 2)
        multiplier = round(self.rate / self.pps, 2)
        return str(multiplier)

    def start_ixia_latency(self, traffic_generator, ixia_obj,
                           mac={}, xfile=None):
        traffic = self._get_ixia_traffic_profile(self.full_profile, mac)
        self._ixia_traffic_generate(traffic_generator, traffic,
                                    ixia_obj, xfile)

    def get_drop_percentage(self, traffic_generator, samples, tol_min,
                            tolerance, ixia_obj, mac={}, xfile=None):
        status = 'Running'
        drop_percent = 100
        in_packets = sum([samples[iface]['in_packets'] for iface in samples])
        out_packets = sum([samples[iface]['out_packets'] for iface in samples])
        rx_throughput = \
            sum([samples[iface]['RxThroughput'] for iface in samples])
        tx_throughput = \
            sum([samples[iface]['TxThroughput'] for iface in samples])
        packet_drop = abs(out_packets - in_packets)
        try:
            drop_percent = round((packet_drop / float(out_packets)) * 100, 2)
        except ZeroDivisionError:
            LOG.info('No traffic is flowing')
        samples['TxThroughput'] = round(tx_throughput / 1.0, 2)
        samples['RxThroughput'] = round(rx_throughput / 1.0, 2)
        samples['CurrentDropPercentage'] = drop_percent
        samples['Throughput'] = self.tmp_throughput
        samples['DropPercentage'] = self.tmp_drop
        if drop_percent > tolerance and self.tmp_throughput == 0:
            samples['Throughput'] = round(rx_throughput / 1.0, 2)
            samples['DropPercentage'] = drop_percent
        if self.first_run:
            max_supported_rate = out_packets / 30.0
            self.rate = max_supported_rate
            self.first_run = False
            if drop_percent <= tolerance:
                status = 'Completed'
        if drop_percent > tolerance:
            self.max_rate = self.rate
        elif drop_percent < tol_min:
            self.min_rate = self.rate
            if drop_percent >= self.tmp_drop:
                self.tmp_drop = drop_percent
                self.tmp_throughput = round((rx_throughput / 1.0), 2)
                samples['Throughput'] = round(rx_throughput / 1.0, 2)
                samples['DropPercentage'] = drop_percent
        else:
            samples['Throughput'] = round(rx_throughput / 1.0, 2)
            samples['DropPercentage'] = drop_percent
            return status, samples
        self.get_multiplier()
        traffic = self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
        self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj)
        return status, samples