mirror of
https://github.com/virt-manager/virt-manager.git
synced 2024-10-27 01:55:20 +03:00
connection: Don't close VM dialog on rename
Rework things a bit to simplify everything we pass around. The specific bug fix is making sure we update the object list in place, otherwise the event loop detects it as the VM being deleted and closes the details window.
This commit is contained in:
parent
ea97325a72
commit
38738d9fa6
@ -684,44 +684,56 @@ class vmmConnection(vmmGObject):
|
|||||||
def define_interface(self, xml):
|
def define_interface(self, xml):
|
||||||
return self._backend.interfaceDefineXML(xml, 0)
|
return self._backend.interfaceDefineXML(xml, 0)
|
||||||
|
|
||||||
def _rename_helper(self, objtype, define_cb, obj, origxml, newxml):
|
def rename_object(self, obj, origxml, newxml, oldname, newname):
|
||||||
|
if str(obj.__class__).endswith("vmmDomain'>"):
|
||||||
|
objlabel = "domain"
|
||||||
|
define_cb = self.define_domain
|
||||||
|
objlist = self._vms
|
||||||
|
elif str(obj.__class__).endswith("vmmStoragePool'>"):
|
||||||
|
objlabel = "storagepool"
|
||||||
|
define_cb = self.define_pool
|
||||||
|
objlist = self._pools
|
||||||
|
elif str(obj.__class__).endswith("vmmNetwork'>"):
|
||||||
|
objlabel = "network"
|
||||||
|
define_cb = self.define_network
|
||||||
|
objlist = self._nets
|
||||||
|
else:
|
||||||
|
raise RuntimeError("programming error: rename_object "
|
||||||
|
"helper doesn't support object class %s" % obj.__class__)
|
||||||
|
|
||||||
# Undefine the original object
|
# Undefine the original object
|
||||||
obj.delete(force=False)
|
obj.delete(force=False)
|
||||||
|
|
||||||
newobj = None
|
newobj = None
|
||||||
|
success = False
|
||||||
try:
|
try:
|
||||||
|
# Redefine new domain
|
||||||
|
newobj = define_cb(newxml)
|
||||||
|
success = True
|
||||||
|
except Exception, renameerr:
|
||||||
try:
|
try:
|
||||||
# Redefine new domain
|
logging.debug("Error defining new name %s XML", objlabel,
|
||||||
newobj = define_cb(newxml)
|
exc_info=True)
|
||||||
except Exception, renameerr:
|
newobj = define_cb(origxml)
|
||||||
try:
|
except Exception, fixerr:
|
||||||
logging.debug("Error defining new name %s XML", objtype,
|
logging.debug("Failed to redefine original %s!", objlabel,
|
||||||
exc_info=True)
|
exc_info=True)
|
||||||
newobj = define_cb(origxml)
|
raise RuntimeError(
|
||||||
except Exception, fixerr:
|
_("%s rename failed. Attempting to recover also "
|
||||||
logging.debug("Failed to redefine original %s!", objtype,
|
"failed.\n\n"
|
||||||
exc_info=True)
|
"Original error: %s\n\n"
|
||||||
raise RuntimeError(
|
"Recover error: %s" %
|
||||||
_("%s rename failed. Attempting to recover also "
|
(objlabel, str(renameerr), str(fixerr))))
|
||||||
"failed.\n\n"
|
raise
|
||||||
"Original error: %s\n\n"
|
|
||||||
"Recover error: %s" %
|
|
||||||
(objtype, str(renameerr), str(fixerr))))
|
|
||||||
raise
|
|
||||||
finally:
|
finally:
|
||||||
if newobj:
|
if newobj:
|
||||||
# Reinsert handle into new obj
|
# Reinsert handle into new obj
|
||||||
obj.change_name_backend(newobj)
|
obj.change_name_backend(newobj)
|
||||||
|
|
||||||
def rename_vm(self, obj, origxml, newxml):
|
if success:
|
||||||
return self._rename_helper("domain", self.define_domain,
|
objlist.pop(oldname)
|
||||||
obj, origxml, newxml)
|
objlist[newname] = obj
|
||||||
def rename_network(self, obj, origxml, newxml):
|
|
||||||
return self._rename_helper("network", self.define_network,
|
|
||||||
obj, origxml, newxml)
|
|
||||||
def rename_pool(self, obj, origxml, newxml):
|
|
||||||
return self._rename_helper("storagepool", self.define_pool,
|
|
||||||
obj, origxml, newxml)
|
|
||||||
|
|
||||||
#########################
|
#########################
|
||||||
# Domain event handling #
|
# Domain event handling #
|
||||||
|
@ -629,11 +629,6 @@ class vmmDomain(vmmLibvirtObject):
|
|||||||
guest.maxmemory = int(maxmem)
|
guest.maxmemory = int(maxmem)
|
||||||
return self._redefine(change)
|
return self._redefine(change)
|
||||||
|
|
||||||
def define_name(self, newname):
|
|
||||||
return self._define_name_helper("domain",
|
|
||||||
self.conn.rename_vm,
|
|
||||||
newname)
|
|
||||||
|
|
||||||
def define_overview(self, machine=_SENTINEL, description=_SENTINEL,
|
def define_overview(self, machine=_SENTINEL, description=_SENTINEL,
|
||||||
title=_SENTINEL, idmap_list=_SENTINEL, loader=_SENTINEL):
|
title=_SENTINEL, idmap_list=_SENTINEL, loader=_SENTINEL):
|
||||||
def change(guest):
|
def change(guest):
|
||||||
|
@ -86,7 +86,7 @@ class vmmLibvirtObject(vmmGObject):
|
|||||||
# Used for changing the backing object after a rename
|
# Used for changing the backing object after a rename
|
||||||
self._backend = newbackend
|
self._backend = newbackend
|
||||||
|
|
||||||
def _define_name_helper(self, objtype, rename_cb, newname):
|
def define_name(self, newname):
|
||||||
oldname = self.get_xmlobj().name
|
oldname = self.get_xmlobj().name
|
||||||
self._invalidate_xml()
|
self._invalidate_xml()
|
||||||
xmlobj = self._get_xmlobj_to_define()
|
xmlobj = self._get_xmlobj_to_define()
|
||||||
@ -94,13 +94,17 @@ class vmmLibvirtObject(vmmGObject):
|
|||||||
return
|
return
|
||||||
|
|
||||||
logging.debug("Changing %s name from %s to %s",
|
logging.debug("Changing %s name from %s to %s",
|
||||||
objtype, oldname, newname)
|
self.__class__, oldname, newname)
|
||||||
origxml = xmlobj.get_xml_config()
|
origxml = xmlobj.get_xml_config()
|
||||||
xmlobj.name = newname
|
xmlobj.name = newname
|
||||||
newxml = xmlobj.get_xml_config()
|
newxml = xmlobj.get_xml_config()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rename_cb(self, origxml, newxml)
|
self._key = newname
|
||||||
|
self.conn.rename_object(self, origxml, newxml, oldname, newname)
|
||||||
|
except:
|
||||||
|
self._key = oldname
|
||||||
|
raise
|
||||||
finally:
|
finally:
|
||||||
self._invalidate_xml()
|
self._invalidate_xml()
|
||||||
|
|
||||||
|
@ -133,12 +133,6 @@ class vmmNetwork(vmmLibvirtObject):
|
|||||||
return self.is_active()
|
return self.is_active()
|
||||||
|
|
||||||
|
|
||||||
def define_name(self, newname):
|
|
||||||
return self._define_name_helper("network",
|
|
||||||
self.conn.rename_network,
|
|
||||||
newname)
|
|
||||||
|
|
||||||
|
|
||||||
###############
|
###############
|
||||||
# XML parsing #
|
# XML parsing #
|
||||||
###############
|
###############
|
||||||
|
@ -189,10 +189,6 @@ class vmmStoragePool(vmmLibvirtObject):
|
|||||||
def get_last_refresh_time(self):
|
def get_last_refresh_time(self):
|
||||||
return self._last_refresh_time
|
return self._last_refresh_time
|
||||||
|
|
||||||
def define_name(self, newname):
|
|
||||||
return self._define_name_helper("storagepool",
|
|
||||||
self.conn.rename_pool,
|
|
||||||
newname)
|
|
||||||
|
|
||||||
###################
|
###################
|
||||||
# Volume handling #
|
# Volume handling #
|
||||||
|
Loading…
Reference in New Issue
Block a user