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