summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErno Kuvaja <jokke@usr.fi>2019-12-18 09:57:30 +0000
committerAbhishek Kekane <akekane@redhat.com>2020-03-20 07:21:59 +0000
commitd91bcae8a509235ec17a60233e2c3e252b9a317d (patch)
treedddff4311e2444f8f5b36540911bab94b3ec8e3c
parent6d506c3a3644cf79622238473c99d9c22cfd4e96 (diff)
downloadpython-glanceclient-d91bcae8a509235ec17a60233e2c3e252b9a317d.tar.gz
Delete image from specific store
Add support to delete image from specific store. bp: delete-from-store Change-Id: Ie57d7de5822264a5ea8a5f4587ab8cfb4afb79de
-rw-r--r--glanceclient/tests/unit/v2/test_shell_v2.py23
-rw-r--r--glanceclient/v2/images.py8
-rw-r--r--glanceclient/v2/shell.py18
-rw-r--r--releasenotes/notes/del_from_store-2d807c3038283907.yaml4
4 files changed, 53 insertions, 0 deletions
diff --git a/glanceclient/tests/unit/v2/test_shell_v2.py b/glanceclient/tests/unit/v2/test_shell_v2.py
index f137d30..c43f606 100644
--- a/glanceclient/tests/unit/v2/test_shell_v2.py
+++ b/glanceclient/tests/unit/v2/test_shell_v2.py
@@ -2166,6 +2166,29 @@ class ShellV2Test(testtools.TestCase):
mocked_utils_exit.assert_called_once_with()
@mock.patch.object(utils, 'exit')
+ def test_do_image_delete_from_store_not_found(self, mocked_utils_exit):
+ args = argparse.Namespace(id='image1', store='store1')
+ with mock.patch.object(self.gc.images,
+ 'delete_from_store') as mocked_delete:
+ mocked_delete.side_effect = exc.HTTPNotFound
+
+ test_shell.do_stores_delete(self.gc, args)
+
+ self.assertEqual(1, mocked_delete.call_count)
+ mocked_utils_exit.assert_called_once_with('Multi Backend support '
+ 'is not enabled or '
+ 'Image/store not found.')
+
+ def test_do_image_delete_from_store(self):
+ args = argparse.Namespace(id='image1', store='store1')
+ with mock.patch.object(self.gc.images,
+ 'delete_from_store') as mocked_delete:
+ test_shell.do_stores_delete(self.gc, args)
+
+ mocked_delete.assert_called_once_with('store1',
+ 'image1')
+
+ @mock.patch.object(utils, 'exit')
@mock.patch.object(utils, 'print_err')
def test_do_image_delete_with_forbidden_ids(self, mocked_print_err,
mocked_utils_exit):
diff --git a/glanceclient/v2/images.py b/glanceclient/v2/images.py
index 69163fe..1e8e621 100644
--- a/glanceclient/v2/images.py
+++ b/glanceclient/v2/images.py
@@ -303,6 +303,14 @@ class Controller(object):
return body, resp
@utils.add_req_id_to_object()
+ def delete_from_store(self, store_id, image_id):
+ """Delete image data from specific store."""
+ url = ('/v2/stores/%(store)s/%(image)s' % {'store': store_id,
+ 'image': image_id})
+ resp, body = self.http_client.delete(url)
+ return body, resp
+
+ @utils.add_req_id_to_object()
def stage(self, image_id, image_data, image_size=None):
"""Upload the data to image staging.
diff --git a/glanceclient/v2/shell.py b/glanceclient/v2/shell.py
index 3193a88..b4dc811 100644
--- a/glanceclient/v2/shell.py
+++ b/glanceclient/v2/shell.py
@@ -556,6 +556,24 @@ def do_stores_info(gc, args):
utils.print_dict(stores_info)
+@utils.arg('id', metavar='<IMAGE_ID>', help=_('ID of image to update.'))
+@utils.arg('--store', metavar='<STORE_ID>', required=True,
+ help=_('Store to delete image from.'))
+def do_stores_delete(gc, args):
+ """Delete image from specific store."""
+ try:
+ gc.images.delete_from_store(args.store, args.id)
+ except exc.HTTPNotFound:
+ utils.exit('Multi Backend support is not enabled or Image/store not '
+ 'found.')
+ except (exc.HTTPForbidden, exc.HTTPException) as e:
+ msg = ("Unable to delete image '%s' from store '%s'. (%s)" % (
+ args.id,
+ args.store,
+ e))
+ utils.exit(msg)
+
+
@utils.arg('--allow-md5-fallback', action='store_true',
default=utils.env('OS_IMAGE_ALLOW_MD5_FALLBACK', default=False),
help=_('If os_hash_algo and os_hash_value properties are available '
diff --git a/releasenotes/notes/del_from_store-2d807c3038283907.yaml b/releasenotes/notes/del_from_store-2d807c3038283907.yaml
new file mode 100644
index 0000000..7c330a8
--- /dev/null
+++ b/releasenotes/notes/del_from_store-2d807c3038283907.yaml
@@ -0,0 +1,4 @@
+---
+features:
+ - |
+ Support for deleting the image data from single store.