From 41ae620b6b5e43f08c707ce0fef9c1af90518762 Mon Sep 17 00:00:00 2001 From: Willian Galvani Date: Fri, 21 Oct 2022 11:16:19 -0300 Subject: [PATCH] core: services: kraken: properly cleanup when uninstalling an extension --- core/services/kraken/exceptions.py | 2 ++ core/services/kraken/kraken.py | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100755 core/services/kraken/exceptions.py diff --git a/core/services/kraken/exceptions.py b/core/services/kraken/exceptions.py new file mode 100755 index 0000000000..68881d1b75 --- /dev/null +++ b/core/services/kraken/exceptions.py @@ -0,0 +1,2 @@ +class ContainerDoesNotExist(RuntimeError): + """Attempted to use a non-existing container""" diff --git a/core/services/kraken/kraken.py b/core/services/kraken/kraken.py index e84ae12232..e72dd5e75e 100644 --- a/core/services/kraken/kraken.py +++ b/core/services/kraken/kraken.py @@ -9,6 +9,7 @@ from commonwealth.settings.manager import Manager from loguru import logger +from exceptions import ContainerDoesNotExist from settings import Extension, SettingsV1 REPO_URL = "https://bluerobotics.github.io/BlueOS-Extensions-Repository/manifest.json" @@ -93,6 +94,17 @@ async def kill(self, container_name: str) -> None: if container: await container[0].kill() + async def remove(self, container_name: str) -> None: + logger.info(f"Removing container {container_name}") + container = await self.client.containers.list(filters={"name": {container_name: True}}) # type: ignore + if not container: + raise ContainerDoesNotExist(f"Unable remove {container_name}. container not found") + image = container[0]["Image"] + await self.kill(container_name) + await container[0].delete() + logger.info(f"Removing {container_name}") + await self.client.images.delete(image, force=False, noprune=False) + async def uninstall_extension(self, extension_name: str) -> None: regex = re.compile("[^a-zA-Z0-9]") expected_container_name = "extension-" + regex.sub("", f"{extension_name}") @@ -102,8 +114,8 @@ async def uninstall_extension(self, extension_name: str) -> None: if extension.container_name().startswith(expected_container_name) ] logger.info(f"uninstalling: {extension}") - if extension: - await self.kill(extension[0].container_name()) + container_name = extension[0].container_name() + await self.remove(container_name) self.settings.extensions = [ extension for extension in self.settings.extensions if extension.name != extension_name ]