Add missing default-runtime support bits

So it can be used when debugging containers with podman
and paunch. Also fix clean/list/delete should be added the
default_runtime value.

Deduplicate cont_cmd and default_runtime (deprecated) ABI
params passed into action methods and taking the same
values. Use cont_cmd instead.

Closes-Bug: #1796646

Change-Id: I86d6403ee6d7e8acd05e8646066420feec098f1a
Signed-off-by: Bogdan Dobrelya <bdobreli@redhat.com>
This commit is contained in:
Bogdan Dobrelya 2018-10-08 12:12:11 +02:00
parent 791766596c
commit e2b74083fe
4 changed files with 183 additions and 39 deletions

View File

@ -24,8 +24,8 @@ from paunch.utils import common
__version__ = pbr.version.VersionInfo('paunch').version_string()
def apply(config_id, config, managed_by, labels=None, cont_cmd=None,
default_runtime='docker', log_level=None, log_file=None):
def apply(config_id, config, managed_by, labels=None, cont_cmd='docker',
default_runtime=None, log_level=None, log_file=None):
"""Execute supplied container configuration.
:param str config_id: Unique config ID, should not be re-used until any
@ -38,8 +38,7 @@ def apply(config_id, config, managed_by, labels=None, cont_cmd=None,
:param dict labels: Optional keys/values of labels to apply to containers
created with this invocation.
:param str cont_cmd: Optional override to the container command to run.
:param str default_runtime: Optional override to the default runtime used
for containers.
:param str default_runtime: (deprecated) does nothing.
:param int log_level: optional log level for loggers
:param int log_file: optional log file for messages
@ -49,8 +48,11 @@ def apply(config_id, config, managed_by, labels=None, cont_cmd=None,
:rtype: tuple
"""
log = common.configure_logging(__name__, log_level, log_file)
if default_runtime:
log.warning("DEPRECATION: 'default_runtime' does nothing, "
"use 'cont_cmd' instead")
if default_runtime == 'docker':
if cont_cmd == 'docker':
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd, log=log)
builder = compose1.ComposeV1Builder(
config_id=config_id,
@ -59,7 +61,7 @@ def apply(config_id, config, managed_by, labels=None, cont_cmd=None,
labels=labels,
log=log
)
elif default_runtime == 'podman':
elif cont_cmd == 'podman':
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd, log=log)
builder = podman.PodmanBuilder(
config_id=config_id,
@ -69,11 +71,11 @@ def apply(config_id, config, managed_by, labels=None, cont_cmd=None,
log=log
)
else:
log.error("container runtime not supported: %s" % default_runtime)
log.error("container runtime not supported: %s" % cont_cmd)
return builder.apply()
def cleanup(config_ids, managed_by, cont_cmd=None, default_runtime='docker',
def cleanup(config_ids, managed_by, cont_cmd='docker', default_runtime=None,
log_level=None, log_file=None):
"""Delete containers no longer applied, rename others to preferred name.
@ -83,33 +85,34 @@ def cleanup(config_ids, managed_by, cont_cmd=None, default_runtime='docker',
:param str managed_by: Name of the tool managing the containers. Only
containers labelled with this will be modified.
:param str cont_cmd: Optional override to the container command to run.
:param str default_runtime: Optional override to the default runtime used
for containers.
:param str default_runtime: (deprecated) does nothing.
:param int log_level: optional log level for loggers
:param int log_file: optional log file for messages
"""
log = common.configure_logging(__name__, log_level, log_file)
if default_runtime:
log.warning("DEPRECATION: 'default_runtime' does nothing, "
"use 'cont_cmd' instead")
if default_runtime == 'docker':
if cont_cmd == 'docker':
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd, log=log)
elif default_runtime == 'podman':
elif cont_cmd == 'podman':
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd, log=log)
log.warning("paunch cleanup is partially supported with podman")
else:
log.error("container runtime not supported: %s" % default_runtime)
log.error("container runtime not supported: %s" % cont_cmd)
r.delete_missing_configs(config_ids)
r.rename_containers()
def list(managed_by, cont_cmd=None, default_runtime='docker', log_level=None,
log_file=None):
def list(managed_by, cont_cmd='docker', default_runtime=None,
log_level=None, log_file=None):
"""List all containers associated with all config IDs.
:param str managed_by: Name of the tool managing the containers. Only
containers labelled with this will be modified.
:param str cont_cmd: Optional override to the container command to run.
:param str default_runtime: Optional override to the default runtime used
for containers.
:param str default_runtime: (deprecated) does nothing.
:param int log_level: optional log level for loggers
:param int log_file: optional log file for messages
@ -118,18 +121,21 @@ def list(managed_by, cont_cmd=None, default_runtime='docker', log_level=None,
:rtype: defaultdict(list)
"""
log = common.configure_logging(__name__, log_level, log_file)
if default_runtime:
log.warning("DEPRECATION: 'default_runtime' does nothing, "
"use 'cont_cmd' instead")
if default_runtime == 'docker':
if cont_cmd == 'docker':
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd, log=log)
elif default_runtime == 'podman':
elif cont_cmd == 'podman':
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd, log=log)
else:
log.error("container runtime not supported: %s" % default_runtime)
log.error("container runtime not supported: %s" % cont_cmd)
return r.list_configs()
def debug(config_id, container_name, action, config, managed_by, labels=None,
cont_cmd=None, default_runtime='docker', log_level=None,
cont_cmd='docker', default_runtime=None, log_level=None,
log_file=None):
"""Execute supplied container configuration.
@ -146,8 +152,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
:param dict labels: Optional keys/values of labels to apply to containers
created with this invocation.
:param str cont_cmd: Optional override to the container command to run.
:param str default_runtime: Optional override to the default runtime used
for containers.
:param str default_runtime: (deprecated) does nothing.
:param int log_level: optional log level for loggers
:param int log_file: optional log file for messages
@ -156,8 +161,11 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
:rtype: int
"""
log = common.configure_logging(__name__, log_level, log_file)
if default_runtime:
log.warning("DEPRECATION: 'default_runtime' does nothing, "
"use 'cont_cmd' instead")
if default_runtime == 'docker':
if cont_cmd == 'docker':
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd, log=log)
builder = compose1.ComposeV1Builder(
config_id=config_id,
@ -166,7 +174,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
labels=labels,
log=log
)
elif default_runtime == 'podman':
elif cont_cmd == 'podman':
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd, log=log)
builder = podman.PodmanBuilder(
config_id=config_id,
@ -176,7 +184,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
log=log
)
else:
log.error("container runtime not supported: %s" % default_runtime)
log.error("container runtime not supported: %s" % cont_cmd)
if action == 'print-cmd':
cmd = [
r.cont_cmd,
@ -204,7 +212,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
'"print-cmd", or "run"')
def delete(config_ids, managed_by, cont_cmd=None, default_runtime='docker',
def delete(config_ids, managed_by, cont_cmd='docker', default_runtime=None,
log_level=None, log_file=None):
"""Delete containers with the specified config IDs.
@ -212,20 +220,22 @@ def delete(config_ids, managed_by, cont_cmd=None, default_runtime='docker',
:param str managed_by: Name of the tool managing the containers. Only
containers labelled with this will be modified.
:param str cont_cmd: Optional override to the container command to run.
:param str default_runtime: Optional override to the default runtime used
for containers.
:param str default_runtime: (deprecated) does nothing.
"""
log = common.configure_logging(__name__, log_level, log_file)
if default_runtime:
log.warning("DEPRECATION: 'default_runtime' does nothing, "
"use 'cont_cmd' instead")
if not config_ids:
log.warn('No config IDs specified')
if default_runtime == 'docker':
if cont_cmd == 'docker':
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd, log=log)
elif default_runtime == 'podman':
elif cont_cmd == 'podman':
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd, log=log)
log.warning("paunch cleanup is partially supported with podman")
else:
log.error("container runtime not supported: %s" % default_runtime)
log.error("container runtime not supported: %s" % cont_cmd)
for conf_id in config_ids:
r.remove_containers(conf_id)

View File

@ -63,6 +63,7 @@ class Apply(command.Command):
'--default-runtime',
dest='default_runtime',
default='docker',
choices=['docker', 'podman'],
help=('Default runtime for containers. Can be docker or podman.'),
)
return parser
@ -88,7 +89,7 @@ class Apply(command.Command):
config,
managed_by='paunch',
labels=labels,
default_runtime=parsed_args.default_runtime,
cont_cmd=parsed_args.default_runtime,
log_level=log_level,
log_file=log_file
)
@ -116,6 +117,13 @@ class Cleanup(command.Command):
default='paunch',
help=('Override the name of the tool managing the containers'),
)
parser.add_argument(
'--default-runtime',
dest='default_runtime',
default='docker',
choices=['docker', 'podman'],
help=('Default runtime for containers. Can be docker or podman.'),
)
return parser
def take_action(self, parsed_args):
@ -128,6 +136,7 @@ class Cleanup(command.Command):
paunch.cleanup(
parsed_args.config_id,
managed_by=parsed_args.managed_by,
cont_cmd=parsed_args.default_runtime,
log_level=log_level,
log_file=log_file
)
@ -152,6 +161,13 @@ class Delete(command.Command):
default='paunch',
help=('Override the name of the tool managing the containers'),
)
parser.add_argument(
'--default-runtime',
dest='default_runtime',
default='docker',
choices=['docker', 'podman'],
help=('Default runtime for containers. Can be docker or podman.'),
)
return parser
def take_action(self, parsed_args):
@ -164,6 +180,7 @@ class Delete(command.Command):
paunch.delete(
parsed_args.config_id,
parsed_args.managed_by,
cont_cmd=parsed_args.default_runtime,
log_level=log_level,
log_file=log_file
)
@ -250,6 +267,13 @@ class Debug(command.Command):
default='debug',
help=('ID to assign to containers')
)
parser.add_argument(
'--default-runtime',
dest='default_runtime',
default='docker',
choices=['docker', 'podman'],
help=('Default runtime for containers. Can be docker or podman.'),
)
return parser
def take_action(self, parsed_args):
@ -302,6 +326,7 @@ class Debug(command.Command):
cconfig,
parsed_args.managed_by,
labels=labels,
cont_cmd=parsed_args.default_runtime,
log_level=log_level,
log_file=log_file
)
@ -320,6 +345,13 @@ class List(lister.Lister):
default='paunch',
help=('Override the name of the tool managing the containers'),
)
parser.add_argument(
'--default-runtime',
dest='default_runtime',
default='docker',
choices=['docker', 'podman'],
help=('Default runtime for containers. Can be docker or podman.'),
)
return parser
def take_action(self, parsed_args):
@ -331,6 +363,7 @@ class List(lister.Lister):
__name__, log_level, log_file)
configs = paunch.list(
parsed_args.managed_by,
cont_cmd=parsed_args.default_runtime,
log_level=log_level,
log_file=log_file
)

View File

@ -18,13 +18,14 @@ import paunch
from paunch.tests import base
class TestPaunch(base.TestCase):
class TestPaunchDockerRuntime(base.TestCase):
@mock.patch('paunch.builder.compose1.ComposeV1Builder', autospec=True)
@mock.patch('paunch.runner.DockerRunner', autospec=True)
def test_apply(self, runner, builder):
paunch.apply('foo', {'bar': 'baz'}, 'tester')
runner.assert_called_once_with('tester', cont_cmd=None, log=mock.ANY)
runner.assert_called_once_with('tester', cont_cmd='docker',
log=mock.ANY)
builder.assert_called_once_with(
config_id='foo',
config={'bar': 'baz'},
@ -43,7 +44,8 @@ class TestPaunch(base.TestCase):
managed_by='tester',
labels={'bink': 'boop'})
runner.assert_called_once_with('tester', cont_cmd=None, log=mock.ANY)
runner.assert_called_once_with('tester', cont_cmd='docker',
log=mock.ANY)
builder.assert_called_once_with(
config_id='foo',
config={'bar': 'baz'},
@ -56,7 +58,8 @@ class TestPaunch(base.TestCase):
@mock.patch('paunch.runner.DockerRunner', autospec=True)
def test_cleanup(self, runner):
paunch.cleanup(['foo', 'bar'], 'tester')
runner.assert_called_once_with('tester', cont_cmd=None, log=mock.ANY)
runner.assert_called_once_with('tester', cont_cmd='docker',
log=mock.ANY)
runner.return_value.delete_missing_configs.assert_called_once_with(
['foo', 'bar'])
runner.return_value.rename_containers.assert_called_once_with()
@ -64,13 +67,15 @@ class TestPaunch(base.TestCase):
@mock.patch('paunch.runner.DockerRunner', autospec=True)
def test_list(self, runner):
paunch.list('tester')
runner.assert_called_once_with('tester', cont_cmd=None, log=mock.ANY)
runner.assert_called_once_with('tester', cont_cmd='docker',
log=mock.ANY)
runner.return_value.list_configs.assert_called_once_with()
@mock.patch('paunch.runner.DockerRunner', autospec=True)
def test_delete(self, runner):
paunch.delete(['foo', 'bar'], 'tester')
runner.assert_called_once_with('tester', cont_cmd=None, log=mock.ANY)
runner.assert_called_once_with('tester', cont_cmd='docker',
log=mock.ANY)
runner.return_value.remove_containers.assert_has_calls([
mock.call('foo'), mock.call('bar')
])
@ -89,3 +94,94 @@ class TestPaunch(base.TestCase):
)
runner.assert_called_once_with('tester', cont_cmd='docker',
log=mock.ANY)
class TestPaunchPodmanRuntime(base.TestCase):
@mock.patch('paunch.builder.podman.PodmanBuilder', autospec=True)
@mock.patch('paunch.runner.PodmanRunner', autospec=True)
def test_apply(self, runner, builder):
paunch.apply(
config_id='foo',
config={'bar': 'baz'},
managed_by='tester',
labels=None,
cont_cmd='podman')
runner.assert_called_once_with('tester', cont_cmd='podman',
log=mock.ANY)
builder.assert_called_once_with(
config_id='foo',
config={'bar': 'baz'},
runner=runner.return_value,
labels=None,
log=mock.ANY
)
builder.return_value.apply.assert_called_once_with()
@mock.patch('paunch.builder.podman.PodmanBuilder', autospec=True)
@mock.patch('paunch.runner.PodmanRunner', autospec=True)
def test_apply_labels(self, runner, builder):
paunch.apply(
config_id='foo',
config={'bar': 'baz'},
managed_by='tester',
labels={'bink': 'boop'},
cont_cmd='podman')
runner.assert_called_once_with('tester', cont_cmd='podman',
log=mock.ANY)
builder.assert_called_once_with(
config_id='foo',
config={'bar': 'baz'},
runner=runner.return_value,
labels={'bink': 'boop'},
log=mock.ANY
)
builder.return_value.apply.assert_called_once_with()
@mock.patch('paunch.runner.PodmanRunner', autospec=True)
def test_cleanup(self, runner):
paunch.cleanup(
['foo', 'bar'],
managed_by='tester',
cont_cmd='podman')
runner.assert_called_once_with('tester', cont_cmd='podman',
log=mock.ANY)
runner.return_value.delete_missing_configs.assert_called_once_with(
['foo', 'bar'])
runner.return_value.rename_containers.assert_called_once_with()
@mock.patch('paunch.runner.PodmanRunner', autospec=True)
def test_list(self, runner):
paunch.list('tester', cont_cmd='podman')
runner.assert_called_once_with('tester', cont_cmd='podman',
log=mock.ANY)
runner.return_value.list_configs.assert_called_once_with()
@mock.patch('paunch.runner.PodmanRunner', autospec=True)
def test_delete(self, runner):
paunch.delete(
['foo', 'bar'],
managed_by='tester',
cont_cmd='podman')
runner.assert_called_once_with('tester', cont_cmd='podman',
log=mock.ANY)
runner.return_value.remove_containers.assert_has_calls([
mock.call('foo'), mock.call('bar')
])
@mock.patch('paunch.builder.podman.PodmanBuilder', autospec=True)
@mock.patch('paunch.runner.PodmanRunner')
def test_debug(self, runner, builder):
paunch.debug('foo', 'testcont', 'run', {'bar': 'baz'}, 'tester',
labels=None, cont_cmd='podman',
log_level=42, log_file='/dev/null')
builder.assert_called_once_with(
config_id='foo',
config={'bar': 'baz'},
runner=runner.return_value,
labels=None,
log=mock.ANY
)
runner.assert_called_once_with('tester', cont_cmd='podman',
log=mock.ANY)

View File

@ -0,0 +1,5 @@
---
deprecations:
- |
The `default_runtime` ABI parameter is deprecated, use cont_cmd instead.
The default-runtime CLI argument retains unchanged.