[Sheepdog] [PATCH 1/2] tests: add test_io method to support qemu-io test.
chenbaozi at gmail.com
chenbaozi at gmail.com
Fri Nov 11 16:17:22 CET 2011
From: CHEN Baozi <chenbaozi.pt at taobao.com>
Also fixed some python grammar bugs. (missing "self." when refering
member variable in Python class)
Noticed that the subprocess.PIPE in python has limited size. I redirect
it to None after the node has joined Sheepdog successfully, or it would
lead a dead-lock when the pipe becomes full.
Signed-off-by: CHEN Baozi <chenbaozi.pt at taobao.com>
---
tests/sheepdog_test.py | 28 ++++++++++++++++++++++++++--
1 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/tests/sheepdog_test.py b/tests/sheepdog_test.py
index 111e7e2..ddce3fe 100644
--- a/tests/sheepdog_test.py
+++ b/tests/sheepdog_test.py
@@ -24,16 +24,39 @@ class VirtualMachine:
def read(self, offset, size):
"""Emulate read requests."""
- vdiname = 'sheepdog:localhost:' + str(node.get_port()) + ':' + vdi.name
+ vdiname = 'sheepdog:localhost:' + str(self.node.get_port()) \
+ + ':' + self.vdi.name
p = Popen(['qemu-io', vdiname, 'read', str(offset), str(size)], stdout=PIPE)
return p
def write(self, offset, size):
"""Emulate write requests."""
- vdiname = 'sheepdog:localhost:' + str(node.get_port()) + ':' + vdi.name
+ vdiname = 'sheepdog:localhost:' + str(self.node.get_port()) \
+ + ':' + self.vdi.name
p = Popen(['qemu-io', vdiname, 'write', str(offset), str(size)], stdout=PIPE)
return p
+ def test_io(self, cmd, case, async=False):
+ sed_pattern = "s/[0-9]* ops\; [0-9/:. sec]* ([0-9/.inf]* " \
+ + "[EPTGMKiBbytes]*\/sec and [0-9/.inf]* ops\/sec)/" \
+ + "X ops\; XX:XX:XX.X (XXX YYY\/sec and XXX ops\/sec)/"
+ aio_pattern = "s/bytes at offset [0-9]*/bytes at offset XXX/g"
+
+ vdiname = 'sheepdog:localhost:' + str(self.node.get_port()) \
+ + ':' + self.vdi.name
+
+ p = Popen(cmd + [vdiname], stdin=PIPE, stdout=PIPE, stderr=PIPE)
+ (out, err) = p.communicate(case)
+
+ out = re.sub("qemu-io>[\ \n]", "", out).strip()
+ p = Popen(["sed", "-e", sed_pattern], stdin=PIPE, stdout=PIPE)
+ (out, _) = p.communicate(out)
+
+ if async:
+ p = Popen(["sed", "-e", aio_pattern], stdin=PIPE, stdout=PIPE)
+ (out, _) = p.communicate(out.strip())
+
+ return (out.strip(), err.strip())
class VirtualDiskImage:
def __init__(self, name, size):
@@ -90,6 +113,7 @@ class Node:
match = re.search(r'join Sheepdog cluster', line)
if match:
self.started = True
+ self.p.stderr=None
break
def stop(self):
--
1.7.6.4
More information about the sheepdog
mailing list