diff --git a/src/pytest_docker/__init__.py b/src/pytest_docker/__init__.py index 9422958..1245117 100644 --- a/src/pytest_docker/__init__.py +++ b/src/pytest_docker/__init__.py @@ -8,6 +8,7 @@ import subprocess import time import timeit +import json def execute(command, success_codes=(0,)): @@ -101,6 +102,36 @@ def wait_until_responsive(self, check, timeout, pause, 'Timeout reached while waiting on service!' ) + def ip_for(self, service): + """Get direct IP of container""" + # List containers providing given service + containers_ids = self._docker_compose.execute( + "ps -q %s" % service).strip().splitlines() + if len(containers_ids) == 0: + raise ValueError( + "Can not find container for service '%s'" % service) + if len(containers_ids) > 1: + raise Exception( + "Multiple containers (%d) for one service '%s' detected" + % (len(containers_ids), service)) + + # Read out info about listed container + docker_info = json.loads( + execute("docker inspect %s" % containers_ids[0]) + ) + if not docker_info: + raise Exception( + "Couldn't fetch information data about container %s " + % containers_ids[0]) + network_settings = docker_info[0]['NetworkSettings'] + networks = network_settings['Networks'] + if not networks: + raise Exception( + "Container %s doesn't have network attached" + % containers_ids[0]) + for i in networks.values(): + return i['IPAddress'] + def str_to_list(arg): if isinstance(arg, (list, tuple)): diff --git a/tests/requirements.in b/tests/requirements.in index b285968..564c38f 100644 --- a/tests/requirements.in +++ b/tests/requirements.in @@ -6,3 +6,4 @@ flake8 mock pytest requests +docker-compose diff --git a/tests/test_integration.py b/tests/test_integration.py index 3c27fe4..cbc33ff 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -38,3 +38,8 @@ def test_integration(docker_ip, docker_services): response = requests.get(url) response.raise_for_status() print(response.text) + + +def test_direct_ip(docker_ip, docker_services): + ip = docker_services.ip_for('hello') + assert len(ip.split('.')) == 4