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
This commit is contained in:
Hongbin Lu 2019-03-03 20:06:51 +00:00
parent 1f868534eb
commit 24bc74f8eb
2 changed files with 27 additions and 0 deletions

View File

@ -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+

View File

@ -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,