From e54c0847f2838dc67e05b9ca372f782e699c1aaf Mon Sep 17 00:00:00 2001 From: sanderegg <35365065+sanderegg@users.noreply.github.com> Date: Wed, 28 Nov 2018 23:05:58 +0100 Subject: [PATCH 1/2] added additional configuration variable for director EXTRA_HOSTS_SUFFIX if there are extra hosts defined for the director it will pass them to the services --- services/director/Dockerfile | 1 + .../src/simcore_service_director/config.py | 1 + .../src/simcore_service_director/producer.py | 10 ++++++++++ .../src/simcore_service_director/system_utils.py | 15 +++++++++++++++ services/director/tests/test_producer.py | 13 +++++++++---- 5 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 services/director/src/simcore_service_director/system_utils.py diff --git a/services/director/Dockerfile b/services/director/Dockerfile index f30b5c72c21..6375014d97c 100644 --- a/services/director/Dockerfile +++ b/services/director/Dockerfile @@ -20,6 +20,7 @@ ENV REGISTRY_USER = '' ENV REGISTRY_PW = '' ENV REGISTRY_URL = '' ENV PUBLISHED_HOST_NAME='' +ENV EXTRA_HOSTS_SUFFIX = 'undefined' WORKDIR /home/scu diff --git a/services/director/src/simcore_service_director/config.py b/services/director/src/simcore_service_director/config.py index c99d5670a6d..492cbe14a6a 100644 --- a/services/director/src/simcore_service_director/config.py +++ b/services/director/src/simcore_service_director/config.py @@ -16,6 +16,7 @@ REGISTRY_PW = os.environ.get("REGISTRY_PW", "") REGISTRY_URL = os.environ.get("REGISTRY_URL", "") REGISTRY_SSL = os.environ.get("REGISTRY_SSL", True) +EXTRA_HOSTS_SUFFIX = os.environ.get("EXTRA_HOSTS_SUFFIX", "undefined") # these are the envs passed to the dynamic services by default SERVICES_DEFAULT_ENVS = { diff --git a/services/director/src/simcore_service_director/producer.py b/services/director/src/simcore_service_director/producer.py index a59d2978f58..2fb87d1842f 100644 --- a/services/director/src/simcore_service_director/producer.py +++ b/services/director/src/simcore_service_director/producer.py @@ -10,6 +10,7 @@ import tenacity from . import config, exceptions, registry_proxy +from .system_utils import get_system_extra_hosts SERVICE_RUNTIME_SETTINGS = 'simcore.service.settings' SERVICE_RUNTIME_BOOTSETTINGS = 'simcore.service.bootsettings' @@ -144,6 +145,14 @@ def __add_env_variables_to_service_runtime_params(docker_service_runtime_paramet docker_service_runtime_parameters["env"] = service_env_variables log.debug("Added env parameter to docker runtime parameters: %s", docker_service_runtime_parameters["env"]) +def _add_extra_hosts_to_service_runtime_params(docker_service_runtime_parameters: Dict): + log.debug("Getting extra hosts with suffix: %s",config.EXTRA_HOSTS_SUFFIX) + extra_hosts = get_system_extra_hosts(config.EXTRA_HOSTS_SUFFIX) + if "hosts" in docker_service_runtime_parameters: + docker_service_runtime_parameters["hosts"].update(extra_hosts) + else: + docker_service_runtime_parameters["hosts"] = extra_hosts + def __set_service_name(docker_service_runtime_parameters: Dict, service_name: str, node_uuid: str): # pylint: disable=C0103 docker_service_runtime_parameters["name"] = service_name + "_" + node_uuid @@ -285,6 +294,7 @@ async def __prepare_runtime_parameters(user_id: str, service_key: str, service_t __add_to_swarm_network_if_ports_published(client, docker_service_runtime_parameters) __add_uuid_label_to_service_runtime_params(docker_service_runtime_parameters, node_uuid) __add_env_variables_to_service_runtime_params(docker_service_runtime_parameters, user_id, node_uuid) + _add_extra_hosts_to_service_runtime_params(docker_service_runtime_parameters) __set_service_name(docker_service_runtime_parameters, registry_proxy.get_service_last_names(service_key), node_uuid) diff --git a/services/director/src/simcore_service_director/system_utils.py b/services/director/src/simcore_service_director/system_utils.py new file mode 100644 index 00000000000..294d8d71ae9 --- /dev/null +++ b/services/director/src/simcore_service_director/system_utils.py @@ -0,0 +1,15 @@ +from pathlib import Path +from typing import Dict + + +def get_system_extra_hosts(extra_host_domain: str) -> Dict: + extra_hosts = {} + hosts_path = Path("/etc/hosts") + if hosts_path.exists(): + with hosts_path.open() as hosts: + for line in hosts: + if extra_host_domain in line: + host = line.split()[1] + ip = line.split()[0] + extra_hosts[host] = ip + return extra_hosts diff --git a/services/director/tests/test_producer.py b/services/director/tests/test_producer.py index d47c6e4a3e0..90378bf7e23 100644 --- a/services/director/tests/test_producer.py +++ b/services/director/tests/test_producer.py @@ -1,11 +1,11 @@ +#pylint: disable=W0621, W0611, W0613 import uuid import docker import pytest -from simcore_service_director import ( - producer, - exceptions -) + +from simcore_service_director import config, exceptions, producer + @pytest.fixture async def run_services(loop, configure_registry_access, push_services, docker_swarm, user_id): #pylint: disable=W0613, W0621 @@ -90,3 +90,8 @@ async def test_interactive_service_published_port(run_services): #pylint: disabl service_information = low_level_client.inspect_service(docker_service.id) service_published_port = service_information["Endpoint"]["Ports"][0]["PublishedPort"] assert service_published_port == service_port + +async def test_extra_hosts_passed_to_services(run_services): + # would need to test right inside a docker or test from outside... + # start the director with extra hosts, start some services, and test if the extra hosts are added + pass \ No newline at end of file From be003ac84fe7f49960b4d213e1b261e4109daca3 Mon Sep 17 00:00:00 2001 From: Sylvain <35365065+sanderegg@users.noreply.github.com> Date: Thu, 29 Nov 2018 07:51:39 +0100 Subject: [PATCH 2/2] review --- services/director/src/simcore_service_director/system_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/director/src/simcore_service_director/system_utils.py b/services/director/src/simcore_service_director/system_utils.py index 294d8d71ae9..3b846aa6b44 100644 --- a/services/director/src/simcore_service_director/system_utils.py +++ b/services/director/src/simcore_service_director/system_utils.py @@ -5,7 +5,7 @@ def get_system_extra_hosts(extra_host_domain: str) -> Dict: extra_hosts = {} hosts_path = Path("/etc/hosts") - if hosts_path.exists(): + if hosts_path.exists() and extra_host_domain != "undefined": with hosts_path.open() as hosts: for line in hosts: if extra_host_domain in line: