瀏覽代碼

storage: fix Storage.clone and Storage.clone_volume

1. Volume.import_volume expect volume to be created first.
2. asyncio.wait do not accept generator, it must be concrete iterable.
Marek Marczykowski-Górecki 6 年之前
父節點
當前提交
910f793c61
共有 1 個文件被更改,包括 13 次插入4 次删除
  1. 13 4
      qubes/storage/__init__.py

+ 13 - 4
qubes/storage/__init__.py

@@ -513,13 +513,22 @@ class Storage(object):
         src_volume = src_vm.volumes[name]
         msg = "Importing volume {!s} from vm {!s}"
         self.vm.log.info(msg.format(src_volume.name, src_vm.name))
+
+        # First create the destination volume
+        create_op_ret = dst.create()
+        # clone/import functions may be either synchronous or asynchronous
+        # in the later case, we need to wait for them to finish
+        if asyncio.iscoroutine(create_op_ret):
+            yield from create_op_ret
+
+        # Then import data from source volume
         clone_op_ret = dst.import_volume(src_volume)
 
         # clone/import functions may be either synchronous or asynchronous
         # in the later case, we need to wait for them to finish
         if asyncio.iscoroutine(clone_op_ret):
-            clone_op_ret = yield from clone_op_ret
-        self.vm.volumes[name] = clone_op_ret
+            yield from clone_op_ret
+        self.vm.volumes[name] = dst
         return self.vm.volumes[name]
 
     @asyncio.coroutine
@@ -528,8 +537,8 @@ class Storage(object):
 
         self.vm.volumes = {}
         with VmCreationManager(self.vm):
-            yield from asyncio.wait(self.clone_volume(src_vm, vol_name)
-                for vol_name in self.vm.volume_config.keys())
+            yield from asyncio.wait([self.clone_volume(src_vm, vol_name)
+                for vol_name in self.vm.volume_config.keys()])
 
     @property
     def outdated_volumes(self):