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):
|
||||
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
|
||||
obj.delete(force=False)
|
||||
|
||||
newobj = None
|
||||
success = False
|
||||
try:
|
||||
# Redefine new domain
|
||||
newobj = define_cb(newxml)
|
||||
success = True
|
||||
except Exception, renameerr:
|
||||
try:
|
||||
# Redefine new domain
|
||||
newobj = define_cb(newxml)
|
||||
except Exception, renameerr:
|
||||
try:
|
||||
logging.debug("Error defining new name %s XML", objtype,
|
||||
exc_info=True)
|
||||
newobj = define_cb(origxml)
|
||||
except Exception, fixerr:
|
||||
logging.debug("Failed to redefine original %s!", objtype,
|
||||
exc_info=True)
|
||||
raise RuntimeError(
|
||||
_("%s rename failed. Attempting to recover also "
|
||||
"failed.\n\n"
|
||||
"Original error: %s\n\n"
|
||||
"Recover error: %s" %
|
||||
(objtype, str(renameerr), str(fixerr))))
|
||||
raise
|
||||
logging.debug("Error defining new name %s XML", objlabel,
|
||||
exc_info=True)
|
||||
newobj = define_cb(origxml)
|
||||
except Exception, fixerr:
|
||||
logging.debug("Failed to redefine original %s!", objlabel,
|
||||
exc_info=True)
|
||||
raise RuntimeError(
|
||||
_("%s rename failed. Attempting to recover also "
|
||||
"failed.\n\n"
|
||||
"Original error: %s\n\n"
|
||||
"Recover error: %s" %
|
||||
(objlabel, str(renameerr), str(fixerr))))
|
||||
raise
|
||||
finally:
|
||||
if newobj:
|
||||
# Reinsert handle into new obj
|
||||
obj.change_name_backend(newobj)
|
||||
|
||||
def rename_vm(self, obj, origxml, newxml):
|
||||
return self._rename_helper("domain", self.define_domain,
|
||||
obj, origxml, newxml)
|
||||
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)
|
||||
if success:
|
||||
objlist.pop(oldname)
|
||||
objlist[newname] = obj
|
||||
|
||||
|
||||
#########################
|
||||
# Domain event handling #
|
||||
|
|
|
@ -629,11 +629,6 @@ class vmmDomain(vmmLibvirtObject):
|
|||
guest.maxmemory = int(maxmem)
|
||||
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,
|
||||
title=_SENTINEL, idmap_list=_SENTINEL, loader=_SENTINEL):
|
||||
def change(guest):
|
||||
|
|
|
@ -86,7 +86,7 @@ class vmmLibvirtObject(vmmGObject):
|
|||
# Used for changing the backing object after a rename
|
||||
self._backend = newbackend
|
||||
|
||||
def _define_name_helper(self, objtype, rename_cb, newname):
|
||||
def define_name(self, newname):
|
||||
oldname = self.get_xmlobj().name
|
||||
self._invalidate_xml()
|
||||
xmlobj = self._get_xmlobj_to_define()
|
||||
|
@ -94,13 +94,17 @@ class vmmLibvirtObject(vmmGObject):
|
|||
return
|
||||
|
||||
logging.debug("Changing %s name from %s to %s",
|
||||
objtype, oldname, newname)
|
||||
self.__class__, oldname, newname)
|
||||
origxml = xmlobj.get_xml_config()
|
||||
xmlobj.name = newname
|
||||
newxml = xmlobj.get_xml_config()
|
||||
|
||||
try:
|
||||
rename_cb(self, origxml, newxml)
|
||||
self._key = newname
|
||||
self.conn.rename_object(self, origxml, newxml, oldname, newname)
|
||||
except:
|
||||
self._key = oldname
|
||||
raise
|
||||
finally:
|
||||
self._invalidate_xml()
|
||||
|
||||
|
|
|
@ -133,12 +133,6 @@ class vmmNetwork(vmmLibvirtObject):
|
|||
return self.is_active()
|
||||
|
||||
|
||||
def define_name(self, newname):
|
||||
return self._define_name_helper("network",
|
||||
self.conn.rename_network,
|
||||
newname)
|
||||
|
||||
|
||||
###############
|
||||
# XML parsing #
|
||||
###############
|
||||
|
|
|
@ -189,10 +189,6 @@ class vmmStoragePool(vmmLibvirtObject):
|
|||
def get_last_refresh_time(self):
|
||||
return self._last_refresh_time
|
||||
|
||||
def define_name(self, newname):
|
||||
return self._define_name_helper("storagepool",
|
||||
self.conn.rename_pool,
|
||||
newname)
|
||||
|
||||
###################
|
||||
# Volume handling #
|
||||
|
|
Loading…
Reference in New Issue