iotests: implement QemuIoInteractive class

Implement QemuIoInteractive to test nbd-server-remove command when
there are active connections.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20180119135719.24745-5-vsementsov@virtuozzo.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2018-01-19 16:57:18 +03:00 committed by Eric Blake
parent 549084eaed
commit 9fa90eec04
1 changed files with 38 additions and 0 deletions

View File

@ -93,6 +93,44 @@ def qemu_io(*args):
sys.stderr.write('qemu-io received signal %i: %s\n' % (-exitcode, ' '.join(args)))
return subp.communicate()[0]
class QemuIoInteractive:
def __init__(self, *args):
self.args = qemu_io_args + list(args)
self._p = subprocess.Popen(self.args, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
assert self._p.stdout.read(9) == 'qemu-io> '
def close(self):
self._p.communicate('q\n')
def _read_output(self):
pattern = 'qemu-io> '
n = len(pattern)
pos = 0
s = []
while pos != n:
c = self._p.stdout.read(1)
# check unexpected EOF
assert c != ''
s.append(c)
if c == pattern[pos]:
pos += 1
else:
pos = 0
return ''.join(s[:-n])
def cmd(self, cmd):
# quit command is in close(), '\n' is added automatically
assert '\n' not in cmd
cmd = cmd.strip()
assert cmd != 'q' and cmd != 'quit'
self._p.stdin.write(cmd + '\n')
return self._read_output()
def qemu_nbd(*args):
'''Run qemu-nbd in daemon mode and return the parent's exit code'''
return subprocess.call(qemu_nbd_args + ['--fork'] + list(args))