A new command is added to delete an existing snapshot:
DELETE /vms/<vm-name>/snapshots/<snapshot-name>
It deletes the specified snapshot from the virtual machine.
Signed-off-by: Crístian Viana <vianac(a)linux.vnet.ibm.com>
---
docs/API.md | 5 +++++
src/kimchi/i18n.py | 1 +
src/kimchi/mockmodel.py | 8 ++++++++
src/kimchi/model/vmsnapshots.py | 9 +++++++++
tests/test_rest.py | 10 ++++++++++
5 files changed, 33 insertions(+)
diff --git a/docs/API.md b/docs/API.md
index 38c8a59..a6ca0c2 100644
--- a/docs/API.md
+++ b/docs/API.md
@@ -204,6 +204,11 @@ Represents a snapshot of the Virtual Machine's primary monitor.
(in seconds, since the epoch).
* parent: The name of the parent snapshot, or an empty string if there is
no parent.
+* **DELETE**: Delete snapshot.
+ * children: A boolean flag indicating whether the snapshot's children
+ should also be deleted: if true, the snapshot and its children
+ will be deleted; if false, only the snapshot will be deleted
+ (optional, defaults to false).
### Collection: Templates
diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
index 0a6fee3..6a1e193 100644
--- a/src/kimchi/i18n.py
+++ b/src/kimchi/i18n.py
@@ -316,4 +316,5 @@ messages = {
"KCHSNAP0003E": _("Snapshot '%(name)s' does not exist on
virtual machine '%(vm)s'."),
"KCHSNAP0004E": _("Unable to retrieve snapshot '%(name)s' on
virtual machine '%(vm)s'. Details: %(err)s"),
"KCHSNAP0005E": _("Unable to list snapshots on virtual machine
'%(vm)s'. Details: %(err)s"),
+ "KCHSNAP0006E": _("Unable to delete snapshot '%(name)s' on
virtual machine '%(vm)s'. Details: %(err)s"),
}
diff --git a/src/kimchi/mockmodel.py b/src/kimchi/mockmodel.py
index d4d53fc..50c6e0c 100644
--- a/src/kimchi/mockmodel.py
+++ b/src/kimchi/mockmodel.py
@@ -1012,6 +1012,14 @@ class MockModel(object):
except KeyError:
raise NotFoundError('KCHSNAP0003E', {'vm': vm_name,
'name': name})
+ def vmsnapshot_delete(self, vm_name, name):
+ vm = self._get_vm(vm_name)
+
+ try:
+ del vm.snapshots[name]
+ except KeyError:
+ raise NotFoundError('KCHSNAP0003E', {'vm': vm_name,
'name': name})
+
def tasks_get_list(self):
with self.objstore as session:
return session.get_list('task')
diff --git a/src/kimchi/model/vmsnapshots.py b/src/kimchi/model/vmsnapshots.py
index adc785f..e02108d 100644
--- a/src/kimchi/model/vmsnapshots.py
+++ b/src/kimchi/model/vmsnapshots.py
@@ -133,6 +133,15 @@ class VMSnapshotModel(object):
'created': unicode(snap_xml.creationTime),
'parent': parent}
+ def delete(self, vm_name, name):
+ try:
+ vir_snap = self.get_vmsnapshot(vm_name, name)
+ vir_snap.delete(0)
+ except libvirt.libvirtError, e:
+ raise OperationFailed('KCHSNAP0006E', {'name': name,
+ 'vm': vm_name,
+ 'err': e.message})
+
def get_vmsnapshot(self, vm_name, name):
vir_dom = VMModel.get_vm(vm_name, self.conn)
diff --git a/tests/test_rest.py b/tests/test_rest.py
index 6af0d72..ef0fbf3 100644
--- a/tests/test_rest.py
+++ b/tests/test_rest.py
@@ -426,6 +426,16 @@ class RestTests(unittest.TestCase):
snaps = json.loads(resp.read())
self.assertEquals(2, len(snaps))
+ # Delete a snapshot
+ resp = self.request('/vms/test-vm/snapshots/foobar', '{}',
'DELETE')
+ self.assertEquals(404, resp.status)
+ resp = self.request('/vms/test-vm/snapshots/%s' %
params['name'],
+ '{}', 'DELETE')
+ self.assertEquals(204, resp.status)
+ resp = self.request('/vms/test-vm/snapshots/%s' %
params['name'],
+ '{}', 'GET')
+ self.assertEquals(404, resp.status)
+
# Delete the VM
resp = self.request('/vms/test-vm', '{}', 'DELETE')
self.assertEquals(204, resp.status)
--
1.9.3