From 24bc74f8eb1890961fa89b75763a11d437a83424 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Sun, 3 Mar 2019 20:06:51 +0000 Subject: [PATCH] Fix init container in capsule There is a regression that the init container logic was removed from compute manager. This commit adds it back. Change-Id: I435a273daab4b60d50ea8c68b6995097d28ff8e5 --- requirements.txt | 1 + zun/container/docker/driver.py | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/requirements.txt b/requirements.txt index 970330de6..5915d12f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -33,5 +33,6 @@ SQLAlchemy!=1.1.5,!=1.1.6,!=1.1.7,!=1.1.8,>=1.0.10 # MIT stevedore>=1.20.0 # Apache-2.0 docker>=2.4.2 # Apache-2.0 neutron-lib>=1.13.0 # Apache-2.0 +tenacity>=4.9.0 # Apache-2.0 websockify>=0.8.0 # LGPLv3 websocket-client>=0.44.0 # LGPLv2+ diff --git a/zun/container/docker/driver.py b/zun/container/docker/driver.py index 8c1fc708c..6b1bef752 100644 --- a/zun/container/docker/driver.py +++ b/zun/container/docker/driver.py @@ -24,6 +24,7 @@ from oslo_utils import timeutils from oslo_utils import uuidutils import psutil import six +import tenacity from zun.common import consts from zun.common import exception @@ -1193,6 +1194,11 @@ class DockerDriver(driver.ContainerDriver): capsule = self.create(context, capsule, image, requested_networks, requested_volumes) self.start(context, capsule) + for container in capsule.init_containers: + self._create_container_in_capsule(context, capsule, container, + requested_networks, + requested_volumes) + self._wait_for_init_container(context, container) for container in capsule.containers: self._create_container_in_capsule(context, capsule, container, requested_networks, @@ -1284,6 +1290,26 @@ class DockerDriver(driver.ContainerDriver): self._populate_container(container, response) container.save(context) + def _wait_for_init_container(self, context, container, timeout=3600): + def retry_if_result_is_false(result): + return result is False + + def check_init_container_stopped(): + status = self.show(context, container).status + if status == consts.STOPPED: + return True + elif status == consts.RUNNING: + return False + else: + raise exception.ZunException( + _("Container has unexpected status: %s") % status) + + r = tenacity.Retrying( + stop=tenacity.stop_after_delay(timeout), + wait=tenacity.wait_exponential(), + retry=tenacity.retry_if_result(retry_if_result_is_false)) + r.call(check_init_container_stopped) + def delete_capsule(self, context, capsule, force): for container in capsule.containers: self._delete_container_in_capsule(context, capsule, container,