pkt_gen: Adding Support of testcenter traffic generation using STC REST API.
[vswitchperf.git] / tools / pkt_gen / testcenter / testcenter.py
1 # Copyright 2016 Spirent Communications.
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 """
16 Code to integrate Spirent TestCenter with the vsperf test framework.
17
18 Provides a model for Spirent TestCenter as a test tool for implementing
19 various performance tests of a virtual switch.
20 """
21
22 import csv
23 import logging
24 import os
25 import subprocess
26
27 from conf import settings
28 from core.results.results_constants import ResultsConstants
29 from tools.pkt_gen import trafficgen
30
31
32 class TestCenter(trafficgen.ITrafficGenerator):
33     """
34     Spirent TestCenter
35     """
36     _logger = logging.getLogger(__name__)
37
38     def connect(self):
39         """
40         Do nothing.
41         """
42         return self
43
44     def disconnect(self):
45         """
46         Do nothing.
47         """
48         pass
49
50     def send_burst_traffic(self, traffic=None, numpkts=100, duration=20):
51         """
52         Do nothing.
53         """
54         return None
55
56     def send_cont_traffic(self, traffic=None, duration=30):
57         """
58         Do nothing.
59         """
60         return None
61
62     def send_rfc2544_throughput(self, traffic=None, trials=3, duration=20,
63                                 lossrate=0.0):
64         """
65         Send traffic per RFC2544 throughput test specifications.
66         """
67         verbose = False
68         framesize = settings.getValue("TRAFFICGEN_STC_FRAME_SIZE")
69         if traffic and 'l2' in traffic:
70             if 'framesize' in traffic['l2']:
71                 framesize = traffic['l2']['framesize']
72         args = [settings.getValue("TRAFFICGEN_STC_PYTHON2_PATH"),
73                 os.path.join(
74                     settings.getValue("TRAFFICGEN_STC_TESTCENTER_PATH"),
75                     settings.getValue(
76                         "TRAFFICGEN_STC_RFC2544_TPUT_TEST_FILE_NAME")),
77                 "--lab_server_addr",
78                 settings.getValue("TRAFFICGEN_STC_LAB_SERVER_ADDR"),
79                 "--license_server_addr",
80                 settings.getValue("TRAFFICGEN_STC_LICENSE_SERVER_ADDR"),
81                 "--east_chassis_addr",
82                 settings.getValue("TRAFFICGEN_STC_EAST_CHASSIS_ADDR"),
83                 "--east_slot_num",
84                 settings.getValue("TRAFFICGEN_STC_EAST_SLOT_NUM"),
85                 "--east_port_num",
86                 settings.getValue("TRAFFICGEN_STC_EAST_PORT_NUM"),
87                 "--west_chassis_addr",
88                 settings.getValue("TRAFFICGEN_STC_WEST_CHASSIS_ADDR"),
89                 "--west_slot_num",
90                 settings.getValue("TRAFFICGEN_STC_WEST_SLOT_NUM"),
91                 "--west_port_num",
92                 settings.getValue("TRAFFICGEN_STC_WEST_PORT_NUM"),
93                 "--test_session_name",
94                 settings.getValue("TRAFFICGEN_STC_TEST_SESSION_NAME"),
95                 "--results_dir",
96                 settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
97                 "--csv_results_file_prefix",
98                 settings.getValue("TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX"),
99                 "--num_trials",
100                 settings.getValue("TRAFFICGEN_STC_NUMBER_OF_TRIALS"),
101                 "--trial_duration_sec",
102                 settings.getValue("TRAFFICGEN_STC_TRIAL_DURATION_SEC"),
103                 "--traffic_pattern",
104                 settings.getValue("TRAFFICGEN_STC_TRAFFIC_PATTERN"),
105                 "--search_mode",
106                 settings.getValue("TRAFFICGEN_STC_SEARCH_MODE"),
107                 "--learning_mode",
108                 settings.getValue("TRAFFICGEN_STC_LEARNING_MODE"),
109                 "--rate_lower_limit_pct",
110                 settings.getValue("TRAFFICGEN_STC_RATE_LOWER_LIMIT_PCT"),
111                 "--rate_upper_limit_pct",
112                 settings.getValue("TRAFFICGEN_STC_RATE_UPPER_LIMIT_PCT"),
113                 "--rate_initial_pct",
114                 settings.getValue("TRAFFICGEN_STC_RATE_INITIAL_PCT"),
115                 "--rate_step_pct",
116                 settings.getValue("TRAFFICGEN_STC_RATE_STEP_PCT"),
117                 "--resolution_pct",
118                 settings.getValue("TRAFFICGEN_STC_RESOLUTION_PCT"),
119                 "--frame_size_list",
120                 str(framesize),
121                 "--acceptable_frame_loss_pct",
122                 settings.getValue("TRAFFICGEN_STC_ACCEPTABLE_FRAME_LOSS_PCT"),
123                 "--east_intf_addr",
124                 settings.getValue("TRAFFICGEN_STC_EAST_INTF_ADDR"),
125                 "--east_intf_gateway_addr",
126                 settings.getValue("TRAFFICGEN_STC_EAST_INTF_GATEWAY_ADDR"),
127                 "--west_intf_addr",
128                 settings.getValue("TRAFFICGEN_STC_WEST_INTF_ADDR"),
129                 "--west_intf_gateway_addr",
130                 settings.getValue("TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR")]
131
132         if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
133             args.append("--verbose")
134             verbose = True
135             self._logger.debug("Arguments used to call test: %s", args)
136         subprocess.check_call(args)
137
138         filec = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
139                              settings.getValue(
140                                  "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
141                              ".csv")
142
143         if verbose:
144             self._logger.info("file: %s", filec)
145
146         result = {}
147
148         with open(filec, "r") as csvfile:
149             csvreader = csv.DictReader(csvfile)
150             for row in csvreader:
151                 self._logger.info("Row: %s", row)
152                 result[ResultsConstants.TX_RATE_FPS] = 0.0
153                 result[ResultsConstants.THROUGHPUT_RX_FPS] = 0.0
154                 result[ResultsConstants.TX_RATE_MBPS] = 0.0
155                 result[ResultsConstants.THROUGHPUT_RX_MBPS] = 0.0
156                 result[ResultsConstants.TX_RATE_PERCENT] = float(
157                     row["OfferedLoad(%)"])
158                 result[ResultsConstants.THROUGHPUT_RX_PERCENT] = float(
159                     row["Throughput(%)"])
160                 result[ResultsConstants.MIN_LATENCY_NS] = float(
161                     row["MinimumLatency(us)"]) * 1000
162                 result[ResultsConstants.MAX_LATENCY_NS] = float(
163                     row["MaximumLatency(us)"]) * 1000
164                 result[ResultsConstants.AVG_LATENCY_NS] = float(
165                     row["AverageLatency(us)"]) * 1000
166                 result[ResultsConstants.FRAME_LOSS_PERCENT] = float(
167                     row["PercentLoss"])
168         return result
169
170     def send_rfc2544_back2back(self, traffic=None, trials=1, duration=20,
171                                lossrate=0.0):
172         """
173         Send traffic per RFC2544 BacktoBack test specifications.
174         """
175         verbose = False
176         framesize = settings.getValue("TRAFFICGEN_STC_FRAME_SIZE")
177         if traffic and 'l2' in traffic:
178             if 'framesize' in traffic['l2']:
179                 framesize = traffic['l2']['framesize']
180         args = [settings.getValue("TRAFFICGEN_STC_PYTHON2_PATH"),
181                 os.path.join(
182                     settings.getValue("TRAFFICGEN_STC_TESTCENTER_PATH"),
183                     settings.getValue(
184                         "TRAFFICGEN_STC_RFC2544_B2B_TEST_FILE_NAME")),
185                 "--metric",
186                 settings.getValue("TRAFFICGEN_STC_RFC2544_METRIC"),
187                 "--lab_server_addr",
188                 settings.getValue("TRAFFICGEN_STC_LAB_SERVER_ADDR"),
189                 "--license_server_addr",
190                 settings.getValue("TRAFFICGEN_STC_LICENSE_SERVER_ADDR"),
191                 "--east_chassis_addr",
192                 settings.getValue("TRAFFICGEN_STC_EAST_CHASSIS_ADDR"),
193                 "--east_slot_num",
194                 settings.getValue("TRAFFICGEN_STC_EAST_SLOT_NUM"),
195                 "--east_port_num",
196                 settings.getValue("TRAFFICGEN_STC_EAST_PORT_NUM"),
197                 "--west_chassis_addr",
198                 settings.getValue("TRAFFICGEN_STC_WEST_CHASSIS_ADDR"),
199                 "--west_slot_num",
200                 settings.getValue("TRAFFICGEN_STC_WEST_SLOT_NUM"),
201                 "--west_port_num",
202                 settings.getValue("TRAFFICGEN_STC_WEST_PORT_NUM"),
203                 "--test_session_name",
204                 settings.getValue("TRAFFICGEN_STC_TEST_SESSION_NAME"),
205                 "--results_dir",
206                 settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
207                 "--csv_results_file_prefix",
208                 settings.getValue("TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX"),
209                 "--num_trials",
210                 settings.getValue("TRAFFICGEN_STC_NUMBER_OF_TRIALS"),
211                 "--trial_duration_sec",
212                 settings.getValue("TRAFFICGEN_STC_TRIAL_DURATION_SEC"),
213                 "--traffic_pattern",
214                 settings.getValue("TRAFFICGEN_STC_TRAFFIC_PATTERN"),
215                 "--search_mode",
216                 settings.getValue("TRAFFICGEN_STC_SEARCH_MODE"),
217                 "--learning_mode",
218                 settings.getValue("TRAFFICGEN_STC_LEARNING_MODE"),
219                 "--latency_type",
220                 settings.getValue("TRAFFICGEN_STC_LATENCY_TYPE"),
221                 "--rate_lower_limit_pct",
222                 settings.getValue("TRAFFICGEN_STC_RATE_LOWER_LIMIT_PCT"),
223                 "--rate_upper_limit_pct",
224                 settings.getValue("TRAFFICGEN_STC_RATE_UPPER_LIMIT_PCT"),
225                 "--rate_initial_pct",
226                 settings.getValue("TRAFFICGEN_STC_RATE_INITIAL_PCT"),
227                 "--rate_step_pct",
228                 settings.getValue("TRAFFICGEN_STC_RATE_STEP_PCT"),
229                 "--resolution_pct",
230                 settings.getValue("TRAFFICGEN_STC_RESOLUTION_PCT"),
231                 "--frame_size_list",
232                 str(framesize),
233                 "--acceptable_frame_loss_pct",
234                 settings.getValue("TRAFFICGEN_STC_ACCEPTABLE_FRAME_LOSS_PCT"),
235                 "--east_intf_addr",
236                 settings.getValue("TRAFFICGEN_STC_EAST_INTF_ADDR"),
237                 "--east_intf_gateway_addr",
238                 settings.getValue("TRAFFICGEN_STC_EAST_INTF_GATEWAY_ADDR"),
239                 "--west_intf_addr",
240                 settings.getValue("TRAFFICGEN_STC_WEST_INTF_ADDR"),
241                 "--west_intf_gateway_addr",
242                 settings.getValue("TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR")]
243
244         if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
245             args.append("--verbose")
246             verbose = True
247             self._logger.info("Arguments used to call test: %s", args)
248         subprocess.check_call(args)
249
250         filecs = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
251                               settings.getValue(
252                                   "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
253                               ".csv")
254         if verbose:
255             self._logger.debug("file: %s", filecs)
256
257         result = {}
258
259         with open(filecs, "r") as csvfile:
260             csvreader = csv.DictReader(csvfile)
261             for row in csvreader:
262                 self._logger.info("Row: %s", row)
263                 result[ResultsConstants.TX_RATE_FPS] = 0.0
264                 result[ResultsConstants.THROUGHPUT_RX_FPS] = 0.0
265                 result[ResultsConstants.TX_RATE_MBPS] = 0.0
266                 result[ResultsConstants.THROUGHPUT_RX_MBPS] = 0.0
267                 result[ResultsConstants.TX_RATE_PERCENT] = float(
268                     row["OfferedLoad(%)"])
269                 result[ResultsConstants.THROUGHPUT_RX_PERCENT] = float(
270                     row["Throughput(%)"])
271                 result[ResultsConstants.MIN_LATENCY_NS] = float(
272                     row["MinimumLatency(us)"]) * 1000
273                 result[ResultsConstants.MAX_LATENCY_NS] = float(
274                     row["MaximumLatency(us)"]) * 1000
275                 result[ResultsConstants.AVG_LATENCY_NS] = float(
276                     row["AverageLatency(us)"]) * 1000
277                 result[ResultsConstants.FRAME_LOSS_PERCENT] = float(
278                     row["PercentLoss"])
279         return result
280
281 if __name__ == '__main__':
282     TRAFFIC = {
283         'l3': {
284             'proto': 'tcp',
285             'srcip': '1.1.1.1',
286             'dstip': '90.90.90.90',
287         },
288     }
289     with TestCenter() as dev:
290         print(dev.send_rfc2544_throughput(traffic=TRAFFIC))
291         print(dev.send_rfc2544_backtoback(traffic=TRAFFIC))