Re: [PATCH] KVM test: use new functions in cdrom_test

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I forgot add pull request link:
https://github.com/autotest/autotest/pull/368

Dne 30.5.2012 16:43, Lukáš Doktor napsal(a):
Use get_block and other framework functions in cdrom test. Also
don't fail the whole test when tray-status reporting is not supported
by qemu and other cleanups.

Signed-off-by: Lukáš Doktor<ldoktor@xxxxxxxxxx>
---
  client/tests/kvm/tests/cdrom.py |  118 ++++++++++++++++-----------------------
  client/virt/subtests.cfg.sample |    2 +
  2 files changed, 50 insertions(+), 70 deletions(-)

diff --git a/client/tests/kvm/tests/cdrom.py b/client/tests/kvm/tests/cdrom.py
index 089150b..4390796 100644
--- a/client/tests/kvm/tests/cdrom.py
+++ b/client/tests/kvm/tests/cdrom.py
@@ -21,7 +21,7 @@ def run_cdrom(test, params, env):
      3) * If cdrom_test_autounlock is set, verifies that device is unlocked
         <300s after boot
      4) Eject cdrom using monitor and change with another iso several times.
-    5) Eject cdrom in guest and check tray status reporting.
+    5) * If cdrom_test_tray_status = yes, tests tray reporting.
      6) Try to format cdrom and check the return string.
      7) Mount cdrom device.
      8) Copy file from cdrom and compare files using diff.
@@ -35,6 +35,10 @@ def run_cdrom(test, params, env):
                                          eject CDROM directly after insert
      @param cfg: cdrom_test_autounlock - Test whether guest OS unlocks cdrom
                                          after boot (<300s after VM is booted)
+    @param cfg: cdrom_test_tray_status - Test tray reporting (eject and insert
+                                         CD couple of times in guest).
+
+    @warning: Check dmesg for block device failures
      """
      def master_cdroms(params):
          """ Creates 'new' cdrom with one file on it """
@@ -43,7 +47,7 @@ def run_cdrom(test, params, env):
          cdrom_cd1 = params.get("cdrom_cd1")
          if not os.path.isabs(cdrom_cd1):
              cdrom_cd1 = os.path.join(test.bindir, cdrom_cd1)
-        cdrom_dir = os.path.realpath(os.path.dirname(cdrom_cd1))
+        cdrom_dir = os.path.dirname(cdrom_cd1)
          utils.run("dd if=/dev/urandom of=orig bs=10M count=1")
          utils.run("dd if=/dev/urandom of=new bs=10M count=1")
          utils.run("mkisofs -o %s/orig.iso orig" % cdrom_dir)
@@ -55,57 +59,27 @@ def run_cdrom(test, params, env):
          error.context("cleaning up temp cdrom images")
          os.remove("%s/new.iso" % cdrom_dir)

-    def get_block_info(re_device='[^\n][^:]+'):
-        """ Gets device string and file from kvm-monitor """
-        blocks = vm.monitor.info("block")
-        devices = []
-        files = []
-        if isinstance(blocks, str):
-            devices = re.findall('(%s): .*' % re_device, blocks)
-            if devices:
-                for dev in devices:
-                    cdfile = re.findall('%s: .*file=(\S*) ' % dev, blocks)
-                    if cdfile:
-                        cdfile = os.path.realpath(cdfile[0])
-                    else:
-                        cdfile = None
-                    files.append(cdfile)
-        else:
-            for block in blocks:
-                if re.match(re_device, block['device']):
-                    devices.append(block['device'])
-                    try:
-                        cdfile = block['inserted']['file']
-                        if cdfile:
-                            cdfile = os.path.realpath(cdfile)
-                    except KeyError:
-                        cdfile = None
-                    files.append(cdfile)
-        return (devices, files)
-
-    def get_cdrom_info(device):
+    def get_cdrom_file(device):
          """
          @param device: qemu monitor device
          @return: file associated with $device device
          """
-        (_, cdfile) = get_block_info(device)
-        logging.debug("Device name: %s, ISO: %s", device, cdfile[0])
-        return cdfile[0]
-
-    def check_cdrom_locked(cdrom):
-        """ Checks whether the cdrom is locked """
          blocks = vm.monitor.info("block")
+        cdfile = None
          if isinstance(blocks, str):
-            lock_str = "locked=1"
-            for block in blocks.splitlines():
-                if cdrom in block and lock_str in block:
-                    return True
+            cdfile = re.findall('%s: .*file=(\S*) ' % device, blocks)
+            if not cdfile:
+                return None
+            else:
+                cdfile = cdfile[0]
          else:
              for block in blocks:
-                if ('inserted' in block.keys() and
-                    block['inserted']['file'] == cdrom):
-                    return block['locked']
-        return False
+                if block['device'] == device:
+                    try:
+                        cdfile = block['inserted']['file']
+                    except KeyError:
+                        continue
+        return cdfile

      def check_cdrom_tray(cdrom):
          """ Checks whether the tray is opend """
@@ -121,7 +95,7 @@ def run_cdrom(test, params, env):
              for block in blocks:
                  if block['device'] == cdrom and 'tray_open' in block.keys():
                      return block['tray_open']
-        raise error.TestNAError('cdrom tray reporting not supported')
+        return None

      def eject_cdrom(device, monitor):
          """ Ejects the cdrom using kvm-monitor """
@@ -149,7 +123,6 @@ def run_cdrom(test, params, env):
      cdrom_orig = params.get("cdrom_cd1")
      if not os.path.isabs(cdrom_orig):
          cdrom_orig = os.path.join(test.bindir, cdrom_orig)
-    cdrom_orig = os.path.realpath(cdrom_orig)
      cdrom = cdrom_orig
      output = session.get_command_output("ls /dev/cdrom*")
      cdrom_dev_list = re.findall("/dev/cdrom-\w+|/dev/cdrom\d*", output)
@@ -168,19 +141,17 @@ def run_cdrom(test, params, env):
          raise error.TestFail("Could not find a valid cdrom device")

      error.context("Detecting the existence of a cdrom")
-    cdfile = ''
-    (_device, _file) = get_block_info()
-    for i in range(len(_file)):
-        if _file[i] == cdrom:
-            cdfile = _file[i]
-            device = _device[i]
-    if cdfile != cdrom:
-        raise error.TestFail("Could not find a valid cdrom device")
+    cdfile = cdrom
+    device = vm.get_block({'file': cdfile})
+    if not device:
+        device = vm.get_block({'backing_file': cdfile})
+        if not device:
+            raise error.TestFail("Could not find a valid cdrom device")

      session.get_command_output("umount %s" % cdrom_dev)
      if params.get('cdrom_test_autounlock') == 'yes':
          error.context("Trying to unlock the cdrom")
-        if not virt_utils.wait_for(lambda: not check_cdrom_locked(cdfile),
+        if not virt_utils.wait_for(lambda: not vm.check_block_locked(device),
                                     300):
              raise error.TestFail("Device %s could not be unlocked" % device)

@@ -189,7 +160,7 @@ def run_cdrom(test, params, env):
      for i in range(1, max_times):
          session.cmd('eject %s' % cdrom_dev)
          eject_cdrom(device, vm.monitor)
-        if get_cdrom_info(device) is not None:
+        if get_cdrom_file(device) is not None:
              raise error.TestFail("Device %s was not ejected (%s)" % (cdrom, i))

          cdrom = cdrom_new
@@ -197,25 +168,32 @@ def run_cdrom(test, params, env):
          if i % 2 == 0:
              cdrom = cdrom_orig
          change_cdrom(device, cdrom, vm.monitor)
-        if get_cdrom_info(device) != cdrom:
+        if get_cdrom_file(device) != cdrom:
              raise error.TestFail("It wasn't possible to change cdrom %s (%s)"
                                    % (cdrom, i))
          time.sleep(workaround_eject_time)

      error.context('Eject the cdrom in guest %s times' % max_times)
-    for i in range(1, max_times):
-        session.cmd('eject %s' % cdrom_dev)
-        if not check_cdrom_tray(device):
-            raise error.TestFail("Monitor reports closed tray (%s)" % i)
-        session.cmd('dd if=%s of=/dev/null count=1' % cdrom_dev)
-        if check_cdrom_tray(device):
-            raise error.TestFail("Monitor reports opened tray (%s)" % i)
-        time.sleep(workaround_eject_time)
+    if params.get('cdrom_test_tray_status') != 'yes':
+        pass
+    elif check_cdrom_tray(device) is None:
+        logging.error("Tray reporting not supported by qemu!")
+        logging.error("cdrom_test_tray_status skipped...")
+    else:
+        for i in range(1, max_times):
+            session.cmd('eject %s' % cdrom_dev)
+            if not check_cdrom_tray(device):
+                raise error.TestFail("Monitor reports closed tray (%s)" % i)
+            session.cmd('dd if=%s of=/dev/null count=1' % cdrom_dev)
+            if check_cdrom_tray(device):
+                raise error.TestFail("Monitor reports opened tray (%s)" % i)
+            time.sleep(workaround_eject_time)

      error.context("Check whether the cdrom is read-only")
      try:
          output = session.cmd("echo y | mkfs %s" % cdrom_dev)
-        raise error.TestFail("Attempt to format cdrom %s succeeded" % cdrom_dev)
+        raise error.TestFail("Attempt to format cdrom %s succeeded" %
+                                                                    cdrom_dev)
      except aexpect.ShellError:
          pass

@@ -248,16 +226,16 @@ def run_cdrom(test, params, env):

      error.context("Cleanup")
      # Return the cdrom_orig
-    cdfile = get_cdrom_info(device)
+    cdfile = get_cdrom_file(device)
      if cdfile != cdrom_orig:
          time.sleep(workaround_eject_time)
          session.cmd('eject %s' % cdrom_dev)
          eject_cdrom(device, vm.monitor)
-        if get_cdrom_info(device) is not None:
+        if get_cdrom_file(device) is not None:
              raise error.TestFail("Device %s was not ejected (%s)" % (cdrom, i))

          change_cdrom(device, cdrom_orig, vm.monitor)
-        if get_cdrom_info(device) != cdrom_orig:
+        if get_cdrom_file(device) != cdrom_orig:
              raise error.TestFail("It wasn't possible to change cdrom %s (%s)"
                                    % (cdrom, i))

diff --git a/client/virt/subtests.cfg.sample b/client/virt/subtests.cfg.sample
index cdb6722..d371f49 100644
--- a/client/virt/subtests.cfg.sample
+++ b/client/virt/subtests.cfg.sample
@@ -1767,6 +1767,8 @@ variants:
          max_times = 20
          # test whether cdrom is unlocked<300s after boot
          cdrom_test_autounlock = no
+        # test the tray status
+        cdrom_test_tray_status = yes
          # wait before eject $cdrom (let OS initialize cdrom ...)
          workaround_eject_time = 0


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux