1 # Copyright 2016 Spirent Communications.
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 Code to integrate Spirent TestCenter with the vsperf test framework.
18 Provides a model for Spirent TestCenter as a test tool for implementing
19 various performance tests of a virtual switch.
27 from conf import settings
28 from core.results.results_constants import ResultsConstants
29 from tools.pkt_gen import trafficgen
32 class TestCenter(trafficgen.ITrafficGenerator):
36 _logger = logging.getLogger(__name__)
50 def send_burst_traffic(self, traffic=None, numpkts=100, duration=20):
56 def send_cont_traffic(self, traffic=None, duration=30):
62 def send_rfc2544_throughput(self, traffic=None, trials=3, duration=20,
65 Send traffic per RFC2544 throughput test specifications.
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"),
74 settings.getValue("TRAFFICGEN_STC_TESTCENTER_PATH"),
76 "TRAFFICGEN_STC_RFC2544_TPUT_TEST_FILE_NAME")),
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"),
84 settings.getValue("TRAFFICGEN_STC_EAST_SLOT_NUM"),
86 settings.getValue("TRAFFICGEN_STC_EAST_PORT_NUM"),
87 "--west_chassis_addr",
88 settings.getValue("TRAFFICGEN_STC_WEST_CHASSIS_ADDR"),
90 settings.getValue("TRAFFICGEN_STC_WEST_SLOT_NUM"),
92 settings.getValue("TRAFFICGEN_STC_WEST_PORT_NUM"),
93 "--test_session_name",
94 settings.getValue("TRAFFICGEN_STC_TEST_SESSION_NAME"),
96 settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
97 "--csv_results_file_prefix",
98 settings.getValue("TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX"),
100 settings.getValue("TRAFFICGEN_STC_NUMBER_OF_TRIALS"),
101 "--trial_duration_sec",
102 settings.getValue("TRAFFICGEN_STC_TRIAL_DURATION_SEC"),
104 settings.getValue("TRAFFICGEN_STC_TRAFFIC_PATTERN"),
106 settings.getValue("TRAFFICGEN_STC_SEARCH_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"),
116 settings.getValue("TRAFFICGEN_STC_RATE_STEP_PCT"),
118 settings.getValue("TRAFFICGEN_STC_RESOLUTION_PCT"),
121 "--acceptable_frame_loss_pct",
122 settings.getValue("TRAFFICGEN_STC_ACCEPTABLE_FRAME_LOSS_PCT"),
124 settings.getValue("TRAFFICGEN_STC_EAST_INTF_ADDR"),
125 "--east_intf_gateway_addr",
126 settings.getValue("TRAFFICGEN_STC_EAST_INTF_GATEWAY_ADDR"),
128 settings.getValue("TRAFFICGEN_STC_WEST_INTF_ADDR"),
129 "--west_intf_gateway_addr",
130 settings.getValue("TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR")]
132 if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
133 args.append("--verbose")
135 self._logger.debug("Arguments used to call test: %s", args)
136 subprocess.check_call(args)
138 filec = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
140 "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
144 self._logger.info("file: %s", filec)
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 tx_fps = ((float(row["TxFrameCount"])) /
153 (float(row["Duration(sec)"])))
154 rx_fps = ((float(row["RxFrameCount"])) /
155 (float(row["Duration(sec)"])))
156 tx_mbps = ((float(row["TxFrameCount"]) *
157 float(row["ConfiguredFrameSize"])) /
158 (float(row["Duration(sec)"]) * 1000000.0))
159 rx_mbps = ((float(row["RxFrameCount"]) *
160 float(row["ConfiguredFrameSize"])) /
161 (float(row["Duration(sec)"]) * 1000000.0))
162 result[ResultsConstants.TX_RATE_FPS] = tx_fps
163 result[ResultsConstants.THROUGHPUT_RX_FPS] = rx_fps
164 result[ResultsConstants.TX_RATE_MBPS] = tx_mbps
165 result[ResultsConstants.THROUGHPUT_RX_MBPS] = rx_mbps
166 result[ResultsConstants.TX_RATE_PERCENT] = float(
167 row["OfferedLoad(%)"])
168 result[ResultsConstants.THROUGHPUT_RX_PERCENT] = float(
169 row["Throughput(%)"])
170 result[ResultsConstants.MIN_LATENCY_NS] = float(
171 row["MinimumLatency(us)"]) * 1000
172 result[ResultsConstants.MAX_LATENCY_NS] = float(
173 row["MaximumLatency(us)"]) * 1000
174 result[ResultsConstants.AVG_LATENCY_NS] = float(
175 row["AverageLatency(us)"]) * 1000
176 result[ResultsConstants.FRAME_LOSS_PERCENT] = float(
180 def send_rfc2544_back2back(self, traffic=None, trials=1, duration=20,
183 Send traffic per RFC2544 BacktoBack test specifications.
186 framesize = settings.getValue("TRAFFICGEN_STC_FRAME_SIZE")
187 if traffic and 'l2' in traffic:
188 if 'framesize' in traffic['l2']:
189 framesize = traffic['l2']['framesize']
190 args = [settings.getValue("TRAFFICGEN_STC_PYTHON2_PATH"),
192 settings.getValue("TRAFFICGEN_STC_TESTCENTER_PATH"),
194 "TRAFFICGEN_STC_RFC2544_B2B_TEST_FILE_NAME")),
196 settings.getValue("TRAFFICGEN_STC_RFC2544_METRIC"),
198 settings.getValue("TRAFFICGEN_STC_LAB_SERVER_ADDR"),
199 "--license_server_addr",
200 settings.getValue("TRAFFICGEN_STC_LICENSE_SERVER_ADDR"),
201 "--east_chassis_addr",
202 settings.getValue("TRAFFICGEN_STC_EAST_CHASSIS_ADDR"),
204 settings.getValue("TRAFFICGEN_STC_EAST_SLOT_NUM"),
206 settings.getValue("TRAFFICGEN_STC_EAST_PORT_NUM"),
207 "--west_chassis_addr",
208 settings.getValue("TRAFFICGEN_STC_WEST_CHASSIS_ADDR"),
210 settings.getValue("TRAFFICGEN_STC_WEST_SLOT_NUM"),
212 settings.getValue("TRAFFICGEN_STC_WEST_PORT_NUM"),
213 "--test_session_name",
214 settings.getValue("TRAFFICGEN_STC_TEST_SESSION_NAME"),
216 settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
217 "--csv_results_file_prefix",
218 settings.getValue("TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX"),
220 settings.getValue("TRAFFICGEN_STC_NUMBER_OF_TRIALS"),
221 "--trial_duration_sec",
222 settings.getValue("TRAFFICGEN_STC_TRIAL_DURATION_SEC"),
224 settings.getValue("TRAFFICGEN_STC_TRAFFIC_PATTERN"),
226 settings.getValue("TRAFFICGEN_STC_SEARCH_MODE"),
228 settings.getValue("TRAFFICGEN_STC_LEARNING_MODE"),
230 settings.getValue("TRAFFICGEN_STC_LATENCY_TYPE"),
231 "--rate_lower_limit_pct",
232 settings.getValue("TRAFFICGEN_STC_RATE_LOWER_LIMIT_PCT"),
233 "--rate_upper_limit_pct",
234 settings.getValue("TRAFFICGEN_STC_RATE_UPPER_LIMIT_PCT"),
235 "--rate_initial_pct",
236 settings.getValue("TRAFFICGEN_STC_RATE_INITIAL_PCT"),
238 settings.getValue("TRAFFICGEN_STC_RATE_STEP_PCT"),
240 settings.getValue("TRAFFICGEN_STC_RESOLUTION_PCT"),
243 "--acceptable_frame_loss_pct",
244 settings.getValue("TRAFFICGEN_STC_ACCEPTABLE_FRAME_LOSS_PCT"),
246 settings.getValue("TRAFFICGEN_STC_EAST_INTF_ADDR"),
247 "--east_intf_gateway_addr",
248 settings.getValue("TRAFFICGEN_STC_EAST_INTF_GATEWAY_ADDR"),
250 settings.getValue("TRAFFICGEN_STC_WEST_INTF_ADDR"),
251 "--west_intf_gateway_addr",
252 settings.getValue("TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR")]
254 if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
255 args.append("--verbose")
257 self._logger.info("Arguments used to call test: %s", args)
258 subprocess.check_call(args)
260 filecs = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
262 "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
265 self._logger.debug("file: %s", filecs)
269 with open(filecs, "r") as csvfile:
270 csvreader = csv.DictReader(csvfile)
271 for row in csvreader:
272 self._logger.info("Row: %s", row)
273 tx_fps = ((float(row["TxFrameCount"])) /
274 (float(row["Duration(sec)"])))
275 rx_fps = ((float(row["RxFrameCount"])) /
276 (float(row["Duration(sec)"])))
277 tx_mbps = ((float(row["TxFrameCount"]) *
278 float(row["ConfiguredFrameSize"])) /
279 (float(row["Duration(sec)"]) * 1000000.0))
280 rx_mbps = ((float(row["RxFrameCount"]) *
281 float(row["ConfiguredFrameSize"])) /
282 (float(row["Duration(sec)"]) * 1000000.0))
283 result[ResultsConstants.TX_RATE_FPS] = tx_fps
284 result[ResultsConstants.THROUGHPUT_RX_FPS] = rx_fps
285 result[ResultsConstants.TX_RATE_MBPS] = tx_mbps
286 result[ResultsConstants.THROUGHPUT_RX_MBPS] = rx_mbps
287 result[ResultsConstants.TX_RATE_PERCENT] = float(
288 row["OfferedLoad(%)"])
289 result[ResultsConstants.THROUGHPUT_RX_PERCENT] = float(
290 row["Throughput(%)"])
291 result[ResultsConstants.MIN_LATENCY_NS] = float(
292 row["MinimumLatency(us)"]) * 1000
293 result[ResultsConstants.MAX_LATENCY_NS] = float(
294 row["MaximumLatency(us)"]) * 1000
295 result[ResultsConstants.AVG_LATENCY_NS] = float(
296 row["AverageLatency(us)"]) * 1000
297 result[ResultsConstants.FRAME_LOSS_PERCENT] = float(
301 if __name__ == '__main__':
306 'dstip': '90.90.90.90',
309 with TestCenter() as dev:
310 print(dev.send_rfc2544_throughput(traffic=TRAFFIC))
311 print(dev.send_rfc2544_backtoback(traffic=TRAFFIC))