Skip to content
This repository has been archived by the owner on Oct 31, 2023. It is now read-only.

Windows docker ports #4428

Merged
merged 3 commits into from
Jul 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions golem/docker/commands/docker_machine.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class DockerMachineCommandHandler(DockerCommandHandler):
'docker-machine', '--native-ssh', 'regenerate-certs', '--force'],
restart=['docker-machine', '--native-ssh', 'restart'],
execute=['docker-machine', '--native-ssh', 'ssh'],
ip=['docker-machine', 'ip'],
)

commands.update(DockerCommandHandler.commands)
9 changes: 8 additions & 1 deletion golem/docker/hypervisor/docker_machine.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from contextlib import contextmanager
from typing import Optional, ClassVar, Any, List, Tuple

from golem.docker.client import local_client
from golem.docker.commands.docker_machine import DockerMachineCommandHandler
from golem.docker.config import DOCKER_VM_NAME, GetConfigFunction, \
CONSTRAINT_KEYS
Expand Down Expand Up @@ -92,7 +93,13 @@ def requires_ports_publishing(self) -> bool:
return True

def get_port_mapping(self, container_id: str, port: int) -> Tuple[str, int]:
pass
api_client = local_client()
c_config = api_client.inspect_container(container_id)
port = int(
c_config['NetworkSettings']['Ports'][f'{port}/tcp'][0]['HostPort'])
ip = self.command('ip', self._vm_name)
assert isinstance(ip, str)
return ip, port

@property
def config_dir(self):
Expand Down
15 changes: 8 additions & 7 deletions golem/envs/docker/cpu.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
NamedTuple, Tuple, Iterator, Union, Iterable

from docker.errors import APIError
from twisted.internet.defer import Deferred, inlineCallbacks
from twisted.internet.defer import Deferred, inlineCallbacks, succeed
from twisted.internet.threads import deferToThread
from urllib3.contrib.pyopenssl import WrappedSocket

Expand Down Expand Up @@ -580,13 +580,14 @@ def install_prerequisites(self, prerequisites: Prerequisites) -> Deferred:
f"is in invalid state: '{self._status}'")
logger.info("Preparing prerequisites...")

if not Whitelist.is_whitelisted(prerequisites.image):
logger.info(
"Docker image '%s' is not whitelisted.",
prerequisites.image,
)
return succeed(False)

def _prepare():
if not Whitelist.is_whitelisted(prerequisites.image):
logger.info(
"Docker image '%s' is not whitelisted.",
prerequisites.image,
)
return False
try:
client = local_client()
client.pull(
Expand Down
60 changes: 58 additions & 2 deletions tests/golem/docker/test_hypervisor.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import functools
import json
import os
import types
import uuid
from contextlib import contextmanager
from subprocess import CalledProcessError
from typing import Optional, Dict
from unittest import mock
from unittest import mock, TestCase

from golem.docker.commands.docker_machine import DockerMachineCommandHandler
from golem.docker.config import DOCKER_VM_NAME as VM_NAME, DEFAULTS
from golem.docker.hypervisor.docker_for_mac import DockerForMac
from golem.docker.hypervisor.docker_machine import DockerMachineHypervisor
from golem.docker.hypervisor.dummy import DummyHypervisor
from golem.docker.hypervisor.virtualbox import VirtualBoxHypervisor
from golem.docker.manager import DockerManager
from golem.testutils import TempDirFixture
Expand Down Expand Up @@ -167,6 +167,25 @@ def test_remove(self):
with self.assertLogs(level='WARN'):
assert not hypervisor.remove('test')

@mock.patch('golem.docker.hypervisor.docker_machine.local_client')
def test_get_port_mapping(self, local_client):
local_client().inspect_container.return_value = {
'NetworkSettings': {
'Ports': {
'12345/tcp': [{
'HostIp': '0.0.0.0',
'HostPort': '54321'
}]
}
}
}
hypervisor = MockHypervisor()
vm_ip = '192.168.64.151'
with mock.patch.object(hypervisor, 'command', return_value=vm_ip):
host, port = hypervisor.get_port_mapping('container_id', 12345)
self.assertEqual(host, vm_ip)
self.assertEqual(port, 54321)


class TestVirtualBoxHypervisor(LogTestCase):

Expand Down Expand Up @@ -442,3 +461,40 @@ def _assert_dns_configured(config_file) -> Dict:
assert all(daemon_config['dns'])

return daemon_config

@mock.patch('golem.docker.hypervisor.docker_for_mac.local_client')
def test_get_port_mapping(self, local_client):
local_client().inspect_container.return_value = {
'NetworkSettings': {
'Ports': {
'12345/tcp': [{
'HostIp': '0.0.0.0',
'HostPort': '54321'
}]
}
}
}
hypervisor = DockerForMac.instance(mock.Mock())
host, port = hypervisor.get_port_mapping('container_id', 12345)
self.assertEqual(host, '127.0.0.1')
self.assertEqual(port, 54321)


class TestDummyHypervisor(TestCase):

@mock.patch('golem.docker.hypervisor.dummy.local_client')
def test_get_port_mapping(self, local_client):
container_ip = '172.17.0.2'
local_client().inspect_container.return_value = {
'NetworkSettings': {
'Networks': {
'bridge': {
'IPAddress': container_ip,
}
}
}
}
hypervisor = DummyHypervisor(mock.Mock())
host, port = hypervisor.get_port_mapping('container_id', 12345)
self.assertEqual(host, container_ip)
self.assertEqual(port, 12345)