factor out utils.coro_maybe()
This commit is contained in:
		
							parent
							
								
									d94e13f753
								
							
						
					
					
						commit
						fe97a15d11
					
				| @ -380,10 +380,7 @@ class QubesAdminAPI(qubes.api.AbstractQubesAPI): | |||||||
|         revision = untrusted_revision |         revision = untrusted_revision | ||||||
| 
 | 
 | ||||||
|         self.fire_event_for_permission(volume=volume, revision=revision) |         self.fire_event_for_permission(volume=volume, revision=revision) | ||||||
| 
 |         yield from qubes.utils.coro_maybe(volume.revert(revision)) | ||||||
|         ret = volume.revert(revision) |  | ||||||
|         if asyncio.iscoroutine(ret): |  | ||||||
|             yield from ret |  | ||||||
|         self.app.save() |         self.app.save() | ||||||
| 
 | 
 | ||||||
|     # write=True because this allow to clone VM - and most likely modify that |     # write=True because this allow to clone VM - and most likely modify that | ||||||
| @ -432,15 +429,8 @@ class QubesAdminAPI(qubes.api.AbstractQubesAPI): | |||||||
| 
 | 
 | ||||||
|         self.fire_event_for_permission(src_volume=src_volume, |         self.fire_event_for_permission(src_volume=src_volume, | ||||||
|             dst_volume=dst_volume) |             dst_volume=dst_volume) | ||||||
| 
 |         self.dest.volumes[self.arg] = yield from qubes.utils.coro_maybe( | ||||||
|         op_retval = dst_volume.import_volume(src_volume) |             dst_volume.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(op_retval): |  | ||||||
|             op_retval = yield from op_retval |  | ||||||
| 
 |  | ||||||
|         self.dest.volumes[self.arg] = op_retval |  | ||||||
|         self.app.save() |         self.app.save() | ||||||
| 
 | 
 | ||||||
|     @qubes.api.method('admin.vm.volume.Resize', |     @qubes.api.method('admin.vm.volume.Resize', | ||||||
|  | |||||||
| @ -1257,9 +1257,7 @@ class Qubes(qubes.PropertyHolder): | |||||||
| 
 | 
 | ||||||
|         kwargs['name'] = name |         kwargs['name'] = name | ||||||
|         pool = self._get_pool(**kwargs) |         pool = self._get_pool(**kwargs) | ||||||
|         ret = pool.setup() |         yield from qubes.utils.coro_maybe(pool.setup()) | ||||||
|         if asyncio.iscoroutine(ret): |  | ||||||
|             yield from ret |  | ||||||
|         self.pools[name] = pool |         self.pools[name] = pool | ||||||
|         yield from self.fire_event_async('pool-add', pool=pool) |         yield from self.fire_event_async('pool-add', pool=pool) | ||||||
|         return pool |         return pool | ||||||
| @ -1283,9 +1281,7 @@ class Qubes(qubes.PropertyHolder): | |||||||
|             yield from self.fire_event_async('pool-pre-delete', |             yield from self.fire_event_async('pool-pre-delete', | ||||||
|                 pre_event=True, pool=pool) |                 pre_event=True, pool=pool) | ||||||
|             del self.pools[name] |             del self.pools[name] | ||||||
|             ret = pool.destroy() |             yield from qubes.utils.coro_maybe(pool.destroy()) | ||||||
|             if asyncio.iscoroutine(ret): |  | ||||||
|                 yield from ret |  | ||||||
|             yield from self.fire_event_async('pool-delete', pool=pool) |             yield from self.fire_event_async('pool-delete', pool=pool) | ||||||
|         except KeyError: |         except KeyError: | ||||||
|             return |             return | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ | |||||||
| import asyncio | import asyncio | ||||||
| 
 | 
 | ||||||
| import qubes.ext | import qubes.ext | ||||||
|  | import qubes.utils | ||||||
| 
 | 
 | ||||||
| class WindowsFeatures(qubes.ext.Extension): | class WindowsFeatures(qubes.ext.Extension): | ||||||
|     # pylint: disable=too-few-public-methods |     # pylint: disable=too-few-public-methods | ||||||
| @ -67,7 +68,6 @@ class WindowsFeatures(qubes.ext.Extension): | |||||||
|             # until windows tools get ability to prepare private.img on its own, |             # until windows tools get ability to prepare private.img on its own, | ||||||
|             # copy one from the template |             # copy one from the template | ||||||
|             vm.log.info('Windows template - cloning private volume') |             vm.log.info('Windows template - cloning private volume') | ||||||
|             import_op = vm.volumes['private'].import_volume( |             yield from qubes.utils.coro_maybe( | ||||||
|                 template.volumes['private']) |                 vm.volumes['private'].import_volume( | ||||||
|             if asyncio.iscoroutine(import_op): |                     template.volumes['private'])) | ||||||
|                 yield from import_op |  | ||||||
|  | |||||||
| @ -489,9 +489,7 @@ class Storage: | |||||||
|         ''' Resizes volume a read-writable volume ''' |         ''' Resizes volume a read-writable volume ''' | ||||||
|         if isinstance(volume, str): |         if isinstance(volume, str): | ||||||
|             volume = self.vm.volumes[volume] |             volume = self.vm.volumes[volume] | ||||||
|         ret = volume.resize(size) |         yield from qubes.utils.coro_maybe(volume.resize(size)) | ||||||
|         if asyncio.iscoroutine(ret): |  | ||||||
|             yield from ret |  | ||||||
|         if self.vm.is_running(): |         if self.vm.is_running(): | ||||||
|             try: |             try: | ||||||
|                 yield from self.vm.run_service_for_stdio('qubes.ResizeDisk', |                 yield from self.vm.run_service_for_stdio('qubes.ResizeDisk', | ||||||
| @ -535,21 +533,8 @@ class Storage: | |||||||
|         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)) | ||||||
| 
 |         yield from qubes.utils.coro_maybe(dst.create()) | ||||||
|         # First create the destination volume |         yield from qubes.utils.coro_maybe(dst.import_volume(src_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): |  | ||||||
|             yield from clone_op_ret |  | ||||||
|         self.vm.volumes[name] = dst |         self.vm.volumes[name] = dst | ||||||
|         return self.vm.volumes[name] |         return self.vm.volumes[name] | ||||||
| 
 | 
 | ||||||
| @ -671,10 +656,7 @@ class Storage: | |||||||
|             ret = volume.import_data() |             ret = volume.import_data() | ||||||
|         else: |         else: | ||||||
|             ret = self.vm.volumes[volume].import_data() |             ret = self.vm.volumes[volume].import_data() | ||||||
| 
 |         return (yield from qubes.utils.coro_maybe(ret)) | ||||||
|         if asyncio.iscoroutine(ret): |  | ||||||
|             ret = yield from ret |  | ||||||
|         return ret |  | ||||||
| 
 | 
 | ||||||
|     @asyncio.coroutine |     @asyncio.coroutine | ||||||
|     def import_data_end(self, volume, success): |     def import_data_end(self, volume, success): | ||||||
| @ -686,10 +668,7 @@ class Storage: | |||||||
|             ret = volume.import_data_end(success=success) |             ret = volume.import_data_end(success=success) | ||||||
|         else: |         else: | ||||||
|             ret = self.vm.volumes[volume].import_data_end(success=success) |             ret = self.vm.volumes[volume].import_data_end(success=success) | ||||||
| 
 |         return (yield from qubes.utils.coro_maybe(ret)) | ||||||
|         if asyncio.iscoroutine(ret): |  | ||||||
|             ret = yield from ret |  | ||||||
|         return ret |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class VolumesCollection: | class VolumesCollection: | ||||||
|  | |||||||
| @ -28,6 +28,7 @@ import qubes.storage.lvm | |||||||
| import qubes.tests | import qubes.tests | ||||||
| import qubes.tests.storage_lvm | import qubes.tests.storage_lvm | ||||||
| import qubes.tests.storage_reflink | import qubes.tests.storage_reflink | ||||||
|  | import qubes.utils | ||||||
| import qubes.vm.appvm | import qubes.vm.appvm | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -84,11 +85,8 @@ class StorageTestMixin(object): | |||||||
|             'rw': True, |             'rw': True, | ||||||
|         } |         } | ||||||
|         testvol = self.vm1.storage.init_volume('testvol', volume_config) |         testvol = self.vm1.storage.init_volume('testvol', volume_config) | ||||||
|         coro_maybe = testvol.create() |         yield from qubes.utils.coro_maybe(testvol.create()) | ||||||
|         del testvol |         del testvol | ||||||
|         if asyncio.iscoroutine(coro_maybe): |  | ||||||
|             yield from coro_maybe |  | ||||||
|         del coro_maybe |  | ||||||
|         self.app.save() |         self.app.save() | ||||||
|         yield from (self.vm1.start()) |         yield from (self.vm1.start()) | ||||||
|         yield from self.wait_for_session(self.vm1) |         yield from self.wait_for_session(self.vm1) | ||||||
| @ -120,11 +118,8 @@ class StorageTestMixin(object): | |||||||
|             'rw': True, |             'rw': True, | ||||||
|         } |         } | ||||||
|         testvol = self.vm1.storage.init_volume('testvol', volume_config) |         testvol = self.vm1.storage.init_volume('testvol', volume_config) | ||||||
|         coro_maybe = testvol.create() |         yield from qubes.utils.coro_maybe(testvol.create()) | ||||||
|         del testvol |         del testvol | ||||||
|         if asyncio.iscoroutine(coro_maybe): |  | ||||||
|             yield from coro_maybe |  | ||||||
|         del coro_maybe |  | ||||||
|         self.app.save() |         self.app.save() | ||||||
|         yield from self.vm1.start() |         yield from self.vm1.start() | ||||||
|         yield from self.wait_for_session(self.vm1) |         yield from self.wait_for_session(self.vm1) | ||||||
| @ -158,11 +153,8 @@ class StorageTestMixin(object): | |||||||
|             'rw': False, |             'rw': False, | ||||||
|         } |         } | ||||||
|         testvol = self.vm1.storage.init_volume('testvol', volume_config) |         testvol = self.vm1.storage.init_volume('testvol', volume_config) | ||||||
|         coro_maybe = testvol.create() |         yield from qubes.utils.coro_maybe(testvol.create()) | ||||||
|         del testvol |         del testvol | ||||||
|         if asyncio.iscoroutine(coro_maybe): |  | ||||||
|             yield from coro_maybe |  | ||||||
|         del coro_maybe |  | ||||||
|         self.app.save() |         self.app.save() | ||||||
|         yield from self.vm1.start() |         yield from self.vm1.start() | ||||||
|         # non-volatile image not clean |         # non-volatile image not clean | ||||||
| @ -192,10 +184,7 @@ class StorageTestMixin(object): | |||||||
|             'rw': True, |             'rw': True, | ||||||
|         } |         } | ||||||
|         testvol = self.vm1.storage.init_volume('testvol', volume_config) |         testvol = self.vm1.storage.init_volume('testvol', volume_config) | ||||||
|         coro_maybe = testvol.create() |         yield from qubes.utils.coro_maybe(testvol.create()) | ||||||
|         if asyncio.iscoroutine(coro_maybe): |  | ||||||
|             yield from coro_maybe |  | ||||||
|         del coro_maybe |  | ||||||
|         volume_config = { |         volume_config = { | ||||||
|             'pool': self.pool.name, |             'pool': self.pool.name, | ||||||
|             'size': size, |             'size': size, | ||||||
| @ -205,11 +194,8 @@ class StorageTestMixin(object): | |||||||
|         } |         } | ||||||
|         del testvol |         del testvol | ||||||
|         testvol_snap = self.vm2.storage.init_volume('testvol', volume_config) |         testvol_snap = self.vm2.storage.init_volume('testvol', volume_config) | ||||||
|         coro_maybe = testvol_snap.create() |         yield from qubes.utils.coro_maybe(testvol_snap.create()) | ||||||
|         del testvol_snap |         del testvol_snap | ||||||
|         if asyncio.iscoroutine(coro_maybe): |  | ||||||
|             yield from coro_maybe |  | ||||||
|         del coro_maybe |  | ||||||
|         self.app.save() |         self.app.save() | ||||||
|         yield from self.vm1.start() |         yield from self.vm1.start() | ||||||
|         yield from self.vm2.start() |         yield from self.vm2.start() | ||||||
| @ -284,10 +270,7 @@ class StorageTestMixin(object): | |||||||
|             'rw': True, |             'rw': True, | ||||||
|         } |         } | ||||||
|         testvol = self.vm1.storage.init_volume('testvol', volume_config) |         testvol = self.vm1.storage.init_volume('testvol', volume_config) | ||||||
|         coro_maybe = testvol.create() |         yield from qubes.utils.coro_maybe(testvol.create()) | ||||||
|         if asyncio.iscoroutine(coro_maybe): |  | ||||||
|             yield from coro_maybe |  | ||||||
|         del coro_maybe |  | ||||||
|         volume_config = { |         volume_config = { | ||||||
|             'pool': self.pool.name, |             'pool': self.pool.name, | ||||||
|             'size': size, |             'size': size, | ||||||
| @ -297,11 +280,8 @@ class StorageTestMixin(object): | |||||||
|         } |         } | ||||||
|         del testvol |         del testvol | ||||||
|         testvol_snap = self.vm2.storage.init_volume('testvol', volume_config) |         testvol_snap = self.vm2.storage.init_volume('testvol', volume_config) | ||||||
|         coro_maybe = testvol_snap.create() |         yield from qubes.utils.coro_maybe(testvol_snap.create()) | ||||||
|         del testvol_snap |         del testvol_snap | ||||||
|         if asyncio.iscoroutine(coro_maybe): |  | ||||||
|             yield from coro_maybe |  | ||||||
|         del coro_maybe |  | ||||||
|         self.app.save() |         self.app.save() | ||||||
|         yield from self.vm2.start() |         yield from self.vm2.start() | ||||||
|         yield from self.wait_for_session(self.vm2) |         yield from self.wait_for_session(self.vm2) | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ | |||||||
| # License along with this library; if not, see <https://www.gnu.org/licenses/>. | # License along with this library; if not, see <https://www.gnu.org/licenses/>. | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
|  | import asyncio | ||||||
| import hashlib | import hashlib | ||||||
| import random | import random | ||||||
| import string | import string | ||||||
| @ -183,3 +184,9 @@ def match_vm_name_with_special(vm, name): | |||||||
|     if name.startswith('@type:'): |     if name.startswith('@type:'): | ||||||
|         return name[len('@type:'):] == vm.__class__.__name__ |         return name[len('@type:'):] == vm.__class__.__name__ | ||||||
|     return name == vm.name |     return name == vm.name | ||||||
|  | 
 | ||||||
|  | @asyncio.coroutine | ||||||
|  | def coro_maybe(value): | ||||||
|  |     if asyncio.iscoroutine(value): | ||||||
|  |         return (yield from value) | ||||||
|  |     return value | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rusty Bird
						Rusty Bird