Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/pr/342'
Browse files Browse the repository at this point in the history
* origin/pr/342:
  Added a servicevm feature extension
  Removed unused Qubes Manager extension
  Add vm.icon property
  • Loading branch information
marmarek committed May 10, 2020
2 parents 4a56064 + 419b4d5 commit c7d3635
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 79 deletions.
22 changes: 22 additions & 0 deletions qubes/ext/core_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,25 @@ def qubes_features_request(self, vm, event, untrusted_features):
# if this is the first time qrexec was advertised, now can finish
# template setup
yield from vm.fire_event_async('template-postinstall')

# pylint: disable=no-self-use
def set_servicevm_feature(self, subject):
if getattr(subject, 'provides_network', False):
subject.features['servicevm'] = 1
elif 'servicevm' in subject.features:
del subject.features['servicevm']

@qubes.ext.handler('property-set:provides_network')
def on_property_set(self, subject, event, name, newvalue, oldvalue=None):
# pylint: disable=unused-argument
self.set_servicevm_feature(subject)

@qubes.ext.handler('property-del:provides_network')
def on_property_del(self, subject, event, name):
# pylint: disable=unused-argument
self.set_servicevm_feature(subject)

@qubes.ext.handler('domain-load')
def on_domain_load(self, subject, event):
# pylint: disable=unused-argument
self.set_servicevm_feature(subject)
70 changes: 0 additions & 70 deletions qubes/ext/qubesmanager.py

This file was deleted.

13 changes: 13 additions & 0 deletions qubes/tests/ext.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,11 @@ def setUp(self):
self.features = {}
self.vm.configure_mock(**{
'features.get.side_effect': self.features.get,
'features.items.side_effect': self.features.items,
'features.__iter__.side_effect': self.features.__iter__,
'features.__contains__.side_effect': self.features.__contains__,
'features.__setitem__.side_effect': self.features.__setitem__,
'features.__delitem__.side_effect': self.features.__delitem__,
})

def test_010_notify_tools(self):
Expand Down Expand Up @@ -181,6 +184,16 @@ def test_018_notify_tools_already_installed(self):
('features.__contains__', ('gui',), {}),
])

def test_100_servicevm_feature(self):
self.vm.provides_network = True
self.ext.set_servicevm_feature(self.vm)
self.assertEqual(self.features['servicevm'], 1)

self.vm.provides_network = False
self.ext.set_servicevm_feature(self.vm)
self.assertNotIn('servicevm', self.features)


class TC_10_WindowsFeatures(qubes.tests.QubesTestCase):
def setUp(self):
super().setUp()
Expand Down
5 changes: 4 additions & 1 deletion qubes/tests/vm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,10 @@ def init_volume(self, *args, **kwargs):
return TestVolume(self)

class TestApp(qubes.tests.TestEmitter):
labels = {1: qubes.Label(1, '0xcc0000', 'red')}
labels = {1: qubes.Label(1, '0xcc0000', 'red'),
2: qubes.Label(2, '0x00cc00', 'green'),
3: qubes.Label(3, '0x0000cc', 'blue'),
4: qubes.Label(4, '0xcccccc', 'black')}
check_updates_vm = False

def get_label(self, label):
Expand Down
37 changes: 31 additions & 6 deletions qubes/tests/vm/qubesvm.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@
import qubes.tests.vm

class TestApp(object):
labels = {1: qubes.Label(1, '0xcc0000', 'red')}
labels = {1: qubes.Label(1, '0xcc0000', 'red'),
2: qubes.Label(2, '0x00cc00', 'green'),
3: qubes.Label(3, '0x0000cc', 'blue'),
4: qubes.Label(4, '0xcccccc', 'black')}

def __init__(self):
self.domains = {}
Expand Down Expand Up @@ -394,24 +397,46 @@ def test_120_uuid(self):
with self.assertRaises(AttributeError):
vm.uuid = uuid.uuid4()

@unittest.skip('TODO: how to not fail on making an icon symlink here?')
def test_130_label(self):
@unittest.mock.patch("os.symlink")
def test_130_label(self, _):
vm = self.get_vm()
self.assertPropertyDefaultValue(vm, 'label')
self.assertPropertyValue(vm, 'label', self.app.labels[1],
self.app.labels[1], 'label-1')
self.app.labels[1], 'red')
del vm.label
self.assertPropertyDefaultValue(vm, 'label')
self.assertPropertyValue(vm, 'label', 'red',
self.app.labels[1], 'label-1')
self.app.labels[1], 'red')
self.assertPropertyValue(vm, 'label', 'label-1',
self.app.labels[1], 'label-1')
self.app.labels[1], 'red')

def test_131_label_invalid(self):
vm = self.get_vm()
self.assertPropertyInvalidValue(vm, 'label', 'invalid')
self.assertPropertyInvalidValue(vm, 'label', 123)

@unittest.mock.patch("os.symlink")
def test_135_icon(self, _):
vm = self.get_vm(cls=qubes.vm.appvm.AppVM)
vm.label = "red"
self.assertEqual(vm.icon, "appvm-red")

templatevm = self.get_vm(cls=qubes.vm.templatevm.TemplateVM)
templatevm.label = "blue"
self.assertEqual(templatevm.icon, "templatevm-blue")

vm.template_for_dispvms = True
dispvm = self.get_vm(cls=qubes.vm.dispvm.DispVM, template=vm,
dispid=10)
dispvm.label = "black"
self.assertEqual(dispvm.icon, "dispvm-black")

vm = self.get_vm()
vm.label = "green"
vm.features["servicevm"] = 1
self.assertEqual(vm.icon, "servicevm-green")


def test_160_memory(self):
vm = self.get_vm()
self.assertPropertyDefaultValue(vm, 'memory', 400)
Expand Down
14 changes: 14 additions & 0 deletions qubes/vm/qubesvm.py
Original file line number Diff line number Diff line change
Expand Up @@ -2101,6 +2101,20 @@ def start_time(self):

return None

@qubes.stateless_property
def icon(self):
"""freedesktop icon name, suitable for use in
:py:meth:`PyQt4.QtGui.QIcon.fromTheme`"""
# pylint: disable=comparison-with-callable
raw_icon_name = self.label.name
if self.klass == 'TemplateVM':
return 'templatevm-' + raw_icon_name
if self.klass == 'DispVM':
return 'dispvm-' + raw_icon_name
if self.features.get('servicevm', False):
return 'servicevm-' + raw_icon_name
return 'appvm-' + raw_icon_name

@property
def kernelopts_common(self):
"""Kernel options which should be used in addition to *kernelopts*
Expand Down
1 change: 0 additions & 1 deletion rpm_spec/core-dom0.spec.in
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,6 @@ fi
%{python3_sitelib}/qubes/ext/gui.py
%{python3_sitelib}/qubes/ext/audio.py
%{python3_sitelib}/qubes/ext/pci.py
%{python3_sitelib}/qubes/ext/qubesmanager.py
%{python3_sitelib}/qubes/ext/r3compatibility.py
%{python3_sitelib}/qubes/ext/services.py
%{python3_sitelib}/qubes/ext/windows.py
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ def run(self):
'qubes.ext': [
'qubes.ext.admin = qubes.ext.admin:AdminExtension',
'qubes.ext.core_features = qubes.ext.core_features:CoreFeatures',
'qubes.ext.qubesmanager = qubes.ext.qubesmanager:QubesManager',
'qubes.ext.gui = qubes.ext.gui:GUI',
'qubes.ext.audio = qubes.ext.audio:AUDIO',
'qubes.ext.r3compatibility = qubes.ext.r3compatibility:R3Compatibility',
Expand Down

0 comments on commit c7d3635

Please sign in to comment.