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:
Cole Robinson 2014-09-20 16:55:11 -04:00
parent ea97325a72
commit 38738d9fa6
5 changed files with 46 additions and 45 deletions

View File

@ -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 #

View File

@ -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):

View File

@ -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()

View File

@ -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 #
###############

View File

@ -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 #