Skip to content

Commit

Permalink
Add dynamic network options
Browse files Browse the repository at this point in the history
  • Loading branch information
Dramelac committed Mar 3, 2024
1 parent c32071c commit 7080e9b
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 11 deletions.
2 changes: 1 addition & 1 deletion exegol/config/UserConfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
3 changes: 2 additions & 1 deletion exegol/console/cli/actions/GenericParameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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",
Expand Down
18 changes: 10 additions & 8 deletions exegol/model/ExegolNetwork.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
9 changes: 8 additions & 1 deletion exegol/utils/NetworkUtils.py
Original file line number Diff line number Diff line change
@@ -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


Expand Down Expand Up @@ -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)

0 comments on commit 7080e9b

Please sign in to comment.