Browse Source

Fix reporting events even if its source is not available anymore

This is especially the case for domain-shutdown event for DispVM - when
handled, DispVM can be already removed. Give the handled VM object even
if actual VM is already removed. For this, avoid VM existence check by
using domains.get_blind() method.

And actually implement domains.get_blind() method - it was present only
in generic collection, but not VMCollection.
Marek Marczykowski-Górecki 6 years ago
parent
commit
0caf6f735d
3 changed files with 13 additions and 5 deletions
  1. 7 0
      qubesadmin/app.py
  2. 1 1
      qubesadmin/events/__init__.py
  3. 5 4
      qubesadmin/tests/events.py

+ 7 - 0
qubesadmin/app.py

@@ -85,6 +85,13 @@ class VMCollection(object):
     def __getitem__(self, item):
         if not self.app.blind_mode and item not in self:
             raise KeyError(item)
+        return self.get_blind(item)
+
+    def get_blind(self, item):
+        '''
+        Get a vm without downloading the list
+        and checking if exists
+        '''
         if item not in self._vm_objects:
             cls = qubesadmin.vm.QubesVM
             # provide class name to constructor, if already cached (which can be

+ 1 - 1
qubesadmin/events/__init__.py

@@ -192,7 +192,7 @@ class EventsDispatcher(object):
             if event in ['property-set:name']:
                 self.app.domains.clear_cache()
             try:
-                subject = self.app.domains[subject]
+                subject = self.app.domains.get_blind(subject)
             except KeyError:
                 return
         else:

+ 5 - 4
qubesadmin/tests/events.py

@@ -54,7 +54,7 @@ class TC_00_Events(qubesadmin.tests.QubesTestCase):
         handler.reset_mock()
         self.dispatcher.handle('test-vm', 'some-event', arg1='value1')
         handler.assert_called_once_with(
-            self.app.domains['test-vm'], 'some-event', arg1='value1')
+            self.app.domains.get_blind('test-vm'), 'some-event', arg1='value1')
         handler.reset_mock()
         self.dispatcher.handle('', 'other-event', arg1='value1')
         self.assertFalse(handler.called)
@@ -70,7 +70,7 @@ class TC_00_Events(qubesadmin.tests.QubesTestCase):
         handler.reset_mock()
         self.dispatcher.handle('test-vm', 'some-event', arg1='value1')
         handler.assert_called_once_with(
-            self.app.domains['test-vm'], 'some-event', arg1='value1')
+            self.app.domains.get_blind('test-vm'), 'some-event', arg1='value1')
         handler.reset_mock()
         self.dispatcher.handle('', 'other-event', arg1='value1')
         handler.assert_called_once_with(None, 'other-event', arg1='value1')
@@ -116,9 +116,10 @@ class TC_00_Events(qubesadmin.tests.QubesTestCase):
         self.assertEqual(handler.mock_calls, [
             unittest.mock.call(None, 'some-event', arg1='value1'),
             unittest.mock.call(
-                self.app.domains['some-vm'], 'some-event', arg1='value1'),
+                self.app.domains.get_blind('some-vm'), 'some-event',
+                arg1='value1'),
             unittest.mock.call(
-                self.app.domains['some-vm'], 'some-event',
+                self.app.domains.get_blind('some-vm'), 'some-event',
                 arg_without_value='', arg2='value'),
         ])
         cleanup_func.assert_called_once_with()