Merge "Zunclient should escape special character"
This commit is contained in:
@@ -166,3 +166,12 @@ def list_containers(containers):
|
|||||||
utils.print_list(containers, columns,
|
utils.print_list(containers, columns,
|
||||||
{'versions': print_list_field('versions')},
|
{'versions': print_list_field('versions')},
|
||||||
sortby_index=None)
|
sortby_index=None)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_command(command):
|
||||||
|
output = []
|
||||||
|
if command:
|
||||||
|
for c in command:
|
||||||
|
c = '"' + c + '"'
|
||||||
|
output.append(c)
|
||||||
|
return " ".join(output)
|
||||||
|
@@ -126,7 +126,7 @@ class CreateContainer(command.ShowOne):
|
|||||||
opts['image_pull_policy'] = parsed_args.image_pull_policy
|
opts['image_pull_policy'] = parsed_args.image_pull_policy
|
||||||
opts['image_driver'] = parsed_args.image_driver
|
opts['image_driver'] = parsed_args.image_driver
|
||||||
if parsed_args.command:
|
if parsed_args.command:
|
||||||
opts['command'] = ' '.join(parsed_args.command)
|
opts['command'] = zun_utils.parse_command(parsed_args.command)
|
||||||
if parsed_args.restart:
|
if parsed_args.restart:
|
||||||
opts['restart_policy'] = \
|
opts['restart_policy'] = \
|
||||||
zun_utils.check_restart_policy(parsed_args.restart)
|
zun_utils.check_restart_policy(parsed_args.restart)
|
||||||
@@ -373,8 +373,8 @@ class ExecContainer(command.Command):
|
|||||||
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
|
container = parsed_args.container
|
||||||
command = ' '.join(parsed_args.command)
|
command = zun_utils.parse_command(parsed_args.command)
|
||||||
response = client.containers.execute(container, command)
|
response = client.containers.execute(container, command=command)
|
||||||
output = response['output']
|
output = response['output']
|
||||||
exit_code = response['exit_code']
|
exit_code = response['exit_code']
|
||||||
print(output)
|
print(output)
|
||||||
@@ -590,7 +590,7 @@ class RunContainer(command.ShowOne):
|
|||||||
opts['image_pull_policy'] = parsed_args.image_pull_policy
|
opts['image_pull_policy'] = parsed_args.image_pull_policy
|
||||||
opts['image_driver'] = parsed_args.image_driver
|
opts['image_driver'] = parsed_args.image_driver
|
||||||
if parsed_args.command:
|
if parsed_args.command:
|
||||||
opts['command'] = ' '.join(parsed_args.command)
|
opts['command'] = zun_utils.parse_command(parsed_args.command)
|
||||||
if parsed_args.restart:
|
if parsed_args.restart:
|
||||||
opts['restart_policy'] = \
|
opts['restart_policy'] = \
|
||||||
zun_utils.check_restart_policy(parsed_args.restart)
|
zun_utils.check_restart_policy(parsed_args.restart)
|
||||||
|
@@ -56,6 +56,27 @@ class TestCase(base.FunctionalTestBase):
|
|||||||
self.fail('Container has not been created!')
|
self.fail('Container has not been created!')
|
||||||
return container
|
return container
|
||||||
|
|
||||||
|
def container_run(self, image='cirros', name=None, params='sleep 100000'):
|
||||||
|
"""Run container and add cleanup.
|
||||||
|
|
||||||
|
:param String image: Image for a new container
|
||||||
|
:param String name: Name for a new container
|
||||||
|
:param String params: Additional args and kwargs
|
||||||
|
:return: JSON object of created container
|
||||||
|
"""
|
||||||
|
if not name:
|
||||||
|
name = data_utils.rand_name('container')
|
||||||
|
|
||||||
|
opts = self.get_opts()
|
||||||
|
output = self.openstack('appcontainer run {0}'
|
||||||
|
' --name {1} {2} {3}'
|
||||||
|
.format(opts, name, image, params))
|
||||||
|
container = json.loads(output)
|
||||||
|
|
||||||
|
if not output:
|
||||||
|
self.fail('Container has not run!')
|
||||||
|
return container
|
||||||
|
|
||||||
def container_delete(self, identifier, ignore_exceptions=False):
|
def container_delete(self, identifier, ignore_exceptions=False):
|
||||||
"""Try to delete container by name or UUID.
|
"""Try to delete container by name or UUID.
|
||||||
|
|
||||||
@@ -105,3 +126,12 @@ class TestCase(base.FunctionalTestBase):
|
|||||||
"""
|
"""
|
||||||
self.openstack('appcontainer rename {0} {1}'
|
self.openstack('appcontainer rename {0} {1}'
|
||||||
.format(identifier, name))
|
.format(identifier, name))
|
||||||
|
|
||||||
|
def container_execute(self, identifier, command):
|
||||||
|
"""Execute in specified container.
|
||||||
|
|
||||||
|
:param String identifier: Name or UUID of the container
|
||||||
|
:param String command: command execute in the container
|
||||||
|
"""
|
||||||
|
return self.openstack('appcontainer exec {0} {1}'
|
||||||
|
.format(identifier, command))
|
||||||
|
@@ -68,7 +68,7 @@ class ContainerTests(base.TestCase):
|
|||||||
[x['uuid'] for x in container_list])
|
[x['uuid'] for x in container_list])
|
||||||
count = 0
|
count = 0
|
||||||
while count < 5:
|
while count < 5:
|
||||||
self.container_show(container['name'])
|
container = self.container_show(container['name'])
|
||||||
if container['status'] == 'Created':
|
if container['status'] == 'Created':
|
||||||
break
|
break
|
||||||
if container['status'] == 'Error':
|
if container['status'] == 'Error':
|
||||||
@@ -109,3 +109,25 @@ class ContainerTests(base.TestCase):
|
|||||||
self.container_rename(container['name'], new_name)
|
self.container_rename(container['name'], new_name)
|
||||||
container_list = self.container_list()
|
container_list = self.container_list()
|
||||||
self.assertIn(new_name, [x['name'] for x in container_list])
|
self.assertIn(new_name, [x['name'] for x in container_list])
|
||||||
|
|
||||||
|
def test_execute(self):
|
||||||
|
"""Check container execute command with name and UUID arguments.
|
||||||
|
|
||||||
|
Test steps:
|
||||||
|
1) Create container in setUp.
|
||||||
|
2) Execute command calling it with name and UUID arguments.
|
||||||
|
3) Check the container logs.
|
||||||
|
"""
|
||||||
|
container = self.container_run(name='test_execute')
|
||||||
|
count = 0
|
||||||
|
while count < 50:
|
||||||
|
container = self.container_show(container['name'])
|
||||||
|
if container['status'] == 'Running':
|
||||||
|
break
|
||||||
|
if container['status'] == 'Error':
|
||||||
|
break
|
||||||
|
time.sleep(2)
|
||||||
|
count = count + 1
|
||||||
|
command = "sh -c 'echo hello'"
|
||||||
|
result = self.container_execute(container['name'], command)
|
||||||
|
self.assertIn('hello', result)
|
||||||
|
@@ -23,7 +23,7 @@ CONTAINER1 = {'id': '1234',
|
|||||||
'name': 'test1',
|
'name': 'test1',
|
||||||
'image_pull_policy': 'never',
|
'image_pull_policy': 'never',
|
||||||
'image': 'cirros',
|
'image': 'cirros',
|
||||||
'command': 'sleep 100000000',
|
'command': 'sh -c "echo hello"',
|
||||||
'cpu': '1',
|
'cpu': '1',
|
||||||
'memory': '256',
|
'memory': '256',
|
||||||
'environment': 'hostname=zunsystem',
|
'environment': 'hostname=zunsystem',
|
||||||
|
@@ -98,7 +98,7 @@ def do_create(cs, args):
|
|||||||
opts['image_pull_policy'] = args.image_pull_policy
|
opts['image_pull_policy'] = args.image_pull_policy
|
||||||
opts['image_driver'] = args.image_driver
|
opts['image_driver'] = args.image_driver
|
||||||
if args.command:
|
if args.command:
|
||||||
opts['command'] = ' '.join(args.command)
|
opts['command'] = zun_utils.parse_command(args.command)
|
||||||
if args.restart:
|
if args.restart:
|
||||||
opts['restart_policy'] = zun_utils.check_restart_policy(args.restart)
|
opts['restart_policy'] = zun_utils.check_restart_policy(args.restart)
|
||||||
if args.interactive:
|
if args.interactive:
|
||||||
@@ -321,7 +321,7 @@ def do_logs(cs, args):
|
|||||||
def do_exec(cs, args):
|
def do_exec(cs, args):
|
||||||
"""Execute command in a running container."""
|
"""Execute command in a running container."""
|
||||||
opts = {}
|
opts = {}
|
||||||
opts['command'] = ' '.join(args.command)
|
opts['command'] = zun_utils.parse_command(args.command)
|
||||||
if args.interactive:
|
if args.interactive:
|
||||||
opts['interactive'] = True
|
opts['interactive'] = True
|
||||||
opts['run'] = False
|
opts['run'] = False
|
||||||
@@ -428,7 +428,7 @@ def do_run(cs, args):
|
|||||||
opts['image_pull_policy'] = args.image_pull_policy
|
opts['image_pull_policy'] = args.image_pull_policy
|
||||||
opts['image_driver'] = args.image_driver
|
opts['image_driver'] = args.image_driver
|
||||||
if args.command:
|
if args.command:
|
||||||
opts['command'] = ' '.join(args.command)
|
opts['command'] = zun_utils.parse_command(args.command)
|
||||||
if args.restart:
|
if args.restart:
|
||||||
opts['restart_policy'] = zun_utils.check_restart_policy(args.restart)
|
opts['restart_policy'] = zun_utils.check_restart_policy(args.restart)
|
||||||
if args.interactive:
|
if args.interactive:
|
||||||
|
Reference in New Issue
Block a user