* [KVM-AUTOTEST PATCH 1/9] KVM test: kvm_vm.py: make -drive index optional for both images and cdrom ISOs
@ 2010-07-15 15:57 Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 2/9] KVM test: allow definition of multiple cdroms Michael Goldish
0 siblings, 1 reply; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm; +Cc: Michael Goldish
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/kvm_vm.py | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index 6cd0688..248aeca 100755
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -214,16 +214,18 @@ class VM:
def add_smp(help, smp):
return " -smp %s" % smp
- def add_cdrom(help, filename, index=2):
+ def add_cdrom(help, filename, index=None):
if has_option(help, "drive"):
- return " -drive file='%s',index=%d,media=cdrom" % (filename,
- index)
+ cmd = " -drive file='%s',media=cdrom" % filename
+ if index is not None: cmd += ",index=%s" % index
+ return cmd
else:
return " -cdrom '%s'" % filename
- def add_drive(help, filename, format=None, cache=None, werror=None,
- serial=None, snapshot=False, boot=False):
+ def add_drive(help, filename, index=None, format=None, cache=None,
+ werror=None, serial=None, snapshot=False, boot=False):
cmd = " -drive file='%s'" % filename
+ if index is not None: cmd += ",index=%s" % index
if format: cmd += ",if=%s" % format
if cache: cmd += ",cache=%s" % cache
if werror: cmd += ",werror=%s" % werror
@@ -362,6 +364,7 @@ class VM:
continue
qemu_cmd += add_drive(help,
get_image_filename(image_params, root_dir),
+ image_params.get("drive_index"),
image_params.get("drive_format"),
image_params.get("drive_cache"),
image_params.get("drive_werror"),
@@ -414,7 +417,7 @@ class VM:
iso = params.get("cdrom")
if iso:
iso = kvm_utils.get_path(root_dir, iso)
- qemu_cmd += add_cdrom(help, iso)
+ qemu_cmd += add_cdrom(help, iso, 2)
# Even though this is not a really scalable approach,
# it doesn't seem like we are going to need more than
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 2/9] KVM test: allow definition of multiple cdroms
2010-07-15 15:57 [KVM-AUTOTEST PATCH 1/9] KVM test: kvm_vm.py: make -drive index optional for both images and cdrom ISOs Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 3/9] KVM test: rss_file_transfer.py: add convenience functions upload() and download() Michael Goldish
0 siblings, 1 reply; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm
Instead of using 'cdrom_extra', define 'cdroms' similarly to 'images'.
Also set -drive indices for cd1 and image1.
Also fix regular expression in tests.cfg.sample, so it doesn't match 'cdroms'
when it shouldn't.
Note: if you use your own tests.cfg, you should change the line
cdrom.* ?<= ...
to
cdrom(_.*)? ?<= ...
It won't hurt to do the same for image_name.
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/kvm_vm.py | 19 +++++++------------
client/tests/kvm/tests.cfg.sample | 4 ++--
client/tests/kvm/tests_base.cfg.sample | 10 ++++++++--
3 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index 248aeca..bdc9aab 100755
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -414,18 +414,13 @@ class VM:
if smp:
qemu_cmd += add_smp(help, smp)
- iso = params.get("cdrom")
- if iso:
- iso = kvm_utils.get_path(root_dir, iso)
- qemu_cmd += add_cdrom(help, iso, 2)
-
- # Even though this is not a really scalable approach,
- # it doesn't seem like we are going to need more than
- # 2 CDs active on the same VM.
- iso_extra = params.get("cdrom_extra")
- if iso_extra:
- iso_extra = kvm_utils.get_path(root_dir, iso_extra)
- qemu_cmd += add_cdrom(help, iso_extra, 3)
+ cdroms = kvm_utils.get_sub_dict_names(params, "cdroms")
+ for cdrom in cdroms:
+ cdrom_params = kvm_utils.get_sub_dict(params, cdrom)
+ iso = cdrom_params.get("cdrom")
+ if iso:
+ qemu_cmd += add_cdrom(help, kvm_utils.get_path(root_dir, iso),
+ cdrom_params.get("drive_index"))
# We may want to add {floppy_otps} parameter for -fda
# {fat:floppy:}/path/. However vvfat is not usually recommended.
diff --git a/client/tests/kvm/tests.cfg.sample b/client/tests/kvm/tests.cfg.sample
index 6d5f244..e01406e 100644
--- a/client/tests/kvm/tests.cfg.sample
+++ b/client/tests/kvm/tests.cfg.sample
@@ -13,8 +13,8 @@ include cdkeys.cfg
# * All image files are expected under /tmp/kvm_autotest_root/images/
# * All iso files are expected under /tmp/kvm_autotest_root/isos/
qemu_img_binary = /usr/bin/qemu-img
-image_name.* ?<= /tmp/kvm_autotest_root/images/
-cdrom.* ?<= /tmp/kvm_autotest_root/isos/
+image_name(_.*)? ?<= /tmp/kvm_autotest_root/images/
+cdrom(_.*)? ?<= /tmp/kvm_autotest_root/isos/
# Here are the test sets variants. The variant 'qemu_kvm_windows_quick' is
# fully commented, the following ones have comments only on noteworthy points
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index c2def29..d0b8acb 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -3,9 +3,10 @@
# Define the objects we'll be using
vms = vm1
images = image1
+cdroms = cd1
nics = nic1
monitors = humanmonitor1
-login_timeout = 360
+
# Choose the main VM and monitor
main_vm = vm1
main_monitor = humanmonitor1
@@ -33,8 +34,10 @@ qemu_img_binary = qemu-img
smp = 1
mem = 512
image_size = 10G
+drive_index_image1 = 0
shell_port = 22
display = vnc
+drive_index_cd1 = 2
# Monitor params
monitor_type = human
@@ -56,6 +59,7 @@ run_tcpdump = yes
# Misc
profilers = kvm_stat
+login_timeout = 360
# Tests
@@ -1044,7 +1048,9 @@ variants:
unattended_install.cdrom:
timeout = 7200
finish_program = deps/finish.exe
- cdrom_extra = windows/winutils.iso
+ cdroms += " extracd"
+ cdrom_extracd = windows/winutils.iso
+ drive_index_extracd = 3
migrate:
migration_test_command = ver && vol
migration_bg_command = start ping -t localhost
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 3/9] KVM test: rss_file_transfer.py: add convenience functions upload() and download()
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 2/9] KVM test: allow definition of multiple cdroms Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 4/9] [RFC] KVM test: DTM automation program for WHQL tests Michael Goldish
0 siblings, 1 reply; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
| 32 ++++++++++++++++++++++++++------
1 files changed, 26 insertions(+), 6 deletions(-)
--git a/client/tests/kvm/rss_file_transfer.py b/client/tests/kvm/rss_file_transfer.py
index c584397..3de8259 100755
--- a/client/tests/kvm/rss_file_transfer.py
+++ b/client/tests/kvm/rss_file_transfer.py
@@ -395,6 +395,30 @@ class FileDownloadClient(FileTransferClient):
raise
+def upload(address, port, src_pattern, dst_path, timeout=60,
+ connect_timeout=10):
+ """
+ Connect to server and upload files.
+
+ @see: FileUploadClient
+ """
+ client = FileUploadClient(address, port, connect_timeout)
+ client.upload(src_pattern, dst_path, timeout)
+ client.close()
+
+
+def download(address, port, src_pattern, dst_path, timeout=60,
+ connect_timeout=10):
+ """
+ Connect to server and upload files.
+
+ @see: FileDownloadClient
+ """
+ client = FileDownloadClient(address, port, connect_timeout)
+ client.download(src_pattern, dst_path, timeout)
+ client.close()
+
+
def main():
import optparse
@@ -418,13 +442,9 @@ def main():
port = int(port)
if options.download:
- client = FileDownloadClient(address, port)
- client.download(src_pattern, dst_path, timeout=options.timeout)
- client.close()
+ download(address, port, src_pattern, dst_path, options.timeout)
elif options.upload:
- client = FileUploadClient(address, port)
- client.upload(src_pattern, dst_path, timeout=options.timeout)
- client.close()
+ upload(address, port, src_pattern, dst_path, options.timeout)
if __name__ == "__main__":
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 4/9] [RFC] KVM test: DTM automation program for WHQL tests
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 3/9] KVM test: rss_file_transfer.py: add convenience functions upload() and download() Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 5/9] [RFC] KVM test: DTM machine deletion tool " Michael Goldish
0 siblings, 1 reply; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm
This C# program should run on a DTM/WHQL server. It's used by the
whql_submission test to schedule and monitor device submission jobs.
Note: the binary is copied to the server at run time, so it doesn't need to be
packaged in winutils.iso.
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/deps/whql_submission_15.cs | 254 ++++++++++++++++++++++++++
client/tests/kvm/deps/whql_submission_15.exe | Bin 0 -> 10240 bytes
2 files changed, 254 insertions(+), 0 deletions(-)
create mode 100644 client/tests/kvm/deps/whql_submission_15.cs
create mode 100644 client/tests/kvm/deps/whql_submission_15.exe
diff --git a/client/tests/kvm/deps/whql_submission_15.cs b/client/tests/kvm/deps/whql_submission_15.cs
new file mode 100644
index 0000000..540674a
--- /dev/null
+++ b/client/tests/kvm/deps/whql_submission_15.cs
@@ -0,0 +1,254 @@
+// DTM submission automation program
+// Author: Michael Goldish <mgoldish@redhat.com>
+// Based on sample code by Microsoft.
+
+// Note: this program has only been tested with DTM version 1.5.
+// It might fail to work with other versions, specifically because it uses
+// a few undocumented methods/attributes.
+
+using System;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using Microsoft.DistributedAutomation.DeviceSelection;
+using Microsoft.DistributedAutomation.SqlDataStore;
+
+namespace automate0
+{
+ class AutoJob
+ {
+ static int Main(string[] args)
+ {
+ if (args.Length != 5)
+ {
+ Console.WriteLine("Error: incorrect number of command line arguments");
+ Console.WriteLine("Usage: {0} serverName clientName machinePoolName submissionName timeout",
+ System.Environment.GetCommandLineArgs()[0]);
+ return 1;
+ }
+ string serverName = args[0];
+ string clientName = args[1];
+ string machinePoolName = args[2];
+ string submissionName = args[3];
+ double timeout = Convert.ToDouble(args[4]);
+
+ try
+ {
+ // Initialize DeviceScript and connect to data store
+ Console.WriteLine("Initializing DeviceScript object");
+ DeviceScript script = new DeviceScript();
+ Console.WriteLine("Connecting to data store");
+
+ script.ConnectToNamedDataStore(serverName);
+
+ // Find client machine
+ IResourcePool rootPool = script.GetResourcePoolByName("$");
+ Console.WriteLine("Looking for client machine '{0}'", clientName);
+ IResource machine = null;
+ while (true)
+ {
+ try
+ {
+ machine = rootPool.GetResourceByName(clientName);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Warning: " + e.Message);
+ }
+ // Make sure the machine is valid
+ if (machine != null &&
+ machine.OperatingSystem != null &&
+ machine.OperatingSystem.Length > 0 &&
+ machine.ProcessorArchitecture != null &&
+ machine.ProcessorArchitecture.Length > 0 &&
+ machine.GetDevices().Length > 0)
+ break;
+ System.Threading.Thread.Sleep(1000);
+ }
+ Console.WriteLine("Client machine '{0}' found ({1}, {2})",
+ clientName, machine.OperatingSystem, machine.ProcessorArchitecture);
+
+ // Create machine pool and add client machine to it
+ // (this must be done because jobs cannot be scheduled for machines in the
+ // default pool)
+ try
+ {
+ script.CreateResourcePool(machinePoolName, rootPool.ResourcePoolId);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Warning: " + e.Message);
+ }
+ IResourcePool newPool = script.GetResourcePoolByName(machinePoolName);
+ Console.WriteLine("Moving the client machine to pool '{0}'", machinePoolName);
+ machine.ChangeResourcePool(newPool);
+
+ // Reset client machine
+ if (machine.Status != "Ready")
+ {
+ Console.WriteLine("Changing the client machine's status to 'Reset'");
+ while (true)
+ {
+ try
+ {
+ machine.ChangeResourceStatus("Reset");
+ break;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Warning: " + e.Message);
+ }
+ System.Threading.Thread.Sleep(5000);
+ }
+ Console.WriteLine("Waiting for client machine to be ready");
+ while (machine.Status != "Ready")
+ {
+ try
+ {
+ machine = rootPool.GetResourceByName(clientName);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Warning: " + e.Message);
+ }
+ System.Threading.Thread.Sleep(1000);
+ }
+ }
+ Console.WriteLine("Client machine is ready");
+
+ // Get requested device regex and look for a matching device
+ Console.WriteLine("Device to test: ");
+ Regex deviceRegex = new Regex(Console.ReadLine(), RegexOptions.IgnoreCase);
+ Console.WriteLine("Looking for device '{0}'", deviceRegex);
+ IDevice device = null;
+ foreach (IDevice d in machine.GetDevices())
+ {
+ if (deviceRegex.IsMatch(d.FriendlyName))
+ {
+ device = d;
+ Console.WriteLine("Found device '{0}'", d.FriendlyName);
+ break;
+ }
+ }
+ if (device == null)
+ {
+ Console.WriteLine("Error: device '{0}' not found", deviceRegex);
+ return 1;
+ }
+
+ // Create submission
+ Object[] existingSubmissions = script.GetSubmissionByName(submissionName);
+ if (existingSubmissions.Length > 0)
+ {
+ Console.WriteLine("Submission '{0}' already exists -- removing it",
+ submissionName);
+ script.DeleteSubmission(((ISubmission)existingSubmissions[0]).Id);
+ }
+ Console.WriteLine("Creating submission '{0}'", submissionName);
+ ISubmission submission = script.CreateHardwareSubmission(submissionName,
+ newPool.ResourcePoolId, device.InstanceId);
+
+ // Get DeviceData objects from the user
+ List<Object> deviceDataList = new List<Object>();
+ while (true)
+ {
+ ISubmissionDeviceData dd = script.CreateNewSubmissionDeviceData();
+ Console.WriteLine("DeviceData name: ");
+ dd.Name = Console.ReadLine();
+ if (dd.Name.Length == 0)
+ break;
+ Console.WriteLine("DeviceData data: ");
+ dd.Data = Console.ReadLine();
+ deviceDataList.Add(dd);
+ }
+
+ // Set the submission's DeviceData
+ submission.SetDeviceData(deviceDataList.ToArray());
+
+ // Get descriptors from the user
+ List<Object> descriptorList = new List<Object>();
+ while (true)
+ {
+ Console.WriteLine("Descriptor path: ");
+ string descriptorPath = Console.ReadLine();
+ if (descriptorPath.Length == 0)
+ break;
+ descriptorList.Add(script.GetDescriptorByPath(descriptorPath));
+ }
+
+ // Set the submission's descriptors
+ submission.SetLogoDescriptors(descriptorList.ToArray());
+
+ // Create a schedule
+ ISchedule schedule = script.CreateNewSchedule();
+ Console.WriteLine("Scheduling jobs:");
+ foreach (IJob j in submission.GetJobs())
+ {
+ Console.WriteLine(" " + j.Name);
+ schedule.AddDeviceJob(device, j);
+ }
+ schedule.AddSubmission(submission);
+ schedule.SetResourcePool(newPool);
+ script.RunSchedule(schedule);
+
+ // Wait for jobs to complete
+ Console.WriteLine("Waiting for all jobs to complete (timeout={0})", timeout);
+ DateTime endTime = DateTime.Now.AddSeconds(timeout);
+ int numCompleted = 0, numFailed = 0;
+ while (numCompleted < submission.GetResults().Length && DateTime.Now < endTime)
+ {
+ // Sleep for 30 seconds
+ System.Threading.Thread.Sleep(30000);
+ // Count completed submission jobs
+ numCompleted = 0;
+ foreach (IResult r in submission.GetResults())
+ if (r.ResultStatus != "InProgress")
+ numCompleted++;
+ // Report results in a Python readable format and count failed schedule jobs
+ // (submission jobs are a subset of schedule jobs)
+ Console.WriteLine();
+ Console.WriteLine("---- [");
+ numFailed = 0;
+ foreach (IResult r in schedule.GetResults())
+ {
+ Console.WriteLine(" {");
+ Console.WriteLine(" 'job': r'''{0}''',", r.Job.Name);
+ Console.WriteLine(" 'logs': r'''{0}''',", r.LogLocation);
+ if (r.ResultStatus != "InProgress")
+ Console.WriteLine(" 'report': r'''{0}''',",
+ submission.GetSubmissionResultReport(r));
+ Console.WriteLine(" 'status': '{0}',", r.ResultStatus);
+ Console.WriteLine(" 'pass': {0}, 'fail': {1}, 'notrun': {2}, 'notapplicable': {3}",
+ r.Pass, r.Fail, r.NotRun, r.NotApplicable);
+ Console.WriteLine(" },");
+ numFailed += r.Fail;
+ }
+ Console.WriteLine("] ----");
+ }
+ Console.WriteLine();
+
+ // Cancel incomplete jobs
+ foreach (IResult r in schedule.GetResults())
+ if (r.ResultStatus == "InProgress")
+ r.Cancel();
+
+ // Report failures
+ if (numCompleted < submission.GetResults().Length)
+ Console.WriteLine("Some jobs did not complete on time.");
+ if (numFailed > 0)
+ Console.WriteLine("Some jobs failed.");
+
+ if (numFailed > 0 || numCompleted < submission.GetResults().Length)
+ return 1;
+
+ Console.WriteLine("All jobs completed.");
+
+ return 0;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Error: " + e.Message);
+ return 1;
+ }
+ }
+ }
+}
diff --git a/client/tests/kvm/deps/whql_submission_15.exe b/client/tests/kvm/deps/whql_submission_15.exe
new file mode 100644
index 0000000000000000000000000000000000000000..1e513a1783db619fbc8b17f9245783087f235232
GIT binary patch
literal 10240
zcmeHMeQX@Zb$@#wyyJ;HYwo0@M3M56l*FS*9!W`VBt^1Fk(6={Dakxawi_wZ@@_?~
za(8>4-IGb%X%qx09Kcp=AT0_tZR(<Fn*s&w#6{z#wu^qaC}0OkksvM#t4?7!MrzbS
zn)D+^qW<3OF7HT5u7dWT0$Flr-+S}koA)&{yK}R@{3L~mD1!U?b)v80$=A4Q-@mzx
z?&O_+mZaxeU+wv-HuGxF`~}O=YtmknMnx|g)vE343#KmXRo$xUQ^yN>#V(n-_V&a!
zU-gM;q8Tkrk6*icCK&Av3Tf-KIMG&6@Zjs(K{Pt<aopVKc!WH=0V(_WNtbbh&R3Ym
zKTWh={WqRI>aoyc&|6@5oai+U!rJQ`Q5$Hl9U$sj+xLFBzGAxKiUa>p6MxP%mt5d)
zcB4U`^3}H+n7VYLb2;hAA~0p!IDi)1I_{=x9M<QgS+>E*w$eG=tZN7ErfZz&a1*M)
zzu>syV%tI#r5|L8-cA!~z;W|vKi9QoG(ts4K~{vWSX*-45@0Qh&?cnGP!v$+Y8E_+
zj-8>*)kLV{>blUTt8JmpSKC9KSF<tnq$Bd*12G3BkVr@6Ud`7dqAhkSXd)^vf@UYU
zzeQF7$CTa;>6mDV+3T1dyVjYG%V*Fh;x?j_$hLFC_FN+o8#*9jb`r?YZXdAk0G1is
z1{9@}7~0|kKD`a70R4)U8Ew<w#@xxKfDT@ff6e3jN_?3tA_+6&qQ%|-$li!%2MlWU
z3~Ig6plIB4Cn48|s1{f5h?q#&8P*iDJMfU_(3RZ;Xx|e^jx00E4vCn21+cvt@U<Q3
zb>1lJZWu*>40d^Dzan1?qz6Y=1+C4KZo5%>#pxUD8Gb?T2>Zs!QvsCiggqV37PRSh
zxdgIk_w$s53XW!4&!l?>_X%C}Ty;Uv(szh<afgj5m#{HK5<?y0j&xG~5es`{rC~5B
zdOGe;_lO>$U$J(*B$C4$<Tn~4bfoWm{oBZqh_>2TO%mz#Vm&f9rpvYn)mpvqM#cKf
zRTo**>^pfp9gV!$)ZdEubN)oq?qP;rG-=`V@gpUo_BIC6^0y)4<sq$Hwzq>W(l(}H
zLRHUDkNnHEJpIg*0v9G;V(`mCh?G6R0z1)oLu`<51yV|HdZXCr=}U<XA_`=X1(bqs
zLBR%3!4QZrZWxbrMkb<xal+0qsW+4E8{92=Mc-8yRi&jn<Pdm7hdqMs#w-yTkpyv+
zwe=y^eWFkFBG!L{4q=ZmIfMA@VjwCq_HF=j7i)?<jvCcejI(<{O>awW6Ors)3~tJ#
zH)qnFdoh7YAFcc42qJX;5;JViq<0JsitS>@RTuT6rMHMJ_6Jz^lk5ps|4@tA41+d{
z9cXum9b!AodNsS3nSMWT7lXj4eXO!Slg{pa6EjBii>$A;OFkEH%0FkLyX^ho^<uzl
zl>EL&{UBhkT)Nhpk(Qk;kQ9)`F5z*>V@&c`m6%)tq4Np2tEC6TKn8tSdJ~UhR%pK~
z20DP>-Gpxfey9oG41Bx^&rSf5KZQ=O;yQi#`{8aD;mC@t=)Yne64$R^m$6vD7KHbT
zH6m0_#HK9vgv9=(pIyJMA{PW}XC^&3I3#w8K|fO6qPxlQNeB(aK$-#|1~KBG7!*5^
zfLBD*APKo~W$ez(SVEp@LPy)1S)-V%*M{UL1BMLH?(|mqB@o2cHLDQwlDKmxO+1Qx
z;^GJIeUITrxiE}S6UESCX47Uoo9Pb%$FfhKSVMmnIO};~4V|~i7SzKeZmdU2|JG1;
z8s6{ZJ@3Qd$Ck@`-lkQ1-t+9wP4~PtJ6v01gNu9nTfDKowKwf<t^Upy5s~4Pe6JC&
z`0FpjGJhY6s9jA&)F!6(Avqim${->?3)tHy^4MC{_846g<7*=;BVo&G@t9iHGErj>
z#9(TBV%=(j4!<aWD;P75-Xn;XeH2Y59Y=0sUT$M+RCb_~L>#%DfjhXqh?{fu72M4^
zd=)tMczSIO9jl?r{vdL)HdluW_Z-%|(olK6v@187yKD3VyRftn-hawyU2GVAze4l|
zo-R_?S8%0OU38dZ9xon0zza#=$pTHGu<(jNeMe8`F%4)Q_~$TY-{G>oz|6Q%6WY;@
zp*X~dexmIr?Bie|Onbbadhe~^Aw)&t40Au<+>c=S*0#_D?Z*q*gY;2&{b}^H&~x-T
zwBJ(gPgHN4#yo>)6Ldh!YYBQvwSR)Pg}$kJzo*)JLi<8VdMos|Xx~Abp#KUne=f|N
zzZQNtoS@GGPEa($?OxTMM%zNa5#dq3fHpxdD@tb+%O)<in_GUahqGG|(*Vo*SeQ=e
z%=HxBI@!Ae*aL}vb<->)LNukYr|?#u0QNR^wV;pVq0s|=D`=KBP!HNp8bG_A#_-*6
zC+(w6+BO9bAY!|<5z4FHJS}T`0DnQ-NB7c8+95LNAGK++=wG!wwEkGZt)b(9H-x6q
z=0XKT``*y~O4}Jo-G|;hT@0D%{dlO1_DOJB^qV0G_)DQZ;CwN(M9UcQQThyN;c39B
z@TVZv8GZ~N?+>$viEt-+=g^xcBYXvw$oA*y%i+({)AWt-9<={}-lyrG0k_e=gr7$H
zZuk$N;XlHE3{DaG3gGP#h7U)c2Rt7s(DO>_Su!Fo(z8^Jyo~nINEtkjM_!@7qd$!N
zJ=$j?-vR&E!2eD9dSqI8_c}N|%0ETE3;Op!$5@fK0E_5xw7O~sRJ#W)NBbRUI}-gj
zL|`r|!Sm7RdTLd^Jm7n3Mms5odOfG*C`}gHEhM$~=$Q8F6uFF4uDX5*jAuY_X&8ks
zt?_*a?0_n=)qGy{ap$aEs+Y~XX=;9U-gMlYxn$Br-L>z*oHX#P7_K=QP{yd@6m40y
z7O1f7xMqcpFI+T>F3lQNm2ySbmI@prLt+8&cyd#gu~@Yo*D5+RWiHeg7mbCoIpJcN
zSg5<EPs5S{Tg(-yxq8*LDrRoduGFluDGR2&WEIix5e(O|t8-@ASW=MFQ0EIW8@d*(
zvgIx}dVN2krRvyalkSt2YtC3zlcuYeENNFOX4R#mrVIIsQ7v)T1UmzPOQv*b-k!4S
zupef#J%ysQY6yT;l(u7^cj2w$J67U2B7QJ5=QEpSL<=};s{)+2j~NxSG-bF(0l_mV
zKW932T^7v~wq0g3n(@QS%-!H=?)Uqqmx^Xhjj(9CXJ<{vF&0hoR%9NuXt=~Z$7`m9
zWz|JLk4&2}tBdXh)qO(R2(@F&30b^=02SRjjDtCzA1g_kzaUMc1U2MAR4AKfO{r)$
zJYS+oFuG<lktQz~)y35$HlyGgZrvffb~ax%AFLakzcsu*%N)j5sq+hM9)|?EIdidI
zHsthDO~M1j+98n4C9gfMg5yx$b3|EsL|SIGRQ7}G%o=X-0{dF1FH|h0A_#ngq6FdA
z6f)|XYw1<THL68(#qAFnvh<K4oB4c`C+)Id5>D=@Sv93qq#0DuxiQK&w0g#JmH2Ty
zW<GS&UI+10HNt^Z08^CUM5%<@osiO4rb3WN)q_|#s){jtRf+@b@bU=*1p)3Ed(m!i
zA$*161(O$!CVK)3RABJ{4=*7Y)id5l8dkH~Rpo$ryP`FiVknt;ECMRp$Lxn#UBN8c
z)sn-OLcCsfF_H%aWe1vHARGlAn4fTA#zy(`?1OB>5Knl{tl5~|%z46aptI`k-lfnZ
zhE-O;G24ZW0XR{sm8~MLWL&B<sI__2GsDv>MaxA{_G={Ym8dvP5`Q-C{iI_zs8Ug3
zl1xA@XjQ6Hg%*HIU^bmc%RCkQ8R#tmFDpqCkO8hmC1Ik^CA@lF{_IIS43JGV$RjjL
z9|x<WR9;f;G4xjev1(T42{))bRFN+D!<@kIHuxI-4u)KS1`Appv^EBB^tzz1b{kwc
zx|_(O*8*fgE06XtZUhsfPl4+aup*uXv=VSlg~5jYi=c8)XlzoAQ1$UZ+67fdKn(C0
z%0s4bC@GAShKU(qHhpYmwDYQWwa>Z=Yr|Ka`pJt}KfXWjgI=kuXL~ti^x?^-h`pb*
zj?{4kyp(03bqskJf{sUM7oY*sj?aRF{r95bBI0Xva^nb|*EL9TPFC5wZVvJWBC<?$
zb`sjSU>1Ka{r$)%*9u3}h4qYiBlZ((=PGg$BTbFvVKmEe@-pmsa(j{X^m3`|Dr>&w
zBkvz!uDMnGJ<U}VSnDcVT`y;2x2l8^xPtmy70K;KnsRqbt`DxB&bQ*@No^x)%@v`Y
zDcocZHQT_GyWA8P9kwnZ%A6aHz%c&2I8>m$QAL~wZTF-v$+OPO$<5|$^LScca~!8s
z{&`ka0r6~B)qe|~U=B8ToTk~#b5h5==8C%D>FMFw&edK*6ujk(*Mp1jWC7mcB{ix8
zr!%*zERGFVe;^U$-CHVa=;J!&%F5!|ydE9&=Qqv{H|F8p30P-imhig4s~NR(WWDHq
zgtQpj@d(i{Kl!iUAG2S1B7yT?ux2nkMA}G$yR5W3pmTI?!N0q~&vx+amazMMWd<5D
z&GXfhX;=hnE`O@Q%4uLXJvPs5UX=Q=T=66>uk-}VRli@pQY~hI94}#>oLAfijOMWO
zVs0RboPdCLH+Z#Hwt;1+{S2TW$lB2Yob@)NMlws#!#iCtac)d2Z#kTFFSR(R?Yo(t
zz$Y#=@bpi>uGM9;R<q)}WA((QiT~}E%3D}tqrGua5BzLw8D#w5FW@H;Gk!HVuX3Zc
zH{*1ir@uFCf+eH*<={q}&#Q@3K^B7P?`<6Z7K~5K-n-uW;eUST$Fom-`yJ=I%RgO5
z@jrd|^r_8z-uMj8I^x~QuufW3*EG={K^u>drX?ddib_WD$(-y0-k#*1B$!eIsvTw_
z?oTEeibr(nW=1U@qX=ZWx?1!Qc;gU(3>d+Q^N=LST2f3vU5FKRcO_$bIF(PvlhKW-
zS*;6-Qune@nwOq#ZZ&YBO`U`hlzJcr4XNqW8SY5sRr>&}6(&Gowqp>D`M5usvRc@M
z?yeXN5T-EaVneVv*`C^-8b}SN#_%_w+JjIz-QAVSD=Sj>sz);QK<bPz<MEWG{>I|n
zUHmUh@7dkONUSxPY|=Ltk8A#+0011l;o8baO7o%2ebT5Mv#TrLi1=o+A96IsLo2^2
zhk!qY`$ssP{}Fx#nk!5dp4wdQ`^3p7kA89co15nU>LVdON1WV$dde==`Fq*X@ujTe
zg`U4CozoMgidE&$U<2Q@r)QV-6~5D_EC*k7dcm!iEL-0-I=c5XzBTy_!8z@Jny)<V
zg^Q>0g>M>;8PIaI(gK_N3?DH2*Vh@=18ns(_`SA4Jv(XR+t5@87V0p=G;^ggpJU<|
z{q3ZWE9mx`5Kf`g(3kQ13gL&8%d6$Qle`nRpkKHNo#odk0maMElYo9_oM?&@<X>+e
zCi;GmK+vW__~nRB;Whd!+G)J36>yq$9IxeP@jOOH0Q2=i<lUbIdKJNM@EeM{P|^OV
zJ^_y@MLUI+LqZSl5jcv#TEeRpU)zYK=F!V9oDTYVtM@(&6a!Aueh;>4u*n6Nx4zt{
z>9XP(#RrS`w+H*kC=?8#thJSqd7Wy0y=aW1gLf2_-{3t3UJ337&nWhR#?85F13!Di
zuM7OL²#|-;Ek8`?tHKq$$ehD)%PFC4819(wM@Fz+QFW&6kB3^Cq*+Oj3xYB>z
zr?cm*Kkz+xxw`c@dz3%kOA5a%@dwdbuNwZaZ|oDtU;=*g3p#&ImSLIxKgvOr-u>E3
z2M#S&$~um`_zdM>?^tfMS2wFgn@@WV_MV(SGQ77}=W~vdQMRk*!QN%l={<CJd*T2-
zpUuibd0B^os&lZnF01<;oDNhBXSfoalMNT`%6`MC<Svc%>Nse#&g1m)RP$(1rRyuo
z@+GV@I0;&15q^w-RaG2{9qgT5_P@y0d7DwI^^SNNTv>PAeD%D2oA&JLRdN{HF^hE^
z4=(#SC=v%!u+uD^kk%!fN-mntZED>eXw`8w^k69}*4g42^O9NC%iJF9HJp6)lKnAL
z_Ud(OqR2;a2Yb&OWykcLQc6Z{VohNB$ST_pjI0C!3<pMn3<2S6|Khss2w-Bhf%%Q5
P{pYr2f5G_wJ_7#@Ru|}y
literal 0
HcmV?d00001
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 5/9] [RFC] KVM test: DTM machine deletion tool for WHQL tests
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 4/9] [RFC] KVM test: DTM automation program for WHQL tests Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Michael Goldish
0 siblings, 1 reply; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm
This C# program should run on a DTM server. It's used by the
whql_client_install test to delete the client machine from the server's data
store (if listed there) prior to client installation. This seems to be
necessary to prevent trouble during testing (like failure to contact the client
machine).
Note: the binary is copied to the server at run time, so it doesn't need to be
packaged in winutils.iso.
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/deps/whql_delete_machine_15.cs | 82 ++++++++++++++++++++++
client/tests/kvm/deps/whql_delete_machine_15.exe | Bin 0 -> 10240 bytes
2 files changed, 82 insertions(+), 0 deletions(-)
create mode 100644 client/tests/kvm/deps/whql_delete_machine_15.cs
create mode 100644 client/tests/kvm/deps/whql_delete_machine_15.exe
diff --git a/client/tests/kvm/deps/whql_delete_machine_15.cs b/client/tests/kvm/deps/whql_delete_machine_15.cs
new file mode 100644
index 0000000..1d78a6d
--- /dev/null
+++ b/client/tests/kvm/deps/whql_delete_machine_15.cs
@@ -0,0 +1,82 @@
+// DTM machine deletion tool
+// Author: Michael Goldish <mgoldish@redhat.com>
+// Based on sample code by Microsoft.
+
+using System;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using Microsoft.DistributedAutomation.DeviceSelection;
+using Microsoft.DistributedAutomation.SqlDataStore;
+
+namespace automate0
+{
+ class AutoJob
+ {
+ static int Main(string[] args)
+ {
+ if (args.Length != 2)
+ {
+ Console.WriteLine("Error: incorrect number of command line arguments");
+ Console.WriteLine("Usage: {0} serverName clientName",
+ System.Environment.GetCommandLineArgs()[0]);
+ return 1;
+ }
+ string serverName = args[0];
+ string clientName = args[1];
+
+ try
+ {
+ // Initialize DeviceScript and connect to data store
+ Console.WriteLine("Initializing DeviceScript object");
+ DeviceScript script = new DeviceScript();
+ Console.WriteLine("Connecting to data store");
+ script.ConnectToNamedDataStore(serverName);
+
+ // Find the client machine
+ IResourcePool rootPool = script.GetResourcePoolByName("$");
+ Console.WriteLine("Looking for client machine '{0}'", clientName);
+ IResource machine = rootPool.GetResourceByName(clientName);
+ if (machine == null)
+ {
+ Console.WriteLine("Client machine not found");
+ return 0;
+ }
+ Console.WriteLine("Client machine '{0}' found ({1}, {2})",
+ clientName, machine.OperatingSystem, machine.ProcessorArchitecture);
+
+ // Change the client machine's status to 'unsafe'
+ Console.WriteLine("Changing the client machine's status to 'Unsafe'");
+ try
+ {
+ machine.ChangeResourceStatus("Unsafe");
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Warning: " + e.Message);
+ }
+ while (machine.Status != "Unsafe")
+ {
+ try
+ {
+ machine = rootPool.GetResourceByName(clientName);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Warning: " + e.Message);
+ }
+ System.Threading.Thread.Sleep(1000);
+ }
+
+ // Delete the client machine from datastore
+ Console.WriteLine("Deleting client machine from data store");
+ script.DeleteResource(machine.Id);
+ return 0;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine("Error: " + e.Message);
+ return 1;
+ }
+ }
+ }
+}
diff --git a/client/tests/kvm/deps/whql_delete_machine_15.exe b/client/tests/kvm/deps/whql_delete_machine_15.exe
new file mode 100644
index 0000000000000000000000000000000000000000..3817ac42d7748b87af3683e86e1137757ed6073a
GIT binary patch
literal 10240
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
NZOi_Y@&A1U{u`?1<*)z%
literal 0
HcmV?d00001
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service()
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 5/9] [RFC] KVM test: DTM machine deletion tool " Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 7/9] [RFC] KVM test: add whql_submission test Michael Goldish
2010-08-05 0:38 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Amos Kong
0 siblings, 2 replies; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm
These utilities use sc to stop and start windows services. They're used by whql_submission
and whql_client_install to stop or restart wttsvc on the client machine.
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/kvm_test_utils.py | 46 ++++++++++++++++++++++++++++++++++++
1 files changed, 46 insertions(+), 0 deletions(-)
diff --git a/client/tests/kvm/kvm_test_utils.py b/client/tests/kvm/kvm_test_utils.py
index 53c11ae..9fd3a74 100644
--- a/client/tests/kvm/kvm_test_utils.py
+++ b/client/tests/kvm/kvm_test_utils.py
@@ -242,6 +242,52 @@ def migrate(vm, env=None, mig_timeout=3600, mig_protocol="tcp",
raise
+def stop_windows_service(session, service, timeout=120):
+ """
+ Stop a Windows service using sc.
+ If the service is already stopped or is not installed, do nothing.
+
+ @param service: The name of the service
+ @param timeout: Time duration to wait for service to stop
+ @raise: error.TestError is raised if the service can't be stopped
+ """
+ end_time = time.time() + timeout
+ while time.time() < end_time:
+ o = session.get_command_output("sc stop %s" % service, timeout=60)
+ # FAILED 1060 means the service isn't installed.
+ # FAILED 1062 means the service hasn't been started.
+ if re.search(r"\bFAILED (1060|1062)\b", o, re.I):
+ break
+ time.sleep(1)
+ else:
+ raise error.TestError("Could not stop service '%s'" % service)
+
+
+def start_windows_service(session, service, timeout=120):
+ """
+ Start a Windows service using sc.
+ If the service is already running, do nothing.
+ If the service isn't installed, fail.
+
+ @param service: The name of the service
+ @param timeout: Time duration to wait for service to start
+ @raise: error.TestError is raised if the service can't be started
+ """
+ end_time = time.time() + timeout
+ while time.time() < end_time:
+ o = session.get_command_output("sc start %s" % service, timeout=60)
+ # FAILED 1060 means the service isn't installed.
+ if re.search(r"\bFAILED 1060\b", o, re.I):
+ raise error.TestError("Could not start service '%s' "
+ "(service not installed)" % service)
+ # FAILED 1056 means the service is already running.
+ if re.search(r"\bFAILED 1056\b", o, re.I):
+ break
+ time.sleep(1)
+ else:
+ raise error.TestError("Could not start service '%s'" % service)
+
+
def get_time(session, time_command, time_filter_re, time_format):
"""
Return the host time and guest time. If the guest time cannot be fetched
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 7/9] [RFC] KVM test: add whql_submission test
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 8/9] [RFC] KVM test: add whql_client_install test Michael Goldish
2010-08-05 0:38 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Amos Kong
1 sibling, 1 reply; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm
whql_submission runs a submission on a given device. It requires a
functioning external DTM server which runs rss.exe like regular Windows VMs,
preferably with administrator permissions.
The submission is defined by descriptors and device_data objects, which are
specified in the config file(s). All jobs of the submission are executed.
When all jobs complete, or when the timeout expires, HTML reports are generated
and copied to test.debugdir (client/results/default/kvm...whql_submission/debug)
and the raw test logs (wtl or xml files) are copied to test.debugdir as well.
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/tests/whql_submission.py | 176 +++++++++++++++++++++++++++++
1 files changed, 176 insertions(+), 0 deletions(-)
create mode 100644 client/tests/kvm/tests/whql_submission.py
diff --git a/client/tests/kvm/tests/whql_submission.py b/client/tests/kvm/tests/whql_submission.py
new file mode 100644
index 0000000..fd238ff
--- /dev/null
+++ b/client/tests/kvm/tests/whql_submission.py
@@ -0,0 +1,176 @@
+import logging, time, os, re
+from autotest_lib.client.common_lib import error
+import kvm_subprocess, kvm_test_utils, kvm_utils, rss_file_transfer
+
+
+def run_whql_submission(test, params, env):
+ """
+ WHQL submission test:
+ 1) Log into the guest (the client machine) and into a DTM server machine
+ 2) Copy the automation program binary (dsso_test_binary) to the server machine
+ 3) Run the automation program
+ 4) Pass the program all relevant parameters (e.g. device_data)
+ 5) Wait for the program to terminate
+ 6) Parse and report job results
+ (logs and HTML reports are placed in test.bindir)
+
+ @param test: kvm test object
+ @param params: Dictionary with the test parameters
+ @param env: Dictionary with test environment.
+ """
+ vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+ session = kvm_test_utils.wait_for_login(vm, 0, 240)
+
+ # Collect parameters
+ server_address = params.get("server_address")
+ server_shell_port = int(params.get("server_shell_port"))
+ server_file_transfer_port = int(params.get("server_file_transfer_port"))
+ server_studio_path = params.get("server_studio_path", "%programfiles%\\ "
+ "Microsoft Driver Test Manager\\Studio")
+ dsso_test_binary = params.get("dsso_test_binary",
+ "deps/whql_submission_15.exe")
+ dsso_test_binary = kvm_utils.get_path(test.bindir, dsso_test_binary)
+ test_device = params.get("test_device")
+ test_timeout = float(params.get("test_timeout", 600))
+ wtt_services = params.get("wtt_services")
+
+ # Restart WTT service(s) on the client
+ logging.info("Restarting WTT services on client")
+ for svc in wtt_services.split():
+ kvm_test_utils.stop_windows_service(session, svc)
+ for svc in wtt_services.split():
+ kvm_test_utils.start_windows_service(session, svc)
+
+ # Copy dsso_test_binary to the server
+ rss_file_transfer.upload(server_address, server_file_transfer_port,
+ dsso_test_binary, server_studio_path, timeout=60)
+
+ # Open a shell session with the server
+ server_session = kvm_utils.remote_login("nc", server_address,
+ server_shell_port, "", "",
+ session.prompt, session.linesep)
+
+ # Get the computer names of the server and client
+ cmd = "echo %computername%"
+ server_name = server_session.get_command_output(cmd).strip()
+ client_name = session.get_command_output(cmd).strip()
+ session.close()
+
+ # Run the automation program on the server
+ server_session.get_command_output("cd %s" % server_studio_path)
+ cmd = "%s %s %s %s %s %s" % (os.path.basename(dsso_test_binary),
+ server_name,
+ client_name,
+ "%s_pool" % client_name,
+ "%s_submission" % client_name,
+ test_timeout)
+ server_session.sendline(cmd)
+
+ # Helper function: wait for a given prompt and raise an exception if an
+ # error occurs
+ def find_prompt(prompt):
+ m, o = server_session.read_until_last_line_matches(
+ [prompt, server_session.prompt], print_func=logging.info,
+ timeout=600)
+ if m != 0:
+ errors = re.findall("^Error:.*$", o, re.I | re.M)
+ if errors:
+ raise error.TestError(errors[0])
+ else:
+ raise error.TestError("Error running automation program: could "
+ "not find '%s' prompt" % prompt)
+
+ # Tell the automation program which device to test
+ find_prompt("Device to test:")
+ server_session.sendline(test_device)
+
+ # Give the automation program all the device data supplied by the user
+ find_prompt("DeviceData name:")
+ for dd in kvm_utils.get_sub_dict_names(params, "device_data"):
+ dd_params = kvm_utils.get_sub_dict(params, dd)
+ if dd_params.get("dd_name") and dd_params.get("dd_data"):
+ server_session.sendline(dd_params.get("dd_name"))
+ server_session.sendline(dd_params.get("dd_data"))
+ server_session.sendline()
+
+ # Give the automation program all the descriptor information supplied by
+ # the user
+ find_prompt("Descriptor path:")
+ for desc in kvm_utils.get_sub_dict_names(params, "descriptors"):
+ desc_params = kvm_utils.get_sub_dict(params, desc)
+ if desc_params.get("desc_path"):
+ server_session.sendline(desc_params.get("desc_path"))
+ server_session.sendline()
+
+ # Wait for the automation program to terminate
+ m, o = server_session.read_up_to_prompt(print_func=logging.info,
+ timeout=test_timeout + 120)
+ # (test_timeout + 120 is used here because the automation program is
+ # supposed to terminate cleanly on its own when test_timeout expires)
+ server_session.close()
+
+ # Look for test results in the automation program's output
+ result_summaries = re.findall(r"---- \[.*?\] ----", o, re.DOTALL)
+ if not result_summaries:
+ raise error.TestError("The automation program did not return any "
+ "results")
+ results = result_summaries[-1].strip("-")
+ results = eval("".join(results.splitlines()))
+
+ # Download logs and HTML reports from the server
+ for i, r in enumerate(results):
+ if "report" in r:
+ try:
+ rss_file_transfer.download(server_address,
+ server_file_transfer_port,
+ r["report"], test.debugdir)
+ except rss_file_transfer.FileTransferNotFoundError:
+ pass
+ if "logs" in r:
+ try:
+ rss_file_transfer.download(server_address,
+ server_file_transfer_port,
+ r["logs"], test.debugdir)
+ except rss_file_transfer.FileTransferNotFoundError:
+ pass
+ else:
+ try:
+ # Create symlinks to test log dirs to make it easier
+ # to access them (their original names are not human
+ # readable)
+ link_name = "logs_%s" % r["report"].split("\\")[-1]
+ link_name = link_name.replace(" ", "_")
+ link_name = link_name.replace("/", "_")
+ os.symlink(r["logs"].split("\\")[-1],
+ os.path.join(test.debugdir, link_name))
+ except (KeyError, OSError):
+ pass
+
+ # Print result summary
+ logging.info("")
+ logging.info("Result summary:")
+ name_length = max(len(r.get("job", "")) for r in results)
+ fmt = "%%-%ds %%-15s %%-8s %%-8s %%-8s %%-15s" % name_length
+ logging.info(fmt % ("Job", "Status", "Pass", "Fail", "NotRun", "NotApplicable"))
+ logging.info(fmt % ("---", "------", "----", "----", "------", "-------------"))
+ for r in results:
+ logging.info(fmt % (r.get("job"), r.get("status"),
+ r.get("pass"), r.get("fail"), r.get("notrun"),
+ r.get("notapplicable")))
+ logging.info("(see logs and HTML reports in %s)" % test.debugdir)
+
+ # Fail if the automation program did not terminate on time
+ if not m:
+ raise error.TestFail("The automation program did not terminate "
+ "on time")
+
+ # Fail if there are failed or incomplete jobs
+ failed_jobs = [r.get("job") for r in results if r.get("fail", 0) > 0]
+ running_jobs = [r.get("job") for r in results if r.get("notrun", 0) > 0]
+ errors = []
+ if failed_jobs:
+ errors += ["Jobs failed: %s." % failed_jobs]
+ if running_jobs:
+ errors += ["Jobs did not complete on time: %s." % running_jobs]
+ if errors:
+ raise error.TestFail(" ".join(errors))
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 8/9] [RFC] KVM test: add whql_client_install test
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 7/9] [RFC] KVM test: add whql_submission test Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 9/9] [RFC] KVM test: add WHQL test definitions to tests_base.cfg.sample Michael Goldish
0 siblings, 1 reply; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm; +Cc: Michael Goldish
whql_client_install installs the DTM client on a guest. It requires a
functioning external DTM server which runs rss.exe like regular Windows VMs.
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/tests/whql_client_install.py | 110 +++++++++++++++++++++++++
1 files changed, 110 insertions(+), 0 deletions(-)
create mode 100644 client/tests/kvm/tests/whql_client_install.py
diff --git a/client/tests/kvm/tests/whql_client_install.py b/client/tests/kvm/tests/whql_client_install.py
new file mode 100644
index 0000000..f46939e
--- /dev/null
+++ b/client/tests/kvm/tests/whql_client_install.py
@@ -0,0 +1,110 @@
+import logging, time, os, re
+from autotest_lib.client.common_lib import error
+import kvm_subprocess, kvm_test_utils, kvm_utils, rss_file_transfer
+
+
+def run_whql_client_install(test, params, env):
+ """
+ WHQL DTM client installation:
+ 1) Log into the guest (the client machine) and into a DTM server machine
+ 2) Stop the DTM client service (wttsvc) on the client machine
+ 3) Delete the client machine from the server's data store
+ 4) Rename the client machine (give it a randomly generated name)
+ 5) Move the client machine into the server's workgroup
+ 6) Reboot the client machine
+ 7) Install the DTM client software
+
+ @param test: kvm test object
+ @param params: Dictionary with the test parameters
+ @param env: Dictionary with test environment.
+ """
+ vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
+ session = kvm_test_utils.wait_for_login(vm, 0, 240)
+
+ # Collect test params
+ server_address = params.get("server_address")
+ server_shell_port = int(params.get("server_shell_port"))
+ server_file_transfer_port = int(params.get("server_file_transfer_port"))
+ server_studio_path = params.get("server_studio_path", "%programfiles%\\ "
+ "Microsoft Driver Test Manager\\Studio")
+ server_username = params.get("server_username")
+ server_password = params.get("server_password")
+ dsso_delete_machine_binary = params.get("dsso_delete_machine_binary",
+ "deps/whql_delete_machine_15.exe")
+ dsso_delete_machine_binary = kvm_utils.get_path(test.bindir,
+ dsso_delete_machine_binary)
+ install_timeout = float(params.get("install_timeout", 600))
+ install_cmd = params.get("install_cmd")
+ wtt_services = params.get("wtt_services")
+
+ # Stop WTT service(s) on client
+ for svc in wtt_services.split():
+ kvm_test_utils.stop_windows_service(session, svc)
+
+ # Copy dsso_delete_machine_binary to server
+ rss_file_transfer.upload(server_address, server_file_transfer_port,
+ dsso_delete_machine_binary, server_studio_path,
+ timeout=60)
+
+ # Open a shell session with server
+ server_session = kvm_utils.remote_login("nc", server_address,
+ server_shell_port, "", "",
+ session.prompt, session.linesep)
+
+ # Get server and client information
+ cmd = "echo %computername%"
+ server_name = server_session.get_command_output(cmd).strip()
+ client_name = session.get_command_output(cmd).strip()
+ cmd = "wmic computersystem get workgroup"
+ server_workgroup = server_session.get_command_output(cmd).strip()
+
+ # Delete the client machine from the server's data store (if it's there)
+ server_session.get_command_output("cd %s" % server_studio_path)
+ cmd = "%s %s %s" % (os.path.basename(dsso_delete_machine_binary),
+ server_name, client_name)
+ server_session.get_command_output(cmd, print_func=logging.info)
+ server_session.close()
+
+ # Rename the client machine
+ client_name = "autotest_%s" % kvm_utils.generate_random_string(4)
+ logging.info("Renaming client machine to '%s'" % client_name)
+ cmd = ('wmic computersystem where name="%%computername%%" rename name="%s"'
+ % client_name)
+ s = session.get_command_status(cmd, timeout=600)
+ if s != 0:
+ raise error.TestError("Could not rename the client machine")
+
+ # Join the server's workgroup
+ logging.info("Joining workgroup '%s'" % server_workgroup)
+ cmd = ('wmic computersystem where name="%%computername%%" call '
+ 'joindomainorworkgroup name="%s"' % server_workgroup)
+ s = session.get_command_status(cmd, timeout=600)
+ if s != 0:
+ raise error.TestError("Could not change the client's workgroup")
+
+ # Reboot
+ session = kvm_test_utils.reboot(vm, session)
+
+ # Access shared resources on the server machine
+ logging.info("Attempting to access remote share on server")
+ cmd = r"net use \\%s /user:%s %s" % (server_name, server_username,
+ server_password)
+ end_time = time.time() + 120
+ while time.time() < end_time:
+ s = session.get_command_status(cmd)
+ if s == 0:
+ break
+ time.sleep(5)
+ else:
+ raise error.TestError("Could not access server share from client "
+ "machine")
+
+ # Install
+ logging.info("Installing DTM client (timeout=%ds)", install_timeout)
+ install_cmd = r"cmd /c \\%s\%s" % (server_name, install_cmd.lstrip("\\"))
+ s, o = session.get_command_status_output(install_cmd,
+ timeout=install_timeout)
+ if s != 0:
+ raise error.TestError("Client installation failed")
+
+ session.close()
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [KVM-AUTOTEST PATCH 9/9] [RFC] KVM test: add WHQL test definitions to tests_base.cfg.sample
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 8/9] [RFC] KVM test: add whql_client_install test Michael Goldish
@ 2010-07-15 15:57 ` Michael Goldish
0 siblings, 0 replies; 11+ messages in thread
From: Michael Goldish @ 2010-07-15 15:57 UTC (permalink / raw)
To: autotest, kvm; +Cc: Michael Goldish
The parameters that define submissions (dd_name_*, dd_data_*, desc_path_*) were
collected from manually created submissions.
I haven't yet collected the parameters for Windows 2003 and 2008, so for now
WHQL tests are disabled for these versions.
This patch also adds a comment in tests.cfg.sample, encouraging the user to
specify the DTM server's address and ports there.
Note that this patch renames WinVista.32sp1 to WinVista.32.sp1,
WinVista.32sp2 to WinVista.32.sp2,
WinVista.64sp1 to WinVista.64.sp1 and
WinVista.64sp2 to WinVista.64.sp2.
Signed-off-by: Michael Goldish <mgoldish@redhat.com>
---
client/tests/kvm/tests.cfg.sample | 8 +
client/tests/kvm/tests_base.cfg.sample | 230 ++++++++++++++++++++++++--------
2 files changed, 184 insertions(+), 54 deletions(-)
diff --git a/client/tests/kvm/tests.cfg.sample b/client/tests/kvm/tests.cfg.sample
index e01406e..cdb7b0a 100644
--- a/client/tests/kvm/tests.cfg.sample
+++ b/client/tests/kvm/tests.cfg.sample
@@ -73,6 +73,14 @@ variants:
only Fedora.13.64
only unattended_install.cdrom boot shutdown
+# You may provide information about the DTM server for WHQL tests here:
+#whql:
+# server_address = 10.20.30.40
+# server_shell_port = 10022
+# server_file_transfer_port = 10023
+# Note that the DTM server must run rss.exe (available under deps/),
+# preferably with administrator privileges.
+
# Uncomment the following lines to enable abort-on-error mode:
#abort_on_error = yes
#kill_vm.* ?= no
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index d0b8acb..dabcdc4 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -285,6 +285,80 @@ variants:
iozone_cmd = "D:\IOzone\iozone.exe -a"
iozone_timeout = 3600
+ - @whql: install setup unattended_install.cdrom
+ nic_mode = tap
+ # Replace this with the address of an installed DTM server
+ server_address = 10.20.30.40
+ # The server should run rss.exe like a regular Windows VM, preferably
+ # with administrator privileges (or at least with permission to write
+ # to the DTM studio directory)
+ server_shell_port = 10022
+ server_file_transfer_port = 10023
+ server_studio_path = %programfiles%\Microsoft Driver Test Manager\Studio
+ wtt_services = wttsvc
+ variants:
+ - whql_client_install:
+ type = whql_client_install
+ dsso_delete_machine_binary = deps/whql_delete_machine_15.exe
+ # The username and password are required for accessing the DTM client
+ # installer binary shared by the server
+ server_username = administrator
+ server_password = 1q2w3eP
+ # This path refers to a shared directory on the server
+ # (the final cmd will be something like \\servername\DTMInstall\...)
+ install_cmd = \DTMInstall\Client\Setup.exe /passive
+ install_timeout = 1800
+ - whql_submission: whql_client_install
+ type = whql_submission
+ dsso_test_binary = deps/whql_submission_15.exe
+ test_timeout = 3600
+ device_data = cat0 cat1 cat2 cat3 logoarch logoos whqlos whqlqual prog desc filter virt
+ descriptors = desc1 desc2 desc3
+ # DeviceData names
+ dd_name_cat0 = Category
+ dd_name_cat1 = Category
+ dd_name_cat2 = Category
+ dd_name_cat3 = Category
+ dd_name_logoarch = LogoProcessorArchitecture
+ dd_name_logoos = LogoOperatingSystem
+ dd_name_whqlos = WhqlOs
+ dd_name_whqlqual = WhqlQualification
+ dd_name_prog = LogoProgramId
+ dd_name_desc = LogoProgramDescription
+ dd_name_filter = WDKFilterAttribute
+ dd_name_virt = ParaVirtualizationDriver
+ # Common DeviceData data
+ dd_data_filter = FilterIfNoInf
+ dd_data_virt = True
+ variants:
+ - keyboard:
+ # test_device is a regular expression that should match a device's
+ # name as it appears in device manager. The first device that matches
+ # is used.
+ test_device = keyboard
+ dd_data_cat0 = Input\Keyboard
+ dd_data_cat1 = Device Fundamentals
+ dd_data_cat2 = System Fundamentals\Dynamic Partitioning
+ dd_data_prog = InputKbd
+ dd_data_desc = Input > Keyboard
+ - hdd:
+ test_device = qemu harddisk|generic volume
+ device_data += " ex0 ex1 ex2 ex3"
+ dd_data_cat0 = Storage\Device Class\Disk\Disk
+ dd_data_cat1 = Storage\Device Class\Disk\Fixed
+ dd_data_cat2 = Storage\Device Class\Disk\Bus\ATA
+ dd_data_cat3 = Device Fundamentals
+ dd_data_prog = StorHDD
+ dd_data_desc = Storage > Hard Disk Drive (HDD)
+ dd_name_ex0 = Storage_bus_type
+ dd_data_ex0 = ATA/ATAPI
+ dd_name_ex1 = Hybrid_HDD_Support
+ dd_data_ex1 = 0
+ dd_name_ex2 = Non_Rotating_Media
+ dd_data_ex2 = 0
+ dd_name_ex3 = Secure_Storage
+ dd_data_ex3 = 0
+
- guest_s4: install setup unattended_install.cdrom
type = guest_s4
check_s4_support_cmd = grep -q disk /sys/power/state
@@ -497,7 +571,7 @@ variants:
variants:
# Linux section
- @Linux:
- no autoit iozone_windows
+ no autoit iozone_windows whql
shutdown_command = shutdown -h now
reboot_command = shutdown -r now
status_test_command = echo $?
@@ -1100,7 +1174,7 @@ variants:
variants:
- Win2000:
- no reboot
+ no reboot whql
image_name = win2000-32
kill_vm_gracefully = no
install:
@@ -1131,6 +1205,13 @@ variants:
md5sum_1m = b473bf75af2d1269fec8958cf0202bfd
unattended_file = unattended/winxp32.sif
floppy = images/winXP-32/floppy.img
+ whql_submission:
+ desc_path_desc1 = $\WDK\Logo Type\Device Logo\Windows XP
+ desc_path_desc2 = $\WDK\Logo Type\Systems Logo\Windows XP
+ dd_data_logoarch = X86
+ dd_data_logoos = Windows XP
+ dd_data_whqlos = Windows XP
+ dd_data_whqlqual = Basic
- 64:
image_name += -64
@@ -1148,8 +1229,16 @@ variants:
md5sum_1m = e812363ff427effc512b7801ee70e513
unattended_file = unattended/winxp64.sif
floppy = images/winXP-64/floppy.img
+ whql_submission:
+ desc_path_desc1 = $\WDK\Logo Type\Device Logo\Windows XP
+ desc_path_desc2 = $\WDK\Logo Type\Systems Logo\Windows XP
+ dd_data_logoarch = AMD64
+ dd_data_logoos = Windows XP
+ dd_data_whqlos = Windows XP x64
+ dd_data_whqlqual = Basic
- Win2003:
+ no whql
image_name = win2003
image_size = 20G
@@ -1191,63 +1280,80 @@ variants:
- WinVista:
image_name = winvista
image_size = 20G
+ whql_submission:
+ desc_path_desc1 = $\WDK\Logo Type\Device Logo\Vista Client\Device Premium
+ desc_path_desc2 = $\WDK\Logo Type\Device Logo\Vista Client\Device Standard
+ desc_path_desc3 = $\WDK\Logo Type\Device Logo\Vista Client
variants:
- - 32sp1:
- image_name += sp1-32
- install:
- cdrom = windows/WindowsVista-32.iso
- md5sum = 1008f323d5170c8e614e52ccb85c0491
- md5sum_1m = c724e9695da483bc0fd59e426eaefc72
- steps = Win-Vista-32.steps
- setup:
- steps = WinVista-32-rss.steps
- unattended_install.cdrom:
- cdrom = windows/WindowsVista-32.iso
- md5sum = 1008f323d5170c8e614e52ccb85c0491
- md5sum_1m = c724e9695da483bc0fd59e426eaefc72
- unattended_file = unattended/winvista-32-autounattend.xml
- floppy = images/winvista-sp1-32/floppy.img
-
- - 64sp1:
- image_name += sp1-64
- install:
- cdrom = windows/WindowsVista-64.iso
- md5sum = 11e2010d857fffc47813295e6be6d58d
- md5sum_1m = 0947bcd5390546139e25f25217d6f165
- steps = Win-Vista-64.steps
- setup:
- steps = WinVista-64-rss.steps
- unattended_install.cdrom:
- cdrom = windows/WindowsVista-64.iso
- md5sum = 11e2010d857fffc47813295e6be6d58d
- md5sum_1m = 0947bcd5390546139e25f25217d6f165
- unattended_file = unattended/winvista-64-autounattend.xml
- floppy = images/winvista-sp1-64/floppy.img
-
- - 32sp2:
- image_name += sp2-32
- unattended_install.cdrom:
- cdrom = windows/en_windows_vista_with_sp2_x86_dvd_342266.iso
- md5sum = 19ca90a425667812977bab6f4ce24175
- md5sum_1m = 89c15020e0e6125be19acf7a2e5dc614
- sha1sum = 25ad9a776503e6a583bec07879dbcc5dfd20cd6e
- sha1sum_1m = a2afa4cffdc1c362dbf9e62942337f4f875a22cf
- unattended_file = unattended/winvista-32-autounattend.xml
- floppy = images/winvista-sp2-32/floppy.img
+ - 32:
+ whql_submission:
+ dd_data_logoarch = X86
+ dd_data_logoos = Windows Vista
+ dd_data_whqlos = Windows Vista Client
+ dd_data_whqlqual = Premium
+ variants:
+ - sp1:
+ image_name += sp1-32
+ install:
+ cdrom = windows/WindowsVista-32.iso
+ md5sum = 1008f323d5170c8e614e52ccb85c0491
+ md5sum_1m = c724e9695da483bc0fd59e426eaefc72
+ steps = Win-Vista-32.steps
+ setup:
+ steps = WinVista-32-rss.steps
+ unattended_install.cdrom:
+ cdrom = windows/WindowsVista-32.iso
+ md5sum = 1008f323d5170c8e614e52ccb85c0491
+ md5sum_1m = c724e9695da483bc0fd59e426eaefc72
+ unattended_file = unattended/winvista-32-autounattend.xml
+ floppy = images/winvista-sp1-32/floppy.img
+ - sp2:
+ image_name += sp2-32
+ unattended_install.cdrom:
+ cdrom = windows/en_windows_vista_with_sp2_x86_dvd_342266.iso
+ md5sum = 19ca90a425667812977bab6f4ce24175
+ md5sum_1m = 89c15020e0e6125be19acf7a2e5dc614
+ sha1sum = 25ad9a776503e6a583bec07879dbcc5dfd20cd6e
+ sha1sum_1m = a2afa4cffdc1c362dbf9e62942337f4f875a22cf
+ unattended_file = unattended/winvista-32-autounattend.xml
+ floppy = images/winvista-sp2-32/floppy.img
- - 64sp2:
- image_name += sp2-64
- unattended_install.cdrom:
- cdrom = windows/en_windows_vista_sp2_x64_dvd_342267.iso
- md5sum = a1c024d7abaf34bac3368e88efbc2574
- md5sum_1m = 3d84911a80f3df71d1026f7adedc2181
- sha1sum = aaee3c04533899f9f8c4ae0c4250ef5fafbe29a3
- sha1sum_1m = 1fd21bd3ce2a4de8856c7b8fe6fdf80260f6d1c7
- unattended_file = unattended/winvista-64-autounattend.xml
- floppy = images/winvista-sp2-64/floppy.img
+ - 64:
+ whql_submission:
+ dd_data_logoarch = AMD64
+ dd_data_logoos = Windows Vista
+ dd_data_whqlos = Windows Vista Client x64
+ dd_data_whqlqual = Premium
+ variants:
+ - sp1:
+ image_name += sp1-64
+ install:
+ cdrom = windows/WindowsVista-64.iso
+ md5sum = 11e2010d857fffc47813295e6be6d58d
+ md5sum_1m = 0947bcd5390546139e25f25217d6f165
+ steps = Win-Vista-64.steps
+ setup:
+ steps = WinVista-64-rss.steps
+ unattended_install.cdrom:
+ cdrom = windows/WindowsVista-64.iso
+ md5sum = 11e2010d857fffc47813295e6be6d58d
+ md5sum_1m = 0947bcd5390546139e25f25217d6f165
+ unattended_file = unattended/winvista-64-autounattend.xml
+ floppy = images/winvista-sp1-64/floppy.img
+ - sp2:
+ image_name += sp2-64
+ unattended_install.cdrom:
+ cdrom = windows/en_windows_vista_sp2_x64_dvd_342267.iso
+ md5sum = a1c024d7abaf34bac3368e88efbc2574
+ md5sum_1m = 3d84911a80f3df71d1026f7adedc2181
+ sha1sum = aaee3c04533899f9f8c4ae0c4250ef5fafbe29a3
+ sha1sum_1m = 1fd21bd3ce2a4de8856c7b8fe6fdf80260f6d1c7
+ unattended_file = unattended/winvista-64-autounattend.xml
+ floppy = images/winvista-sp2-64/floppy.img
- Win2008:
+ no whql
image_name = win2008
image_size = 20G
@@ -1325,6 +1431,12 @@ variants:
- Win7:
image_name = win7
image_size = 20G
+ whql_submission:
+ desc_path_desc1 = $\WDK\Logo Type\Device Logo\Windows 7 Client\Logo
+ desc_path_desc2 = $\WDK\Logo Type\Device Logo\Windows 7 Client
+ device_data += " adq"
+ dd_name_adq = AdditionalQualificationGroup
+ dd_data_adq = Windows 7
variants:
- 32:
@@ -1337,6 +1449,11 @@ variants:
sha1sum_1m = 9f9c3780aebeb28a9bf22188eed6bc15475dc9c5
unattended_file = unattended/win7-32-autounattend.xml
floppy = images/win7-32/floppy.img
+ whql_submission:
+ dd_data_logoarch = X86
+ dd_data_logoos = Windows 7
+ dd_data_whqlos = Windows 7 Client
+ dd_data_whqlqual = Logo
- 64:
image_name += -64
@@ -1356,6 +1473,11 @@ variants:
sha1sum_1m = 4a3903bd5157de54f0702e5263e0a683c5775515
unattended_file = unattended/win7-64-autounattend.xml
floppy = images/win7-64/floppy.img
+ whql_submission:
+ dd_data_logoarch = AMD64
+ dd_data_logoos = Windows 7
+ dd_data_whqlos = Windows 7 Client x64
+ dd_data_whqlqual = Logo
# Unix/BSD section
--
1.5.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service()
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 7/9] [RFC] KVM test: add whql_submission test Michael Goldish
@ 2010-08-05 0:38 ` Amos Kong
2010-08-05 13:32 ` Michael Goldish
1 sibling, 1 reply; 11+ messages in thread
From: Amos Kong @ 2010-08-05 0:38 UTC (permalink / raw)
To: Michael Goldish; +Cc: autotest, kvm
On Thu, Jul 15, 2010 at 06:57:35PM +0300, Michael Goldish wrote:
> These utilities use sc to stop and start windows services. They're used by whql_submission
> and whql_client_install to stop or restart wttsvc on the client machine.
>
> Signed-off-by: Michael Goldish <mgoldish@redhat.com>
> ---
> client/tests/kvm/kvm_test_utils.py | 46 ++++++++++++++++++++++++++++++++++++
> 1 files changed, 46 insertions(+), 0 deletions(-)
>
> diff --git a/client/tests/kvm/kvm_test_utils.py b/client/tests/kvm/kvm_test_utils.py
> index 53c11ae..9fd3a74 100644
> --- a/client/tests/kvm/kvm_test_utils.py
> +++ b/client/tests/kvm/kvm_test_utils.py
> @@ -242,6 +242,52 @@ def migrate(vm, env=None, mig_timeout=3600, mig_protocol="tcp",
> raise
>
>
> +def stop_windows_service(session, service, timeout=120):
> + """
> + Stop a Windows service using sc.
> + If the service is already stopped or is not installed, do nothing.
> +
> + @param service: The name of the service
> + @param timeout: Time duration to wait for service to stop
> + @raise: error.TestError is raised if the service can't be stopped
> + """
> + end_time = time.time() + timeout
> + while time.time() < end_time:
> + o = session.get_command_output("sc stop %s" % service, timeout=60)
> + # FAILED 1060 means the service isn't installed.
> + # FAILED 1062 means the service hasn't been started.
> + if re.search(r"\bFAILED (1060|1062)\b", o, re.I):
> + break
> + time.sleep(1)
> + else:
> + raise error.TestError("Could not stop service '%s'" % service)
Hi Michael,
How about combine those two function together ? we can also use it do other setup.
def setup_windows_service(session, service, action, timeout=120):
...
# FAILED 1060 means the service isn't installed.
# FAILED 1062 means the service hasn't been started.
# FAILED 1056 means the service is already running.
dict = {
#"$action" : ["$fail_str", "$break_str"]
"stop": ["", "(1060|1062)"],
"start": ["1060", "1056"],
...
...
}
end_time = time.time() + timeout
while time.time() < end_time:
o = session.get_command_output("sc %s %s" % service, action, timeout=60)
if re.search(r"\bFAILED %s\b" % dict[action][0], o, re.I):
raise error.TestError("..... %s, %s" % (action, dict[action][0]))
if re.search(r"\bFAILED %s\b" % dict[action][1], o, re.I):
break
...
...
time.sleep(1)
else:
raise error.TestError("Could not %s service '%s'" % (action, service))
> +def start_windows_service(session, service, timeout=120):
> + """
> + Start a Windows service using sc.
> + If the service is already running, do nothing.
> + If the service isn't installed, fail.
> +
> + @param service: The name of the service
> + @param timeout: Time duration to wait for service to start
> + @raise: error.TestError is raised if the service can't be started
> + """
> + end_time = time.time() + timeout
> + while time.time() < end_time:
> + o = session.get_command_output("sc start %s" % service, timeout=60)
> + # FAILED 1060 means the service isn't installed.
> + if re.search(r"\bFAILED 1060\b", o, re.I):
> + raise error.TestError("Could not start service '%s' "
> + "(service not installed)" % service)
> + # FAILED 1056 means the service is already running.
> + if re.search(r"\bFAILED 1056\b", o, re.I):
> + break
> + time.sleep(1)
> + else:
> + raise error.TestError("Could not start service '%s'" % service)
> +
> +
> def get_time(session, time_command, time_filter_re, time_format):
> """
> Return the host time and guest time. If the guest time cannot be fetched
> --
> 1.5.4.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service()
2010-08-05 0:38 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Amos Kong
@ 2010-08-05 13:32 ` Michael Goldish
0 siblings, 0 replies; 11+ messages in thread
From: Michael Goldish @ 2010-08-05 13:32 UTC (permalink / raw)
To: Amos Kong; +Cc: autotest, kvm
On 08/05/2010 03:38 AM, Amos Kong wrote:
> On Thu, Jul 15, 2010 at 06:57:35PM +0300, Michael Goldish wrote:
>> These utilities use sc to stop and start windows services. They're used by whql_submission
>> and whql_client_install to stop or restart wttsvc on the client machine.
>>
>> Signed-off-by: Michael Goldish <mgoldish@redhat.com>
>> ---
>> client/tests/kvm/kvm_test_utils.py | 46 ++++++++++++++++++++++++++++++++++++
>> 1 files changed, 46 insertions(+), 0 deletions(-)
>>
>> diff --git a/client/tests/kvm/kvm_test_utils.py b/client/tests/kvm/kvm_test_utils.py
>> index 53c11ae..9fd3a74 100644
>> --- a/client/tests/kvm/kvm_test_utils.py
>> +++ b/client/tests/kvm/kvm_test_utils.py
>> @@ -242,6 +242,52 @@ def migrate(vm, env=None, mig_timeout=3600, mig_protocol="tcp",
>> raise
>>
>>
>> +def stop_windows_service(session, service, timeout=120):
>> + """
>> + Stop a Windows service using sc.
>> + If the service is already stopped or is not installed, do nothing.
>> +
>> + @param service: The name of the service
>> + @param timeout: Time duration to wait for service to stop
>> + @raise: error.TestError is raised if the service can't be stopped
>> + """
>> + end_time = time.time() + timeout
>> + while time.time() < end_time:
>> + o = session.get_command_output("sc stop %s" % service, timeout=60)
>> + # FAILED 1060 means the service isn't installed.
>> + # FAILED 1062 means the service hasn't been started.
>> + if re.search(r"\bFAILED (1060|1062)\b", o, re.I):
>> + break
>> + time.sleep(1)
>> + else:
>> + raise error.TestError("Could not stop service '%s'" % service)
>
> Hi Michael,
>
> How about combine those two function together ? we can also use it do other setup.
>
> def setup_windows_service(session, service, action, timeout=120):
> ...
> # FAILED 1060 means the service isn't installed.
> # FAILED 1062 means the service hasn't been started.
> # FAILED 1056 means the service is already running.
> dict = {
> #"$action" : ["$fail_str", "$break_str"]
> "stop": ["", "(1060|1062)"],
> "start": ["1060", "1056"],
> ...
> ...
> }
>
> end_time = time.time() + timeout
> while time.time() < end_time:
> o = session.get_command_output("sc %s %s" % service, action, timeout=60)
> if re.search(r"\bFAILED %s\b" % dict[action][0], o, re.I):
> raise error.TestError("..... %s, %s" % (action, dict[action][0]))
> if re.search(r"\bFAILED %s\b" % dict[action][1], o, re.I):
> break
> ...
> ...
> time.sleep(1)
> else:
> raise error.TestError("Could not %s service '%s'" % (action, service))
Personally I think this looks more complicated than having two separate
functions.
As for using the function to do other things, what other things did you
have in mind? This function runs 'sc start' or 'sc stop' repeatedly
with no parameters until an error message is printed. I don't know of
any other 'sc' operation that can work this way. ('sc pause' and 'sc
continue' won't display error messages when the service is already
paused/resumed. 'sc config' and 'sc control' require additional
parameters.)
>> +def start_windows_service(session, service, timeout=120):
>> + """
>> + Start a Windows service using sc.
>> + If the service is already running, do nothing.
>> + If the service isn't installed, fail.
>> +
>> + @param service: The name of the service
>> + @param timeout: Time duration to wait for service to start
>> + @raise: error.TestError is raised if the service can't be started
>> + """
>> + end_time = time.time() + timeout
>> + while time.time() < end_time:
>> + o = session.get_command_output("sc start %s" % service, timeout=60)
>> + # FAILED 1060 means the service isn't installed.
>> + if re.search(r"\bFAILED 1060\b", o, re.I):
>> + raise error.TestError("Could not start service '%s' "
>> + "(service not installed)" % service)
>> + # FAILED 1056 means the service is already running.
>> + if re.search(r"\bFAILED 1056\b", o, re.I):
>> + break
>> + time.sleep(1)
>> + else:
>> + raise error.TestError("Could not start service '%s'" % service)
>> +
>> +
>> def get_time(session, time_command, time_filter_re, time_format):
>> """
>> Return the host time and guest time. If the guest time cannot be fetched
>> --
>> 1.5.4.1
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe kvm" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2010-08-05 13:32 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-15 15:57 [KVM-AUTOTEST PATCH 1/9] KVM test: kvm_vm.py: make -drive index optional for both images and cdrom ISOs Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 2/9] KVM test: allow definition of multiple cdroms Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 3/9] KVM test: rss_file_transfer.py: add convenience functions upload() and download() Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 4/9] [RFC] KVM test: DTM automation program for WHQL tests Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 5/9] [RFC] KVM test: DTM machine deletion tool " Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 7/9] [RFC] KVM test: add whql_submission test Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 8/9] [RFC] KVM test: add whql_client_install test Michael Goldish
2010-07-15 15:57 ` [KVM-AUTOTEST PATCH 9/9] [RFC] KVM test: add WHQL test definitions to tests_base.cfg.sample Michael Goldish
2010-08-05 0:38 ` [KVM-AUTOTEST PATCH 6/9] [RFC] KVM test: add utility functions start_windows_service() and stop_windows_service() Amos Kong
2010-08-05 13:32 ` Michael Goldish
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).