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:
parent
791766596c
commit
e2b74083fe
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
deprecations:
|
||||
- |
|
||||
The `default_runtime` ABI parameter is deprecated, use cont_cmd instead.
|
||||
The default-runtime CLI argument retains unchanged.
|
Loading…
Reference in New Issue