X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=VNFs%2FDPPD-PROX%2Fhelper-scripts%2Frapid%2Frapid_flowsizetest.py;h=d5d5e4fbab255cd47c5155aaaa81be32f0a652df;hb=849357bb9ca1d27993c9e96b93156ec69b3ac3a9;hp=da53742e4de0f52d5154375b9595699ca47776c3;hpb=d7385ade1e9693a77f505c27a54169a2a5e8555d;p=samplevnf.git diff --git a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py index da53742e..d5d5e4fb 100644 --- a/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py +++ b/VNFs/DPPD-PROX/helper-scripts/rapid/rapid_flowsizetest.py @@ -16,10 +16,8 @@ ## See the License for the specific language governing permissions and ## limitations under the License. ## - import sys import time -import requests from math import ceil from statistics import mean from past.utils import old_div @@ -32,9 +30,9 @@ class FlowSizeTest(RapidTest): """ Class to manage the flowsizetesting """ - def __init__(self, test_param, lat_percentile, runtime, pushgateway, + def __init__(self, test_param, lat_percentile, runtime, testname, environment_file, gen_machine, sut_machine, background_machines): - super().__init__(test_param, runtime, pushgateway, environment_file) + super().__init__(test_param, runtime, testname, environment_file) self.gen_machine = gen_machine self.sut_machine = sut_machine self.background_machines = background_machines @@ -51,9 +49,6 @@ class FlowSizeTest(RapidTest): self.test['TST009_S']= [] for m in range(0, self.test['TST009_n']): self.test['TST009_S'].append((m+1) * self.test['stepsize']) - self.test['lat_avg_threshold'] = inf - self.test['lat_perc_threshold'] = inf - self.test['lat_max_threshold'] = inf elif self.test['test'] == 'fixed_rate': for key in['drop_rate_threshold','lat_avg_threshold', 'lat_perc_threshold','lat_max_threshold']: @@ -62,6 +57,8 @@ class FlowSizeTest(RapidTest): def new_speed(self, speed,size,success): if self.test['test'] == 'fixed_rate': return (self.test['startspeed']) + elif self.test['test'] == 'increment_till_fail': + return (speed + self.test['step']) elif 'TST009' in self.test.keys(): if success: self.test['TST009_L'] = self.test['TST009_m'] + 1 @@ -79,6 +76,8 @@ class FlowSizeTest(RapidTest): def get_start_speed_and_init(self, size): if self.test['test'] == 'fixed_rate': return (self.test['startspeed']) + elif self.test['test'] == 'increment_till_fail': + return (self.test['startspeed']) elif 'TST009' in self.test.keys(): self.test['TST009_L'] = 0 self.test['TST009_R'] = self.test['TST009_n'] - 1 @@ -98,14 +97,9 @@ class FlowSizeTest(RapidTest): return ((self.test['maxspeed'] - self.test['minspeed']) <= self.test['accuracy']) def run(self): - # global fieldnames - # global writer - # #fieldnames = ['Flows','PacketSize','Gbps','Mpps','AvgLatency','MaxLatency','PacketsDropped','PacketDropRate'] - # fieldnames = ['Flows','PacketSize','RequestedPPS','GeneratedPPS','SentPPS','ForwardedPPS','ReceivedPPS','AvgLatencyUSEC','MaxLatencyUSEC','Sent','Received','Lost','LostTotal'] - # writer = csv.DictWriter(data_csv_file, fieldnames=fieldnames) - # writer.writeheader() + result_details = {'Details': 'Nothing'} self.gen_machine.start_latency_cores() - TestPassed = True + TestResult = 0 for imix in self.test['imixs']: size = mean(imix) self.gen_machine.set_udp_packet_size(imix) @@ -115,7 +109,7 @@ class FlowSizeTest(RapidTest): backgroundinfo = '{}{}'.format(bcolors.FLASH,bcolors.ENDC) self.set_background_size(self.background_machines, imix) RapidLog.info("+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+") - RapidLog.info('| UDP, {:>5} bytes, different number of flows by randomizing SRC & DST UDP port. {:116.116}|'.format(size, backgroundinfo)) + RapidLog.info('| UDP, {:>5} bytes, different number of flows by randomizing SRC & DST UDP port. {:116.116}|'.format(round(size), backgroundinfo)) RapidLog.info("+--------+------------------+-------------+-------------+-------------+------------------------+----------+----------+----------+-----------+-----------+-----------+-----------+-------+----+") RapidLog.info('| Flows | 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("+--------+------------------+-------------+-------------+-------------+------------------------+----------+----------+----------+-----------+-----------+-----------+-----------+-------+----+") @@ -138,7 +132,7 @@ class FlowSizeTest(RapidTest): self.set_background_speed(self.background_machines, speed) self.start_background_traffic(self.background_machines) # Get statistics now that the generation is stable and initial ARP messages are dealt with - pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg,lat_perc , lat_perc_max, lat_max, abs_tx,abs_rx,abs_dropped, abs_tx_fail, drop_rate, lat_min, lat_used, r, actual_duration = self.run_iteration(float(self.test['runtime']),flow_number,size,speed) + pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg,lat_perc , lat_perc_max, lat_max, abs_tx,abs_rx,abs_dropped, abs_tx_fail, drop_rate, lat_min, lat_used, r, actual_duration, avg_bg_rate, bucket_size, buckets = self.run_iteration(float(self.test['runtime']),flow_number,size,speed) self.stop_background_traffic(self.background_machines) if r > 1: retry_warning = bcolors.WARNING + ' {:1} retries needed'.format(r) + bcolors.ENDC @@ -160,14 +154,16 @@ class FlowSizeTest(RapidTest): endlat_perc = lat_perc endlat_perc_max = lat_perc_max endlat_max = lat_max + endbuckets = buckets endabs_dropped = abs_dropped enddrop_rate = drop_rate endabs_tx = abs_tx endabs_rx = abs_rx + endavg_bg_rate = avg_bg_rate if lat_warning or retry_warning: endwarning = '| | {:177.177} |'.format(retry_warning + lat_warning) success = True - TestPassed = False # fixed rate testing cannot be True, it is just reported numbers every second + TestResult = TestResult + pps_rx # fixed rate testing result is strange: we just report the pps received speed_prefix = lat_avg_prefix = lat_perc_prefix = lat_max_prefix = abs_drop_rate_prefix = drop_rate_prefix = bcolors.ENDC # The following if statement is testing if we pass the success criteria of a certain drop rate, average latency and maximum latency below the threshold # The drop rate success can be achieved in 2 ways: either the drop rate is below a treshold, either we want that no packet has been lost during the test @@ -192,10 +188,12 @@ class FlowSizeTest(RapidTest): endlat_perc = lat_perc endlat_perc_max = lat_perc_max endlat_max = lat_max + endbuckets = buckets endabs_dropped = None enddrop_rate = drop_rate endabs_tx = abs_tx endabs_rx = abs_rx + endavg_bg_rate = avg_bg_rate if lat_warning or gen_warning or retry_warning: endwarning = '| | {:186.186} |'.format(retry_warning + lat_warning + gen_warning) success = True @@ -230,30 +228,42 @@ class FlowSizeTest(RapidTest): success = False RapidLog.debug(self.report_result(-attempts,size,speed,pps_req_tx,pps_tx,pps_sut_tx,pps_rx,lat_avg,lat_perc,lat_perc_max,lat_max,abs_tx,abs_rx,abs_dropped,actual_duration,speed_prefix,lat_avg_prefix,lat_perc_prefix,lat_max_prefix,abs_drop_rate_prefix,drop_rate_prefix)+ success_message + retry_warning + lat_warning) speed = self.new_speed(speed, size, success) - if self.resolution_achieved(): + if self.test['test'] == 'increment_till_fail': + if not success: + break + elif self.resolution_achieved(): break if endspeed is not None: - if TestPassed and (endpps_rx < self.test['pass_threshold']): - TestPassed = False speed_prefix = lat_avg_prefix = lat_perc_prefix = lat_max_prefix = abs_drop_rate_prefix = drop_rate_prefix = bcolors.ENDC RapidLog.info(self.report_result(flow_number,size,endspeed,endpps_req_tx,endpps_tx,endpps_sut_tx,endpps_rx,endlat_avg,endlat_perc,endlat_perc_max,endlat_max,endabs_tx,endabs_rx,endabs_dropped,actual_duration,speed_prefix,lat_avg_prefix,lat_perc_prefix,lat_max_prefix,abs_drop_rate_prefix,drop_rate_prefix)) + if endavg_bg_rate: + tot_avg_rx_rate = endpps_rx + (endavg_bg_rate * len(self.background_machines)) + endtotaltrafficrate = '| | Total amount of traffic received by all generators during this test: {:>4.3f} Gb/s {:7.3f} Mpps {} |'.format(RapidTest.get_speed(tot_avg_rx_rate,size) , tot_avg_rx_rate, ' '*84) + RapidLog.info (endtotaltrafficrate) if endwarning: RapidLog.info (endwarning) RapidLog.info("+--------+------------------+-------------+-------------+-------------+------------------------+----------+----------+----------+-----------+-----------+-----------+-----------+-------+----+") - # writer.writerow({'Flows':flow_number,'PacketSize':(size+4),'RequestedPPS':self.get_pps(endspeed,size),'GeneratedPPS':endpps_req_tx,'SentPPS':endpps_tx,'ForwardedPPS':endpps_sut_tx,'ReceivedPPS':endpps_rx,'AvgLatencyUSEC':endlat_avg,'MaxLatencyUSEC':endlat_max,'Sent':endabs_tx,'Received':endabs_rx,'Lost':endabs_dropped,'LostTotal':endabs_dropped}) - if self.test['pushgateway']: - URL = self.test['pushgateway'] + self.test['test']+ '/instance/' + self.test['environment_file'] - if endabs_dropped == None: - ead = 0 - else: - ead = endabs_dropped - DATA = 'Flows {}\nPacketSize {}\nRequestedPPS {}\nGeneratedPPS {}\nSentPPS {}\nForwardedPPS {}\nReceivedPPS {}\nAvgLatencyUSEC {}\nMaxLatencyUSEC {}\nSent {}\nReceived {}\nLost {}\nLostTotal {}\n'.format(flow_number,size+4,self.get_pps(endspeed,size),endpps_req_tx,endpps_tx,endpps_sut_tx,endpps_rx,endlat_avg,endlat_max,endabs_tx,endabs_rx,ead,ead) - HEADERS = {'X-Requested-With': 'Python requests', 'Content-type': 'text/xml'} - response = requests.post(url=URL, data=DATA,headers=HEADERS) - if (response.status_code != 202) and (response.status_code != 200): - RapidLog.info('Cannot send metrics to {}'.format(URL)) - RapidLog.info(DATA) + if self.test['test'] != 'fixed_rate': + TestResult = TestResult + endpps_rx + result_details = {'test': self.test['testname'], + 'environment_file': self.test['environment_file'], + 'Flows': flow_number, + 'Size': size, + 'RequestedSpeed': RapidTest.get_pps(endspeed,size), + 'CoreGenerated': endpps_req_tx, + 'SentByNIC': endpps_tx, + 'FwdBySUT': endpps_sut_tx, + 'RevByCore': endpps_rx, + 'AvgLatency': endlat_avg, + 'PCTLatency': endlat_perc, + 'MaxLatency': endlat_max, + 'PacketsSent': endabs_tx, + 'PacketsReceived': endabs_rx, + 'PacketsLost': endabs_dropped, + 'bucket_size': bucket_size, + 'buckets': endbuckets} + result_details = self.post_data('rapid_flowsizetest', result_details) else: RapidLog.info('|{:>7}'.format(str(flow_number))+" | Speed 0 or close to 0") self.gen_machine.stop_latency_cores() - return (TestPassed) + return (TestResult, result_details)