VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/tests/network/tdNetBenchmark1.py@ 78425

Last change on this file since 78425 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 28.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# $Id: tdNetBenchmark1.py 76553 2019-01-01 01:45:53Z vboxsync $
4
5"""
6VirtualBox Validation Kit - Networking benchmark #1.
7"""
8
9__copyright__ = \
10"""
11Copyright (C) 2010-2019 Oracle Corporation
12
13This file is part of VirtualBox Open Source Edition (OSE), as
14available from http://www.virtualbox.org. This file is free software;
15you can redistribute it and/or modify it under the terms of the GNU
16General Public License (GPL) as published by the Free Software
17Foundation, in version 2 as it comes in the "COPYING" file of the
18VirtualBox OSE distribution. VirtualBox OSE is distributed in the
19hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
20
21The contents of this file may alternatively be used under the terms
22of the Common Development and Distribution License Version 1.0
23(CDDL) only, as it comes in the "COPYING.CDDL" file of the
24VirtualBox OSE distribution, in which case the provisions of the
25CDDL are applicable instead of those of the GPL.
26
27You may elect to license modified versions of this file under the
28terms and conditions of either the GPL or the CDDL or both.
29"""
30__version__ = "$Revision: 76553 $"
31
32
33# Standard Python imports.
34import os;
35import socket
36import sys;
37
38# Only the main script needs to modify the path.
39try: __file__
40except: __file__ = sys.argv[0];
41g_ksValidationKitDir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))));
42sys.path.append(g_ksValidationKitDir);
43
44# Validation Kit imports.
45from testdriver import reporter;
46from testdriver import base;
47from testdriver import vbox;
48from testdriver import vboxcon;
49
50
51class tdNetBenchmark1(vbox.TestDriver): # pylint: disable=R0902
52 """
53 Networking benchmark #1.
54 """
55
56 def __init__(self):
57 vbox.TestDriver.__init__(self);
58 self.asRsrcs = None;
59 self.sLocalName = socket.getfqdn();
60 self.sLocalIP = None
61 self.sRemoteName = None;
62 self.sRemoteIP = None;
63 self.sGuestName = None;
64 self.sGuestIP = None;
65 self.oGuestToGuestVM = None;
66 self.oGuestToGuestSess = None;
67 self.oGuestToGuestTxs = None;
68 self.asTestVMsDef = ['tst-rhel5', 'tst-win2k3ent', 'tst-sol10'];
69 self.asTestVMs = self.asTestVMsDef;
70 self.asSkipVMs = [];
71 self.asVirtModesDef = ['hwvirt', 'hwvirt-np', 'raw',]
72 self.asVirtModes = self.asVirtModesDef
73 self.acCpusDef = [1, 2,]
74 self.acCpus = self.acCpusDef;
75 self.asNicTypesDef = ['E1000', 'PCNet', 'Virtio',];
76 self.asNicTypes = self.asNicTypesDef;
77 self.sNicAttachmentDef = 'bridged';
78 self.sNicAttachment = self.sNicAttachmentDef;
79 self.asSetupsDef = ['g2h', 'g2r', 'g2g',];
80 self.asSetups = self.asSetupsDef;
81 self.cSecsRunDef = 30;
82 self.cSecsRun = self.cSecsRunDef;
83 self.asTestsDef = ['tcp-latency', 'tcp-throughput', 'udp-latency', 'udp-throughput', 'tbench'];
84 self.asTests = self.asTestsDef
85 self.acbLatencyPktsDef = [32, 1024, 4096, 8192, 65536,];
86 self.acbLatencyPkts = self.acbLatencyPktsDef
87 self.acbThroughputPktsDef = [8192, 65536];
88 self.acbThroughputPkts = self.acbThroughputPktsDef
89
90 try: self.sLocalName = socket.gethostbyname(self.sLocalName);
91 except: pass;
92
93 #
94 # Overridden methods.
95 #
96 def showUsage(self):
97 rc = vbox.TestDriver.showUsage(self);
98 reporter.log('');
99 reporter.log('tdNetBenchmark1 Options:');
100 reporter.log(' --remote-host <hostname|address>');
101 reporter.log(' --local-host <hostname|address>');
102 reporter.log(' --guest-host <hostname|address>');
103 reporter.log(' --virt-modes <m1[:m2[:]]');
104 reporter.log(' Default: %s' % (':'.join(self.asVirtModesDef)));
105 reporter.log(' --cpu-counts <c1[:c2[:]]');
106 reporter.log(' Default: %s' % (':'.join(str(c) for c in self.acCpusDef)));
107 reporter.log(' --nic-types <type1[:type2[:...]]>');
108 reporter.log(' Default: %s' % (':'.join(self.asNicTypes)));
109 reporter.log(' --nic-attachment <bridged|nat>');
110 reporter.log(' Default: %s' % (self.sNicAttachmentDef));
111 reporter.log(' --setups <s1[:s2[:]]>');
112 reporter.log(' Default: %s (all)' % (':'.join(self.asSetupsDef)));
113 reporter.log(' --secs-per-run <seconds>');
114 reporter.log(' Default: %s' % (self.cSecsRunDef));
115 reporter.log(' --tests <s1[:s2[:]]>');
116 reporter.log(' Default: %s (all)' % (':'.join(self.asTestsDef)));
117 reporter.log(' --latency-sizes <size1[:size2[:...]]>');
118 reporter.log(' Default: %s' % (':'.join(str(cb) for cb in self.acbLatencyPktsDef))); # pychecker bug?
119 reporter.log(' --throughput-sizes <size1[:size2[:...]]>');
120 reporter.log(' Default: %s' % (':'.join(str(cb) for cb in self.acbThroughputPktsDef))); # pychecker bug?
121 reporter.log(' --test-vms <vm1[:vm2[:...]]>');
122 reporter.log(' Test the specified VMs in the given order. Use this to change');
123 reporter.log(' the execution order or limit the choice of VMs');
124 reporter.log(' Default: %s (all)' % (':'.join(self.asTestVMsDef)));
125 reporter.log(' --skip-vms <vm1[:vm2[:...]]>');
126 reporter.log(' Skip the specified VMs when testing.');
127 reporter.log(' --quick');
128 reporter.log(' Shorthand for: --virt-modes hwvirt --cpu-counts 1 --secs-per-run 5 --latency-sizes 32');
129 reporter.log(' --throughput-sizes 8192 --test-vms tst-rhel5:tst-win2k3ent:tst-sol10');
130 return rc;
131
132 def parseOption(self, asArgs, iArg): # pylint: disable=R0912,R0915
133 if asArgs[iArg] == '--remote-host':
134 iArg += 1;
135 if iArg >= len(asArgs): raise base.InvalidOption('The "--remote-host" takes an IP address or a hostname');
136 self.sRemoteName = asArgs[iArg];
137 elif asArgs[iArg] == '--local-host':
138 iArg += 1;
139 if iArg >= len(asArgs): raise base.InvalidOption('The "--local-host" takes an IP address or a hostname');
140 self.sLocalName = asArgs[iArg];
141 elif asArgs[iArg] == '--guest-host':
142 iArg += 1;
143 if iArg >= len(asArgs): raise base.InvalidOption('The "--guest-host" takes an IP address or a hostname');
144 self.sGuestName = asArgs[iArg];
145 elif asArgs[iArg] == '--virt-modes':
146 iArg += 1;
147 if iArg >= len(asArgs): raise base.InvalidOption('The "--virt-modes" takes a colon separated list of modes');
148 self.asVirtModes = asArgs[iArg].split(':');
149 for s in self.asVirtModes:
150 if s not in self.asVirtModesDef:
151 raise base.InvalidOption('The "--virt-modes" value "%s" is not valid; valid values are: %s' \
152 % (s, ' '.join(self.asVirtModesDef)));
153 elif asArgs[iArg] == '--cpu-counts':
154 iArg += 1;
155 if iArg >= len(asArgs): raise base.InvalidOption('The "--cpu-counts" takes a colon separated list of cpu counts');
156 self.acCpus = [];
157 for s in asArgs[iArg].split(':'):
158 try: c = int(s);
159 except: raise base.InvalidOption('The "--cpu-counts" value "%s" is not an integer' % (s,));
160 if c <= 0: raise base.InvalidOption('The "--cpu-counts" value "%s" is zero or negative' % (s,));
161 self.acCpus.append(c);
162 elif asArgs[iArg] == '--nic-types':
163 iArg += 1;
164 if iArg >= len(asArgs): raise base.InvalidOption('The "--nic-types" takes a colon separated list of NIC types');
165 self.asNicTypes = asArgs[iArg].split(':');
166 elif asArgs[iArg] == '--nic-attachment':
167 iArg += 1;
168 if iArg >= len(asArgs): raise base.InvalidOption('The "--nic-attachment" takes an argument');
169 self.sNicAttachment = asArgs[iArg];
170 if self.sNicAttachment not in ('bridged', 'nat'):
171 raise base.InvalidOption('The "--nic-attachment" value "%s" is not supported. Valid values are: bridged, nat' \
172 % (self.sNicAttachment));
173 elif asArgs[iArg] == '--setups':
174 iArg += 1;
175 if iArg >= len(asArgs): raise base.InvalidOption('The "--setups" takes a colon separated list of setups');
176 self.asSetups = asArgs[iArg].split(':');
177 for s in self.asSetups:
178 if s not in self.asSetupsDef:
179 raise base.InvalidOption('The "--setups" value "%s" is not valid; valid values are: %s' \
180 % (s, ' '.join(self.asSetupsDef)));
181 elif asArgs[iArg] == '--secs-per-run':
182 iArg += 1;
183 if iArg >= len(asArgs): raise base.InvalidOption('The "--secs-per-run" takes second count');
184 try: self.cSecsRun = int(asArgs[iArg]);
185 except: raise base.InvalidOption('The "--secs-per-run" value "%s" is not an integer' % (self.cSecsRun,));
186 if self.cSecsRun <= 0:
187 raise base.InvalidOption('The "--secs-per-run" value "%s" is zero or negative.' % (self.cSecsRun,));
188 elif asArgs[iArg] == '--tests':
189 iArg += 1;
190 if iArg >= len(asArgs): raise base.InvalidOption('The "--tests" takes a colon separated list of tests');
191 self.asTests = asArgs[iArg].split(':');
192 for s in self.asTests:
193 if s not in self.asTestsDef:
194 raise base.InvalidOption('The "--tests" value "%s" is not valid; valid values are: %s' \
195 % (s, ' '.join(self.asTestsDef)));
196 elif asArgs[iArg] == '--latency-sizes':
197 iArg += 1;
198 if iArg >= len(asArgs): raise base.InvalidOption('The "--latency-sizes" takes a colon separated list of sizes');
199 self.acbLatencyPkts = [];
200 for s in asArgs[iArg].split(':'):
201 try: cb = int(s);
202 except: raise base.InvalidOption('The "--latency-sizes" value "%s" is not an integer' % (s,));
203 if cb <= 0: raise base.InvalidOption('The "--latency-sizes" value "%s" is zero or negative' % (s,));
204 self.acbLatencyPkts.append(cb);
205 elif asArgs[iArg] == '--throughput-sizes':
206 iArg += 1;
207 if iArg >= len(asArgs): raise base.InvalidOption('The "--throughput-sizes" takes a colon separated list of sizes');
208 self.acbThroughputPkts = [];
209 for s in asArgs[iArg].split(':'):
210 try: cb = int(s);
211 except: raise base.InvalidOption('The "--throughput-sizes" value "%s" is not an integer' % (s,));
212 if cb <= 0: raise base.InvalidOption('The "--throughput-sizes" value "%s" is zero or negative' % (s,));
213 self.acbThroughputPkts.append(cb);
214 elif asArgs[iArg] == '--test-vms':
215 iArg += 1;
216 if iArg >= len(asArgs): raise base.InvalidOption('The "--test-vms" takes colon separated list');
217 self.asTestVMs = asArgs[iArg].split(':');
218 for s in self.asTestVMs:
219 if s not in self.asTestVMsDef:
220 raise base.InvalidOption('The "--test-vms" value "%s" is not valid; valid values are: %s' \
221 % (s, ' '.join(self.asTestVMsDef)));
222 elif asArgs[iArg] == '--skip-vms':
223 iArg += 1;
224 if iArg >= len(asArgs): raise base.InvalidOption('The "--skip-vms" takes colon separated list');
225 self.asSkipVMs = asArgs[iArg].split(':');
226 for s in self.asSkipVMs:
227 if s not in self.asTestVMsDef:
228 reporter.log('warning: The "--test-vms" value "%s" does not specify any of our test VMs.' % (s));
229 elif asArgs[iArg] == '--quick':
230 self.cSecsRun = 5;
231 self.asVirtModes = ['hwvirt',];
232 self.acCpus = [1,];
233 self.acbLatencyPkts = [32,];
234 self.acbThroughputPkts = [8192,];
235 self.asTestVMs = ['tst-rhel5', 'tst-win2k3ent', 'tst-sol10',];
236 else:
237 return vbox.TestDriver.parseOption(self, asArgs, iArg);
238 return iArg + 1;
239
240 def completeOptions(self):
241 # Remove skipped VMs from the test list.
242 for sVM in self.asSkipVMs:
243 try: self.asTestVMs.remove(sVM);
244 except: pass;
245
246 # Resolve any names we've been given.
247 self.sLocalIP = base.tryGetHostByName(self.sLocalName);
248 self.sRemoteIP = base.tryGetHostByName(self.sRemoteName);
249 self.sGuestIP = base.tryGetHostByName(self.sGuestName);
250
251 reporter.log('Local IP : %s' % (self.sLocalIP));
252 reporter.log('Remote IP: %s' % (self.sRemoteIP));
253 if self.sGuestIP is None:
254 reporter.log('Guest IP : use tst-guest2guest');
255 else:
256 reporter.log('Guest IP : %s' % (self.sGuestIP));
257
258 return vbox.TestDriver.completeOptions(self);
259
260 def getResourceSet(self):
261 # Construct the resource list the first time it's queried.
262 if self.asRsrcs is None:
263 self.asRsrcs = [];
264 if 'tst-rhel5' in self.asTestVMs or 'g2g' in self.asSetups:
265 self.asRsrcs.append('3.0/tcp/rhel5.vdi');
266 if 'tst-rhel5-64' in self.asTestVMs:
267 self.asRsrcs.append('3.0/tcp/rhel5-64.vdi');
268 if 'tst-sles11' in self.asTestVMs:
269 self.asRsrcs.append('3.0/tcp/sles11.vdi');
270 if 'tst-sles11-64' in self.asTestVMs:
271 self.asRsrcs.append('3.0/tcp/sles11-64.vdi');
272 if 'tst-oel' in self.asTestVMs:
273 self.asRsrcs.append('3.0/tcp/oel.vdi');
274 if 'tst-oel-64' in self.asTestVMs:
275 self.asRsrcs.append('3.0/tcp/oel-64.vdi');
276 if 'tst-win2k3ent' in self.asTestVMs:
277 self.asRsrcs.append('3.0/tcp/win2k3ent-acpi.vdi');
278 if 'tst-win2k3ent-64' in self.asTestVMs:
279 self.asRsrcs.append('3.0/tcp/win2k3ent-64.vdi');
280 if 'tst-win2k8' in self.asTestVMs:
281 self.asRsrcs.append('3.0/tcp/win2k8.vdi');
282 if 'tst-sol10' in self.asTestVMs:
283 self.asRsrcs.append('3.0/tcp/solaris10.vdi');
284 if 'tst-sol11' in self.asTestVMs:
285 self.asRsrcs.append('3.0/tcp/solaris11.vdi');
286 return self.asRsrcs;
287
288 def actionConfig(self):
289 # Some stupid trickery to guess the location of the iso. ## fixme - testsuite unzip ++
290 sVBoxValidationKit_iso = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../VBoxValidationKit.iso'));
291 if not os.path.isfile(sVBoxValidationKit_iso):
292 sVBoxValidationKit_iso = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../VBoxTestSuite.iso'));
293 if not os.path.isfile(sVBoxValidationKit_iso):
294 sVBoxValidationKit_iso = '/mnt/ramdisk/vbox/svn/trunk/validationkit/VBoxValidationKit.iso';
295 if not os.path.isfile(sVBoxValidationKit_iso):
296 sVBoxValidationKit_iso = '/mnt/ramdisk/vbox/svn/trunk/testsuite/VBoxTestSuite.iso';
297 if not os.path.isfile(sVBoxValidationKit_iso):
298 sCur = os.getcwd();
299 for i in range(0, 10):
300 sVBoxValidationKit_iso = os.path.join(sCur, 'validationkit/VBoxValidationKit.iso');
301 if os.path.isfile(sVBoxValidationKit_iso):
302 break;
303 sVBoxValidationKit_iso = os.path.join(sCur, 'testsuite/VBoxTestSuite.iso');
304 if os.path.isfile(sVBoxValidationKit_iso):
305 break;
306 sCur = os.path.abspath(os.path.join(sCur, '..'));
307 if i is None: pass; # shut up pychecker/pylint.
308 if not os.path.isfile(sVBoxValidationKit_iso):
309 sVBoxValidationKit_iso = '/home/bird/validationkit/VBoxValidationKit.iso';
310 if not os.path.isfile(sVBoxValidationKit_iso):
311 sVBoxValidationKit_iso = '/home/bird/testsuite/VBoxTestSuite.iso';
312
313 # Make sure vboxapi has been imported so we can use the constants.
314 if not self.importVBoxApi():
315 return False;
316
317 # Guest to Guest VM.
318 if self.sGuestName is None and 'g2g' in self.asSetups:
319 oVM = self.createTestVM('tst-guest2guest', 0, '3.0/tcp/rhel5.vdi', sKind = 'RedHat', fIoApic = True, \
320 eNic0Type = vboxcon.NetworkAdapterType_I82545EM, \
321 eNic0AttachType = vboxcon.NetworkAttachmentType_Bridged, \
322 fVirtEx = True, sDvdImage = sVBoxValidationKit_iso);
323 if oVM is None:
324 return False;
325 self.oGuestToGuestVM = oVM;
326
327 #
328 # Configure the VMs we're going to use.
329 #
330 eNic0AttachType = vboxcon.NetworkAttachmentType_Bridged;
331 if self.sNicAttachment == 'nat':
332 eNic0AttachType = vboxcon.NetworkAttachmentType_NAT;
333
334 # Linux VMs
335 if 'tst-rhel5' in self.asTestVMs:
336 oVM = self.createTestVM('tst-rhel5', 1, '3.0/tcp/rhel5.vdi', sKind = 'RedHat', fIoApic = True, \
337 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
338 if oVM is None:
339 return False;
340
341 if 'tst-rhel5-64' in self.asTestVMs:
342 oVM = self.createTestVM('tst-rhel5-64', 1, '3.0/tcp/rhel5-64.vdi', sKind = 'RedHat_64', \
343 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
344 if oVM is None:
345 return False;
346
347 if 'tst-sles11' in self.asTestVMs:
348 oVM = self.createTestVM('tst-sles11', 1, '3.0/tcp/sles11.vdi', sKind = 'OpenSUSE', fIoApic = True, \
349 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
350 if oVM is None:
351 return False;
352
353 if 'tst-sles11-64' in self.asTestVMs:
354 oVM = self.createTestVM('tst-sles11-64', 1, '3.0/tcp/sles11-64.vdi', sKind = 'OpenSUSE_64', \
355 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
356 if oVM is None:
357 return False;
358
359 if 'tst-oel' in self.asTestVMs:
360 oVM = self.createTestVM('tst-oel', 1, '3.0/tcp/oel.vdi', sKind = 'Oracle', fIoApic = True, \
361 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
362 if oVM is None:
363 return False;
364
365 if 'tst-oel-64' in self.asTestVMs:
366 oVM = self.createTestVM('tst-oel-64', 1, '3.0/tcp/oel-64.vdi', sKind = 'Oracle_64', \
367 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
368 if oVM is None:
369 return False;
370
371 # Windows VMs
372 if 'tst-win2k3ent' in self.asTestVMs:
373 oVM = self.createTestVM('tst-win2k3ent', 1, '3.0/tcp/win2k3ent-acpi.vdi', sKind = 'Windows2003', \
374 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
375 if oVM is None:
376 return False;
377
378 if 'tst-win2k3ent-64' in self.asTestVMs:
379 oVM = self.createTestVM('tst-win2k3ent-64', 1, '3.0/tcp/win2k3ent-64.vdi', sKind = 'Windows2003_64', \
380 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
381 if oVM is None:
382 return False;
383
384 if 'tst-win2k8' in self.asTestVMs:
385 oVM = self.createTestVM('tst-win2k8', 1, '3.0/tcp/win2k8.vdi', sKind = 'Windows2008_64', \
386 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
387 if oVM is None:
388 return False;
389
390 # Solaris VMs
391 if 'tst-sol10' in self.asTestVMs:
392 oVM = self.createTestVM('tst-sol10', 1, '3.0/tcp/solaris10.vdi', sKind = 'Solaris_64', \
393 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
394 if oVM is None:
395 return False;
396
397 if 'tst-sol11' in self.asTestVMs:
398 oVM = self.createTestVM('tst-sol11', 1, '3.0/tcp/os2009-11.vdi', sKind = 'Solaris_64', \
399 eNic0AttachType = eNic0AttachType, sDvdImage = sVBoxValidationKit_iso);
400 if oVM is None:
401 return False;
402
403 return True;
404
405 def actionExecute(self):
406 """
407 Execute the testcase.
408 """
409 fRc = self.test1();
410 return fRc;
411
412
413 #
414 # Test execution helpers.
415 #
416
417 def test1RunTestProgs(self, oTxsSession, fRc, sTestName, sAddr):
418 """
419 Runs all the test programs against one 'server' machine.
420 """
421 reporter.testStart(sTestName);
422
423 reporter.testStart('TCP latency');
424 if fRc and 'tcp-latency' in self.asTests and sAddr is not None:
425 for cbPkt in self.acbLatencyPkts:
426 fRc = self.txsRunTest(oTxsSession, '%u bytes' % (cbPkt), self.cSecsRun * 1000 * 4,
427 '${CDROM}/${OS/ARCH}/NetPerf${EXESUFF}',
428 ('NetPerf', '--client', sAddr, '--interval', self.cSecsRun, '--len', cbPkt,
429 '--mode', 'latency'));
430 if not fRc:
431 break;
432 reporter.testDone();
433 else:
434 reporter.testDone(fSkipped = True);
435
436 reporter.testStart('TCP throughput');
437 if fRc and 'tcp-throughput' in self.asTests and sAddr is not None:
438 for cbPkt in self.acbThroughputPkts:
439 fRc = self.txsRunTest(oTxsSession, '%u bytes' % (cbPkt), self.cSecsRun * 2 * 1000 * 4,
440 '${CDROM}/${OS/ARCH}/NetPerf${EXESUFF}',
441 ('NetPerf', '--client', sAddr, '--interval', self.cSecsRun, '--len', cbPkt,
442 '--mode', 'throughput'));
443 if not fRc:
444 break;
445 reporter.testDone();
446 else:
447 reporter.testDone(fSkipped = True);
448
449 reporter.testStart('UDP latency');
450 if fRc and 'udp-latency' in self.asTests and sAddr is not None:
451 ## @todo Netperf w/UDP.
452 reporter.testDone(fSkipped = True);
453 else:
454 reporter.testDone(fSkipped = True);
455
456 reporter.testStart('UDP throughput');
457 if fRc and 'udp-throughput' in self.asTests and sAddr is not None:
458 ## @todo Netperf w/UDP.
459 reporter.testDone(fSkipped = True);
460 else:
461 reporter.testDone(fSkipped = True);
462
463 reporter.testStart('tbench');
464 if fRc and 'tbench' in self.asTests and sAddr is not None:
465 ## @todo tbench.
466 reporter.testDone(fSkipped = True);
467 else:
468 reporter.testDone(fSkipped = True);
469
470 reporter.testDone(not fRc);
471 return fRc;
472
473 def test1OneCfg(self, sVmName, eNicType, cCpus, fHwVirt, fNestedPaging):
474 """
475 Runs the specified VM thru test #1.
476
477 Returns a success indicator on the general test execution. This is not
478 the actual test result.
479 """
480 oVM = self.getVmByName(sVmName);
481
482 # Reconfigure the VM
483 fRc = True;
484 oSession = self.openSession(oVM);
485 if oSession is not None:
486 fRc = fRc and oSession.setNicType(eNicType);
487 fRc = fRc and oSession.enableVirtEx(fHwVirt);
488 fRc = fRc and oSession.enableNestedPaging(fNestedPaging);
489 fRc = fRc and oSession.setCpuCount(cCpus);
490 fRc = fRc and oSession.saveSettings();
491 fRc = oSession.close() and fRc and True; # pychecker hack.
492 oSession = None;
493 else:
494 fRc = False;
495
496 # Start up.
497 if fRc is True:
498 self.logVmInfo(oVM);
499 oSession, oTxsSession = self.startVmAndConnectToTxsViaTcp(sVmName, fCdWait = True);
500 if oSession is not None:
501 self.addTask(oTxsSession);
502
503 # Fudge factor - Allow the guest to finish starting up.
504 self.sleep(5);
505
506 # Benchmark #1 - guest <-> host.
507 if 'g2h' in self.asSetups:
508 self.test1RunTestProgs(oTxsSession, fRc, 'guest <-> host', self.sLocalIP);
509
510 # Benchmark #2 - guest <-> host.
511 if 'g2r' in self.asSetups:
512 self.test1RunTestProgs(oTxsSession, fRc, 'guest <-> remote', self.sRemoteIP);
513
514 # Benchmark #3 - guest <-> guest.
515 if 'g2g' in self.asSetups:
516 self.test1RunTestProgs(oTxsSession, fRc, 'guest <-> guest', self.sGuestIP);
517
518 # cleanup.
519 self.removeTask(oTxsSession);
520 self.terminateVmBySession(oSession)
521 else:
522 fRc = False;
523 return fRc;
524
525 def test1OneVM(self, sVmName, asSkipNicTypes = (), asSupVirtModes = None, rSupCpus = range(1, 256)):
526 """
527 Runs one VM thru the various configurations.
528 """
529 if asSupVirtModes is None:
530 asSupVirtModes = self.asVirtModes;
531
532 reporter.testStart(sVmName);
533 fRc = True;
534 for sNicType in self.asNicTypes:
535 if sNicType in asSkipNicTypes:
536 continue;
537 reporter.testStart(sNicType);
538
539 if sNicType == 'E1000':
540 eNicType = vboxcon.NetworkAdapterType_I82545EM;
541 elif sNicType == 'PCNet':
542 eNicType = vboxcon.NetworkAdapterType_Am79C973;
543 elif sNicType == 'Virtio':
544 eNicType = vboxcon.NetworkAdapterType_Virtio;
545 else:
546 eNicType = None;
547
548 for cCpus in self.acCpus:
549 if cCpus == 1: reporter.testStart('1 cpu');
550 else: reporter.testStart('%u cpus' % (cCpus));
551
552 for sVirtMode in self.asVirtModes:
553 if sVirtMode == 'raw' and cCpus > 1:
554 continue;
555 if cCpus not in rSupCpus:
556 continue;
557 if sVirtMode not in asSupVirtModes:
558 continue;
559 hsVirtModeDesc = {};
560 hsVirtModeDesc['raw'] = 'Raw-mode';
561 hsVirtModeDesc['hwvirt'] = 'HwVirt';
562 hsVirtModeDesc['hwvirt-np'] = 'NestedPaging';
563 reporter.testStart(hsVirtModeDesc[sVirtMode]);
564
565 fHwVirt = sVirtMode != 'raw';
566 fNestedPaging = sVirtMode == 'hwvirt-np';
567 fRc = self.test1OneCfg(sVmName, eNicType, cCpus, fHwVirt, fNestedPaging) and fRc and True; # pychecker hack.
568
569 reporter.testDone();
570 reporter.testDone();
571 reporter.testDone();
572 reporter.testDone();
573 return fRc;
574
575 def test1(self):
576 """
577 Executes test #1.
578 """
579
580 # Start the VM for the guest to guest testing, if required.
581 fRc = True;
582 if 'g2g' in self.asSetups and self.sGuestName is None:
583 self.oGuestToGuestSess, self.oGuestToGuestTxs = self.startVmAndConnectToTxsViaTcp('tst-guest2guest', fCdWait = True);
584 if self.oGuestToGuestSess is None:
585 return False;
586 self.sGuestIP = self.oGuestToGuestSess.getPrimaryIp();
587 reporter.log('tst-guest2guest IP: %s' % (self.sGuestIP));
588
589 # Start the test servers on it.
590 fRc = self.oGuestToGuestTxs.syncExec('${CDROM}/${OS/ARCH}/NetPerf${EXESUFF}',
591 ('NetPerf', '--server', '--daemonize'), fWithTestPipe=False);
592
593 # Loop thru the test VMs.
594 if fRc:
595 for sVM in self.asTestVMs:
596 # figure args.
597 asSkipNicTypes = [];
598 if sVM not in ('tst-sles11', 'tst-sles11-64'):
599 asSkipNicTypes.append('Virtio');
600 if sVM in ('tst-sol11', 'tst-sol10'):
601 asSkipNicTypes.append('PCNet');
602 asSupVirtModes = None;
603 if sVM in ('tst-sol11', 'tst-sol10'): # 64-bit only
604 asSupVirtModes = ('hwvirt', 'hwvirt-np',);
605
606 # run test on the VM.
607 if not self.test1OneVM(sVM, asSkipNicTypes, asSupVirtModes):
608 fRc = False;
609
610 # Kill the guest to guest VM and clean up the state.
611 if self.oGuestToGuestSess is not None:
612 self.terminateVmBySession(self.oGuestToGuestSess);
613 self.oGuestToGuestSess = None;
614 self.oGuestToGuestTxs = None;
615 self.sGuestIP = None;
616
617 return fRc;
618
619
620
621if __name__ == '__main__':
622 sys.exit(tdNetBenchmark1().main(sys.argv));
623
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette