From: Ricardo Dias Date: Thu, 29 Mar 2018 10:01:39 +0000 (+0100) Subject: mgr/dashboard: rbd: snapshot create/delete implementation X-Git-Tag: v13.1.0~234^2~20 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4dd3988567ab0863008b3e1e09a02069abf4aa49;p=ceph.git mgr/dashboard: rbd: snapshot create/delete implementation Signed-off-by: Ricardo Dias --- diff --git a/src/pybind/mgr/dashboard/controllers/rbd.py b/src/pybind/mgr/dashboard/controllers/rbd.py index ca33af6d655..092be35eda3 100644 --- a/src/pybind/mgr/dashboard/controllers/rbd.py +++ b/src/pybind/mgr/dashboard/controllers/rbd.py @@ -248,3 +248,48 @@ class Rbd(RESTController): status, value = task.wait(2.0) cherrypy.response.status = 200 return {'status': status, 'value': value} + + +@ApiController('rbd/:pool_name/:image_name/snap') +class RbdSnapshot(RESTController): + + @classmethod + def _create_snapshot(cls, pool_name, image_name, snapshot_name): + ioctx = mgr.rados.open_ioctx(pool_name) + img = rbd.Image(ioctx, image_name) + try: + img.create_snap(snapshot_name) + except rbd.OSError as e: + return {'success': False, 'detail': str(e), 'errno': e.errno} + return {'success': True} + + @RESTController.args_from_json + def create(self, pool_name, image_name, snapshot_name): + task = TaskManager.run('rbd/snap/create', + {'pool_name': pool_name, 'image_name': image_name, + 'snapshot_name': snapshot_name}, + self._create_snapshot, + [pool_name, image_name, snapshot_name]) + status, value = task.wait(1.0) + return {'status': status, 'value': value} + + @classmethod + def _remove_snapshot(cls, pool_name, image_name, snapshot_name): + ioctx = mgr.rados.open_ioctx(pool_name) + img = rbd.Image(ioctx, image_name) + try: + img.remove_snap(snapshot_name) + except rbd.OSError as e: + return {'success': False, 'detail': str(e), 'errno': e.errno} + return {'success': True} + + def delete(self, pool_name, image_name, snapshot_name): + task = TaskManager.run('rbd/snap/delete', + {'pool_name': pool_name, + 'image_name': image_name, + 'snapshot_name': snapshot_name}, + self._remove_snapshot, + [pool_name, image_name, snapshot_name]) + status, value = task.wait(1.0) + cherrypy.response.status = 200 + return {'status': status, 'value': value}