On 04/02/2012 08:18 PM, Martin Kletzander wrote:
This patch adds a test that obtains a screenshot of a domain and
saves
it in a file.
Maybe we shoud later on modify this or add another test to allow
comparing the returned image file against a pre-defined pattern, so we
could actualy check if the complete stack including the OS, qemu, video
drivers and libvirt's streams work.
---
repos/domain/screenshot.py | 57 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 57 insertions(+), 0 deletions(-)
create mode 100644 repos/domain/screenshot.py
diff --git a/repos/domain/screenshot.py b/repos/domain/screenshot.py
new file mode 100644
index 0000000..9986cab
--- /dev/null
+++ b/repos/domain/screenshot.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+"""This test is used for creating a screenshot of a domain and saving
+ it in a file. The Screenshot format is hypervisor specific.
+
+ mandatory arguments: guestname
+ screen
+ filename
+"""
+
+import os
+import mimetypes
+
+import libvirt
+
+def check_params(params):
+ """Verify input parameters"""
+ for key in ('guestname', 'screen', 'filename'):
+ if key not in params:
+ raise KeyError('Missing key %s required for screenshot test' % key)
+
+ params['screen'] = int(params['screen'])
+ params['filename'] = os.path.abspath(params['filename'])
+
+def saver(stream, data, file_):
+ return file_.write(data)
+
+def screenshot(params):
+ """This method takes a screenshot of a running machine and saves
+ it in a filename"""
+ ret = 1
I'm starting to notice this pattern. My test contain something very
similar ... a try block, that contains all of the code for testing and
then some exception and other cleanup code. I think this pattern will be
very common and we should consider moving it one level up, to free the
test writers from copying blocks of common code across all test cases.
+ try:
+ logger = params['logger']
+
+ check_params(params)
+
+ conn = libvirt.open(params['uri'])
+ dom = conn.lookupByName(params['guestname'])
+
+ st = conn.newStream(0)
+ mime = dom.screenshot(st, params['screen'], 0)
+
+ ext = mimetypes.guess_extension(mime) or '.ppm'
+ filename = params['filename'] + ext
+ f = file(filename, 'w')
+
+ logger.debug('Saving screenshot into %s' % filename)
+ st.recvAll(saver, f)
+ logger.debug('Mimetype of the file is %s' % mime)
+
+ ret = st.finish()
+
+ finally:
+ # Some error occurred, cleanup
+ if 'conn' in locals() and conn.isAlive():
+ conn.close()
+
+ return ret
Looks good, but I'm not a very experienced Pythonist, so if somebody
else (Guannan?) could have a quick look and confirm my ACK before pushing.
Peter