Merge "Support all_tenants in show and delete"

This commit is contained in:
Jenkins
2017-07-28 03:46:56 +00:00
committed by Gerrit Code Review
5 changed files with 70 additions and 13 deletions

View File

@@ -120,7 +120,11 @@ class Manager(object):
return object_list 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) resp, body = self.api.json_request('GET', url)
if obj_class is None: if obj_class is None:

View File

@@ -181,12 +181,20 @@ class ShowContainer(command.ShowOne):
'container', 'container',
metavar='<container>', metavar='<container>',
help='ID or name of the container to show.') 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 return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
client = _get_client(self, parsed_args) client = _get_client(self, parsed_args)
container = parsed_args.container opts = {}
container = client.containers.get(container) 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) columns = _container_columns(container)
return columns, utils.get_item_properties(container, columns) return columns, utils.get_item_properties(container, columns)
@@ -259,15 +267,24 @@ class DeleteContainer(command.Command):
'--force', '--force',
action='store_true', action='store_true',
help='Force delete the container.') 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 return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
client = _get_client(self, parsed_args) client = _get_client(self, parsed_args)
containers = parsed_args.container containers = parsed_args.container
force = getattr(parsed_args, 'force')
for container in containers: 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: try:
client.containers.delete(container, force) client.containers.delete(**opts)
print(_('Request to delete container %s has been accepted.') print(_('Request to delete container %s has been accepted.')
% container) % container)
except Exception as e: except Exception as e:

View File

@@ -56,6 +56,7 @@ del CREATE_CONTAINER1['uuid']
force_delete1 = False force_delete1 = False
force_delete2 = True force_delete2 = True
all_tenants = True
signal = "SIGTERM" signal = "SIGTERM"
name = "new-name" name = "new-name"
timeout = 10 timeout = 10
@@ -155,6 +156,13 @@ fake_responses = {
None, None,
), ),
}, },
'/v1/containers/%s?all_tenants=%s' % (CONTAINER1['id'], all_tenants):
{
'DELETE': (
{},
None,
),
},
'/v1/containers/%s/stop?timeout=10' % CONTAINER1['id']: '/v1/containers/%s/stop?timeout=10' % CONTAINER1['id']:
{ {
'POST': ( 'POST': (
@@ -411,7 +419,7 @@ class ContainerManagerTest(testtools.TestCase):
self.assertTrue(containers) self.assertTrue(containers)
def test_containers_delete(self): def test_containers_delete(self):
containers = self.mgr.delete(CONTAINER1['id'], force_delete1) containers = self.mgr.delete(CONTAINER1['id'], force=force_delete1)
expect = [ expect = [
('DELETE', '/v1/containers/%s?force=%s' % (CONTAINER1['id'], ('DELETE', '/v1/containers/%s?force=%s' % (CONTAINER1['id'],
force_delete1), force_delete1),
@@ -421,7 +429,7 @@ class ContainerManagerTest(testtools.TestCase):
self.assertIsNone(containers) self.assertIsNone(containers)
def test_containers_delete_with_force(self): 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 = [ expect = [
('DELETE', '/v1/containers/%s?force=%s' % (CONTAINER1['id'], ('DELETE', '/v1/containers/%s?force=%s' % (CONTAINER1['id'],
force_delete2), force_delete2),
@@ -430,6 +438,16 @@ class ContainerManagerTest(testtools.TestCase):
self.assertEqual(expect, self.api.calls) self.assertEqual(expect, self.api.calls)
self.assertIsNone(containers) 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): def test_containers_stop(self):
containers = self.mgr.stop(CONTAINER1['id'], timeout) containers = self.mgr.stop(CONTAINER1['id'], timeout)
expect = [ expect = [

View File

@@ -90,9 +90,10 @@ class ContainerManager(base.Manager):
"containers", "containers",
limit=limit) limit=limit)
def get(self, id): def get(self, id, **kwargs):
try: try:
return self._list(self._path(id))[0] return self._list(self._path(id),
qparams=kwargs)[0]
except IndexError: except IndexError:
return None return None
@@ -106,9 +107,9 @@ class ContainerManager(base.Manager):
"Key must be in %s" % ','.join(CREATION_ATTRIBUTES)) "Key must be in %s" % ','.join(CREATION_ATTRIBUTES))
return self._create(self._path(), new) return self._create(self._path(), new)
def delete(self, id, force): def delete(self, id, **kwargs):
return self._delete(self._path(id), return self._delete(self._path(id),
qparams={'force': force}) qparams=kwargs)
def _action(self, id, action, method='POST', qparams=None, **kwargs): def _action(self, id, action, method='POST', qparams=None, **kwargs):
if qparams: if qparams:

View File

@@ -176,11 +176,20 @@ def do_list(cs, args):
@utils.arg('-f', '--force', @utils.arg('-f', '--force',
action='store_true', action='store_true',
help='Force delete the container.') 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): def do_delete(cs, args):
"""Delete specified containers.""" """Delete specified containers."""
for container in args.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: try:
cs.containers.delete(container, args.force) cs.containers.delete(**opts)
print("Request to delete container %s has been accepted." % print("Request to delete container %s has been accepted." %
container) container)
except Exception as e: except Exception as e:
@@ -199,9 +208,17 @@ def do_delete(cs, args):
help='Print representation of the container.' help='Print representation of the container.'
'The choices of the output format is json,table,yaml.' 'The choices of the output format is json,table,yaml.'
'Defaults to table.') '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): def do_show(cs, args):
"""Show details of a container.""" """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': if args.format == 'json':
print(json.dumps(container._info, indent=4, sort_keys=True)) print(json.dumps(container._info, indent=4, sort_keys=True))
elif args.format == 'yaml': elif args.format == 'yaml':