From 7080e9b997fa5b9f32b9765d227a376f16ae4c05 Mon Sep 17 00:00:00 2001 From: Dramelac Date: Sun, 3 Mar 2024 23:22:57 +0100 Subject: [PATCH] Add dynamic network options --- exegol/config/UserConfig.py | 2 +- .../console/cli/actions/GenericParameters.py | 3 ++- exegol/model/ExegolNetwork.py | 18 ++++++++++-------- exegol/utils/NetworkUtils.py | 9 ++++++++- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/exegol/config/UserConfig.py b/exegol/config/UserConfig.py index 399377b1..2a0949b7 100644 --- a/exegol/config/UserConfig.py +++ b/exegol/config/UserConfig.py @@ -164,7 +164,7 @@ def _process_data(self): # Network section network_data = config_data.get("network", {}) - self.network_default_mode = self._load_config_str(network_data, 'default_network', self.network_default_mode) # TODO add choices depending on dynamic network list + self.network_default_mode = self._load_config_str(network_data, 'default_network', self.network_default_mode, choices=NetworkUtils.get_options()) self.network_fallback_mode = self._load_config_str(network_data, 'fallback_network', self.network_fallback_mode, choices={'nat', 'docker'}) self.network_dedicated_range = self._load_config_str(network_data, 'exegol_dedicated_range') # Dynamic default self.network_default_netmask = NetworkUtils.parse_netmask(self._load_config_str(network_data, 'exegol_default_netmask', str(self.network_default_netmask)), default=self.network_default_netmask) diff --git a/exegol/console/cli/actions/GenericParameters.py b/exegol/console/cli/actions/GenericParameters.py index 5ed81cf1..22fc1b5b 100644 --- a/exegol/console/cli/actions/GenericParameters.py +++ b/exegol/console/cli/actions/GenericParameters.py @@ -5,6 +5,7 @@ from exegol.config.UserConfig import UserConfig from exegol.console.cli.ExegolCompleter import ContainerCompleter, ImageCompleter, VoidCompleter, DesktopConfigCompleter from exegol.console.cli.actions.Command import Option, GroupArg +from exegol.utils.NetworkUtils import NetworkUtils class ContainerSelector: @@ -165,7 +166,7 @@ def __init__(self, groupArgs: List[GroupArg]): dest="network", action="store", default="host", - choices={"host", "nat", "disable", "docker"}, # TODO add dedicated network option + choices=NetworkUtils.get_options(), help="Select the type of network to which the container will be attached (default: [blue]host[/blue])") self.share_timezone = Option("--disable-shared-timezones", action="store_false", diff --git a/exegol/model/ExegolNetwork.py b/exegol/model/ExegolNetwork.py index b652b302..9a1a7286 100644 --- a/exegol/model/ExegolNetwork.py +++ b/exegol/model/ExegolNetwork.py @@ -11,11 +11,11 @@ class DockerDrivers(Enum): class ExegolNetworkMode(Enum): """Enum for user display""" - disable = 'none' - host = 'host' - docker = 'bridge' + disable = 'Disable' + host = 'Host' + docker = 'Docker' nat = 'NAT' # need pre-process - attached = 'external' # need pre-process + attached = 'External' # need pre-process class ExegolNetwork: @@ -26,9 +26,11 @@ class ExegolNetwork: def __init__(self, net_mode: ExegolNetworkMode = ExegolNetworkMode.host, net_name: Optional[str] = None): self.__net_mode: ExegolNetworkMode = net_mode self.__net_name: str = net_name if net_name is not None else net_mode.value - try: - self.__docker_net_mode: DockerDrivers = DockerDrivers(self.__net_name) - except ValueError: + if self.__net_mode == ExegolNetworkMode.disable: + self.__docker_net_mode: DockerDrivers = DockerDrivers.Disable + elif self.__net_mode == ExegolNetworkMode.host: + self.__docker_net_mode = DockerDrivers.Host + else: self.__docker_net_mode = self.__DEFAULT_NETWORK_DRIVER @classmethod @@ -69,7 +71,7 @@ def getNetworkName(self): def getTextNetworkMode(self) -> str: if self.__net_mode is ExegolNetworkMode.attached: return self.__net_name - return self.__net_mode.name + return self.__net_mode.value def shouldBeRemoved(self): return self.__net_mode == ExegolNetworkMode.nat diff --git a/exegol/utils/NetworkUtils.py b/exegol/utils/NetworkUtils.py index 6d9048e8..b4675464 100644 --- a/exegol/utils/NetworkUtils.py +++ b/exegol/utils/NetworkUtils.py @@ -1,9 +1,10 @@ import ipaddress -from typing import Union +from typing import Union, Set import ifaddr from rich.prompt import Prompt +from exegol.model.ExegolNetwork import ExegolNetworkMode from exegol.utils.ExeLog import logger, console @@ -93,3 +94,9 @@ def parse_netmask(cls, netmask: Union[int, str], default: int) -> int: pass logger.error(f"The supplied netmask is invalid (must be IPv4): {netmask}") return default + + @classmethod + def get_options(cls) -> Set[str]: + options = [x.name for x in ExegolNetworkMode if x != ExegolNetworkMode.attached] + + return set(options)