#!/usr/bin/python ## ## Copyright (c) 2020 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. ## import sys import time import requests from rapid_log import RapidLog from rapid_test import RapidTest from statistics import mean class ImpairTest(RapidTest): """ Class to manage the impair testing """ def __init__(self, test_param, lat_percentile, runtime, testname, environment_file, gen_machine, sut_machine): super().__init__(test_param, runtime, testname, environment_file) self.gen_machine = gen_machine self.sut_machine = sut_machine self.test['lat_percentile'] = lat_percentile def run(self): result_details = {'Details': 'Nothing'} imix = self.test['imix'] size = mean (imix) flow_number = self.test['flowsize'] attempts = 0 self.gen_machine.set_udp_packet_size(imix) flow_number = self.gen_machine.set_flows(flow_number) self.gen_machine.start_latency_cores() RapidLog.info("+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+") RapidLog.info("| Generator is sending UDP ({:>5} flow) packets ({:>5} bytes) to SUT via GW dropping and delaying packets. SUT sends packets back. Use ctrl-c to stop the test |".format(flow_number,round(size))) RapidLog.info("+--------+------------------+-------------+-------------+-------------+------------------------+----------+----------+----------+-----------+-----------+-----------+-----------+-------+----+") RapidLog.info('| Test | Speed requested | Gen by core | Sent by NIC | Fwrd by SUT | Rec. by core | Avg. Lat.|{:.0f} Pcentil| Max. Lat.| Sent | Received | Lost | Total Lost|L.Ratio|Time|'.format(self.test['lat_percentile']*100)) RapidLog.info("+--------+------------------+-------------+-------------+-------------+------------------------+----------+----------+----------+-----------+-----------+-----------+-----------+-------+----+") speed = self.test['startspeed'] self.gen_machine.set_generator_speed(speed) while True: attempts += 1 print('Measurement ongoing at speed: ' + str(round(speed,2)) + '% ',end='\r') sys.stdout.flush() time.sleep(1) # Get statistics now that the generation is stable and NO ARP messages any more iteration_data = self.run_iteration(float(self.test['runtime']),flow_number,size,speed) iteration_data['speed'] = speed # Drop rate is expressed in percentage. lat_used is a ratio (0 to 1). The sum of these 2 should be 100%. # If the sum is lower than 95, it means that more than 5% of the latency measurements where dropped for accuracy reasons. if (iteration_data['drop_rate'] + iteration_data['lat_used'] * 100) < 95: lat_warning = bcolors.WARNING + ' Latency accuracy issue?: {:>3.0f}%'.format(iteration_data['lat_used']*100) + bcolors.ENDC else: lat_warning = '' iteration_prefix = {'speed' : '', 'lat_avg' : '', 'lat_perc' : '', 'lat_max' : '', 'abs_drop_rate' : '', 'drop_rate' : ''} RapidLog.info(self.report_result(attempts, size, iteration_data, iteration_prefix)) result_details = {'test': self.test['test'], 'environment_file': self.test['environment_file'], 'Flows': flow_number, 'Size': size, 'RequestedSpeed': RapidTest.get_pps(speed,size), 'CoreGenerated': iteration_data['pps_req_tx'], 'SentByNIC': iteration_data['pps_tx'], 'FwdBySUT': iteration_data['pps_sut_tx'], 'RevByCore': iteration_data['pps_rx'], 'AvgLatency': iteration_data['lat_avg'], 'PCTLatency': iteration_data['lat_perc'], 'MaxLatency': iteration_data['lat_max'], 'PacketsLost': iteration_data['abs_dropped'], 'DropRate': iteration_data['drop_rate'], 'bucket_size': iteration_data['bucket_size'], 'buckets': iteration_data['buckets']} result_details = self.post_data('rapid_impairtest', result_details) self.gen_machine.stop_latency_cores() return (True, result_details)