78 lines
2.7 KiB
Python
Raw Normal View History

2024-12-13 15:58:25 +08:00
import os
from src.libs.custom_logger import get_custom_logger
from tenacity import retry, stop_after_delay, wait_fixed
2024-12-19 16:02:57 +08:00
2024-12-13 15:58:25 +08:00
from src.node.api_clients.rest import REST
from src.node.docker_mananger import DockerManager
from src.env_vars import DOCKER_LOG_DIR
2024-12-19 16:02:57 +08:00
from src.node.node_vars import nomos_nodes
2024-12-13 15:58:25 +08:00
logger = get_custom_logger(__name__)
def sanitize_docker_flags(input_flags):
output_flags = {}
for key, value in input_flags.items():
key = key.replace("_", "-")
output_flags[key] = value
return output_flags
class NomosNode:
2024-12-19 16:02:57 +08:00
def __init__(self, node_type, docker_log_prefix=""):
2024-12-20 16:14:47 +08:00
logger.debug(f"Node is going to be initialized with this config {nomos_nodes[node_type]}")
2024-12-19 16:02:57 +08:00
self._image_name = nomos_nodes[node_type]["image"]
self._internal_ports = nomos_nodes[node_type]["ports"]
self._volumes = nomos_nodes[node_type]["volumes"]
self._entrypoint = nomos_nodes[node_type]["entrypoint"]
2024-12-13 15:58:25 +08:00
self._log_path = os.path.join(DOCKER_LOG_DIR, f"{docker_log_prefix}__{self._image_name.replace('/', '_')}.log")
self._docker_manager = DockerManager(self._image_name)
self._container = None
2024-12-20 16:14:47 +08:00
2024-12-13 15:58:25 +08:00
logger.debug(f"NomosNode instance initialized with log path {self._log_path}")
@retry(stop=stop_after_delay(60), wait=wait_fixed(0.1), reraise=True)
def start(self, wait_for_node_sec=20, **kwargs):
logger.debug("Starting Node...")
2024-12-19 16:02:57 +08:00
self._docker_manager.create_network()
self._ext_ip = self._docker_manager.generate_random_ext_ip()
2024-12-20 16:14:47 +08:00
number_of_ports = len(self._internal_ports)
self._port_map = {}
if number_of_ports > 0:
self._external_ports = self._docker_manager.generate_ports(count=number_of_ports)
self._udp_port = self._external_ports[0]
self._tcp_port = self._external_ports[1]
self._api = REST(self._tcp_port)
logger.debug(f"Internal ports {self._internal_ports}")
for i, port in enumerate(self._internal_ports):
self._port_map[port] = int(self._external_ports[i])
2024-12-19 16:02:57 +08:00
default_args = {
"listen-address": "0.0.0.0",
"log-level": "info",
"nat": f"extip:{self._ext_ip}",
}
logger.debug(f"Using volumes {self._volumes}")
2024-12-20 16:14:47 +08:00
logger.debug(f"Port map {self._port_map}")
2024-12-19 16:02:57 +08:00
self._container = self._docker_manager.start_container(
self._docker_manager.image,
2024-12-20 16:14:47 +08:00
ports=self._port_map,
2024-12-19 16:02:57 +08:00
args=default_args,
log_path=self._log_path,
container_ip=self._ext_ip,
volumes=self._volumes,
remove_container=True,
)
logger.debug(f"Started container from image {self._image_name}")