1 # Copyright (c) 2016-2017 Intel Corporation
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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
17 from yardstick.common import utils
18 from yardstick.network_services.traffic_profile import base as tp_base
19 from yardstick.network_services.traffic_profile import trex_traffic_profile
22 LOG = logging.getLogger(__name__)
25 class IXIARFC2544Profile(trex_traffic_profile.TrexProfile):
29 DROP_PERCENT_ROUND = 6
32 def __init__(self, yaml_data):
33 super(IXIARFC2544Profile, self).__init__(yaml_data)
34 self.rate = self.config.frame_rate
35 self.rate_unit = self.config.rate_unit
37 def _get_ip_and_mask(self, ip_range):
38 _ip_range = ip_range.split('-')
39 if len(_ip_range) == 1:
40 return _ip_range[0], None
42 mask = utils.get_mask_from_ip_range(_ip_range[0], _ip_range[1])
43 return _ip_range[0], mask
45 def _get_ixia_traffic_profile(self, profile_data, mac=None):
46 mac = {} if mac is None else mac
48 for traffickey, values in profile_data.items():
49 if not traffickey.startswith((self.UPLINK, self.DOWNLINK)):
53 # values should be single-item dict, so just grab the first item
55 key, value = next(iter(values.items()))
57 result[traffickey] = {}
60 port_id = value.get('id', 1)
61 port_index = port_id - 1
63 if value.get('outer_l3v4'):
64 ip = value['outer_l3v4']
65 src_key, dst_key = 'srcip4', 'dstip4'
67 ip = value['outer_l3v6']
68 src_key, dst_key = 'srcip6', 'dstip6'
70 srcip, srcmask = self._get_ip_and_mask(ip[src_key])
71 dstip, dstmask = self._get_ip_and_mask(ip[dst_key])
73 result[traffickey] = {
77 'rate_unit': self.rate_unit,
79 'framesize': value['outer_l2']['framesize'],
80 'framesPerSecond': True,
81 'srcmac': mac['src_mac_{}'.format(port_index)],
82 'dstmac': mac['dst_mac_{}'.format(port_index)],
95 'outer_l4': value['outer_l4'],
102 def _ixia_traffic_generate(self, traffic, ixia_obj):
103 ixia_obj.update_frame(traffic)
104 ixia_obj.update_ip_packet(traffic)
105 ixia_obj.start_traffic()
107 def update_traffic_profile(self, traffic_generator):
108 def port_generator():
109 for vld_id, intfs in sorted(traffic_generator.networks.items()):
110 if not vld_id.startswith((self.UPLINK, self.DOWNLINK)):
112 profile_data = self.params.get(vld_id)
115 self.profile_data = profile_data
116 self.full_profile.update({vld_id: self.profile_data})
118 yield traffic_generator.vnfd_helper.port_num(intf)
120 self.ports = [port for port in port_generator()]
122 def execute_traffic(self, traffic_generator, ixia_obj=None, mac=None):
123 mac = {} if mac is None else mac
124 first_run = self.first_run
126 self.first_run = False
127 self.full_profile = {}
129 self.update_traffic_profile(traffic_generator)
130 self.max_rate = self.rate
133 self.rate = round(float(self.max_rate + self.min_rate) / 2.0,
136 traffic = self._get_ixia_traffic_profile(self.full_profile, mac)
137 self._ixia_traffic_generate(traffic, ixia_obj)
140 def get_drop_percentage(self, samples, tol_min, tolerance, duration=30.0,
144 num_ifaces = len(samples)
145 in_packets_sum = sum(
146 [samples[iface]['in_packets'] for iface in samples])
147 out_packets_sum = sum(
148 [samples[iface]['out_packets'] for iface in samples])
150 [samples[iface]['RxThroughput'] for iface in samples])
151 rx_throughput = round(float(rx_throughput), 2)
153 [samples[iface]['TxThroughput'] for iface in samples])
154 tx_throughput = round(float(tx_throughput), 2)
155 packet_drop = abs(out_packets_sum - in_packets_sum)
158 drop_percent = round(
159 (packet_drop / float(out_packets_sum)) * 100,
160 self.DROP_PERCENT_ROUND)
161 except ZeroDivisionError:
162 LOG.info('No traffic is flowing')
164 samples['TxThroughput'] = tx_throughput
165 samples['RxThroughput'] = rx_throughput
166 samples['DropPercentage'] = drop_percent
169 completed = True if drop_percent <= tolerance else False
171 self.rate_unit == tp_base.TrafficProfileConfig.RATE_FPS):
172 self.rate = out_packets_sum / duration / num_ifaces
174 if drop_percent > tolerance:
175 self.max_rate = self.rate
176 elif drop_percent < tol_min:
177 self.min_rate = self.rate
181 return completed, samples