| Index: client/tests/kvm/scripts/virtio_console_guest.py
|
| diff --git a/client/tests/kvm/scripts/virtio_console_guest.py b/client/tests/kvm/scripts/virtio_console_guest.py
|
| index c407231aab3523ebf00bfa51beed08e9a99c89ba..6626593ca3fbef82b0fcbce9ff52b4b79db2ba61 100755
|
| --- a/client/tests/kvm/scripts/virtio_console_guest.py
|
| +++ b/client/tests/kvm/scripts/virtio_console_guest.py
|
| @@ -14,6 +14,7 @@ import fcntl, traceback, signal
|
|
|
| DEBUGPATH = "/sys/kernel/debug"
|
| SYSFSPATH = "/sys/class/virtio-ports/"
|
| +DEVPATH = "/dev/virtio-ports/"
|
|
|
| exiting = False
|
|
|
| @@ -53,15 +54,16 @@ class VirtioGuest:
|
| return out
|
|
|
|
|
| - def _get_port_status(self):
|
| + def _get_port_status(self, in_files=None):
|
| """
|
| Get info about ports from kernel debugfs.
|
|
|
| + @param in_files: Array of input files.
|
| @return: Ports dictionary of port properties
|
| """
|
| ports = {}
|
| not_present_msg = "FAIL: There's no virtio-ports dir in debugfs"
|
| - if (not os.path.ismount(DEBUGPATH)):
|
| + if not os.path.ismount(DEBUGPATH):
|
| os.system('mount -t debugfs none %s' % (DEBUGPATH))
|
| try:
|
| if not os.path.isdir('%s/virtio-ports' % (DEBUGPATH)):
|
| @@ -70,6 +72,22 @@ class VirtioGuest:
|
| print not_present_msg
|
| else:
|
| viop_names = os.listdir('%s/virtio-ports' % (DEBUGPATH))
|
| + if in_files is not None:
|
| + dev_names = os.listdir('/dev')
|
| + rep = re.compile(r"vport[0-9]p[0-9]+")
|
| + dev_names = filter(lambda x: rep.match(x) is not None, dev_names)
|
| + if len(dev_names) != len(in_files):
|
| + print ("FAIL: Not all ports were successfully initialized "
|
| + "in /dev, only %d from %d." % (len(dev_names),
|
| + len(in_files)))
|
| + return
|
| +
|
| + if len(viop_names) != len(in_files):
|
| + print ("FAIL: Not all ports were successfuly initialized "
|
| + "in debugfs, only %d from %d." % (len(viop_names),
|
| + len(in_files)))
|
| + return
|
| +
|
| for name in viop_names:
|
| open_db_file = "%s/virtio-ports/%s" % (DEBUGPATH, name)
|
| f = open(open_db_file, 'r')
|
| @@ -82,30 +100,36 @@ class VirtioGuest:
|
| m = re.match("(\S+): (\S+)", line)
|
| port[m.group(1)] = m.group(2)
|
|
|
| - if (port['is_console'] == "yes"):
|
| + if port['is_console'] == "yes":
|
| port["path"] = "/dev/hvc%s" % (port["console_vtermno"])
|
| # Console works like a serialport
|
| else:
|
| port["path"] = "/dev/%s" % name
|
|
|
| - if (not os.path.exists(port['path'])):
|
| + if not os.path.exists(port['path']):
|
| print "FAIL: %s not exist" % port['path']
|
|
|
| sysfspath = SYSFSPATH + name
|
| - if (not os.path.isdir(sysfspath)):
|
| + if not os.path.isdir(sysfspath):
|
| print "FAIL: %s not exist" % (sysfspath)
|
|
|
| info_name = sysfspath + "/name"
|
| port_name = self._readfile(info_name).strip()
|
| - if (port_name != port["name"]):
|
| - print ("FAIL: Port info not match \n%s - %s\n%s - %s" %
|
| + if port_name != port["name"]:
|
| + print ("FAIL: Port info does not match "
|
| + "\n%s - %s\n%s - %s" %
|
| (info_name , port_name,
|
| "%s/virtio-ports/%s" % (DEBUGPATH, name),
|
| port["name"]))
|
| + dev_ppath = DEVPATH + port_name
|
| + if not os.path.exists(dev_ppath):
|
| + print "FAIL: Symlink %s does not exist." % dev_ppath
|
| + if not os.path.realpath(dev_ppath) != "/dev/name":
|
| + print "FAIL: Symlink %s is not correct." % dev_ppath
|
| except AttributeError:
|
| - print ("In file " + open_db_file +
|
| - " are bad data\n"+ "".join(file).strip())
|
| - print ("FAIL: Fail file data.")
|
| + print ("Bad data on file %s:\n%s. " %
|
| + (open_db_file, "".join(file).strip()))
|
| + print "FAIL: Bad data on file %s." % open_db_file
|
| return
|
|
|
| ports[port['name']] = port
|
| @@ -114,18 +138,31 @@ class VirtioGuest:
|
| return ports
|
|
|
|
|
| + def check_zero_sym(self):
|
| + """
|
| + Check if port /dev/vport0p0 was created.
|
| + """
|
| + symlink = "/dev/vport0p0"
|
| + if os.path.exists(symlink):
|
| + print "PASS: Symlink %s exists." % symlink
|
| + else:
|
| + print "FAIL: Symlink %s does not exist." % symlink
|
| +
|
| +
|
| def init(self, in_files):
|
| """
|
| Init and check port properties.
|
| """
|
| - self.ports = self._get_port_status()
|
| + self.ports = self._get_port_status(in_files)
|
|
|
| - if self.ports == None:
|
| + if self.ports is None:
|
| return
|
| for item in in_files:
|
| if (item[1] != self.ports[item[0]]["is_console"]):
|
| print self.ports
|
| print "FAIL: Host console is not like console on guest side\n"
|
| + return
|
| +
|
| print "PASS: Init and check virtioconsole files in system."
|
|
|
|
|
| @@ -426,7 +463,7 @@ class VirtioGuest:
|
| return ret
|
|
|
|
|
| - def async(self, port, mode=True, exp_val = 0):
|
| + def async(self, port, mode=True, exp_val=0):
|
| """
|
| Set port function mode async/sync.
|
|
|
| @@ -471,11 +508,11 @@ class VirtioGuest:
|
| """
|
| descriptor = None
|
| path = self.ports[file]["path"]
|
| - if path != None:
|
| + if path is not None:
|
| if path in self.files.keys():
|
| descriptor = self.files[path]
|
| del self.files[path]
|
| - if descriptor != None:
|
| + if descriptor is not None:
|
| try:
|
| os.close(descriptor)
|
| except Exception, inst:
|
| @@ -566,7 +603,7 @@ class VirtioGuest:
|
| print "PASS: Sender start"
|
|
|
|
|
| - def send(self, port, length=1, mode=True):
|
| + def send(self, port, length=1, mode=True, is_static=False):
|
| """
|
| Send a data of some length
|
|
|
| @@ -577,14 +614,18 @@ class VirtioGuest:
|
| in_f = self._open([port])
|
|
|
| data = ""
|
| - while len(data) < length:
|
| - data += "%c" % random.randrange(255)
|
| - try:
|
| - writes = os.write(in_f[0], data)
|
| - except Exception, inst:
|
| - print inst
|
| - if not writes:
|
| - writes = 0
|
| + writes = 0
|
| +
|
| + if not is_static:
|
| + while len(data) < length:
|
| + data += "%c" % random.randrange(255)
|
| + try:
|
| + writes = os.write(in_f[0], data)
|
| + except Exception, inst:
|
| + print inst
|
| + else:
|
| + while len(data) < 4096:
|
| + data += "%c" % random.randrange(255)
|
| if mode:
|
| while (writes < length):
|
| try:
|
| @@ -632,7 +673,7 @@ class VirtioGuest:
|
| buf = ""
|
| if ret[0]:
|
| buf = os.read(in_f[0], buffer)
|
| - print ("PASS: Rest in socket: ") + str(buf[10])
|
| + print ("PASS: Rest in socket: ") + str(buf[:10])
|
|
|
|
|
| def is_alive():
|
| @@ -681,6 +722,7 @@ def worker(virt):
|
| traceback.format_exception(exc_type,
|
| exc_value,
|
| exc_traceback))
|
| + print "FAIL: Guest command exception."
|
|
|
|
|
| def sigusr_handler(sig, frame):
|
| @@ -704,9 +746,9 @@ def main():
|
| catch = virt.catching_signal()
|
| if catch:
|
| signal.signal(signal.SIGIO, virt)
|
| - elif catch == False:
|
| + elif catch is False:
|
| signal.signal(signal.SIGIO, signal.SIG_DFL)
|
| - if (catch != None):
|
| + if catch is not None:
|
| virt.use_config.set()
|
| print "PASS: guest_exit"
|
|
|
|
|