diff --git a/src/node/docker_mananger.py b/src/node/docker_mananger.py index d638a189..7085bac4 100644 --- a/src/node/docker_mananger.py +++ b/src/node/docker_mananger.py @@ -31,7 +31,7 @@ class DockerManager: logger.debug(f"Network {network_name} created") return network - def start_container(self, image_name, ports, args, log_path, container_ip, volumes): + def start_container(self, image_name, ports, args, log_path, container_ip, volumes, remove_container=True): cli_args = [] for key, value in args.items(): if isinstance(value, list): # Check if value is a list @@ -46,7 +46,7 @@ class DockerManager: cli_args_str_for_log = " ".join(cli_args) logger.debug(f"docker run -i -t {port_bindings_for_log} {image_name} {cli_args_str_for_log}") container = self._client.containers.run( - image_name, command=cli_args, ports=port_bindings, detach=True, remove=True, auto_remove=True, volumes=volumes + image_name, command=cli_args, ports=port_bindings, detach=True, remove=remove_container, auto_remove=remove_container, volumes=volumes ) network = self._client.networks.get(NETWORK_NAME) diff --git a/src/node/waku_node.py b/src/node/waku_node.py index f925cd6c..3402a7e8 100644 --- a/src/node/waku_node.py +++ b/src/node/waku_node.py @@ -100,6 +100,12 @@ class WakuNode: else: raise NotImplementedError("Not implemented for this node type") + if "remove_container" in kwargs: + remove_container = kwargs["remove_container"] + del kwargs["remove_container"] + else: + remove_container = True + default_args.update(sanitize_docker_flags(kwargs)) rln_args, rln_creds_set, keystore_path = self.parse_rln_credentials(default_args, False) @@ -116,7 +122,13 @@ class WakuNode: logger.debug(f"Using volumes {self._volumes}") self._container = self._docker_manager.start_container( - self._docker_manager.image, self._ports, default_args, self._log_path, self._ext_ip, self._volumes + self._docker_manager.image, + ports=self._ports, + args=default_args, + log_path=self._log_path, + container_ip=self._ext_ip, + volumes=self._volumes, + remove_container=remove_container, ) logger.debug(f"Started container from image {self._image_name}. REST: {self._rest_port}") @@ -168,6 +180,10 @@ class WakuNode: if self._container: logger.debug(f"Stopping container with id {self._container.short_id}") self._container.stop() + try: + self._container.remove() + except: + pass self._container = None logger.debug("Container stopped.") @@ -405,3 +421,7 @@ class WakuNode: raise NotImplementedError("Not implemented for type other than Nim Waku ") return rln_args, True, keystore_path + + @property + def container(self): + return self._container diff --git a/tests/store/test_reliability.py b/tests/store/test_reliability.py index 09e63a85..6e5fc712 100644 --- a/tests/store/test_reliability.py +++ b/tests/store/test_reliability.py @@ -6,9 +6,8 @@ from src.steps.store import StepsStore logger = get_custom_logger(__name__) -@pytest.mark.usefixtures("node_setup") class TestReliability(StepsStore): - def test_publishing_node_is_stopped(self): + def test_publishing_node_is_stopped(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) self.publishing_node1.stop() @@ -21,7 +20,7 @@ class TestReliability(StepsStore): else: raise AssertionError(f"Nwaku failed with {ex}") - def test_publishing_node_restarts(self): + def test_publishing_node_restarts(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) self.publishing_node1.restart() @@ -34,7 +33,7 @@ class TestReliability(StepsStore): store_response = self.get_messages_from_store(node, page_size=5) assert len(store_response.messages) == 2 - def test_store_node_restarts(self): + def test_store_node_restarts(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) self.store_node1.restart() @@ -46,7 +45,7 @@ class TestReliability(StepsStore): store_response = self.get_messages_from_store(node, page_size=5) assert len(store_response.messages) == 2 - def test_publishing_node_paused_and_unpaused(self): + def test_publishing_node_paused_and_unpaused(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) self.publishing_node1.pause() @@ -59,7 +58,7 @@ class TestReliability(StepsStore): store_response = self.get_messages_from_store(node, page_size=5) assert len(store_response.messages) == 2 - def test_store_node_paused_and_unpaused(self): + def test_store_node_paused_and_unpaused(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) self.store_node1.pause() @@ -72,7 +71,7 @@ class TestReliability(StepsStore): store_response = self.get_messages_from_store(node, page_size=5) assert len(store_response.messages) == 2 - def test_message_relayed_while_store_node_is_paused(self): + def test_message_relayed_while_store_node_is_paused(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) self.store_node1.pause() @@ -84,13 +83,27 @@ class TestReliability(StepsStore): store_response = self.get_messages_from_store(node, page_size=5) assert len(store_response.messages) == 2 - ## I THINK WE HAVE A BUG FOR GOWAKU - NEEDS REPORTING!!!! - def test_message_relayed_while_store_node_is_stopped(self): + def test_message_relayed_while_store_node_is_stopped_without_removing(self): + self.setup_first_publishing_node(store="true", relay="true") + self.setup_first_store_node(store="false", relay="true", remove_container=False) + self.subscribe_to_pubsub_topics_via_relay() + self.publish_message() + self.check_published_message_is_stored(page_size=5) + self.store_node1.container.stop() + self.publish_message() + self.store_node1.container.start() + self.store_node1.ensure_ready() + for node in self.store_nodes: + store_response = self.get_messages_from_store(node, page_size=5) + assert len(store_response.messages) == 2 + + def test_message_relayed_while_store_node_is_stopped_and_removed(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) self.store_node1.stop() + self.store_nodes.remove(self.store_node1) self.publish_message() - self.store_node1.start() + self.setup_first_store_node(store="false", relay="true") self.store_node1.ensure_ready() self.add_node_peer(self.store_node1, self.multiaddr_list) self.subscribe_to_pubsub_topics_via_relay(node=self.store_node1) @@ -99,11 +112,10 @@ class TestReliability(StepsStore): store_response = self.get_messages_from_store(node, page_size=5) assert len(store_response.messages) == 2 - ## I THINK WE HAVE A BUG FOR NWAKU - NEEDS REPORTING!!!! - def test_message_relayed_before_store_node_is_started(self): + def test_message_relayed_before_store_node_is_started(self, node_setup): self.publish_message() self.check_published_message_is_stored(page_size=5) - self.setup_second_store_node(store="true", relay="true") + self.setup_second_store_node(store="false", relay="true") self.subscribe_to_pubsub_topics_via_relay() store_response = self.get_messages_from_store(self.store_node2, page_size=5) assert len(store_response.messages) == 1