diff --git a/qubesmgmt/app.py b/qubesmgmt/app.py index f3b2ebc..89f980c 100644 --- a/qubesmgmt/app.py +++ b/qubesmgmt/app.py @@ -34,7 +34,12 @@ class VMCollection(object): self.app = app self._vm_list = None + def clear_cache(self): + '''Clear cached list of VMs''' + self._vm_list = None + def refresh_cache(self, force=False): + '''Refresh cached list of VMs''' if not force and self._vm_list is not None: return vm_list_data = self.app.qubesd_call( diff --git a/qubesmgmt/base.py b/qubesmgmt/base.py index 3506a1d..f05cca3 100644 --- a/qubesmgmt/base.py +++ b/qubesmgmt/base.py @@ -138,8 +138,7 @@ class PropertyHolder(object): None) else: if isinstance(value, qubesmgmt.vm.QubesVM): - # pylint: disable=protected-access - value = value._name + value = value.name self.qubesd_call( self._method_dest, self._method_prefix + 'Set', diff --git a/qubesmgmt/tests/app.py b/qubesmgmt/tests/app.py index 2e06258..b2801b6 100644 --- a/qubesmgmt/tests/app.py +++ b/qubesmgmt/tests/app.py @@ -35,7 +35,7 @@ class TC_00_VMCollection(qubesmgmt.tests.QubesTestCase): b'0\x00test-vm class=AppVM state=running\n' try: vm = self.app.domains['test-vm'] - self.assertEqual(vm._name, 'test-vm') + self.assertEqual(vm.name, 'test-vm') except KeyError: self.fail('VM not found in collection') self.assertAllCalled() @@ -56,7 +56,7 @@ class TC_00_VMCollection(qubesmgmt.tests.QubesTestCase): def test_003_iter(self): self.app.expected_calls[('dom0', 'mgmt.vm.List', None, None)] = \ b'0\x00test-vm class=AppVM state=running\n' - self.assertEqual([vm._name for vm in self.app.domains], ['test-vm']) + self.assertEqual([vm.name for vm in self.app.domains], ['test-vm']) self.assertAllCalled() diff --git a/qubesmgmt/tests/vm/properties.py b/qubesmgmt/tests/vm/properties.py index 1247e7c..b4a623e 100644 --- a/qubesmgmt/tests/vm/properties.py +++ b/qubesmgmt/tests/vm/properties.py @@ -131,3 +131,25 @@ class TC_00_Properties(qubesmgmt.tests.vm.VMTestCase): del self.vm.prop1 self.assertAllCalled() + +class TC_01_SpecialCases(qubesmgmt.tests.vm.VMTestCase): + def test_000_get_name(self): + # should not make any mgmt call + self.assertEqual(self.vm.name, 'test-vm') + self.assertAllCalled() + + def test_001_set_name(self): + # but this one should still do a call + self.app.expected_calls[ + ('test-vm', 'mgmt.vm.property.Set', 'name', b'test-vm2')] = \ + b'0\x00' + self.vm.name = 'test-vm2' + self.assertEqual(self.vm.name, 'test-vm2') + self.assertAllCalled() + + # check if VM list cache was cleared + self.app.actual_calls = [] + del self.app.expected_calls[ + ('test-vm', 'mgmt.vm.property.Set', 'name', b'test-vm2')] + vm = self.app.domains['test-vm'] + self.assertAllCalled() diff --git a/qubesmgmt/vm/__init__.py b/qubesmgmt/vm/__init__.py index 521cfdb..fb2e2ea 100644 --- a/qubesmgmt/vm/__init__.py +++ b/qubesmgmt/vm/__init__.py @@ -23,6 +23,19 @@ import qubesmgmt.base class QubesVM(qubesmgmt.base.PropertyHolder): def __init__(self, app, name, vm_class): - self._name = name self._class = vm_class super(QubesVM, self).__init__(app, 'mgmt.vm.property.', name) + + @property + def name(self): + return self._method_dest + + @name.setter + def name(self, new_value): + self.qubesd_call( + self._method_dest, + self._method_prefix + 'Set', + 'name', + str(new_value).encode('utf-8')) + self._method_dest = new_value + self.app.domains.clear_cache()