admin-api: add admin.*.property.GetDefault
Fixes QubesOS/qubes-issues#3197
This commit is contained in:
parent
038ca6d5d7
commit
4809c16e08
2
Makefile
2
Makefile
@ -30,6 +30,7 @@ ADMIN_API_METHODS_SIMPLE = \
|
|||||||
admin.pool.volume.Revert \
|
admin.pool.volume.Revert \
|
||||||
admin.pool.volume.Snapshot \
|
admin.pool.volume.Snapshot \
|
||||||
admin.property.Get \
|
admin.property.Get \
|
||||||
|
admin.property.GetDefault \
|
||||||
admin.property.Help \
|
admin.property.Help \
|
||||||
admin.property.HelpRst \
|
admin.property.HelpRst \
|
||||||
admin.property.List \
|
admin.property.List \
|
||||||
@ -78,6 +79,7 @@ ADMIN_API_METHODS_SIMPLE = \
|
|||||||
admin.vm.firewall.SetPolicy \
|
admin.vm.firewall.SetPolicy \
|
||||||
admin.vm.firewall.Reload \
|
admin.vm.firewall.Reload \
|
||||||
admin.vm.property.Get \
|
admin.vm.property.Get \
|
||||||
|
admin.vm.property.GetDefault \
|
||||||
admin.vm.property.Help \
|
admin.vm.property.Help \
|
||||||
admin.vm.property.HelpRst \
|
admin.vm.property.HelpRst \
|
||||||
admin.vm.property.List \
|
admin.vm.property.List \
|
||||||
|
@ -191,6 +191,49 @@ class QubesAdminAPI(qubes.api.AbstractQubesAPI):
|
|||||||
property_type,
|
property_type,
|
||||||
str(value) if value is not None else '')
|
str(value) if value is not None else '')
|
||||||
|
|
||||||
|
@qubes.api.method('admin.vm.property.GetDefault', no_payload=True,
|
||||||
|
scope='local', read=True)
|
||||||
|
@asyncio.coroutine
|
||||||
|
def vm_property_get_default(self):
|
||||||
|
'''Get a value of one property'''
|
||||||
|
return self._property_get_default(self.dest)
|
||||||
|
|
||||||
|
@qubes.api.method('admin.property.GetDefault', no_payload=True,
|
||||||
|
scope='global', read=True)
|
||||||
|
@asyncio.coroutine
|
||||||
|
def property_get_default(self):
|
||||||
|
'''Get a value of one global property'''
|
||||||
|
assert self.dest.name == 'dom0'
|
||||||
|
return self._property_get_default(self.app)
|
||||||
|
|
||||||
|
def _property_get_default(self, dest):
|
||||||
|
if self.arg not in dest.property_list():
|
||||||
|
raise qubes.exc.QubesNoSuchPropertyError(dest, self.arg)
|
||||||
|
|
||||||
|
self.fire_event_for_permission()
|
||||||
|
|
||||||
|
property_def = dest.property_get_def(self.arg)
|
||||||
|
# explicit list to be sure that it matches protocol spec
|
||||||
|
if isinstance(property_def, qubes.vm.VMProperty):
|
||||||
|
property_type = 'vm'
|
||||||
|
elif property_def.type is int:
|
||||||
|
property_type = 'int'
|
||||||
|
elif property_def.type is bool:
|
||||||
|
property_type = 'bool'
|
||||||
|
elif self.arg == 'label':
|
||||||
|
property_type = 'label'
|
||||||
|
else:
|
||||||
|
property_type = 'str'
|
||||||
|
|
||||||
|
try:
|
||||||
|
value = property_def.get_default(dest)
|
||||||
|
except AttributeError:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return 'type={} {}'.format(
|
||||||
|
property_type,
|
||||||
|
str(value) if value is not None else '')
|
||||||
|
|
||||||
@qubes.api.method('admin.vm.property.Set',
|
@qubes.api.method('admin.vm.property.Set',
|
||||||
scope='local', write=True)
|
scope='local', write=True)
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
|
@ -159,6 +159,21 @@ class TC_00_VMs(AdminAPITestCase):
|
|||||||
b'netvm')
|
b'netvm')
|
||||||
self.assertEqual(value, 'default=True type=vm ')
|
self.assertEqual(value, 'default=True type=vm ')
|
||||||
|
|
||||||
|
def test_025_vm_property_get_default_vm_none(self):
|
||||||
|
value = self.call_mgmt_func(
|
||||||
|
b'admin.vm.property.GetDefault',
|
||||||
|
b'test-vm1',
|
||||||
|
b'template')
|
||||||
|
self.assertEqual(value, None)
|
||||||
|
|
||||||
|
def test_026_vm_property_get_default_bool(self):
|
||||||
|
self.vm.provides_network = True
|
||||||
|
value = self.call_mgmt_func(
|
||||||
|
b'admin.vm.property.GetDefault',
|
||||||
|
b'test-vm1',
|
||||||
|
b'provides_network')
|
||||||
|
self.assertEqual(value, 'type=bool False')
|
||||||
|
|
||||||
def test_030_vm_property_set_vm(self):
|
def test_030_vm_property_set_vm(self):
|
||||||
netvm = self.app.add_new_vm('AppVM', label='red', name='test-net',
|
netvm = self.app.add_new_vm('AppVM', label='red', name='test-net',
|
||||||
template='test-template', provides_network=True)
|
template='test-template', provides_network=True)
|
||||||
|
Loading…
Reference in New Issue
Block a user