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 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(
170 def send_rfc2544_back2back(self, traffic=None, trials=1, duration=20,
173 Send traffic per RFC2544 BacktoBack test specifications.
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"),
182 settings.getValue("TRAFFICGEN_STC_TESTCENTER_PATH"),
184 "TRAFFICGEN_STC_RFC2544_B2B_TEST_FILE_NAME")),
186 settings.getValue("TRAFFICGEN_STC_RFC2544_METRIC"),
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"),
194 settings.getValue("TRAFFICGEN_STC_EAST_SLOT_NUM"),
196 settings.getValue("TRAFFICGEN_STC_EAST_PORT_NUM"),
197 "--west_chassis_addr",
198 settings.getValue("TRAFFICGEN_STC_WEST_CHASSIS_ADDR"),
200 settings.getValue("TRAFFICGEN_STC_WEST_SLOT_NUM"),
202 settings.getValue("TRAFFICGEN_STC_WEST_PORT_NUM"),
203 "--test_session_name",
204 settings.getValue("TRAFFICGEN_STC_TEST_SESSION_NAME"),
206 settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
207 "--csv_results_file_prefix",
208 settings.getValue("TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX"),
210 settings.getValue("TRAFFICGEN_STC_NUMBER_OF_TRIALS"),
211 "--trial_duration_sec",
212 settings.getValue("TRAFFICGEN_STC_TRIAL_DURATION_SEC"),
214 settings.getValue("TRAFFICGEN_STC_TRAFFIC_PATTERN"),
216 settings.getValue("TRAFFICGEN_STC_SEARCH_MODE"),
218 settings.getValue("TRAFFICGEN_STC_LEARNING_MODE"),
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"),
228 settings.getValue("TRAFFICGEN_STC_RATE_STEP_PCT"),
230 settings.getValue("TRAFFICGEN_STC_RESOLUTION_PCT"),
233 "--acceptable_frame_loss_pct",
234 settings.getValue("TRAFFICGEN_STC_ACCEPTABLE_FRAME_LOSS_PCT"),
236 settings.getValue("TRAFFICGEN_STC_EAST_INTF_ADDR"),
237 "--east_intf_gateway_addr",
238 settings.getValue("TRAFFICGEN_STC_EAST_INTF_GATEWAY_ADDR"),
240 settings.getValue("TRAFFICGEN_STC_WEST_INTF_ADDR"),
241 "--west_intf_gateway_addr",
242 settings.getValue("TRAFFICGEN_STC_WEST_INTF_GATEWAY_ADDR")]
244 if settings.getValue("TRAFFICGEN_STC_VERBOSE") is "True":
245 args.append("--verbose")
247 self._logger.info("Arguments used to call test: %s", args)
248 subprocess.check_call(args)
250 filecs = os.path.join(settings.getValue("TRAFFICGEN_STC_RESULTS_DIR"),
252 "TRAFFICGEN_STC_CSV_RESULTS_FILE_PREFIX") +
255 self._logger.debug("file: %s", filecs)
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(
281 if __name__ == '__main__':
286 'dstip': '90.90.90.90',
289 with TestCenter() as dev:
290 print(dev.send_rfc2544_throughput(traffic=TRAFFIC))
291 print(dev.send_rfc2544_backtoback(traffic=TRAFFIC))