From e3471441955fbc9c006d747ca2ad504c85d4a0d7 Mon Sep 17 00:00:00 2001 From: Kevin Zhao Date: Thu, 1 Feb 2018 16:13:52 +0800 Subject: [PATCH] Delete the capsule and container when request volume build failed If the request volume build failed, we need to delete the capsule and containers inside capsule from the database. Or it will remain a capsule without any realization. Closes-Bug: #1746427 Change-Id: I778c457755f72804b852de77fb151e8e0fdead6a Signed-off-by: Kevin Zhao --- zun/api/controllers/experimental/capsules.py | 21 +++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/zun/api/controllers/experimental/capsules.py b/zun/api/controllers/experimental/capsules.py index c171985e6..4a75499b5 100644 --- a/zun/api/controllers/experimental/capsules.py +++ b/zun/api/controllers/experimental/capsules.py @@ -233,8 +233,10 @@ class CapsuleController(base.Controller): # Deal with the volume support requested_volumes = \ - self._build_requested_volumes(context, volumes_spec, - container_volume_requests) + self._build_requested_volumes(context, + volumes_spec, + container_volume_requests, + new_capsule) new_capsule.cpu = capsule_need_cpu new_capsule.memory = str(capsule_need_memory) + 'M' new_capsule.save(context) @@ -327,7 +329,8 @@ class CapsuleController(base.Controller): container_dict[field] = dict return container_dict - def _build_requested_volumes(self, context, volume_spec, volume_mounts): + def _build_requested_volumes(self, context, volume_spec, + volume_mounts, capsule): # NOTE(hongbin): We assume cinder is the only volume provider here. # The logic needs to be re-visited if a second volume provider # (i.e. Manila) is introduced. @@ -384,6 +387,18 @@ class CapsuleController(base.Controller): except Exception as exc: LOG.error('Error on deleting volume "%s": %s.', volume.id, six.text_type(exc)) + + # Since the container and capsule database model has been created, + # we need to delete them here due to the volume create failed. + for container in capsule.containers: + try: + container.destroy(context) + except Exception as exc: + LOG.warning('fail to delete the container %s: %s', + container.uuid, exc) + + capsule.destroy(context) + raise e return requested_volumes