VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/tests/teleportation/tdTeleportLocal1.py@ 52776

Last change on this file since 52776 was 52776, checked in by vboxsync, 10 years ago

fix OSE

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 42.2 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# $Id: tdTeleportLocal1.py 52776 2014-09-17 14:51:43Z vboxsync $
4
5"""
6VirtualBox Validation Kit - Local teleportation testdriver.
7"""
8
9__copyright__ = \
10"""
11Copyright (C) 2010-2014 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: 52776 $"
31
32
33# Standard Python imports.
34import os;
35import sys;
36
37# Only the main script needs to modify the path.
38try: __file__
39except: __file__ = sys.argv[0];
40g_ksValidationKitDir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))));
41sys.path.append(g_ksValidationKitDir);
42
43# Validation Kit imports.
44from testdriver import reporter;
45from testdriver import base;
46from testdriver import vbox;
47
48
49class tdTeleportLocal1(vbox.TestDriver):
50 """
51 Local Teleportation Test #1.
52 """
53
54 def __init__(self):
55 vbox.TestDriver.__init__(self);
56 self.asRsrcs = None;
57
58 self.asTestsDef = ['test1', 'test2'];
59 self.asTests = ['test1', 'test2'];
60 self.asSkipTests = [];
61 self.asTestVMsDef = ['tst-rhel5', 'tst-win2k3ent', 'tst-sol10'];
62 self.asTestVMs = self.asTestVMsDef;
63 self.asSkipVMs = [];
64 self.asVirtModesDef = ['hwvirt', 'hwvirt-np', 'raw',]
65 self.asVirtModes = self.asVirtModesDef
66 self.acCpusDef = [1, 2,]
67 self.acCpus = self.acCpusDef;
68
69 #
70 # Overridden methods.
71 #
72 def showUsage(self):
73 rc = vbox.TestDriver.showUsage(self);
74 reporter.log('');
75 reporter.log('tdTeleportLocal1 Options:');
76 reporter.log(' --virt-modes <m1[:m2[:]]');
77 reporter.log(' Default: %s' % (':'.join(self.asVirtModesDef)));
78 reporter.log(' --cpu-counts <c1[:c2[:]]');
79 reporter.log(' Default: %s' % (':'.join(str(c) for c in self.acCpusDef)));
80 reporter.log(' --test-vms <vm1[:vm2[:...]]>');
81 reporter.log(' Test the specified VMs in the given order. Use this to change');
82 reporter.log(' the execution order or limit the choice of VMs');
83 reporter.log(' Default: %s (all)' % (':'.join(self.asTestVMsDef)));
84 reporter.log(' --skip-vms <vm1[:vm2[:...]]>');
85 reporter.log(' Skip the specified VMs when testing.');
86 reporter.log(' --tests <test1[:test2[:...]]>');
87 reporter.log(' Run the specified tests.');
88 reporter.log(' Default: %s (all)' % (':'.join(self.asTestsDef)));
89 reporter.log(' --skip-tests <test1[:test2[:...]]>');
90 reporter.log(' Skip the specified VMs when testing.');
91 reporter.log(' --quick');
92 reporter.log(' Shorthand for: --virt-modes hwvirt --cpu-counts 1');
93 reporter.log(' --test-vms tst-rhel5:tst-win2k3ent:tst-sol10');
94 return rc;
95
96 def parseOption(self, asArgs, iArg):
97 if asArgs[iArg] == '--virt-modes':
98 iArg += 1;
99 if iArg >= len(asArgs): raise base.InvalidOption('The "--virt-modes" takes a colon separated list of modes');
100 self.asVirtModes = asArgs[iArg].split(':');
101 for s in self.asVirtModes:
102 if s not in self.asVirtModesDef:
103 raise base.InvalidOption('The "--virt-modes" value "%s" is not valid; valid values are: %s' \
104 % (s, ' '.join(self.asVirtModesDef)));
105 elif asArgs[iArg] == '--cpu-counts':
106 iArg += 1;
107 if iArg >= len(asArgs): raise base.InvalidOption('The "--cpu-counts" takes a colon separated list of cpu counts');
108 self.acCpus = [];
109 for s in asArgs[iArg].split(':'):
110 try: c = int(s);
111 except: raise base.InvalidOption('The "--cpu-counts" value "%s" is not an integer' % (s,));
112 if c <= 0: raise base.InvalidOption('The "--cpu-counts" value "%s" is zero or negative' % (s,));
113 self.acCpus.append(c);
114 elif asArgs[iArg] == '--test-vms':
115 iArg += 1;
116 if iArg >= len(asArgs): raise base.InvalidOption('The "--test-vms" takes colon separated list');
117 if len(asArgs[iArg]) > 0:
118 self.asTestVMs = asArgs[iArg].split(':');
119 for s in self.asTestVMs:
120 if s not in self.asTestVMsDef:
121 raise base.InvalidOption('The "--test-vms" value "%s" is not valid; valid values are: %s' \
122 % (s, ' '.join(self.asTestVMsDef)));
123 else:
124 self.asTestVMs = [];
125 elif asArgs[iArg] == '--skip-vms':
126 iArg += 1;
127 if iArg >= len(asArgs): raise base.InvalidOption('The "--skip-vms" takes colon separated list');
128 self.asSkipVMs = asArgs[iArg].split(':');
129 for s in self.asSkipVMs:
130 if s not in self.asTestVMsDef:
131 reporter.log('warning: The "--skip-vms" value "%s" does not specify any of our test VMs.' % (s));
132 elif asArgs[iArg] == '--tests':
133 iArg += 1;
134 if iArg >= len(asArgs): raise base.InvalidOption('The "--tests" takes colon separated list');
135 self.asTests = asArgs[iArg].split(':');
136 for s in self.asTests:
137 if s not in self.asTestsDef:
138 reporter.log('warning: The "--tests" value "%s" does not specify any of our tests.' % (s));
139 elif asArgs[iArg] == '--skip-tests':
140 iArg += 1;
141 if iArg >= len(asArgs): raise base.InvalidOption('The "--skip-tests" takes colon separated list');
142 self.asSkipVMs = asArgs[iArg].split(':');
143 for s in self.asSkipTests:
144 if s not in self.asTestsDef:
145 reporter.log('warning: The "--skip-tests" value "%s" does not specify any of our tests.' % (s));
146 elif asArgs[iArg] == '--quick':
147 self.asVirtModes = ['hwvirt',];
148 self.acCpus = [1,];
149 #self.asTestVMs = ['tst-rhel5', 'tst-win2k3ent', 'tst-sol10',];
150 self.asTestVMs = ['tst-rhel5', ];
151 else:
152 return vbox.TestDriver.parseOption(self, asArgs, iArg);
153 return iArg + 1;
154
155 def completeOptions(self):
156 # Remove skipped VMs from the test VM list.
157 for sVM in self.asSkipVMs:
158 try: self.asTestVMs.remove(sVM);
159 except: pass;
160
161 # Remove skipped tests from the test list.
162 for sTest in self.asSkipTests:
163 try: self.asTests.remove(sTest);
164 except: pass;
165
166 # If no test2, then no test VMs.
167 if 'test2' not in self.asTests:
168 self.asTestVMs = [];
169
170 return vbox.TestDriver.completeOptions(self);
171
172 def getResourceSet(self):
173 # Construct the resource list the first time it's queried.
174 if self.asRsrcs is None:
175 self.asRsrcs = [];
176 if 'tst-rhel5' in self.asTestVMs:
177 self.asRsrcs.append('3.0/tcp/rhel5.vdi');
178 if 'tst-rhel5-64' in self.asTestVMs:
179 self.asRsrcs.append('3.0/tcp/rhel5-64.vdi');
180 if 'tst-sles11' in self.asTestVMs:
181 self.asRsrcs.append('3.0/tcp/sles11.vdi');
182 if 'tst-sles11-64' in self.asTestVMs:
183 self.asRsrcs.append('3.0/tcp/sles11-64.vdi');
184 if 'tst-oel' in self.asTestVMs:
185 self.asRsrcs.append('3.0/tcp/oel.vdi');
186 if 'tst-oel-64' in self.asTestVMs:
187 self.asRsrcs.append('3.0/tcp/oel-64.vdi');
188 if 'tst-win2k3ent' in self.asTestVMs:
189 self.asRsrcs.append('3.0/tcp/win2k3ent-acpi.vdi');
190 if 'tst-win2k3ent-64' in self.asTestVMs:
191 self.asRsrcs.append('3.0/tcp/win2k3ent-64.vdi');
192 if 'tst-win2k8' in self.asTestVMs:
193 self.asRsrcs.append('3.0/tcp/win2k8.vdi');
194 if 'tst-sol10' in self.asTestVMs:
195 self.asRsrcs.append('3.0/tcp/solaris10.vdi');
196 if 'tst-sol11' in self.asTestVMs:
197 self.asRsrcs.append('3.0/tcp/solaris11.vdi');
198 return self.asRsrcs;
199
200 def actionConfig(self):
201 ## @todo actionConfig() and getResourceSet() are working on the same
202 # set of VMs as tdNetBenchmark1, creating common base class would be
203 # a good idea.
204
205 # Some stupid trickery to guess the location of the iso. ## fixme - testsuite unzip ++
206 sVBoxValidationKit_iso = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../VBoxValidationKit.iso'));
207 if not os.path.isfile(sVBoxValidationKit_iso):
208 sVBoxValidationKit_iso = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../VBoxTestSuite.iso'));
209 if not os.path.isfile(sVBoxValidationKit_iso):
210 sVBoxValidationKit_iso = '/mnt/ramdisk/vbox/svn/trunk/validationkit/VBoxValidationKit.iso';
211 if not os.path.isfile(sVBoxValidationKit_iso):
212 sVBoxValidationKit_iso = '/mnt/ramdisk/vbox/svn/trunk/testsuite/VBoxTestSuite.iso';
213 if not os.path.isfile(sVBoxValidationKit_iso):
214 sCur = os.getcwd();
215 for i in range(0, 10):
216 sVBoxValidationKit_iso = os.path.join(sCur, 'validationkit/VBoxValidationKit.iso');
217 if os.path.isfile(sVBoxValidationKit_iso):
218 break;
219 sVBoxValidationKit_iso = os.path.join(sCur, 'testsuite/VBoxTestSuite.iso');
220 if os.path.isfile(sVBoxValidationKit_iso):
221 break;
222 sCur = os.path.abspath(os.path.join(sCur, '..'));
223 if i is not None: pass; # shut up pychecker/pylint.
224 if not os.path.isfile(sVBoxValidationKit_iso):
225 sVBoxValidationKit_iso = '/home/bird/validationkit/VBoxValidationKit.iso';
226 if not os.path.isfile(sVBoxValidationKit_iso):
227 sVBoxValidationKit_iso = '/home/bird/testsuite/VBoxTestSuite.iso';
228
229 # Make sure vboxapi has been imported so we can use the constants.
230 if not self.importVBoxApi():
231 return False;
232
233 #
234 # Configure the empty VMs we're going to use for the first tests.
235 #
236
237 if 'test1' in self.asTests:
238 #oVM = self.createTestVMs('tst-empty-hwvirt', 0, sKind = 'Other', fVirtEx = True);
239 #if oVM is None:
240 # return False;
241
242 oVM = self.createTestVMs('tst-empty-raw', 2, sKind = 'Other', fVirtEx = False);
243 if oVM is None:
244 return False;
245
246 #
247 # Configure the VMs we're going to use for the last test.
248 #
249
250 # Linux VMs
251 if 'tst-rhel5' in self.asTestVMs:
252 oVM = self.createTestVMs('tst-rhel5', 1, '3.0/tcp/rhel5.vdi', sKind = 'RedHat', fIoApic = True, \
253 sDvdImage = sVBoxValidationKit_iso);
254 if oVM is None:
255 return False;
256
257 if 'tst-rhel5-64' in self.asTestVMs:
258 oVM = self.createTestVMs('tst-rhel5-64', 1, '3.0/tcp/rhel5-64.vdi', sKind = 'RedHat_64', \
259 sDvdImage = sVBoxValidationKit_iso);
260 if oVM is None:
261 return False;
262
263 if 'tst-sles11' in self.asTestVMs:
264 oVM = self.createTestVMs('tst-sles11', 1, '3.0/tcp/sles11.vdi', sKind = 'OpenSUSE', fIoApic = True, \
265 sDvdImage = sVBoxValidationKit_iso);
266 if oVM is None:
267 return False;
268
269 if 'tst-sles11-64' in self.asTestVMs:
270 oVM = self.createTestVMs('tst-sles11-64', 1, '3.0/tcp/sles11-64.vdi', sKind = 'OpenSUSE_64', \
271 sDvdImage = sVBoxValidationKit_iso);
272 if oVM is None:
273 return False;
274
275 if 'tst-oel' in self.asTestVMs:
276 oVM = self.createTestVMs('tst-oel', 1, '3.0/tcp/oel.vdi', sKind = 'Oracle', fIoApic = True, \
277 sDvdImage = sVBoxValidationKit_iso);
278 if oVM is None:
279 return False;
280
281 if 'tst-oel-64' in self.asTestVMs:
282 oVM = self.createTestVMs('tst-oel-64', 1, '3.0/tcp/oel-64.vdi', sKind = 'Oracle_64', \
283 sDvdImage = sVBoxValidationKit_iso);
284 if oVM is None:
285 return False;
286
287 # Windows VMs
288 if 'tst-win2k3ent' in self.asTestVMs:
289 oVM = self.createTestVMs('tst-win2k3ent', 1, '3.0/tcp/win2k3ent-acpi.vdi', sKind = 'Windows2003', \
290 sDvdImage = sVBoxValidationKit_iso);
291 if oVM is None:
292 return False;
293
294 if 'tst-win2k3ent-64' in self.asTestVMs:
295 oVM = self.createTestVMs('tst-win2k3ent-64', 1, '3.0/tcp/win2k3ent-64.vdi', sKind = 'Windows2003_64', \
296 sDvdImage = sVBoxValidationKit_iso);
297 if oVM is None:
298 return False;
299
300 if 'tst-win2k8' in self.asTestVMs:
301 oVM = self.createTestVMs('tst-win2k8', 1, '3.0/tcp/win2k8.vdi', sKind = 'Windows2008_64', \
302 sDvdImage = sVBoxValidationKit_iso);
303 if oVM is None:
304 return False;
305
306 # Solaris VMs
307 if 'tst-sol10' in self.asTestVMs:
308 oVM = self.createTestVMs('tst-sol10', 1, '3.0/tcp/solaris10.vdi', sKind = 'Solaris_64', \
309 sDvdImage = sVBoxValidationKit_iso);
310 if oVM is None:
311 return False;
312
313 if 'tst-sol11' in self.asTestVMs:
314 oVM = self.createTestVMs('tst-sol11', 1, '3.0/tcp/os2009-11.vdi', sKind = 'Solaris_64', \
315 sDvdImage = sVBoxValidationKit_iso);
316 if oVM is None:
317 return False;
318
319 return True;
320
321 def actionExecute(self):
322 """
323 Execute the testcase.
324 """
325 fRc = 'test1' not in self.asTests or self.test1();
326 if fRc: fRc = 'test2' not in self.asTests or self.test2();
327 return fRc;
328
329
330 #
331 # Test config helpers.
332 #
333
334 def createTestVMs(self, sName, iGroup, *tArgs, **dKeywordArgs):
335 """
336 Wrapper around vbox.createTestVM for creating two VMs, the source
337 (sName-1) and target (sName-2).
338
339 Returns the 2nd VM object on success, None on failure.
340 """
341 sName1 = sName + '-1';
342 oVM = self.createTestVM(sName1, iGroup * 2, *tArgs, **dKeywordArgs);
343 if oVM is not None:
344 sName2 = sName + '-2';
345 oVM = self.createTestVM(sName2, iGroup * 2 + 1, *tArgs, **dKeywordArgs);
346 return oVM;
347
348
349 #
350 # Test execution helpers.
351 #
352
353 def test2Teleport(self, oVmSrc, oSessionSrc, oVmDst):
354 """
355 Attempts a teleportation.
356
357 Returns the input parameters for the next test2Teleport call (source
358 and destiation are switched around). The input session is closed and
359 removed from the task list, while the return session is in the list.
360 """
361
362 # Enable the teleporter of the VM.
363 oSession = self.openSession(oVmDst);
364 fRc = oSession is not None
365 if fRc:
366 fRc = oSession.enableTeleporter();
367 fRc = fRc and oSession.saveSettings();
368 fRc = oSession.close() and fRc and True; # pychecker hack.
369 if fRc:
370 # Start the destination VM.
371 oSessionDst, oProgressDst = self.startVmEx(oVmDst, fWait = False);
372 if oSessionDst is not None:
373 if oProgressDst.waitForOperation(iOperation = -3) == 0:
374
375 # Do the teleportation.
376 try:
377 uDstPort = oVmDst.teleporterPort;
378 except:
379 reporter.logXcpt();
380 uDstPort = 6502;
381 oProgressSrc = oSessionSrc.teleport('localhost', uDstPort, 'password', 1024);
382 if oProgressSrc is not None:
383 oProgressSrc.wait();
384 if oProgressSrc.isSuccess():
385 oProgressDst.wait();
386 if oProgressSrc.isSuccess() and oProgressDst.isSuccess():
387
388 # Terminate the source VM.
389 self.terminateVmBySession(oSessionSrc, oProgressSrc);
390
391 # Return with the source and destination swapped.
392 self.addTask(oSessionDst);
393 return oVmDst, oSessionDst, oVmSrc;
394
395 # Failure / bail out.
396 oProgressSrc.logResult();
397 oProgressDst.logResult();
398 self.terminateVmBySession(oSessionDst, oProgressDst);
399 return oVmSrc, oSessionSrc, oVmDst;
400
401 def test2OneCfg(self, sVmBaseName, cCpus, fHwVirt, fNestedPaging):
402 """
403 Runs the specified VM thru test #1.
404 """
405
406 # Reconfigure the source VM.
407 oVmSrc = self.getVmByName(sVmBaseName + '-1');
408 fRc = True;
409 oSession = self.openSession(oVmSrc);
410 if oSession is not None:
411 fRc = fRc and oSession.enableVirtEx(fHwVirt);
412 fRc = fRc and oSession.enableNestedPaging(fNestedPaging);
413 fRc = fRc and oSession.setCpuCount(cCpus);
414 fRc = fRc and oSession.setupTeleporter(False, uPort=6501, sPassword='password');
415 fRc = fRc and oSession.saveSettings();
416 fRc = oSession.close() and fRc and True; # pychecker hack.
417 oSession = None;
418 else:
419 fRc = False;
420
421 # Reconfigure the destination VM.
422 oVmDst = self.getVmByName(sVmBaseName + '-2');
423 oSession = self.openSession(oVmDst);
424 if oSession is not None:
425 fRc = fRc and oSession.enableVirtEx(fHwVirt);
426 fRc = fRc and oSession.enableNestedPaging(fNestedPaging);
427 fRc = fRc and oSession.setCpuCount(cCpus);
428 fRc = fRc and oSession.setupTeleporter(True, uPort=6502, sPassword='password');
429 fRc = fRc and oSession.saveSettings();
430 fRc = oSession.close() and fRc and True; # pychecker hack.
431 oSession = None;
432 else:
433 fRc = False;
434
435 # Simple test.
436 if fRc is True:
437 self.logVmInfo(oVmSrc);
438 self.logVmInfo(oVmDst);
439
440 # Start the source VM.
441 oSessionSrc = self.startVm(oVmSrc);
442 if oSessionSrc is not None:
443 self.addTask(oSessionSrc);
444
445 # Simple back and forth to test the ice...
446 cTeleportations = 0;
447 oVmSrc, oSessionSrc, oVmDst = self.test2Teleport(oVmSrc, oSessionSrc, oVmDst);
448 if reporter.testErrorCount() == 0:
449 cTeleportations += 1;
450 oVmSrc, oSessionSrc, oVmDst = self.test2Teleport(oVmSrc, oSessionSrc, oVmDst);
451
452 # Teleport back and forth for a while.
453 msStart = base.timestampMilli();
454 while reporter.testErrorCount() == 0:
455 cTeleportations += 1;
456 if oSessionSrc.txsTryConnectViaTcp(2500, 'localhost') is True:
457 break;
458 oVmSrc, oSessionSrc, oVmDst = self.test2Teleport(oVmSrc, oSessionSrc, oVmDst);
459 cMsElapsed = base.timestampMilli() - msStart;
460 if cMsElapsed > 5*60000:
461 reporter.testFailure('TXS did not show up after %u min of teleporting (%u)...' \
462 % (cMsElapsed / 60000.0, cTeleportations));
463 break;
464
465 # Clean up the source VM.
466 self.terminateVmBySession(oSessionSrc)
467 return None;
468
469 def test2OneVM(self, sVmBaseName, asSupVirtModes = None, rSupCpus = range(1, 256)):
470 """
471 Runs one VM (a pair really) thru the various configurations.
472 """
473 if asSupVirtModes is None:
474 asSupVirtModes = self.asVirtModes;
475
476 reporter.testStart(sVmBaseName);
477 for cCpus in self.acCpus:
478 if cCpus == 1: reporter.testStart('1 cpu');
479 else: reporter.testStart('%u cpus' % (cCpus));
480
481 for sVirtMode in self.asVirtModes:
482 if sVirtMode == 'raw' and cCpus > 1:
483 continue;
484 if cCpus not in rSupCpus:
485 continue;
486 if sVirtMode not in asSupVirtModes:
487 continue;
488 hsVirtModeDesc = {};
489 hsVirtModeDesc['raw'] = 'Raw-mode';
490 hsVirtModeDesc['hwvirt'] = 'HwVirt';
491 hsVirtModeDesc['hwvirt-np'] = 'NestedPaging';
492 reporter.testStart(hsVirtModeDesc[sVirtMode]);
493
494 fHwVirt = sVirtMode != 'raw';
495 fNestedPaging = sVirtMode == 'hwvirt-np';
496 self.test2OneCfg(sVmBaseName, cCpus, fHwVirt, fNestedPaging);
497
498 reporter.testDone();
499 reporter.testDone();
500 return reporter.testDone()[1] == 0;
501
502 def test2(self):
503 """
504 Executes test #2.
505 """
506
507 # Loop thru the test VMs.
508 fRc = True;
509 for sVM in self.asTestVMs:
510 # figure args.
511 asSupVirtModes = None;
512 if sVM in ('tst-sol11', 'tst-sol10'): # 64-bit only
513 asSupVirtModes = ['hwvirt', 'hwvirt-np',];
514
515 # run test on the VM.
516 if not self.test2OneVM(sVM, asSupVirtModes):
517 fRc = False;
518
519 return fRc;
520 #
521 # Test #1
522 #
523
524 def test1ResetVmConfig(self, oVM, fTeleporterEnabled = False):
525 """
526 Resets the teleportation config for the specified VM.
527 Returns True on success, False on failure.
528 """
529 oSession = self.openSession(oVM);
530 if oSession is not None:
531 fRc = oSession.setupTeleporter(fTeleporterEnabled, uPort=6502, sPassword='password');
532 fRc = fRc and oSession.saveSettings();
533 if not oSession.close(): fRc = False;
534 oSession = None;
535 else:
536 fRc = False;
537 return fRc;
538
539 def test1Sub7(self, oVmSrc, oVmDst):
540 """
541 Test the password check.
542 """
543 reporter.testStart('Bad password');
544 if self.test1ResetVmConfig(oVmSrc, fTeleporterEnabled = False) \
545 and self.test1ResetVmConfig(oVmDst, fTeleporterEnabled = True):
546 # Start the target VM.
547 oSessionDst, oProgressDst = self.startVmEx(oVmDst, fWait = False);
548 if oSessionDst is not None:
549 if oProgressDst.waitForOperation(iOperation = -3) == 0:
550 # Start the source VM.
551 oSessionSrc = self.startVm(oVmSrc);
552 if oSessionSrc is not None:
553 tsPasswords = ('password-bad', 'passwor', 'pass', 'p', '', 'Password', );
554 for sPassword in tsPasswords:
555 reporter.testStart(sPassword);
556 oProgressSrc = oSessionSrc.teleport('localhost', 6502, sPassword);
557 if oProgressSrc:
558 oProgressSrc.wait();
559 reporter.log('src: %s' % oProgressSrc.stringifyResult());
560 if oProgressSrc.isSuccess():
561 reporter.testFailure('IConsole::teleport succeeded with bad password "%s"' % sPassword);
562 elif oProgressSrc.getErrInfoResultCode() != vbox.ComError.E_FAIL:
563 reporter.testFailure('IConsole::teleport returns %s instead of E_FAIL' \
564 % (vbox.ComError.toString(oProgressSrc.getErrInfoResultCode()),));
565 elif oProgressSrc.getErrInfoText() != 'Invalid password':
566 reporter.testFailure('IConsole::teleport returns "%s" instead of "Invalid password"' \
567 % (oProgressSrc.getErrInfoText(),));
568 elif oProgressDst.isCompleted():
569 reporter.testFailure('Destination completed unexpectedly after bad password "%s"' \
570 % sPassword);
571 else:
572 reporter.testFailure('IConsole::teleport failed with password "%s"' % sPassword);
573 if reporter.testDone()[1] != 0:
574 break;
575 self.terminateVmBySession(oSessionSrc, oProgressSrc);
576 self.terminateVmBySession(oSessionDst, oProgressDst);
577 else:
578 reporter.testFailure('reconfig failed');
579 return reporter.testDone()[1] == 0;
580
581 def test1Sub6(self, oVmSrc, oVmDst):
582 """
583 Misconfigure the target VM and check that teleportation fails with the
584 same status and message on both ends.
585 xTracker: #4813
586 """
587 reporter.testStart('Misconfiguration & error message');
588 if self.test1ResetVmConfig(oVmSrc, fTeleporterEnabled = False) \
589 and self.test1ResetVmConfig(oVmDst, fTeleporterEnabled = True):
590 # Give the source a bit more RAM.
591 oSession = self.openSession(oVmSrc);
592 if oSession is not None:
593 try: cbMB = oVmSrc.memorySize + 4;
594 except: cbMB = 1; fRc = False;
595 fRc = oSession.setRamSize(cbMB);
596 if not oSession.saveSettings(): fRc = False;
597 if not oSession.close(): fRc = False;
598 oSession = None;
599 else:
600 fRc = False;
601 if fRc:
602 # Start the target VM.
603 oSessionDst, oProgressDst = self.startVmEx(oVmDst, fWait = False);
604 if oSessionDst is not None:
605 if oProgressDst.waitForOperation(iOperation = -3) == 0:
606 # Start the source VM.
607 oSessionSrc = self.startVm(oVmSrc);
608 if oSessionSrc is not None:
609 # Try teleport.
610 oProgressSrc = oSessionSrc.teleport('localhost', 6502, 'password');
611 if oProgressSrc:
612 oProgressSrc.wait();
613 oProgressDst.wait();
614
615 reporter.log('src: %s' % oProgressSrc.stringifyResult());
616 reporter.log('dst: %s' % oProgressDst.stringifyResult());
617
618 # Make sure it failed.
619 if oProgressSrc.isSuccess() and oProgressDst.isSuccess():
620 reporter.testFailure('The teleporation did not fail as expected');
621
622 # Compare the results.
623 if oProgressSrc.getResult() != oProgressDst.getResult():
624 reporter.testFailure('Result differs - src=%s dst=%s' \
625 % (vbox.ComError.toString(oProgressSrc.getResult()),\
626 vbox.ComError.toString(oProgressDst.getResult())));
627 elif oProgressSrc.getErrInfoResultCode() != oProgressDst.getErrInfoResultCode():
628 reporter.testFailure('ErrorInfo::resultCode differs - src=%s dst=%s' \
629 % (vbox.ComError.toString(oProgressSrc.getErrInfoResultCode()),\
630 vbox.ComError.toString(oProgressDst.getErrInfoResultCode())));
631 elif oProgressSrc.getErrInfoText() != oProgressDst.getErrInfoText():
632 reporter.testFailure('ErrorInfo::text differs - src="%s" dst="%s"' \
633 % (oProgressSrc.getErrInfoText(), oProgressDst.getErrInfoText()));
634
635 self.terminateVmBySession(oSessionSrc, oProgressSrc);
636 self.terminateVmBySession(oSessionDst, oProgressDst);
637 self.test1ResetVmConfig(oVmSrc, fTeleporterEnabled = False)
638 self.test1ResetVmConfig(oVmDst, fTeleporterEnabled = True);
639 else:
640 reporter.testFailure('reconfig #2 failed');
641 else:
642 reporter.testFailure('reconfig #1 failed');
643 return reporter.testDone()[1] == 0;
644
645 def test1Sub5(self, oVmSrc, oVmDst):
646 """
647 Test that basic teleporting works.
648 xTracker: #4749
649 """
650 reporter.testStart('Simple teleportation');
651 for cSecsX2 in range(0, 10):
652 if self.test1ResetVmConfig(oVmSrc, fTeleporterEnabled = False) \
653 and self.test1ResetVmConfig(oVmDst, fTeleporterEnabled = True):
654 # Start the target VM.
655 oSessionDst, oProgressDst = self.startVmEx(oVmDst, fWait = False);
656 if oSessionDst is not None:
657 if oProgressDst.waitForOperation(iOperation = -3) == 0:
658 # Start the source VM.
659 oSessionSrc = self.startVm(oVmSrc);
660 if oSessionSrc is not None:
661 self.sleep(cSecsX2 / 2);
662 # Try teleport.
663 oProgressSrc = oSessionSrc.teleport('localhost', 6502, 'password');
664 if oProgressSrc:
665 oProgressSrc.wait();
666 oProgressDst.wait();
667
668 self.terminateVmBySession(oSessionSrc, oProgressSrc);
669 self.terminateVmBySession(oSessionDst, oProgressDst);
670 else:
671 reporter.testFailure('reconfig failed');
672 return reporter.testDone()[1] == 0;
673
674 def test1Sub4(self, oVM):
675 """
676 Test that we can start and cancel a teleportation target.
677 (No source VM trying to connect here.)
678 xTracker: #4965
679 """
680 reporter.testStart('openRemoteSession cancel');
681 for cSecsX2 in range(0, 10):
682 if self.test1ResetVmConfig(oVM, fTeleporterEnabled = True):
683 oSession, oProgress = self.startVmEx(oVM, fWait = False);
684 if oSession is not None:
685 self.sleep(cSecsX2 / 2);
686 oProgress.cancel();
687 oProgress.wait();
688 self.terminateVmBySession(oSession, oProgress);
689 else:
690 reporter.testFailure('reconfig failed');
691 return reporter.testDone()[1] == 0;
692
693 def test1Sub3(self, oVM):
694 """
695 Test that starting a teleportation target VM will fail if we give it
696 a bad address to bind to.
697 """
698 reporter.testStart('bad IMachine::teleporterAddress');
699
700 # re-configure it with a bad bind-to address.
701 fRc = False;
702 oSession = self.openSession(oVM);
703 if oSession is not None:
704 fRc = oSession.setupTeleporter(True, uPort=6502, sAddress='no.such.hostname.should.ever.exist.duh');
705 if not oSession.saveSettings(fClose=True): fRc = False;
706 oSession = None;
707 if fRc:
708 # Try start it.
709 oSession, oProgress = self.startVmEx(oVM, fWait = False);
710 if oSession is not None:
711 oProgress.wait();
712 ## TODO: exact error code and look for the IPRT right string.
713 if not oProgress.isCompleted() or oProgress.getResult() >= 0:
714 reporter.testFailure('%s' % (oProgress.stringifyResult(),));
715 self.terminateVmBySession(oSession, oProgress);
716
717 # put back the old teleporter setup.
718 self.test1ResetVmConfig(oVM, fTeleporterEnabled = True);
719 else:
720 reporter.testFailure('reconfig #1 failed');
721 return reporter.testDone()[1] == 0;
722
723 # test1Sub2 - start
724
725 def test1Sub2SetEnabled(self, oSession, fEnabled):
726 """ This should never fail."""
727 try:
728 oSession.o.machine.teleporterEnabled = fEnabled;
729 except:
730 reporter.testFailureXcpt('machine.teleporterEnabled=%s' % (fEnabled,));
731 return False;
732 try:
733 fNew = oSession.o.machine.teleporterEnabled;
734 except:
735 reporter.testFailureXcpt();
736 return False;
737 if fNew != fEnabled:
738 reporter.testFailure('machine.teleporterEnabled=%s but afterwards it is actually %s' % (fEnabled, fNew));
739 return False;
740 return True;
741
742 def test1Sub2SetPassword(self, oSession, sPassword):
743 """ This should never fail."""
744 try:
745 oSession.o.machine.teleporterPassword = sPassword;
746 except:
747 reporter.testFailureXcpt('machine.teleporterPassword=%s' % (sPassword,));
748 return False;
749 try:
750 sNew = oSession.o.machine.teleporterPassword;
751 except:
752 reporter.testFailureXcpt();
753 return False;
754 if sNew != sPassword:
755 reporter.testFailure('machine.teleporterPassword="%s" but afterwards it is actually "%s"' % (sPassword, sNew));
756 return False;
757 return True;
758
759 def test1Sub2SetPort(self, oSession, uPort, fInvalid = False):
760 """ This can fail, thus fInvalid."""
761 if not fInvalid:
762 uOld = uPort;
763 else:
764 try: uOld = oSession.o.machine.teleporterPort;
765 except: return reporter.testFailureXcpt();
766
767 try:
768 oSession.o.machine.teleporterPort = uPort;
769 except Exception, oXcpt:
770 if not fInvalid or vbox.ComError.notEqual(oXcpt, vbox.ComError.E_INVALIDARG):
771 return reporter.testFailureXcpt('machine.teleporterPort=%u' % (uPort,));
772 else:
773 if fInvalid:
774 return reporter.testFailureXcpt('machine.teleporterPort=%u succeeded unexpectedly' % (uPort,));
775
776 try: uNew = oSession.o.machine.teleporterPort;
777 except: return reporter.testFailureXcpt();
778 if uNew != uOld:
779 if not fInvalid:
780 reporter.testFailure('machine.teleporterPort=%u but afterwards it is actually %u' % (uPort, uNew));
781 else:
782 reporter.testFailure('machine.teleporterPort is %u after failure, expected %u' % (uNew, uOld));
783 return False;
784 return True;
785
786 def test1Sub2SetAddress(self, oSession, sAddress):
787 """ This should never fail."""
788 try:
789 oSession.o.machine.teleporterAddress = sAddress;
790 except:
791 reporter.testFailureXcpt('machine.teleporterAddress=%s' % (sAddress,));
792 return False;
793 try:
794 sNew = oSession.o.machine.teleporterAddress;
795 except:
796 reporter.testFailureXcpt();
797 return False;
798 if sNew != sAddress:
799 reporter.testFailure('machine.teleporterAddress="%s" but afterwards it is actually "%s"' % (sAddress, sNew));
800 return False;
801 return True;
802
803 def test1Sub2(self, oVM):
804 """
805 Test the attributes, making sure that we get exceptions on bad values.
806 """
807 reporter.testStart('IMachine::teleport*');
808
809 # Save the original teleporter attributes for the discard test.
810 try:
811 sOrgAddress = oVM.teleporterAddress;
812 uOrgPort = oVM.teleporterPort;
813 sOrgPassword = oVM.teleporterPassword;
814 fOrgEnabled = oVM.teleporterEnabled;
815 except:
816 reporter.testFailureXcpt();
817 else:
818 # Open a session and start messing with the properties.
819 oSession = self.openSession(oVM);
820 if oSession is not None:
821 # Anything goes for the address.
822 reporter.testStart('teleporterAddress');
823 self.test1Sub2SetAddress(oSession, '');
824 self.test1Sub2SetAddress(oSession, '1');
825 self.test1Sub2SetAddress(oSession, 'Anything goes! ^&$@!$%^');
826 reporter.testDone();
827
828 # The port is restricted to {0..65535}.
829 reporter.testStart('teleporterPort');
830 for uPort in range(0, 1000) + range(16000, 17000) + range(32000, 33000) + range(65000, 65536):
831 if not self.test1Sub2SetPort(oSession, uPort):
832 break;
833 self.processPendingEvents();
834 reporter.testDone();
835
836 reporter.testStart('teleporterPort negative');
837 self.test1Sub2SetPort(oSession, 65536, True);
838 self.test1Sub2SetPort(oSession, 999999, True);
839 reporter.testDone();
840
841 # Anything goes for the password.
842 reporter.testStart('teleporterPassword');
843 self.test1Sub2SetPassword(oSession, 'password');
844 self.test1Sub2SetPassword(oSession, '');
845 self.test1Sub2SetPassword(oSession, '1');
846 self.test1Sub2SetPassword(oSession, 'Anything goes! ^&$@!$%^');
847 reporter.testDone();
848
849 # Just test that it works.
850 reporter.testStart('teleporterEnabled');
851 self.test1Sub2SetEnabled(oSession, True);
852 self.test1Sub2SetEnabled(oSession, True);
853 self.test1Sub2SetEnabled(oSession, False);
854 self.test1Sub2SetEnabled(oSession, False);
855 reporter.testDone();
856
857 # Finally, discard the changes, close the session and check
858 # that we're back to the originals.
859 if not oSession.discardSettings(True):
860 reporter.testFailure('Failed to discard settings & close the session')
861 else:
862 reporter.testFailure('Failed to open VM session')
863 try:
864 if oVM.teleporterAddress != sOrgAddress: reporter.testFailure('Rollback failed for teleporterAddress');
865 if oVM.teleporterPort != uOrgPort: reporter.testFailure('Rollback failed for teleporterPort');
866 if oVM.teleporterPassword != sOrgPassword: reporter.testFailure('Rollback failed for teleporterPassword');
867 if oVM.teleporterEnabled != fOrgEnabled: reporter.testFailure('Rollback failed for teleporterEnabled');
868 except:
869 reporter.testFailureXcpt();
870 return reporter.testDone()[1] != 0;
871
872 # test1Sub1 - start
873
874 def test1Sub1DoTeleport(self, oSession, sHostname, uPort, sPassword, cMsMaxDowntime, hrcExpected, sTestName):
875 """ Do a bad IConsole::teleport call and check the result."""
876 reporter.testStart(sTestName);
877 fRc = False;
878 try:
879 oProgress = oSession.o.console.teleport(sHostname, uPort, sPassword, cMsMaxDowntime);
880 except vbox.ComException, oXcpt:
881 if vbox.ComError.equal(oXcpt, hrcExpected):
882 fRc = True;
883 else:
884 reporter.testFailure('hresult %s, expected %s' \
885 % (vbox.ComError.toString(oXcpt.hresult),
886 vbox.ComError.toString(hrcExpected)));
887 except Exception, oXcpt:
888 reporter.testFailure('Unexpected exception %s' % (oXcpt));
889 else:
890 reporter.testFailure('Unpexected success');
891 oProgress.cancel();
892 oProgress.wait();
893 reporter.testDone();
894 return fRc;
895
896 def test1Sub1(self, oVM):
897 """ Test simple IConsole::teleport() failure paths. """
898 reporter.testStart('IConsole::teleport');
899 oSession = self.startVm(oVM);
900 if oSession:
901 self.test1Sub1DoTeleport(oSession, 'localhost', 65536, 'password', 10000,
902 vbox.ComError.E_INVALIDARG, 'Bad port value 65536');
903 self.test1Sub1DoTeleport(oSession, 'localhost', 0, 'password', 10000,
904 vbox.ComError.E_INVALIDARG, 'Bad port value 0');
905 self.test1Sub1DoTeleport(oSession, 'localhost', 5000, 'password', 0,
906 vbox.ComError.E_INVALIDARG, 'Bad max downtime');
907 self.test1Sub1DoTeleport(oSession, '', 5000, 'password', 10000,
908 vbox.ComError.E_INVALIDARG, 'No hostname');
909 self.test1Sub1DoTeleport(oSession, 'no.such.hostname.should.ever.exist.duh', 5000, 'password', 0,
910 vbox.ComError.E_INVALIDARG, 'Non-existing host');
911
912 self.terminateVmBySession(oSession)
913 else:
914 reporter.testFailure('startVm');
915 return reporter.testDone()[1] == 0;
916
917
918 def test1(self):
919 """
920 Executes test #1 - Negative API testing.
921
922 ASSUMES that the VMs are
923 """
924 reporter.testStart('Test 1');
925
926 # Get the VMs.
927 #oVmHwVirt1 = self.getVmByName('tst-empty-hwvirt-1');
928 #oVmHwVirt2 = self.getVmByName('tst-empty-hwvirt-2');
929 oVmRaw1 = self.getVmByName('tst-empty-raw-1');
930 oVmRaw2 = self.getVmByName('tst-empty-raw-2');
931
932 # Reset their teleportation related configuration.
933 fRc = True;
934 #for oVM in (oVmHwVirt1, oVmHwVirt2, oVmRaw1, oVmRaw2):
935 for oVM in (oVmRaw1, oVmRaw2):
936 if not self.test1ResetVmConfig(oVM): fRc = False;
937
938 # Do the testing (don't both with fRc on the subtests).
939 if fRc:
940 self.test1Sub1(oVmRaw1);
941 self.test1Sub2(oVmRaw2);
942 self.test1Sub3(oVmRaw2);
943 self.test1Sub4(oVmRaw2);
944 self.processPendingEvents();
945 self.test1Sub5(oVmRaw1, oVmRaw2);
946 self.test1Sub6(oVmRaw1, oVmRaw2);
947 self.test1Sub7(oVmRaw1, oVmRaw2);
948 else:
949 reporter.testFailure('Failed to reset the VM configs')
950 return reporter.testDone()[1] == 0;
951
952
953
954if __name__ == '__main__':
955 sys.exit(tdTeleportLocal1().main(sys.argv));
956
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