| Index: client/tests/kvm/kvm_preprocessing.py
 | 
| diff --git a/client/tests/kvm/kvm_preprocessing.py b/client/tests/kvm/kvm_preprocessing.py
 | 
| index 4daafece2ea8de8db10d09561dd1c95b0c7fb703..1ddf99b90c121d7f86dd2c322741b681ee7b20ba 100644
 | 
| --- a/client/tests/kvm/kvm_preprocessing.py
 | 
| +++ b/client/tests/kvm/kvm_preprocessing.py
 | 
| @@ -50,18 +50,16 @@ def preprocess_vm(test, params, env, name):
 | 
|      @param name: The name of the VM object.
 | 
|      """
 | 
|      logging.debug("Preprocessing VM '%s'..." % name)
 | 
| -    vm = env.get_vm(name)
 | 
| +    vm = kvm_utils.env_get_vm(env, name)
 | 
|      if vm:
 | 
|          logging.debug("VM object found in environment")
 | 
|      else:
 | 
|          logging.debug("VM object does not exist; creating it")
 | 
|          vm = kvm_vm.VM(name, params, test.bindir, env.get("address_cache"))
 | 
| -        env.register_vm(name, vm)
 | 
| +        kvm_utils.env_register_vm(env, name, vm)
 | 
|  
 | 
|      start_vm = False
 | 
|  
 | 
| -    migration_mode = params.get("migration_mode", None)
 | 
| -
 | 
|      if params.get("restart_vm") == "yes":
 | 
|          logging.debug("'restart_vm' specified; (re)starting VM...")
 | 
|          start_vm = True
 | 
| @@ -74,19 +72,11 @@ def preprocess_vm(test, params, env, name):
 | 
|              logging.debug("VM's qemu command differs from requested one; "
 | 
|                            "restarting it...")
 | 
|              start_vm = True
 | 
| -    elif migration_mode is not None:
 | 
| -        logging.debug("Starting VM on migration incoming mode...")
 | 
| -        start_vm = True
 | 
|  
 | 
|      if start_vm:
 | 
| -        if migration_mode is not None:
 | 
| -            if not vm.create(name, params, test.bindir,
 | 
| -                             migration_mode=migration_mode):
 | 
| -                raise error.TestError("Could not start VM for migration")
 | 
| -        else:
 | 
| -            # Start the VM (or restart it if it's already up)
 | 
| -            if not vm.create(name, params, test.bindir):
 | 
| -                raise error.TestError("Could not start VM")
 | 
| +        # Start the VM (or restart it if it's already up)
 | 
| +        if not vm.create(name, params, test.bindir):
 | 
| +            raise error.TestError("Could not start VM")
 | 
|      else:
 | 
|          # Don't start the VM, just update its params
 | 
|          vm.params = params
 | 
| @@ -122,7 +112,7 @@ def postprocess_vm(test, params, env, name):
 | 
|      @param name: The name of the VM object.
 | 
|      """
 | 
|      logging.debug("Postprocessing VM '%s'..." % name)
 | 
| -    vm = env.get_vm(name)
 | 
| +    vm = kvm_utils.env_get_vm(env, name)
 | 
|      if vm:
 | 
|          logging.debug("VM object found in environment")
 | 
|      else:
 | 
| @@ -183,11 +173,13 @@ def process(test, params, env, image_func, vm_func):
 | 
|      @param vm_func: A function to call for each VM.
 | 
|      """
 | 
|      # Get list of VMs specified for this test
 | 
| -    for vm_name in params.objects("vms"):
 | 
| -        vm_params = params.object_params(vm_name)
 | 
| +    vm_names = kvm_utils.get_sub_dict_names(params, "vms")
 | 
| +    for vm_name in vm_names:
 | 
| +        vm_params = kvm_utils.get_sub_dict(params, vm_name)
 | 
|          # Get list of images specified for this VM
 | 
| -        for image_name in vm_params.objects("images"):
 | 
| -            image_params = vm_params.object_params(image_name)
 | 
| +        image_names = kvm_utils.get_sub_dict_names(vm_params, "images")
 | 
| +        for image_name in image_names:
 | 
| +            image_params = kvm_utils.get_sub_dict(vm_params, image_name)
 | 
|              # Call image_func for each image
 | 
|              image_func(test, image_params)
 | 
|          # Call vm_func for each vm
 | 
| @@ -212,7 +204,7 @@ def preprocess(test, params, env):
 | 
|      if "tcpdump" not in env and params.get("run_tcpdump", "yes") == "yes":
 | 
|          cmd = "%s -npvi any 'dst port 68'" % kvm_utils.find_command("tcpdump")
 | 
|          logging.debug("Starting tcpdump (%s)...", cmd)
 | 
| -        env["tcpdump"] = kvm_subprocess.Tail(
 | 
| +        env["tcpdump"] = kvm_subprocess.kvm_tail(
 | 
|              command=cmd,
 | 
|              output_func=_update_address_cache,
 | 
|              output_params=(env["address_cache"],))
 | 
| @@ -224,7 +216,7 @@ def preprocess(test, params, env):
 | 
|                  env["tcpdump"].get_output()))
 | 
|  
 | 
|      # Destroy and remove VMs that are no longer needed in the environment
 | 
| -    requested_vms = params.objects("vms")
 | 
| +    requested_vms = kvm_utils.get_sub_dict_names(params, "vms")
 | 
|      for key in env.keys():
 | 
|          vm = env[key]
 | 
|          if not kvm_utils.is_vm(vm):
 | 
| @@ -338,7 +330,7 @@ def postprocess(test, params, env):
 | 
|      if params.get("kill_unresponsive_vms") == "yes":
 | 
|          logging.debug("'kill_unresponsive_vms' specified; killing all VMs "
 | 
|                        "that fail to respond to a remote login request...")
 | 
| -        for vm in env.get_all_vms():
 | 
| +        for vm in kvm_utils.env_get_all_vms(env):
 | 
|              if vm.is_alive():
 | 
|                  session = vm.remote_login()
 | 
|                  if session:
 | 
| @@ -350,7 +342,7 @@ def postprocess(test, params, env):
 | 
|      kvm_subprocess.kill_tail_threads()
 | 
|  
 | 
|      # Terminate tcpdump if no VMs are alive
 | 
| -    living_vms = [vm for vm in env.get_all_vms() if vm.is_alive()]
 | 
| +    living_vms = [vm for vm in kvm_utils.env_get_all_vms(env) if vm.is_alive()]
 | 
|      if not living_vms and "tcpdump" in env:
 | 
|          env["tcpdump"].close()
 | 
|          del env["tcpdump"]
 | 
| @@ -370,7 +362,7 @@ def postprocess_on_error(test, params, env):
 | 
|      @param params: A dict containing all VM and image parameters.
 | 
|      @param env: The environment (a dict-like object).
 | 
|      """
 | 
| -    params.update(params.object_params("on_error"))
 | 
| +    params.update(kvm_utils.get_sub_dict(params, "on_error"))
 | 
|  
 | 
|  
 | 
|  def _update_address_cache(address_cache, line):
 | 
| @@ -382,11 +374,9 @@ def _update_address_cache(address_cache, line):
 | 
|          matches = re.findall(r"\w*:\w*:\w*:\w*:\w*:\w*", line)
 | 
|          if matches and address_cache.get("last_seen"):
 | 
|              mac_address = matches[0].lower()
 | 
| -            if time.time() - address_cache.get("time_%s" % mac_address, 0) > 5:
 | 
| -                logging.debug("(address cache) Adding cache entry: %s ---> %s",
 | 
| -                              mac_address, address_cache.get("last_seen"))
 | 
| +            logging.debug("(address cache) Adding cache entry: %s ---> %s",
 | 
| +                          mac_address, address_cache.get("last_seen"))
 | 
|              address_cache[mac_address] = address_cache.get("last_seen")
 | 
| -            address_cache["time_%s" % mac_address] = time.time()
 | 
|              del address_cache["last_seen"]
 | 
|  
 | 
|  
 | 
| @@ -408,7 +398,7 @@ def _take_screendumps(test, params, env):
 | 
|      cache = {}
 | 
|  
 | 
|      while True:
 | 
| -        for vm in env.get_all_vms():
 | 
| +        for vm in kvm_utils.env_get_all_vms(env):
 | 
|              if not vm.is_alive():
 | 
|                  continue
 | 
|              try:
 | 
| 
 |