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.
This commit is contained in:
Marek Marczykowski-Górecki 2017-07-25 14:20:42 +02:00
parent 1af7034d57
commit 910f793c61
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724

View File

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