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

View File

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

View File

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

View File

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

View File

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