Merge "testcase: add rate parameter for spec cpu 2006"
[yardstick.git] / yardstick / network_services / traffic_profile / ixia_rfc2544.py
1 # Copyright (c) 2016-2017 Intel Corporation
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 from __future__ import absolute_import
16 import logging
17 import json
18
19 from yardstick.network_services.traffic_profile.traffic_profile import \
20     TrexProfile
21
22 LOG = logging.getLogger(__name__)
23
24
25 class IXIARFC2544Profile(TrexProfile):
26     def _get_ixia_traffic_profile(self, profile_data, mac={},
27                                   xfile=None, static_traffic={}):
28         result = {}
29         if xfile:
30             with open(xfile, 'r') as stream:
31                 try:
32                     static_traffic = json.load(stream)
33                 except Exception as exc:
34                     LOG.debug(exc)
35
36         for traffickey, trafficvalue in static_traffic.items():
37             traffic = static_traffic[traffickey]
38             # outer_l2
39             index = 0
40             for key, value in profile_data[traffickey].items():
41                 framesize = value['outer_l2']['framesize']
42                 traffic['outer_l2']['framesize'] = framesize
43                 traffic['framesPerSecond'] = True
44                 traffic['bidir'] = False
45                 traffic['outer_l2']['srcmac'] = \
46                     mac["src_mac_{}".format(traffic['id'])]
47                 traffic['outer_l2']['dstmac'] = \
48                     mac["dst_mac_{}".format(traffic['id'])]
49
50                 # outer_l3
51                 if "outer_l3v6" in list(value.keys()):
52                     traffic['outer_l3'] = value['outer_l3v6']
53                     srcip4 = value['outer_l3v6']['srcip6']
54                     traffic['outer_l3']['srcip4'] = srcip4.split("-")[0]
55                     dstip4 = value['outer_l3v6']['dstip6']
56                     traffic['outer_l3']['dstip4'] = dstip4.split("-")[0]
57                 else:
58                     traffic['outer_l3'] = value['outer_l3v4']
59                     srcip4 = value['outer_l3v4']['srcip4']
60                     traffic['outer_l3']['srcip4'] = srcip4.split("-")[0]
61                     dstip4 = value['outer_l3v4']['dstip4']
62                     traffic['outer_l3']['dstip4'] = dstip4.split("-")[0]
63
64                 traffic['outer_l3']['type'] = key
65                 traffic['outer_l3']['count'] = value['outer_l3v4']['count']
66                 # outer_l4
67                 traffic['outer_l4'] = value['outer_l4']
68                 index = index + 1
69             result.update({traffickey: traffic})
70
71         return result
72
73     def _ixia_traffic_generate(self, traffic_generator, traffic, ixia_obj):
74         for key, value in traffic.items():
75             if "public" in key or "private" in key:
76                 traffic[key]["iload"] = str(self.rate)
77         ixia_obj.ix_update_frame(traffic)
78         ixia_obj.ix_update_ether(traffic)
79         ixia_obj.add_ip_header(traffic, 4)
80         ixia_obj.ix_start_traffic()
81         self.tmp_drop = 0
82         self.tmp_throughput = 0
83
84     def update_traffic_profile(self):
85         self.profile = 'private_1'
86         for key, value in self.params.items():
87             if "private" in key or "public" in key:
88                 self.profile_data = self.params[key]
89                 self.get_streams(self.profile_data)
90                 self.full_profile.update({key: self.profile_data})
91
92     def execute(self, traffic_generator, ixia_obj, mac={}, xfile=None):
93         if self.first_run:
94             self.full_profile = {}
95             self.pg_id = 0
96             self.update_traffic_profile()
97             traffic = \
98                 self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
99             self.max_rate = self.rate
100             self.min_rate = 0
101             self.get_multiplier()
102             self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj)
103
104     def get_multiplier(self):
105         self.rate = round((self.max_rate + self.min_rate) / 2.0, 2)
106         multiplier = round(self.rate / self.pps, 2)
107         return str(multiplier)
108
109     def start_ixia_latency(self, traffic_generator, ixia_obj,
110                            mac={}, xfile=None):
111         self.update_traffic_profile()
112         traffic = \
113             self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
114         self._ixia_traffic_generate(traffic_generator, traffic,
115                                     ixia_obj, xfile)
116
117     def get_drop_percentage(self, traffic_generator, samples, tol_min,
118                             tolerance, ixia_obj, mac={}, xfile=None):
119         status = 'Running'
120         drop_percent = 100
121         in_packets = sum([samples[iface]['in_packets'] for iface in samples])
122         out_packets = sum([samples[iface]['out_packets'] for iface in samples])
123         rx_throughput = \
124             sum([samples[iface]['RxThroughput'] for iface in samples])
125         tx_throughput = \
126             sum([samples[iface]['TxThroughput'] for iface in samples])
127         packet_drop = abs(out_packets - in_packets)
128         try:
129             drop_percent = round((packet_drop / float(out_packets)) * 100, 2)
130         except ZeroDivisionError:
131             LOG.info('No traffic is flowing')
132         samples['TxThroughput'] = round(tx_throughput / 1.0, 2)
133         samples['RxThroughput'] = round(rx_throughput / 1.0, 2)
134         samples['CurrentDropPercentage'] = drop_percent
135         samples['Throughput'] = self.tmp_throughput
136         samples['DropPercentage'] = self.tmp_drop
137         if drop_percent > tolerance and self.tmp_throughput == 0:
138             samples['Throughput'] = round(rx_throughput / 1.0, 2)
139             samples['DropPercentage'] = drop_percent
140         if self.first_run:
141             max_supported_rate = out_packets / 30.0
142             self.rate = max_supported_rate
143             self.first_run = False
144             if drop_percent <= tolerance:
145                 status = 'Completed'
146         if drop_percent > tolerance:
147             self.max_rate = self.rate
148         elif drop_percent < tol_min:
149             self.min_rate = self.rate
150             if drop_percent >= self.tmp_drop:
151                 self.tmp_drop = drop_percent
152                 self.tmp_throughput = round((rx_throughput / 1.0), 2)
153                 samples['Throughput'] = round(rx_throughput / 1.0, 2)
154                 samples['DropPercentage'] = drop_percent
155         else:
156             samples['Throughput'] = round(rx_throughput / 1.0, 2)
157             samples['DropPercentage'] = drop_percent
158             return status, samples
159         self.get_multiplier()
160         traffic = self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
161         self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj)
162         return status, samples