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:
parent
aa0e32b004
commit
5d174c1bea
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue