Stop hardcoding 'docker' and make it more generic
Rename: - docker_cmd to cont_cmd - docker_exec_args to cont_exec_args - docker_run_args to cont_run_args - adjust 'inspect' command logs Change-Id: Icdced79fa74514afea9c9fcafd80bd07551c8f13
This commit is contained in:
parent
6a6f99b724
commit
b22598c761
|
@ -26,7 +26,7 @@ __version__ = pbr.version.VersionInfo('paunch').version_string()
|
|||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def apply(config_id, config, managed_by, labels=None, docker_cmd=None,
|
||||
def apply(config_id, config, managed_by, labels=None, cont_cmd=None,
|
||||
default_runtime='docker'):
|
||||
"""Execute supplied container configuration.
|
||||
|
||||
|
@ -39,7 +39,7 @@ def apply(config_id, config, managed_by, labels=None, docker_cmd=None,
|
|||
containers labelled with this will be modified.
|
||||
:param dict labels: Optional keys/values of labels to apply to containers
|
||||
created with this invocation.
|
||||
:param str docker_cmd: Optional override to the docker command to run.
|
||||
: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.
|
||||
|
||||
|
@ -49,7 +49,7 @@ def apply(config_id, config, managed_by, labels=None, docker_cmd=None,
|
|||
:rtype: tuple
|
||||
"""
|
||||
if default_runtime == 'docker':
|
||||
r = runner.DockerRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd)
|
||||
builder = compose1.ComposeV1Builder(
|
||||
config_id=config_id,
|
||||
config=config,
|
||||
|
@ -57,7 +57,7 @@ def apply(config_id, config, managed_by, labels=None, docker_cmd=None,
|
|||
labels=labels
|
||||
)
|
||||
elif default_runtime == 'podman':
|
||||
r = runner.PodmanRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd)
|
||||
builder = podman.PodmanBuilder(
|
||||
config_id=config_id,
|
||||
config=config,
|
||||
|
@ -69,7 +69,7 @@ def apply(config_id, config, managed_by, labels=None, docker_cmd=None,
|
|||
return builder.apply()
|
||||
|
||||
|
||||
def cleanup(config_ids, managed_by, docker_cmd=None, default_runtime='docker'):
|
||||
def cleanup(config_ids, managed_by, cont_cmd=None, default_runtime='docker'):
|
||||
"""Delete containers no longer applied, rename others to preferred name.
|
||||
|
||||
:param list config_ids: List of config IDs still applied. All containers
|
||||
|
@ -77,14 +77,14 @@ def cleanup(config_ids, managed_by, docker_cmd=None, default_runtime='docker'):
|
|||
config ID is not specified in this list.
|
||||
:param str managed_by: Name of the tool managing the containers. Only
|
||||
containers labelled with this will be modified.
|
||||
:param str docker_cmd: Optional override to the docker command to run.
|
||||
: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.
|
||||
"""
|
||||
if default_runtime == 'docker':
|
||||
r = runner.DockerRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd)
|
||||
elif default_runtime == 'podman':
|
||||
r = runner.PodmanRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd)
|
||||
LOG.warning("paunch cleanup is partially supported with podman")
|
||||
else:
|
||||
LOG.error("container runtime not supported: %s" % default_runtime)
|
||||
|
@ -92,12 +92,12 @@ def cleanup(config_ids, managed_by, docker_cmd=None, default_runtime='docker'):
|
|||
r.rename_containers()
|
||||
|
||||
|
||||
def list(managed_by, docker_cmd=None, default_runtime='docker'):
|
||||
def list(managed_by, cont_cmd=None, default_runtime='docker'):
|
||||
"""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 docker_cmd: Optional override to the docker command to run.
|
||||
: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.
|
||||
|
||||
|
@ -106,16 +106,16 @@ def list(managed_by, docker_cmd=None, default_runtime='docker'):
|
|||
:rtype: defaultdict(list)
|
||||
"""
|
||||
if default_runtime == 'docker':
|
||||
r = runner.DockerRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd)
|
||||
elif default_runtime == 'podman':
|
||||
r = runner.PodmanRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd)
|
||||
else:
|
||||
LOG.error("container runtime not supported: %s" % default_runtime)
|
||||
return r.list_configs()
|
||||
|
||||
|
||||
def debug(config_id, container_name, action, config, managed_by, labels=None,
|
||||
docker_cmd=None, default_runtime='docker'):
|
||||
cont_cmd=None, default_runtime='docker'):
|
||||
"""Execute supplied container configuration.
|
||||
|
||||
:param str config_id: Unique config ID, should not be re-used until any
|
||||
|
@ -130,7 +130,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
|
|||
containers labeled with this will be modified.
|
||||
:param dict labels: Optional keys/values of labels to apply to containers
|
||||
created with this invocation.
|
||||
:param str docker_cmd: Optional override to the docker command to run.
|
||||
: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.
|
||||
|
||||
|
@ -140,7 +140,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
|
|||
"""
|
||||
|
||||
if default_runtime == 'docker':
|
||||
r = runner.DockerRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd)
|
||||
builder = compose1.ComposeV1Builder(
|
||||
config_id=config_id,
|
||||
config=config,
|
||||
|
@ -148,7 +148,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
|
|||
labels=labels
|
||||
)
|
||||
elif default_runtime == 'podman':
|
||||
r = runner.PodmanRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd)
|
||||
builder = podman.PodmanBuilder(
|
||||
config_id=config_id,
|
||||
config=config,
|
||||
|
@ -159,7 +159,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
|
|||
LOG.error("container runtime not supported: %s" % default_runtime)
|
||||
if action == 'print-cmd':
|
||||
cmd = [
|
||||
r.docker_cmd,
|
||||
r.cont_cmd,
|
||||
'run',
|
||||
'--name',
|
||||
r.unique_container_name(container_name)
|
||||
|
@ -168,7 +168,7 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
|
|||
print(' '.join(cmd))
|
||||
elif action == 'run':
|
||||
cmd = [
|
||||
r.docker_cmd,
|
||||
r.cont_cmd,
|
||||
'run',
|
||||
'--name',
|
||||
r.unique_container_name(container_name)
|
||||
|
@ -184,13 +184,13 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
|
|||
'"print-cmd", or "run"')
|
||||
|
||||
|
||||
def delete(config_ids, managed_by, docker_cmd=None, default_runtime='docker'):
|
||||
def delete(config_ids, managed_by, cont_cmd=None, default_runtime='docker'):
|
||||
"""Delete containers with the specified config IDs.
|
||||
|
||||
:param list config_ids: List of config IDs to delete the containers for.
|
||||
:param str managed_by: Name of the tool managing the containers. Only
|
||||
containers labelled with this will be modified.
|
||||
:param str docker_cmd: Optional override to the docker command to run.
|
||||
: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.
|
||||
"""
|
||||
|
@ -198,9 +198,9 @@ def delete(config_ids, managed_by, docker_cmd=None, default_runtime='docker'):
|
|||
LOG.warn('No config IDs specified')
|
||||
|
||||
if default_runtime == 'docker':
|
||||
r = runner.DockerRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.DockerRunner(managed_by, cont_cmd=cont_cmd)
|
||||
elif default_runtime == 'podman':
|
||||
r = runner.PodmanRunner(managed_by, docker_cmd=docker_cmd)
|
||||
r = runner.PodmanRunner(managed_by, cont_cmd=cont_cmd)
|
||||
LOG.warning("paunch cleanup is partially supported with podman")
|
||||
else:
|
||||
LOG.error("container runtime not supported: %s" % default_runtime)
|
||||
|
|
|
@ -53,7 +53,7 @@ class BaseBuilder(object):
|
|||
exit_codes = cconfig.get('exit_codes', [0])
|
||||
container_name = self.runner.unique_container_name(container)
|
||||
systemd_managed = (restart != 'none'
|
||||
and self.runner.docker_cmd == 'podman'
|
||||
and self.runner.cont_cmd == 'podman'
|
||||
and action == 'run')
|
||||
start_cmd = 'create' if systemd_managed else 'run'
|
||||
|
||||
|
@ -63,7 +63,7 @@ class BaseBuilder(object):
|
|||
continue
|
||||
|
||||
cmd = [
|
||||
self.runner.docker_cmd,
|
||||
self.runner.cont_cmd,
|
||||
start_cmd,
|
||||
'--name',
|
||||
container_name
|
||||
|
@ -71,8 +71,8 @@ class BaseBuilder(object):
|
|||
self.label_arguments(cmd, container)
|
||||
self.container_run_args(cmd, container)
|
||||
elif action == 'exec':
|
||||
cmd = [self.runner.docker_cmd, 'exec']
|
||||
self.docker_exec_args(cmd, container)
|
||||
cmd = [self.runner.cont_cmd, 'exec']
|
||||
self.cont_exec_args(cmd, container)
|
||||
|
||||
(cmd_stdout, cmd_stderr, returncode) = self.runner.execute(cmd)
|
||||
if cmd_stdout:
|
||||
|
@ -172,7 +172,7 @@ class BaseBuilder(object):
|
|||
if v:
|
||||
cmd.append('%s=%s' % (arg, v))
|
||||
|
||||
def docker_exec_args(self, cmd, container):
|
||||
def cont_exec_args(self, cmd, container):
|
||||
cconfig = self.config[container]
|
||||
if 'privileged' in cconfig:
|
||||
cmd.append('--privileged=%s' % str(cconfig['privileged']).lower())
|
||||
|
@ -229,7 +229,7 @@ class BaseBuilder(object):
|
|||
stop=tenacity.stop_after_attempt(4)
|
||||
)
|
||||
def _pull(self, image):
|
||||
cmd = [self.runner.docker_cmd, 'pull', image]
|
||||
cmd = [self.runner.cont_cmd, 'pull', image]
|
||||
(stdout, stderr, rc) = self.runner.execute(cmd)
|
||||
if rc != 0:
|
||||
raise PullException(stdout, stderr, rc)
|
||||
|
|
|
@ -24,9 +24,9 @@ LOG = logging.getLogger(__name__)
|
|||
|
||||
|
||||
class BaseRunner(object):
|
||||
def __init__(self, managed_by, docker_cmd):
|
||||
def __init__(self, managed_by, cont_cmd):
|
||||
self.managed_by = managed_by
|
||||
self.docker_cmd = docker_cmd
|
||||
self.cont_cmd = cont_cmd
|
||||
|
||||
@staticmethod
|
||||
def execute(cmd):
|
||||
|
@ -48,7 +48,7 @@ class BaseRunner(object):
|
|||
def current_config_ids(self):
|
||||
# List all config_id labels for managed containers
|
||||
cmd = [
|
||||
self.docker_cmd, 'ps', '-a',
|
||||
self.cont_cmd, 'ps', '-a',
|
||||
'--filter', 'label=managed_by=%s' % self.managed_by,
|
||||
'--format', '{{.Label "config_id"}}'
|
||||
]
|
||||
|
@ -59,7 +59,7 @@ class BaseRunner(object):
|
|||
|
||||
def containers_in_config(self, conf_id):
|
||||
cmd = [
|
||||
self.docker_cmd, 'ps', '-q', '-a',
|
||||
self.cont_cmd, 'ps', '-q', '-a',
|
||||
'--filter', 'label=managed_by=%s' % self.managed_by,
|
||||
'--filter', 'label=config_id=%s' % conf_id
|
||||
]
|
||||
|
@ -70,7 +70,7 @@ class BaseRunner(object):
|
|||
return [c for c in cmd_stdout.split()]
|
||||
|
||||
def inspect(self, name, format=None, type='container'):
|
||||
cmd = [self.docker_cmd, 'inspect', '--type', type]
|
||||
cmd = [self.cont_cmd, 'inspect', '--type', type]
|
||||
if format:
|
||||
cmd.append('--format')
|
||||
cmd.append(format)
|
||||
|
@ -84,7 +84,7 @@ class BaseRunner(object):
|
|||
else:
|
||||
return json.loads(cmd_stdout)[0]
|
||||
except Exception as e:
|
||||
LOG.error('Problem parsing docker inspect: %s' % e)
|
||||
LOG.error('Problem parsing %s inspect: %s' % (e, self.cont_cmd))
|
||||
|
||||
def unique_container_name(self, container):
|
||||
container_name = container
|
||||
|
@ -96,7 +96,7 @@ class BaseRunner(object):
|
|||
|
||||
def discover_container_name(self, container, cid):
|
||||
cmd = [
|
||||
self.docker_cmd,
|
||||
self.cont_cmd,
|
||||
'ps',
|
||||
'-a',
|
||||
'--filter',
|
||||
|
@ -133,7 +133,7 @@ class BaseRunner(object):
|
|||
def container_names(self, conf_id=None):
|
||||
# list every container name, and its container_name label
|
||||
cmd = [
|
||||
self.docker_cmd, 'ps', '-a',
|
||||
self.cont_cmd, 'ps', '-a',
|
||||
'--filter', 'label=managed_by=%s' % self.managed_by
|
||||
]
|
||||
if conf_id:
|
||||
|
@ -155,9 +155,9 @@ class BaseRunner(object):
|
|||
self.remove_container(container)
|
||||
|
||||
def remove_container(self, container):
|
||||
if self.docker_cmd == 'podman':
|
||||
if self.cont_cmd == 'podman':
|
||||
systemd.service_delete(container)
|
||||
cmd = [self.docker_cmd, 'rm', '-f', container]
|
||||
cmd = [self.cont_cmd, 'rm', '-f', container]
|
||||
cmd_stdout, cmd_stderr, returncode = self.execute(cmd)
|
||||
if returncode != 0:
|
||||
LOG.error('Error removing container: %s' % container)
|
||||
|
@ -191,12 +191,12 @@ class BaseRunner(object):
|
|||
|
||||
class DockerRunner(BaseRunner):
|
||||
|
||||
def __init__(self, managed_by, docker_cmd=None):
|
||||
docker_cmd = docker_cmd or 'docker'
|
||||
super(DockerRunner, self).__init__(managed_by, docker_cmd)
|
||||
def __init__(self, managed_by, cont_cmd=None):
|
||||
cont_cmd = cont_cmd or 'docker'
|
||||
super(DockerRunner, self).__init__(managed_by, cont_cmd)
|
||||
|
||||
def rename_container(self, container, name):
|
||||
cmd = [self.docker_cmd, 'rename', container, name]
|
||||
cmd = [self.cont_cmd, 'rename', container, name]
|
||||
cmd_stdout, cmd_stderr, returncode = self.execute(cmd)
|
||||
if returncode != 0:
|
||||
LOG.error('Error renaming container: %s' % container)
|
||||
|
@ -205,9 +205,9 @@ class DockerRunner(BaseRunner):
|
|||
|
||||
class PodmanRunner(BaseRunner):
|
||||
|
||||
def __init__(self, managed_by, docker_cmd=None):
|
||||
docker_cmd = docker_cmd or 'podman'
|
||||
super(PodmanRunner, self).__init__(managed_by, docker_cmd)
|
||||
def __init__(self, managed_by, cont_cmd=None):
|
||||
cont_cmd = cont_cmd or 'podman'
|
||||
super(PodmanRunner, self).__init__(managed_by, cont_cmd)
|
||||
|
||||
def rename_container(self, container, name):
|
||||
# TODO(emilien) podman doesn't support rename, we'll handle it
|
||||
|
|
|
@ -52,7 +52,7 @@ class TestBaseBuilder(base.TestCase):
|
|||
}
|
||||
}
|
||||
|
||||
r = runner.DockerRunner(managed_by='tester', docker_cmd='docker')
|
||||
r = runner.DockerRunner(managed_by='tester', cont_cmd='docker')
|
||||
exe = mock.Mock()
|
||||
exe.side_effect = [
|
||||
('exists', '', 0), # inspect for image centos:6
|
||||
|
@ -200,7 +200,7 @@ class TestBaseBuilder(base.TestCase):
|
|||
}
|
||||
}
|
||||
|
||||
r = runner.DockerRunner(managed_by='tester', docker_cmd='docker')
|
||||
r = runner.DockerRunner(managed_by='tester', cont_cmd='docker')
|
||||
exe = mock.Mock()
|
||||
exe.side_effect = [
|
||||
# inspect for image centos:7
|
||||
|
@ -343,7 +343,7 @@ three-12345678 three''', '', 0),
|
|||
}
|
||||
}
|
||||
|
||||
r = runner.DockerRunner(managed_by='tester', docker_cmd='docker')
|
||||
r = runner.DockerRunner(managed_by='tester', cont_cmd='docker')
|
||||
exe = mock.Mock()
|
||||
exe.side_effect = [
|
||||
('exists', '', 0), # inspect for image centos:6
|
||||
|
@ -481,7 +481,7 @@ three-12345678 three''', '', 0),
|
|||
)
|
||||
|
||||
@mock.patch('paunch.runner.DockerRunner', autospec=True)
|
||||
def test_docker_exec_args(self, runner):
|
||||
def test_cont_exec_args(self, runner):
|
||||
r = runner.return_value
|
||||
r.discover_container_name.return_value = 'one-12345678'
|
||||
config = {
|
||||
|
@ -495,7 +495,7 @@ three-12345678 three''', '', 0),
|
|||
'foo', config, runner.return_value)
|
||||
|
||||
cmd = ['docker', 'exec']
|
||||
self.builder.docker_exec_args(cmd, 'one')
|
||||
self.builder.cont_exec_args(cmd, 'one')
|
||||
self.assertEqual(
|
||||
['docker', 'exec',
|
||||
'--privileged=true', '--user=bar',
|
||||
|
|
|
@ -17,7 +17,7 @@ from paunch.tests import test_builder_base as tbb
|
|||
|
||||
|
||||
class TestComposeV1Builder(tbb.TestBaseBuilder):
|
||||
def test_docker_run_args(self):
|
||||
def test_cont_run_args(self):
|
||||
config = {
|
||||
'one': {
|
||||
'image': 'centos:7',
|
||||
|
|
|
@ -17,7 +17,7 @@ from paunch.tests import test_builder_base as base
|
|||
|
||||
|
||||
class TestPodmanBuilder(base.TestBaseBuilder):
|
||||
def test_docker_run_args(self):
|
||||
def test_cont_run_args(self):
|
||||
config = {
|
||||
'one': {
|
||||
'image': 'centos:7',
|
||||
|
|
|
@ -24,7 +24,7 @@ class TestPaunch(base.TestCase):
|
|||
@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', docker_cmd=None)
|
||||
runner.assert_called_once_with('tester', cont_cmd=None)
|
||||
builder.assert_called_once_with(
|
||||
config_id='foo',
|
||||
config={'bar': 'baz'},
|
||||
|
@ -42,7 +42,7 @@ class TestPaunch(base.TestCase):
|
|||
managed_by='tester',
|
||||
labels={'bink': 'boop'})
|
||||
|
||||
runner.assert_called_once_with('tester', docker_cmd=None)
|
||||
runner.assert_called_once_with('tester', cont_cmd=None)
|
||||
builder.assert_called_once_with(
|
||||
config_id='foo',
|
||||
config={'bar': 'baz'},
|
||||
|
@ -54,7 +54,7 @@ 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', docker_cmd=None)
|
||||
runner.assert_called_once_with('tester', cont_cmd=None)
|
||||
runner.return_value.delete_missing_configs.assert_called_once_with(
|
||||
['foo', 'bar'])
|
||||
runner.return_value.rename_containers.assert_called_once_with()
|
||||
|
@ -62,13 +62,13 @@ 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', docker_cmd=None)
|
||||
runner.assert_called_once_with('tester', cont_cmd=None)
|
||||
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', docker_cmd=None)
|
||||
runner.assert_called_once_with('tester', cont_cmd=None)
|
||||
runner.return_value.remove_containers.assert_has_calls([
|
||||
mock.call('foo'), mock.call('bar')
|
||||
])
|
||||
|
@ -77,11 +77,11 @@ class TestPaunch(base.TestCase):
|
|||
@mock.patch('paunch.runner.DockerRunner')
|
||||
def test_debug(self, runner, builder):
|
||||
paunch.debug('foo', 'testcont', 'run', {'bar': 'baz'}, 'tester',
|
||||
docker_cmd='docker')
|
||||
cont_cmd='docker')
|
||||
builder.assert_called_once_with(
|
||||
config_id='foo',
|
||||
config={'bar': 'baz'},
|
||||
runner=runner.return_value,
|
||||
labels=None
|
||||
)
|
||||
runner.assert_called_once_with('tester', docker_cmd='docker')
|
||||
runner.assert_called_once_with('tester', cont_cmd='docker')
|
||||
|
|
Loading…
Reference in New Issue