diff --git a/zunclient/common/base.py b/zunclient/common/base.py index 52c9d325..2c094606 100644 --- a/zunclient/common/base.py +++ b/zunclient/common/base.py @@ -116,7 +116,11 @@ class Manager(object): return object_list - def _list(self, url, response_key=None, obj_class=None, body=None): + def _list(self, url, response_key=None, obj_class=None, body=None, + qparams=None): + if qparams: + url = "%s?%s" % (url, urlparse.urlencode(qparams)) + resp, body = self.api.json_request('GET', url) if obj_class is None: diff --git a/zunclient/osc/v1/containers.py b/zunclient/osc/v1/containers.py index ca94aeed..472d647d 100644 --- a/zunclient/osc/v1/containers.py +++ b/zunclient/osc/v1/containers.py @@ -181,12 +181,20 @@ class ShowContainer(command.ShowOne): 'container', metavar='', help='ID or name of the container to show.') + parser.add_argument( + '--all-tenants', + action="store_true", + default=False, + help='Show container(s) in all tenant by name.') return parser def take_action(self, parsed_args): client = _get_client(self, parsed_args) - container = parsed_args.container - container = client.containers.get(container) + opts = {} + opts['id'] = parsed_args.container + opts['all_tenants'] = parsed_args.all_tenants + opts = zun_utils.remove_null_parms(**opts) + container = client.containers.get(**opts) columns = _container_columns(container) return columns, utils.get_item_properties(container, columns) @@ -259,15 +267,24 @@ class DeleteContainer(command.Command): '--force', action='store_true', help='Force delete the container.') + parser.add_argument( + '--all-tenants', + action="store_true", + default=False, + help='Delete container(s) in all tenant by name.') return parser def take_action(self, parsed_args): client = _get_client(self, parsed_args) containers = parsed_args.container - force = getattr(parsed_args, 'force') for container in containers: + opts = {} + opts['id'] = container + opts['force'] = parsed_args.force + opts['all_tenants'] = parsed_args.all_tenants + opts = zun_utils.remove_null_parms(**opts) try: - client.containers.delete(container, force) + client.containers.delete(**opts) print(_('Request to delete container %s has been accepted.') % container) except Exception as e: diff --git a/zunclient/tests/unit/v1/test_containers.py b/zunclient/tests/unit/v1/test_containers.py index 00e02e09..18b3f39f 100644 --- a/zunclient/tests/unit/v1/test_containers.py +++ b/zunclient/tests/unit/v1/test_containers.py @@ -56,6 +56,7 @@ del CREATE_CONTAINER1['uuid'] force_delete1 = False force_delete2 = True +all_tenants = True signal = "SIGTERM" name = "new-name" timeout = 10 @@ -155,6 +156,13 @@ fake_responses = { None, ), }, + '/v1/containers/%s?all_tenants=%s' % (CONTAINER1['id'], all_tenants): + { + 'DELETE': ( + {}, + None, + ), + }, '/v1/containers/%s/stop?timeout=10' % CONTAINER1['id']: { 'POST': ( @@ -411,7 +419,7 @@ class ContainerManagerTest(testtools.TestCase): self.assertTrue(containers) def test_containers_delete(self): - containers = self.mgr.delete(CONTAINER1['id'], force_delete1) + containers = self.mgr.delete(CONTAINER1['id'], force=force_delete1) expect = [ ('DELETE', '/v1/containers/%s?force=%s' % (CONTAINER1['id'], force_delete1), @@ -421,7 +429,7 @@ class ContainerManagerTest(testtools.TestCase): self.assertIsNone(containers) def test_containers_delete_with_force(self): - containers = self.mgr.delete(CONTAINER1['id'], force_delete2) + containers = self.mgr.delete(CONTAINER1['id'], force=force_delete2) expect = [ ('DELETE', '/v1/containers/%s?force=%s' % (CONTAINER1['id'], force_delete2), @@ -430,6 +438,16 @@ class ContainerManagerTest(testtools.TestCase): self.assertEqual(expect, self.api.calls) self.assertIsNone(containers) + def test_containers_delete_with_all_tenants(self): + containers = self.mgr.delete(CONTAINER1['id'], all_tenants=all_tenants) + expect = [ + ('DELETE', '/v1/containers/%s?all_tenants=%s' % (CONTAINER1['id'], + all_tenants), + {}, None) + ] + self.assertEqual(expect, self.api.calls) + self.assertIsNone(containers) + def test_containers_stop(self): containers = self.mgr.stop(CONTAINER1['id'], timeout) expect = [ diff --git a/zunclient/v1/containers.py b/zunclient/v1/containers.py index a065365e..9bdb375a 100644 --- a/zunclient/v1/containers.py +++ b/zunclient/v1/containers.py @@ -90,9 +90,10 @@ class ContainerManager(base.Manager): "containers", limit=limit) - def get(self, id): + def get(self, id, **kwargs): try: - return self._list(self._path(id))[0] + return self._list(self._path(id), + qparams=kwargs)[0] except IndexError: return None @@ -106,9 +107,9 @@ class ContainerManager(base.Manager): "Key must be in %s" % ','.join(CREATION_ATTRIBUTES)) return self._create(self._path(), new) - def delete(self, id, force): + def delete(self, id, **kwargs): return self._delete(self._path(id), - qparams={'force': force}) + qparams=kwargs) def _action(self, id, action, method='POST', qparams=None, **kwargs): if qparams: diff --git a/zunclient/v1/containers_shell.py b/zunclient/v1/containers_shell.py index 12fd0c99..94785bf6 100644 --- a/zunclient/v1/containers_shell.py +++ b/zunclient/v1/containers_shell.py @@ -177,11 +177,20 @@ def do_list(cs, args): @utils.arg('-f', '--force', action='store_true', help='Force delete the container.') +@utils.arg('--all-tenants', + action="store_true", + default=False, + help='Delete container(s) in all tenant by name.') def do_delete(cs, args): """Delete specified containers.""" for container in args.containers: + opts = {} + opts['id'] = container + opts['force'] = args.force + opts['all_tenants'] = args.all_tenants + opts = zun_utils.remove_null_parms(**opts) try: - cs.containers.delete(container, args.force) + cs.containers.delete(**opts) print("Request to delete container %s has been accepted." % container) except Exception as e: @@ -200,9 +209,17 @@ def do_delete(cs, args): help='Print representation of the container.' 'The choices of the output format is json,table,yaml.' 'Defaults to table.') +@utils.arg('--all-tenants', + action="store_true", + default=False, + help='Show container(s) in all tenant by name.') def do_show(cs, args): """Show details of a container.""" - container = cs.containers.get(args.container) + opts = {} + opts['id'] = args.container + opts['all_tenants'] = args.all_tenants + opts = zun_utils.remove_null_parms(**opts) + container = cs.containers.get(**opts) if args.format == 'json': print(json.dumps(container._info, indent=4, sort_keys=True)) elif args.format == 'yaml':