Fix mismatching fixed vs unique container names

Sometimes, like when redeploying in-place, containers for the "fixed"
service name might already existed, thus get the prefixed names. That
might create mismatches. For example the pidfile names may diverge by
the "fixzed" container service name vs its predictable prefixed unique
name.

Fix that by using the predictable unique names instead of the service
container names for the builder and paunch actions run,
debug/print-cmd that rely on it. This is achieved via a new parameter
for the real container name (a delegate) used for the "fixed" service
container name.

For podman builder, we use that delegate for conmon pidfile and logging
setup. So that now it always matches the PIDFile specified in the
systemd unit generated for that container.

For docker builder, we have no special uses for delegates, but we
support that parameter to simplify the code around (so that there will
be no need to wrap things with 'if cli == podman else...').

Closes-bug: #1839929

Change-Id: I5617e11f5d315f408d818e1ce47aa68f4a0d777a
Signed-off-by: Bogdan Dobrelya <bdobreli@redhat.com>
This commit is contained in:
Bogdan Dobrelya 2019-08-13 11:42:26 +02:00
parent aa0e32b004
commit 5d174c1bea
4 changed files with 26 additions and 10 deletions

View File

@ -187,13 +187,14 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
log=log
)
if action == 'print-cmd':
uname = r.unique_container_name(container_name)
cmd = [
r.cont_cmd,
'run',
'--name',
r.unique_container_name(container_name)
uname
]
builder.container_run_args(cmd, container_name)
builder.container_run_args(cmd, container_name, uname)
if '--health-cmd' in cmd:
health_check_arg_index = cmd.index('--health-cmd') + 1
@ -208,13 +209,14 @@ def debug(config_id, container_name, action, config, managed_by, labels=None,
print(' '.join(cmd))
elif action == 'run':
uname = r.unique_container_name(container_name)
cmd = [
r.cont_cmd,
'run',
'--name',
r.unique_container_name(container_name)
uname
]
if builder.container_run_args(cmd, container_name):
if builder.container_run_args(cmd, container_name, uname):
return r.execute_interactive(cmd, log)
elif action == 'dump-yaml':
print(yaml.safe_dump(config, default_flow_style=False))

View File

@ -105,7 +105,9 @@ class BaseBuilder(object):
]
self.label_arguments(cmd, container)
self.log.debug("Start container {}.".format(container))
validations_passed = self.container_run_args(cmd, container)
validations_passed = self.container_run_args(cmd,
container,
container_name)
elif action == 'exec':
cmd = [self.runner.cont_cmd, 'exec']
validations_passed = self.cont_exec_args(cmd, container)

View File

@ -22,13 +22,18 @@ class ComposeV1Builder(base.BaseBuilder):
super(ComposeV1Builder, self).__init__(config_id, config, runner,
labels, log)
def container_run_args(self, cmd, container):
def container_run_args(self, cmd, container, delegate=None):
"""Prepare the run command args, from the container configuration.
:param cmd: The list of command options to be modified
:param container: A dict with container configurations
:delegate: A compatibility parameter for podman, does nothing here
:returns: True if configuration is valid, otherwise False
"""
if delegate and container != delegate:
self.log.debug("Delegate {} of container {} has no special "
"meanings for this context and will be "
"ignored".format(delegate, container))
cconfig = self.config[container]
if cconfig.get('detach', True):
cmd.append('--detach=true')

View File

@ -23,17 +23,24 @@ class PodmanBuilder(base.BaseBuilder):
labels, log, cont_log_path,
healthcheck_disabled)
def container_run_args(self, cmd, container):
def container_run_args(self, cmd, container, delegate=None):
"""Prepare the run command args, from the container configuration.
:param cmd: The list of command options to be modified
:param container: A dict with container configurations
:param delegate: A predictable/unique name of the actual container
:returns: True if configuration is valid, otherwise False
"""
if delegate and container != delegate:
self.log.debug("Container {} has a delegate "
"{}".format(container, delegate))
if not delegate:
delegate = container
cconfig = self.config[container]
# write out a pid file so we can restart the container via systemd
cmd.append('--conmon-pidfile=/var/run/{}.pid'.format(container))
# write out a pid file so we can restart the container delegate
# via systemd
cmd.append('--conmon-pidfile=/var/run/{}.pid'.format(delegate))
if cconfig.get('detach', True):
cmd.append('--detach=true')
@ -43,7 +50,7 @@ class PodmanBuilder(base.BaseBuilder):
if not os.path.exists(self.cont_log_path):
os.makedirs(self.cont_log_path)
log_path = os.path.join(self.cont_log_path, container)
log_path = os.path.join(self.cont_log_path, delegate)
logging = ['--log-driver', 'k8s-file',
'--log-opt', 'path=%s.log' % log_path]
cmd.extend(logging)