Move QubesVM.{name,qid,uuid,label} to BaseVM

Reduce strange code in BaseVM (accessing non-existing self.name) and
code duplication.
This commit is contained in:
Marek Marczykowski-Górecki 2017-09-26 13:24:22 +02:00
parent dc0e1a5481
commit 9f88fa7f0c
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
4 changed files with 45 additions and 55 deletions

View File

@ -71,15 +71,15 @@ class TC_00_setters(qubes.tests.QubesTestCase):
def test_000_setter_qid(self): def test_000_setter_qid(self):
self.assertEqual( self.assertEqual(
qubes.vm.qubesvm._setter_qid(self.vm, self.prop, 5), 5) qubes.vm._setter_qid(self.vm, self.prop, 5), 5)
def test_001_setter_qid_lt_0(self): def test_001_setter_qid_lt_0(self):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
qubes.vm.qubesvm._setter_qid(self.vm, self.prop, -1) qubes.vm._setter_qid(self.vm, self.prop, -1)
def test_002_setter_qid_gt_max(self): def test_002_setter_qid_gt_max(self):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
qubes.vm.qubesvm._setter_qid(self.vm, qubes.vm._setter_qid(self.vm,
self.prop, qubes.config.max_qid + 5) self.prop, qubes.config.max_qid + 5)
@unittest.skip('test not implemented') @unittest.skip('test not implemented')

View File

@ -27,6 +27,7 @@
import asyncio import asyncio
import re import re
import string import string
import uuid
import lxml.etree import lxml.etree
@ -64,6 +65,26 @@ def validate_name(holder, prop, value):
raise qubes.exc.QubesValueError( raise qubes.exc.QubesValueError(
'VM name cannot be \'none\' nor \'default\'') 'VM name cannot be \'none\' nor \'default\'')
def setter_label(self, prop, value):
''' Helper for setting the domain label '''
# pylint: disable=unused-argument
if isinstance(value, qubes.Label):
return value
if isinstance(value, str) and value.startswith('label-'):
return self.app.labels[int(value.split('-', 1)[1])]
return self.app.get_label(value)
def _setter_qid(self, prop, value):
''' Helper for setting the domain qid '''
# pylint: disable=unused-argument
value = int(value)
if not 0 <= value <= qubes.config.max_qid:
raise ValueError(
'{} value must be between 0 and qubes.config.max_qid'.format(
prop.__name__))
return value
class Features(dict): class Features(dict):
'''Manager of the features. '''Manager of the features.
@ -262,6 +283,25 @@ class BaseVM(qubes.PropertyHolder):
''' '''
# pylint: disable=no-member # pylint: disable=no-member
uuid = qubes.property('uuid', type=uuid.UUID, write_once=True,
clone=False,
doc='UUID from libvirt.')
name = qubes.property('name', type=str, write_once=True,
clone=False,
doc='User-specified name of the domain.')
qid = qubes.property('qid', type=int, write_once=True,
setter=_setter_qid,
clone=False,
doc='''Internal, persistent identificator of particular domain. Note
this is different from Xen domid.''')
label = qubes.property('label',
setter=setter_label,
doc='''Colourful label assigned to VM. This is where the colour of the
padlock is set.''')
def __init__(self, app, xml, features=None, devices=None, tags=None, def __init__(self, app, xml, features=None, devices=None, tags=None,
**kwargs): **kwargs):
# pylint: disable=redefined-outer-name # pylint: disable=redefined-outer-name
@ -531,14 +571,3 @@ class VMProperty(qubes.property):
return untrusted_vmname return untrusted_vmname
validate_name(None, self, untrusted_vmname) validate_name(None, self, untrusted_vmname)
return untrusted_vmname return untrusted_vmname
def setter_label(self, prop, value):
''' Helper for setting the domain label '''
# pylint: disable=unused-argument
if isinstance(value, qubes.Label):
return value
if isinstance(value, str) and value.startswith('label-'):
return self.app.labels[int(value.split('-', 1)[1])]
return self.app.get_label(value)

View File

@ -24,10 +24,12 @@
''' This module contains the AdminVM implementation ''' ''' This module contains the AdminVM implementation '''
import libvirt import libvirt
import qubes import qubes
import qubes.exc import qubes.exc
import qubes.vm import qubes.vm
class AdminVM(qubes.vm.BaseVM): class AdminVM(qubes.vm.BaseVM):
'''Dom0''' '''Dom0'''
@ -36,12 +38,6 @@ class AdminVM(qubes.vm.BaseVM):
name = qubes.property('name', name = qubes.property('name',
default='dom0', setter=qubes.property.forbidden) default='dom0', setter=qubes.property.forbidden)
label = qubes.property('label',
setter=qubes.vm.setter_label,
saver=(lambda self, prop, value: 'label-{}'.format(value.index)),
doc='''Colourful label assigned to VM. This is where the colour of the
padlock is set.''')
qid = qubes.property('qid', qid = qubes.property('qid',
default=0, setter=qubes.property.forbidden) default=0, setter=qubes.property.forbidden)

View File

@ -59,17 +59,6 @@ MEM_OVERHEAD_BASE = (3 + 1) * 1024 * 1024
MEM_OVERHEAD_PER_VCPU = 3 * 1024 * 1024 / 2 MEM_OVERHEAD_PER_VCPU = 3 * 1024 * 1024 / 2
def _setter_qid(self, prop, value):
''' Helper for setting the domain qid '''
# pylint: disable=unused-argument
value = int(value)
if not 0 <= value <= qubes.config.max_qid:
raise ValueError(
'{} value must be between 0 and qubes.config.max_qid'.format(
prop.__name__))
return value
def _setter_kernel(self, prop, value): def _setter_kernel(self, prop, value):
''' Helper for setting the domain kernel and running sanity checks on it. ''' Helper for setting the domain kernel and running sanity checks on it.
''' # pylint: disable=unused-argument ''' # pylint: disable=unused-argument
@ -369,30 +358,6 @@ class QubesVM(qubes.vm.mix.net.NetVMMixin, qubes.vm.BaseVM):
# properties loaded from XML # properties loaded from XML
# #
label = qubes.property('label',
setter=qubes.vm.setter_label,
saver=(lambda self, prop, value: 'label-{}'.format(value.index)),
doc='''Colourful label assigned to VM. This is where the colour of the
padlock is set.''')
# provides_network = qubes.property('provides_network',
# type=bool, setter=qubes.property.bool,
# doc='`True` if it is NetVM or ProxyVM, false otherwise.')
qid = qubes.property('qid', type=int, write_once=True,
setter=_setter_qid,
clone=False,
doc='''Internal, persistent identificator of particular domain. Note
this is different from Xen domid.''')
name = qubes.property('name', type=str, write_once=True,
clone=False,
doc='User-specified name of the domain.')
uuid = qubes.property('uuid', type=uuid.UUID, write_once=True,
clone=False,
doc='UUID from libvirt.')
virt_mode = qubes.property('virt_mode', virt_mode = qubes.property('virt_mode',
type=str, setter=_setter_virt_mode, type=str, setter=_setter_virt_mode,
default='hvm', default='hvm',