def get_vms_info(self, vms): ''' Get VM metadata, for comparing VM later without holding actual reference to the old object.''' vms_info = {} for vm in vms: vm_info = { 'properties': {}, 'default': {}, 'devices': {}, } for prop in ('name', 'kernel', 'memory', 'maxmem', 'kernelopts', 'services', 'vcpus', 'features' 'include_in_backups', 'default_user', 'qrexec_timeout', 'autostart', 'pci_strictreset', 'debug', 'internal', 'netvm', 'template', 'label'): if not hasattr(vm, prop): continue vm_info['properties'][prop] = str(getattr(vm, prop)) vm_info['default'][prop] = vm.property_is_default(prop) for dev_class in vm.devices.keys(): vm_info['devices'][dev_class] = {} for dev_ass in vm.devices[dev_class].assignments(): vm_info['devices'][dev_class][str(dev_ass.device)] = \ dev_ass.options vms_info[vm.name] = vm_info return vms_info
def on_property_set_default_netvm(self, event, name, newvalue, oldvalue=None): # pylint: disable=unused-argument for vm in self.domains: if hasattr(vm, 'provides_network') and not vm.provides_network and \ hasattr(vm, 'netvm') and vm.property_is_default('netvm'): # fire property-del:netvm as it is responsible for resetting # netvm to it's default value vm.fire_event('property-pre-del:netvm', pre_event=True, name='netvm', oldvalue=oldvalue) vm.fire_event('property-del:netvm', name='netvm', oldvalue=oldvalue)
def on_property_set_default_fw_netvm(self, event, name, newvalue, oldvalue=None): # pylint: disable=unused-argument,invalid-name for vm in self.domains: if not vm.provides_network and vm.property_is_default('netvm'): # fire property-del:netvm as it is responsible for resetting # netvm to it's default value vm.fire_event('property-del:netvm', name='netvm', newvalue=newvalue, oldvalue=oldvalue)
def test_210_auto_rename(self): """ Test for #869 :return: """ vms = self.create_backup_vms() self.make_backup(vms) self.restore_backup(options={'rename_conflicting': True}) for vm in vms: with self.assertNotRaises( (qubes.exc.QubesVMNotFoundError, KeyError)): restored_vm = self.app.domains[vm.name + '1'] if vm.netvm and not vm.property_is_default('netvm'): self.assertEqual(restored_vm.netvm.name, vm.netvm.name + '1')
def _setter_default_netvm(app, prop, value): # skip netvm loop check while loading qubes.xml, to avoid tricky loading # order if not app.events_enabled: return value if value is None: return value # forbid setting to a value that would result in netvm loop for vm in app.domains: if not hasattr(vm, 'netvm'): continue if not vm.property_is_default('netvm'): continue if value == vm \ or value in app.domains.get_vms_connected_to(vm): raise qubes.exc.QubesPropertyValueError(app, prop, value, 'Network loop on \'{!s}\''.format(vm)) return value