summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTerryHowe <terrylhowe@gmail.com>2015-10-15 08:39:23 -0600
committerTerry Howe <terrylhowe@gmail.com>2016-02-05 11:18:46 -0700
commit514a168656823eb4897e38a15a1a769a7d18f44f (patch)
tree135b87cd43c11fd4a03b5e5eea818dcc9d04a07e
parent42b607edf117e4a3f421a554308330409c88dbb1 (diff)
downloadpython-openstackclient-514a168656823eb4897e38a15a1a769a7d18f44f.tar.gz
Add recursive object delete for containers
Change-Id: Ib291e79864c218464e842a08efd3742193ba5ff0
-rw-r--r--doc/source/command-objects/container.rst7
-rw-r--r--functional/tests/object/v1/test_object.py5
-rw-r--r--openstackclient/object/v1/container.py14
-rw-r--r--openstackclient/tests/object/v1/test_container.py90
4 files changed, 114 insertions, 2 deletions
diff --git a/doc/source/command-objects/container.rst b/doc/source/command-objects/container.rst
index e6517e9b..130a6b3d 100644
--- a/doc/source/command-objects/container.rst
+++ b/doc/source/command-objects/container.rst
@@ -28,8 +28,13 @@ Delete container
.. code:: bash
os container delete
+ [-r] | [--recursive]
<container> [<container> ...]
+.. option:: --recursive, -r
+
+ Recursively delete objects in container before container delete
+
.. describe:: <container>
Container(s) to delete
@@ -40,7 +45,7 @@ container list
List containers
.. program:: container list
-.. code::bash
+.. code:: bash
os container list
[--prefix <prefix>]
diff --git a/functional/tests/object/v1/test_object.py b/functional/tests/object/v1/test_object.py
index 289e1ca7..cd98012c 100644
--- a/functional/tests/object/v1/test_object.py
+++ b/functional/tests/object/v1/test_object.py
@@ -74,5 +74,8 @@ class ObjectTests(test.TestCase):
+ ' ' + self.OBJECT_NAME)
self.assertEqual(0, len(raw_output))
- raw_output = self.openstack('container delete ' + self.CONTAINER_NAME)
+ self.openstack('object create ' + self.CONTAINER_NAME
+ + ' ' + self.OBJECT_NAME)
+ raw_output = self.openstack('container delete -r ' +
+ self.CONTAINER_NAME)
self.assertEqual(0, len(raw_output))
diff --git a/openstackclient/object/v1/container.py b/openstackclient/object/v1/container.py
index e70afd9d..80b84238 100644
--- a/openstackclient/object/v1/container.py
+++ b/openstackclient/object/v1/container.py
@@ -59,6 +59,12 @@ class DeleteContainer(command.Command):
def get_parser(self, prog_name):
parser = super(DeleteContainer, self).get_parser(prog_name)
parser.add_argument(
+ '--recursive', '-r',
+ action='store_true',
+ default=False,
+ help='Recursively delete objects and container',
+ )
+ parser.add_argument(
'containers',
metavar='<container>',
nargs="+",
@@ -69,6 +75,14 @@ class DeleteContainer(command.Command):
def take_action(self, parsed_args):
for container in parsed_args.containers:
+ if parsed_args.recursive:
+ objs = self.app.client_manager.object_store.object_list(
+ container=container)
+ for obj in objs:
+ self.app.client_manager.object_store.object_delete(
+ container=container,
+ object=obj['name'],
+ )
self.app.client_manager.object_store.container_delete(
container=container,
)
diff --git a/openstackclient/tests/object/v1/test_container.py b/openstackclient/tests/object/v1/test_container.py
index afcb3386..d34d73e2 100644
--- a/openstackclient/tests/object/v1/test_container.py
+++ b/openstackclient/tests/object/v1/test_container.py
@@ -44,6 +44,96 @@ class TestContainer(object_fakes.TestObjectv1):
self.api = self.app.client_manager.object_store
+@mock.patch('openstackclient.api.object_store_v1.APIv1.object_delete')
+@mock.patch('openstackclient.api.object_store_v1.APIv1.object_list')
+@mock.patch('openstackclient.api.object_store_v1.APIv1.container_delete')
+class TestContainerDelete(TestContainer):
+
+ def setUp(self):
+ super(TestContainerDelete, self).setUp()
+
+ # Get the command object to test
+ self.cmd = container.DeleteContainer(self.app, None)
+
+ def test_container_delete(self, c_mock, o_list_mock, o_delete_mock):
+ c_mock.return_value = None
+
+ arglist = [
+ object_fakes.container_name,
+ ]
+ verifylist = [
+ ('containers', [object_fakes.container_name]),
+ ('recursive', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertEqual(None, self.cmd.take_action(parsed_args))
+
+ kwargs = {}
+ c_mock.assert_called_with(
+ container=object_fakes.container_name,
+ **kwargs
+ )
+ self.assertFalse(o_list_mock.called)
+ self.assertFalse(o_delete_mock.called)
+
+ def test_recursive_delete(self, c_mock, o_list_mock, o_delete_mock):
+ c_mock.return_value = None
+ o_list_mock.return_value = [object_fakes.OBJECT]
+ o_delete_mock.return_value = None
+
+ arglist = [
+ '--recursive',
+ object_fakes.container_name,
+ ]
+ verifylist = [
+ ('containers', [object_fakes.container_name]),
+ ('recursive', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertEqual(None, self.cmd.take_action(parsed_args))
+
+ kwargs = {}
+ c_mock.assert_called_with(
+ container=object_fakes.container_name,
+ **kwargs
+ )
+ o_list_mock.assert_called_with(container=object_fakes.container_name)
+ o_delete_mock.assert_called_with(
+ container=object_fakes.container_name,
+ object=object_fakes.OBJECT['name'],
+ )
+
+ def test_r_delete(self, c_mock, o_list_mock, o_delete_mock):
+ c_mock.return_value = None
+ o_list_mock.return_value = [object_fakes.OBJECT]
+ o_delete_mock.return_value = None
+
+ arglist = [
+ '-r',
+ object_fakes.container_name,
+ ]
+ verifylist = [
+ ('containers', [object_fakes.container_name]),
+ ('recursive', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.assertEqual(None, self.cmd.take_action(parsed_args))
+
+ kwargs = {}
+ c_mock.assert_called_with(
+ container=object_fakes.container_name,
+ **kwargs
+ )
+ o_list_mock.assert_called_with(container=object_fakes.container_name)
+ o_delete_mock.assert_called_with(
+ container=object_fakes.container_name,
+ object=object_fakes.OBJECT['name'],
+ )
+
+
@mock.patch(
'openstackclient.api.object_store_v1.APIv1.container_list'
)