1 # Copyright 2016 Red Hat Inc
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.
16 # Bill Michalowski, Red Hat Inc.
17 # Andrew Theurer, Red Hat Inc.
19 Moongen Traffic Generator Model
23 from collections import OrderedDict
30 from conf import settings
31 from conf import merge_spec
32 from core.results.results_constants import ResultsConstants
33 from tools.pkt_gen.trafficgen.trafficgen import ITrafficGenerator
35 class Moongen(ITrafficGenerator):
36 """Moongen Traffic generator wrapper."""
37 _logger = logging.getLogger(__name__)
40 """Moongen class constructor."""
42 self._logger.info("In moongen __init__ method")
44 self._moongen_host_ip_addr = (
45 settings.getValue('TRAFFICGEN_MOONGEN_HOST_IP_ADDR'))
46 self._moongen_base_dir = (
47 settings.getValue('TRAFFICGEN_MOONGEN_BASE_DIR'))
48 self._moongen_user = settings.getValue('TRAFFICGEN_MOONGEN_USER')
49 self._moongen_ports = settings.getValue('TRAFFICGEN_MOONGEN_PORTS')
51 if settings.getValue('TRAFFICGEN_MOONGEN_LINE_SPEED_GBPS') == '10':
52 self._moongen_line_speed = math.pow(10, 10)
55 'MOONGEN: Invalid line speed in configuration ' + \
56 'file (today 10Gbps supported)')
58 def create_moongen_cfg_file(self, traffic, duration=60,
59 acceptable_loss_pct=1, one_shot=0):
60 """Create the Moongen configuration file from VSPERF's traffic profile
61 :param traffic: Detailed "traffic" spec, i.e. IP address, VLAN tags
62 :param duration: The length of time to generate packet throughput
63 :param acceptable_loss: Maximum packet loss acceptable
64 :param one_shot: No RFC 2544 binary search,
65 just packet flow at traffic specifics
67 logging.debug("traffic['frame_rate'] = " + \
68 str(traffic['frame_rate']))
70 logging.debug("traffic['multistream'] = " + \
71 str(traffic['multistream']))
73 logging.debug("traffic['stream_type'] = " + \
74 str(traffic['stream_type']))
76 logging.debug("traffic['l2']['srcmac'] = " + \
77 str(traffic['l2']['srcmac']))
79 logging.debug("traffic['l2']['dstmac'] = " + \
80 str(traffic['l2']['dstmac']))
82 logging.debug("traffic['l3']['proto'] = " + \
83 str(traffic['l3']['proto']))
85 logging.debug("traffic['l3']['srcip'] = " + \
86 str(traffic['l3']['srcip']))
88 logging.debug("traffic['l3']['dstip'] = " + \
89 str(traffic['l3']['dstip']))
91 logging.debug("traffic['l4']['srcport'] = " + \
92 str(traffic['l4']['srcport']))
94 logging.debug("traffic['l4']['dstport'] = " + \
95 str(traffic['l4']['dstport']))
97 logging.debug("traffic['vlan']['enabled'] = " + \
98 str(traffic['vlan']['enabled']))
100 logging.debug("traffic['vlan']['id'] = " + \
101 str(traffic['vlan']['id']))
103 logging.debug("traffic['vlan']['priority'] = " + \
104 str(traffic['vlan']['priority']))
106 logging.debug("traffic['vlan']['cfi'] = " + \
107 str(traffic['vlan']['cfi']))
109 logging.debug(traffic['l2']['framesize'])
111 out_file = open("opnfv-vsperf-cfg.lua", "wt")
113 out_file.write("VSPERF {\n")
115 out_file.write("testType = \"throughput\",\n")
117 out_file.write("nrFlows = " + \
118 str(traffic['multistream']) + ",\n")
120 out_file.write("runBidirec = " + \
121 traffic['bidir'].lower() + ",\n")
123 out_file.write("frameSize = " + \
124 str(traffic['l2']['framesize']) + ",\n")
126 out_file.write("srcMac = \"" + \
127 str(traffic['l2']['srcmac']) + "\",\n")
129 out_file.write("dstMac = \"" + \
130 str(traffic['l2']['dstmac']) + "\",\n")
132 out_file.write("srcIp = \"" + \
133 str(traffic['l3']['srcip']) + "\",\n")
135 out_file.write("dstIp = \"" + \
136 str(traffic['l3']['dstip']) + "\",\n")
138 if traffic['vlan']['enabled']:
139 out_file.write("vlanId = " + \
140 str(traffic['vlan']['id']) + ",\n")
142 out_file.write("searchRunTime = " + \
143 str(duration) + ",\n")
145 out_file.write("validationRunTime = " + \
146 str(duration) + ",\n")
148 out_file.write("acceptableLossPct = " + \
149 str(acceptable_loss_pct) + ",\n")
151 out_file.write("ports = " +\
152 str(self._moongen_ports) + ",\n")
155 out_file.write("oneShot = true,\n")
157 # Need to convert VSPERF frame_rate (percentage of line rate)
158 # to Mpps for Moongen
160 (traffic['frame_rate'] / 100) * (self._moongen_line_speed / \
161 (8 * (traffic['l2']['framesize'] + 20)) / math.pow(10, 6)))
163 logging.debug("startRate = " + start_rate)
165 out_file.write("startRate = " + \
168 out_file.write("}" + "\n")
171 copy_moongen_cfg = "scp opnfv-vsperf-cfg.lua " + \
172 self._moongen_user + "@" + \
173 self._moongen_host_ip_addr + ":" + \
174 self._moongen_base_dir + \
175 "/. && rm opnfv-vsperf-cfg.lua"
177 find_moongen = subprocess.Popen(copy_moongen_cfg,
179 stderr=subprocess.PIPE)
181 output, error = find_moongen.communicate()
184 logging.error(output)
186 raise RuntimeError('MOONGEN: Error copying configuration file')
189 """Connect to Moongen traffic generator
191 Verify that Moongen is on the system indicated by
192 the configuration file
194 self._logger.info("MOONGEN: In Moongen connect method...")
196 if self._moongen_host_ip_addr:
197 cmd_ping = "ping -c1 " + self._moongen_host_ip_addr
199 raise RuntimeError('MOONGEN: Moongen host not defined')
201 ping = subprocess.Popen(cmd_ping, shell=True, stderr=subprocess.PIPE)
202 output, error = ping.communicate()
205 self._logger.error(error)
206 self._logger.error(output)
207 raise RuntimeError('MOONGEN: Cannot ping Moongen host at ' + \
208 self._moongen_host_ip_addr)
210 connect_moongen = "ssh " + self._moongen_user + \
211 "@" + self._moongen_host_ip_addr
213 cmd_find_moongen = connect_moongen + " ls " + \
214 self._moongen_base_dir + "/trafficgen.lua"
216 find_moongen = subprocess.Popen(cmd_find_moongen,
218 stderr=subprocess.PIPE)
220 output, error = find_moongen.communicate()
222 if find_moongen.returncode:
223 self._logger.error(error)
224 self._logger.error(output)
226 'MOONGEN: Cannot locate Moongen program at %s within %s' \
227 % (self._moongen_host_ip_addr, self._moongen_base_dir))
229 self._logger.info("MOONGEN: Moongen host successfully found...")
231 def disconnect(self):
232 """Disconnect from the traffic generator.
234 As with :func:`connect`, this function is optional.
236 Where implemented, this function should raise an exception on
241 self._logger.info("MOONGEN: In moongen disconnect method")
243 def send_burst_traffic(self, traffic=None, numpkts=100, duration=20):
244 """Send a burst of traffic.
246 Send a ``numpkts`` packets of traffic, using ``traffic``
247 configuration, with a timeout of ``time``.
249 :param traffic: Detailed "traffic" spec, i.e. IP address, VLAN tags
250 :param numpkts: Number of packets to send
251 :param duration: Time to wait to receive packets
253 :returns: dictionary of strings with following data:
257 - List of List of Rx Bytes,
258 - Payload Errors and Sequence Errors.
260 self._logger.info("In Moongen send_burst_traffic method")
261 return NotImplementedError('Moongen Burst traffic not implemented')
263 def send_cont_traffic(self, traffic=None, duration=20):
264 """Send a continuous flow of traffic
266 Send packets at ``frame rate``, using ``traffic`` configuration,
267 until timeout ``time`` occurs.
269 :param traffic: Detailed "traffic" spec, i.e. IP address, VLAN tags
270 :param duration: Time to wait to receive packets (secs)
271 :returns: dictionary of strings with following data:
272 - Tx Throughput (fps),
273 - Rx Throughput (fps),
274 - Tx Throughput (mbps),
275 - Rx Throughput (mbps),
276 - Tx Throughput (% linerate),
277 - Rx Throughput (% linerate),
282 self._logger.info("In Moongen send_cont_traffic method")
285 self._params['traffic'] = self.traffic_defaults.copy()
288 self._params['traffic'] = merge_spec(self._params['traffic'],
291 Moongen.create_moongen_cfg_file(self,
294 acceptable_loss_pct=100.0,
297 collected_results = Moongen.run_moongen_and_collect_results(self,
300 results = OrderedDict()
302 results[ResultsConstants.THROUGHPUT_RX_FPS] = (
304 float(collected_results[ResultsConstants.THROUGHPUT_RX_FPS])))
306 results[ResultsConstants.THROUGHPUT_RX_MBPS] = (
308 float(collected_results[ResultsConstants.THROUGHPUT_RX_MBPS])))
310 results[ResultsConstants.THROUGHPUT_RX_PERCENT] = (
313 collected_results[ResultsConstants.THROUGHPUT_RX_PERCENT])))
315 results[ResultsConstants.TX_RATE_FPS] = (
317 float(collected_results[ResultsConstants.TX_RATE_FPS])))
319 results[ResultsConstants.TX_RATE_MBPS] = (
321 float(collected_results[ResultsConstants.TX_RATE_MBPS])))
323 results[ResultsConstants.TX_RATE_PERCENT] = (
325 float(collected_results[ResultsConstants.TX_RATE_PERCENT])))
327 results[ResultsConstants.MIN_LATENCY_NS] = 0
329 results[ResultsConstants.MAX_LATENCY_NS] = 0
331 results[ResultsConstants.AVG_LATENCY_NS] = 0
335 def start_cont_traffic(self, traffic=None, duration=20):
336 """ Non-blocking version of 'send_cont_traffic'.
338 Start transmission and immediately return. Do not wait for
340 :param traffic: Detailed "traffic" spec, i.e. IP address, VLAN tags
341 :param duration: Time to wait to receive packets (secs)
343 self._logger.info("In Moongen start_cont_traffic method")
344 return NotImplementedError('moongen continuous traffic not implemented')
346 def stop_cont_traffic(self):
347 # Stop continuous transmission and return results.
348 self._logger.info("In Moongen stop_cont_traffic method")
350 def run_moongen_and_collect_results(self, test_run=1):
351 """Execute Moongen and transform results into VSPERF format
352 :param test_run: The number of tests to run
354 # Start Moongen and create logfile of the run
355 connect_moongen = "ssh " + self._moongen_user + "@" + \
356 self._moongen_host_ip_addr
358 cmd_moongen = " 'cd " + self._moongen_base_dir + \
359 "; ./MoonGen/build/MoonGen trafficgen.lua | tee moongen_log.txt'"
361 cmd_start_moongen = connect_moongen + cmd_moongen
363 start_moongen = subprocess.Popen(cmd_start_moongen,
364 shell=True, stderr=subprocess.PIPE)
366 output, error = start_moongen.communicate()
368 if start_moongen.returncode:
370 logging.debug(output)
372 'MOONGEN: Error starting Moongen program at %s within %s' \
373 % (self._moongen_host_ip_addr, self._moongen_base_dir))
375 cmd_moongen = "mkdir -p /tmp/moongen/" + str(test_run)
377 moongen_create_log_dir = subprocess.Popen(cmd_moongen,
379 stderr=subprocess.PIPE)
381 output, error = moongen_create_log_dir.communicate()
383 if moongen_create_log_dir.returncode:
385 logging.debug(output)
387 'MOONGEN: Error obtaining Moongen log from %s within %s' \
388 % (self._moongen_host_ip_addr, self._moongen_base_dir))
390 cmd_moongen = " scp " + self._moongen_user + "@" + \
391 self._moongen_host_ip_addr + ":" + \
392 self._moongen_base_dir + "/moongen_log.txt /tmp/moongen/" + \
393 str(test_run) + "/moongen-run.log"
395 copy_moongen_log = subprocess.Popen(cmd_moongen,
397 stderr=subprocess.PIPE)
399 output, error = copy_moongen_log.communicate()
401 if copy_moongen_log.returncode:
403 logging.debug(output)
405 'MOONGEN: Error obtaining Moongen log from %s within %s' \
406 % (self._moongen_host_ip_addr, self._moongen_base_dir))
408 log_file = "/tmp/moongen/" + str(test_run) + "/moongen-run.log"
410 with open(log_file, 'r') as logfile_handle:
411 mytext = logfile_handle.read()
413 # REPORT results line
414 # match.group(1) = Tx frames
415 # match.group(2) = Rx frames
416 # match.group(3) = Frame loss (count)
417 # match.group(4) = Frame loss (percentage)
418 # match.group(5) = Tx Mpps
419 # match.group(6) = Rx Mpps
420 search_pattern = re.compile(
421 r'\[REPORT\]\s+total\:\s+'
422 r'Tx\s+frames\:\s+(\d+)\s+'
423 r'Rx\s+Frames\:\s+(\d+)\s+'
424 r'frame\s+loss\:\s+(\d+)\,'
425 r'\s+(\d+\.\d+|\d+)%\s+'
426 r'Tx\s+Mpps\:\s+(\d+.\d+|\d+)\s+'
427 r'Rx\s+Mpps\:\s+(\d+\.\d+|\d+)',
430 results_match = search_pattern.search(mytext)
432 if not results_match:
433 logging.error('There was a problem parsing ' +\
434 'Moongen REPORT section of Moongen log file')
436 moongen_results = OrderedDict()
437 moongen_results[ResultsConstants.THROUGHPUT_RX_FPS] = 0
438 moongen_results[ResultsConstants.THROUGHPUT_RX_MBPS] = 0
439 moongen_results[ResultsConstants.THROUGHPUT_RX_PERCENT] = 0
440 moongen_results[ResultsConstants.TX_RATE_FPS] = 0
441 moongen_results[ResultsConstants.TX_RATE_MBPS] = 0
442 moongen_results[ResultsConstants.TX_RATE_PERCENT] = 0
443 moongen_results[ResultsConstants.B2B_TX_COUNT] = 0
444 moongen_results[ResultsConstants.B2B_FRAMES] = 0
445 moongen_results[ResultsConstants.B2B_FRAME_LOSS_FRAMES] = 0
446 moongen_results[ResultsConstants.B2B_FRAME_LOSS_PERCENT] = 0
448 # find PARAMETERS line
449 # parameters_match.group(1) = Frame size
451 search_pattern = re.compile(
452 r'\[PARAMETERS\]\s+.*frameSize\:\s+(\d+)',
454 parameters_match = search_pattern.search(mytext)
457 frame_size = int(parameters_match.group(1))
459 logging.error('There was a problem parsing Moongen ' +\
460 'PARAMETERS section of Moongen log file')
463 # Each packet stream in the MoonGen report is prefaced with the
464 # words '[REPORT]Device'. Count the instances of this string to
465 # get the total aggregrate throughput. For example:
467 # - If num_traffic_streams = 1, there is a single
468 # unidirectional stream
470 # - If num_traffic_streams = 2, there is a bidirectional
472 num_traffic_streams = mytext.count('[REPORT]Device')
474 if results_match and parameters_match and num_traffic_streams:
475 # Assume for now 10G link speed
476 max_theoretical_fps = (
477 num_traffic_streams * (self._moongen_line_speed / 8) / (frame_size + 20))
479 moongen_results[ResultsConstants.THROUGHPUT_RX_FPS] = (
480 float(results_match.group(6)) * 1000000)
482 moongen_results[ResultsConstants.THROUGHPUT_RX_MBPS] = (
483 float(results_match.group(6)) * (frame_size + 20) * 8)
485 moongen_results[ResultsConstants.THROUGHPUT_RX_PERCENT] = (
486 (100 * float(results_match.group(6)) * 1000000) / max_theoretical_fps)
488 moongen_results[ResultsConstants.TX_RATE_FPS] = (
489 float(results_match.group(5)) * 1000000)
491 moongen_results[ResultsConstants.TX_RATE_MBPS] = (
492 float(results_match.group(5)) * (frame_size + 20) * 8)
494 moongen_results[ResultsConstants.TX_RATE_PERCENT] = (
495 (100 * float(results_match.group(5)) * 1000000) / max_theoretical_fps)
497 moongen_results[ResultsConstants.B2B_TX_COUNT] = (
498 float(results_match.group(1)))
500 moongen_results[ResultsConstants.B2B_FRAMES] = (
501 float(results_match.group(2)))
503 moongen_results[ResultsConstants.B2B_FRAME_LOSS_FRAMES] = (
504 float(results_match.group(3)))
506 moongen_results[ResultsConstants.B2B_FRAME_LOSS_PERCENT] = (
507 float(results_match.group(4)))
509 return moongen_results
511 def send_rfc2544_throughput(self, traffic=None, duration=20,
512 lossrate=0.0, tests=1):
514 # Send traffic per RFC2544 throughput test specifications.
516 # Send packets at a variable rate, using ``traffic``
517 # configuration, until minimum rate at which no packet loss is
520 # :param traffic: Detailed "traffic" spec, see design docs for details
521 # :param tests: Number of tests to execute
522 # :param duration: Per iteration duration
523 # :param lossrate: Acceptable lossrate percentage
524 # :returns: dictionary of strings with following data:
525 # - Tx Throughput (fps),
526 # - Rx Throughput (fps),
527 # - Tx Throughput (mbps),
528 # - Rx Throughput (mbps),
529 # - Tx Throughput (% linerate),
530 # - Rx Throughput (% linerate),
531 # - Min Latency (ns),
532 # - Max Latency (ns),
535 self._logger.info("In moongen send_rfc2544_throughput method")
537 self._params['traffic'] = self.traffic_defaults.copy()
540 self._params['traffic'] = merge_spec(self._params['traffic'],
542 Moongen.create_moongen_cfg_file(self,
545 acceptable_loss_pct=lossrate)
547 # Initialize RFC 2544 throughput specific results
548 results = OrderedDict()
549 results[ResultsConstants.THROUGHPUT_RX_FPS] = 0
550 results[ResultsConstants.THROUGHPUT_RX_MBPS] = 0
551 results[ResultsConstants.THROUGHPUT_RX_PERCENT] = 0
552 results[ResultsConstants.TX_RATE_FPS] = 0
553 results[ResultsConstants.TX_RATE_MBPS] = 0
554 results[ResultsConstants.TX_RATE_PERCENT] = 0
555 results[ResultsConstants.MIN_LATENCY_NS] = 0
556 results[ResultsConstants.MAX_LATENCY_NS] = 0
557 results[ResultsConstants.AVG_LATENCY_NS] = 0
559 for test_run in range(1, tests+1):
560 collected_results = (
561 Moongen.run_moongen_and_collect_results(self, test_run=test_run))
563 results[ResultsConstants.THROUGHPUT_RX_FPS] += (
564 float(collected_results[ResultsConstants.THROUGHPUT_RX_FPS]))
566 results[ResultsConstants.THROUGHPUT_RX_MBPS] += (
567 float(collected_results[ResultsConstants.THROUGHPUT_RX_MBPS]))
569 results[ResultsConstants.THROUGHPUT_RX_PERCENT] += (
570 float(collected_results[ResultsConstants.THROUGHPUT_RX_PERCENT]))
572 results[ResultsConstants.TX_RATE_FPS] += (
573 float(collected_results[ResultsConstants.TX_RATE_FPS]))
575 results[ResultsConstants.TX_RATE_MBPS] += (
576 float(collected_results[ResultsConstants.TX_RATE_MBPS]))
578 results[ResultsConstants.TX_RATE_PERCENT] += (
579 float(collected_results[ResultsConstants.TX_RATE_PERCENT]))
581 results[ResultsConstants.THROUGHPUT_RX_FPS] = (
582 '{:.6f}'.format(results[ResultsConstants.THROUGHPUT_RX_FPS] /
585 results[ResultsConstants.THROUGHPUT_RX_MBPS] = (
586 '{:.3f}'.format(results[ResultsConstants.THROUGHPUT_RX_MBPS] /
589 results[ResultsConstants.THROUGHPUT_RX_PERCENT] = (
590 '{:.3f}'.format(results[ResultsConstants.THROUGHPUT_RX_PERCENT] /
593 results[ResultsConstants.TX_RATE_FPS] = (
594 '{:.6f}'.format(results[ResultsConstants.TX_RATE_FPS] /
597 results[ResultsConstants.TX_RATE_MBPS] = (
598 '{:.3f}'.format(results[ResultsConstants.TX_RATE_MBPS] /
601 results[ResultsConstants.TX_RATE_PERCENT] = (
602 '{:.3f}'.format(results[ResultsConstants.TX_RATE_PERCENT] /
605 results[ResultsConstants.MIN_LATENCY_NS] = (
606 '{:.3f}'.format(results[ResultsConstants.MIN_LATENCY_NS] /
609 results[ResultsConstants.MAX_LATENCY_NS] = (
610 '{:.3f}'.format(results[ResultsConstants.MAX_LATENCY_NS] /
613 results[ResultsConstants.AVG_LATENCY_NS] = (
614 '{:.3f}'.format(results[ResultsConstants.AVG_LATENCY_NS] /
619 def start_rfc2544_throughput(self, traffic=None, tests=1, duration=20,
621 """Non-blocking version of 'send_rfc2544_throughput'.
623 Start transmission and immediately return. Do not wait for
627 "MOONGEN: In moongen start_rfc2544_throughput method")
629 def wait_rfc2544_throughput(self):
630 """Wait for and return results of RFC2544 test.
632 self._logger.info('In moongen wait_rfc2544_throughput')
634 def send_rfc2544_back2back(self, traffic=None, duration=60,
635 lossrate=0.0, tests=1):
636 """Send traffic per RFC2544 back2back test specifications.
638 Send packets at a fixed rate, using ``traffic``
639 configuration, for duration seconds.
641 :param traffic: Detailed "traffic" spec, see design docs for details
642 :param tests: Number of tests to execute
643 :param duration: Per iteration duration
644 :param lossrate: Acceptable loss percentage
646 :returns: Named tuple of Rx Throughput (fps), Rx Throughput (mbps),
647 Tx Rate (% linerate), Rx Rate (% linerate), Tx Count (frames),
648 Back to Back Count (frames), Frame Loss (frames), Frame Loss (%)
649 :rtype: :class:`Back2BackResult`
651 self._logger.info("In moongen send_rfc2544_back2back method")
653 self._params['traffic'] = self.traffic_defaults.copy()
656 self._params['traffic'] = merge_spec(self._params['traffic'],
659 Moongen.create_moongen_cfg_file(self,
662 acceptable_loss_pct=lossrate)
664 # Initialize RFC 2544 B2B specific results
665 results = OrderedDict()
666 results[ResultsConstants.B2B_RX_FPS] = 0
667 results[ResultsConstants.B2B_TX_FPS] = 0
668 results[ResultsConstants.B2B_RX_PERCENT] = 0
669 results[ResultsConstants.B2B_TX_PERCENT] = 0
670 results[ResultsConstants.B2B_TX_COUNT] = 0
671 results[ResultsConstants.B2B_FRAMES] = 0
672 results[ResultsConstants.B2B_FRAME_LOSS_FRAMES] = 0
673 results[ResultsConstants.B2B_FRAME_LOSS_PERCENT] = 0
674 results[ResultsConstants.SCAL_STREAM_COUNT] = 0
675 results[ResultsConstants.SCAL_STREAM_TYPE] = 0
676 results[ResultsConstants.SCAL_PRE_INSTALLED_FLOWS] = 0
678 for test_run in range(1, tests+1):
679 collected_results = (
680 Moongen.run_moongen_and_collect_results(self, test_run=test_run))
682 results[ResultsConstants.B2B_RX_FPS] += (
683 float(collected_results[ResultsConstants.THROUGHPUT_RX_FPS]))
685 results[ResultsConstants.B2B_RX_PERCENT] += (
686 float(collected_results[ResultsConstants.THROUGHPUT_RX_PERCENT]))
688 results[ResultsConstants.B2B_TX_FPS] += (
689 float(collected_results[ResultsConstants.TX_RATE_FPS]))
691 results[ResultsConstants.B2B_TX_PERCENT] += (
692 float(collected_results[ResultsConstants.TX_RATE_PERCENT]))
694 results[ResultsConstants.B2B_TX_COUNT] += (
695 int(collected_results[ResultsConstants.B2B_TX_COUNT]))
697 results[ResultsConstants.B2B_FRAMES] += (
698 int(collected_results[ResultsConstants.B2B_FRAMES]))
700 results[ResultsConstants.B2B_FRAME_LOSS_FRAMES] += (
701 int(collected_results[ResultsConstants.B2B_FRAME_LOSS_FRAMES]))
703 results[ResultsConstants.B2B_FRAME_LOSS_PERCENT] += (
704 int(collected_results[ResultsConstants.B2B_FRAME_LOSS_PERCENT]))
706 # Calculate average results
707 results[ResultsConstants.B2B_RX_FPS] = (
708 results[ResultsConstants.B2B_RX_FPS] / tests)
710 results[ResultsConstants.B2B_RX_PERCENT] = (
711 results[ResultsConstants.B2B_RX_PERCENT] / tests)
713 results[ResultsConstants.B2B_TX_FPS] = (
714 results[ResultsConstants.B2B_TX_FPS] / tests)
716 results[ResultsConstants.B2B_TX_PERCENT] = (
717 results[ResultsConstants.B2B_TX_PERCENT] / tests)
719 results[ResultsConstants.B2B_TX_COUNT] = (
720 results[ResultsConstants.B2B_TX_COUNT] / tests)
722 results[ResultsConstants.B2B_FRAMES] = (
723 results[ResultsConstants.B2B_FRAMES] / tests)
725 results[ResultsConstants.B2B_FRAME_LOSS_FRAMES] = (
726 results[ResultsConstants.B2B_FRAME_LOSS_FRAMES] / tests)
728 results[ResultsConstants.B2B_FRAME_LOSS_PERCENT] = (
729 results[ResultsConstants.B2B_FRAME_LOSS_PERCENT] / tests)
731 results[ResultsConstants.SCAL_STREAM_COUNT] = 0
732 results[ResultsConstants.SCAL_STREAM_TYPE] = 0
733 results[ResultsConstants.SCAL_PRE_INSTALLED_FLOWS] = 0
737 def start_rfc2544_back2back(self, traffic=None, tests=1, duration=20,
740 # Non-blocking version of 'send_rfc2544_back2back'.
742 # Start transmission and immediately return. Do not wait for results.
744 self._logger.info("In Moongen start_rfc2544_back2back method")
745 return NotImplementedError(
746 'Moongen start back2back traffic not implemented')
748 def wait_rfc2544_back2back(self):
749 self._logger.info("In moongen wait_rfc2544_back2back method")
751 # Wait and set results of RFC2544 test.
753 return NotImplementedError(
754 'Moongen wait back2back traffic not implemented')
756 if __name__ == "__main__":