The patch seems good for me.
I will just wait for a reply from Cristian as he was working on it.
On 20/12/2014 04:26, gouzongmei(a)ourfuture.cn wrote:
From: Zongmei Gou <gouzongmei(a)ourfuture.cn>
---
src/kimchi/control/base.py | 13 ++++++++++---
src/kimchi/model/vms.py | 24 ++++++++++++++++++------
src/kimchi/model/vmsnapshots.py | 8 ++++++--
src/kimchi/xmlutils/utils.py | 5 +++++
4 files changed, 39 insertions(+), 11 deletions(-)
diff --git a/src/kimchi/control/base.py b/src/kimchi/control/base.py
index 60db1df..ff31d47 100644
--- a/src/kimchi/control/base.py
+++ b/src/kimchi/control/base.py
@@ -58,10 +58,17 @@ class Resource(object):
self.role_key = None
self.admin_methods = []
- def _redirect(self, ident, code=303):
- if ident is not None and ident != self.ident:
+ def _redirect(self, action_result, code=303):
+ if isinstance(action_result, list):
+ uri_params = []
+ for arg in action_result:
+ if arg is None:
+ arg = ''
+
uri_params.append(urllib2.quote(arg.encode('utf-8'),safe=""))
+ raise cherrypy.HTTPRedirect(self.uri_fmt % tuple(uri_params), code)
+ elif action_result is not None and action_result != self.ident:
uri_params = list(self.model_args[:-1])
- uri_params += [urllib2.quote(ident.encode('utf-8'),
safe="")]
+ uri_params += [urllib2.quote(action_result.encode('utf-8'),
safe="")]
raise cherrypy.HTTPRedirect(self.uri_fmt % tuple(uri_params), code)
def generate_action_handler(self, action_name, action_args=None):
diff --git a/src/kimchi/model/vms.py b/src/kimchi/model/vms.py
index 3aa1145..0caa1fd 100644
--- a/src/kimchi/model/vms.py
+++ b/src/kimchi/model/vms.py
@@ -668,22 +668,34 @@ class VMModel(object):
new_xml = self._update_graphics(dom, new_xml, params)
conn = self.conn.get()
+ snapshot_xmls = []
try:
if 'name' in params:
- if state == 'running':
- msg_args = {'name': dom.name(), 'new_name':
params['name']}
- raise InvalidParameter("KCHVM0003E", msg_args)
-
- # Undefine old vm, only if name is going to change
- dom.undefine()
+ new_name = params['name']
+ name = dom.name()
+ if new_name != name:
+ if state == 'running':
+ raise InvalidParameter("KCHVM0003E", {'name':
name, 'new_name': new_name})
+
+ # get snapshots before vm undefine, original snapshots will be
created in the new named vm
+ snapshot_names = dom.snapshotListNames(0)
+ for snapshot_name in snapshot_names:
+ vir_snap = self.vmsnapshot.get_vmsnapshot(name, snapshot_name)
+ snapshot_xmls.append(vir_snap.getXMLDesc(0))
+ # Undefine old vm, only if name is going to change
+ dom.undefineFlags(libvirt.VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA)
root = ET.fromstring(new_xml)
currentMem = root.find('.currentMemory')
if currentMem is not None:
root.remove(currentMem)
dom = conn.defineXML(ET.tostring(root, encoding="utf-8"))
+ for snapshot_xml in snapshot_xmls:
+ dom.snapshotCreateXML(snapshot_xml, 1)
except libvirt.libvirtError as e:
dom = conn.defineXML(old_xml)
+ for snapshot_xml in snapshot_xmls:
+ dom.snapshotCreateXML(snapshot_xml, 1)
raise OperationFailed("KCHVM0008E", {'name': dom.name(),
'err':
e.get_error_message()})
return dom
diff --git a/src/kimchi/model/vmsnapshots.py b/src/kimchi/model/vmsnapshots.py
index 725770d..569c7ad 100644
--- a/src/kimchi/model/vmsnapshots.py
+++ b/src/kimchi/model/vmsnapshots.py
@@ -29,7 +29,7 @@ from kimchi.model.tasks import TaskModel
from kimchi.model.vms import DOM_STATE_MAP, VMModel
from kimchi.model.vmstorages import VMStorageModel, VMStoragesModel
from kimchi.utils import add_task
-
+from kimchi.xmlutils.utils import xml_item_get
class VMSnapshotsModel(object):
def __init__(self, **kargs):
@@ -155,7 +155,11 @@ class VMSnapshotModel(object):
try:
vir_dom = VMModel.get_vm(vm_name, self.conn)
vir_snap = self.get_vmsnapshot(vm_name, name)
- vir_dom.revertToSnapshot(vir_snap, 0)
+ ret = vir_dom.revertToSnapshot(vir_snap, 0)
+ if ret == 0:
+ xmlObj = vir_snap.getXMLDesc(0)
+ new_vmname = xml_item_get(xmlObj, 'domain/name')
+ return [new_vmname, name]
except libvirt.libvirtError, e:
raise OperationFailed('KCHSNAP0009E', {'name': name,
'vm': vm_name,
diff --git a/src/kimchi/xmlutils/utils.py b/src/kimchi/xmlutils/utils.py
index be08a14..843a113 100644
--- a/src/kimchi/xmlutils/utils.py
+++ b/src/kimchi/xmlutils/utils.py
@@ -65,3 +65,8 @@ def _dictize(e):
else:
d[child.tag] = _dictize(child)
return d
+
+def xml_item_get(xml, xpath):
+ root = ET.fromstring(xml)
+ item = root.find(xpath)
+ return item.text