Merge "Support all_tenants in show and delete"
This commit is contained in:
@@ -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:
|
||||||
|
@@ -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:
|
||||||
|
@@ -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 = [
|
||||||
|
@@ -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:
|
||||||
|
@@ -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':
|
||||||
|
Reference in New Issue
Block a user