1
0
mirror of https://github.com/GNS3/gns3-server synced 2025-01-25 23:41:02 +00:00

Added preferred Docker API version. Fixes #2136

This commit is contained in:
ziajka 2017-07-06 11:24:55 +02:00
parent 8e8b8bc5a5
commit e0f0adf3c8
2 changed files with 53 additions and 5 deletions

View File

@ -36,6 +36,7 @@ log = logging.getLogger(__name__)
# Be carefull to keep it consistent # Be carefull to keep it consistent
DOCKER_MINIMUM_API_VERSION = "1.25" DOCKER_MINIMUM_API_VERSION = "1.25"
DOCKER_MINIMUM_VERSION = "1.13" DOCKER_MINIMUM_VERSION = "1.13"
DOCKER_PREFERRED_API_VERSION = "1.30"
class Docker(BaseManager): class Docker(BaseManager):
@ -50,6 +51,7 @@ class Docker(BaseManager):
self.ubridge_lock = asyncio.Lock() self.ubridge_lock = asyncio.Lock()
self._connector = None self._connector = None
self._session = None self._session = None
self._api_version = DOCKER_MINIMUM_API_VERSION
@asyncio.coroutine @asyncio.coroutine
def _check_connection(self): def _check_connection(self):
@ -61,8 +63,17 @@ class Docker(BaseManager):
except (aiohttp.errors.ClientOSError, FileNotFoundError): except (aiohttp.errors.ClientOSError, FileNotFoundError):
self._connected = False self._connected = False
raise DockerError("Can't connect to docker daemon") raise DockerError("Can't connect to docker daemon")
if parse_version(version["ApiVersion"]) < parse_version(DOCKER_MINIMUM_API_VERSION):
raise DockerError("Docker version is {}. GNS3 requires a minimum version of {}".format(version["Version"], DOCKER_MINIMUM_VERSION)) docker_version = parse_version(version['ApiVersion'])
if docker_version < parse_version(DOCKER_MINIMUM_API_VERSION):
raise DockerError(
"Docker version is {}. GNS3 requires a minimum version of {}".format(
version["Version"], DOCKER_MINIMUM_VERSION))
preferred_api_version = parse_version(DOCKER_PREFERRED_API_VERSION)
if docker_version >= preferred_api_version:
self._api_version = DOCKER_PREFERRED_API_VERSION
def connector(self): def connector(self):
if self._connector is None or self._connector.closed: if self._connector is None or self._connector.closed:
@ -165,7 +176,7 @@ class Docker(BaseManager):
:returns: Websocket :returns: Websocket
""" """
url = "http://docker/v" + DOCKER_MINIMUM_API_VERSION + "/" + path url = "http://docker/v" + self._api_version + "/" + path
connection = yield from aiohttp.ws_connect(url, connection = yield from aiohttp.ws_connect(url,
connector=self.connector(), connector=self.connector(),
origin="http://docker", origin="http://docker",

View File

@ -17,10 +17,10 @@
import pytest import pytest
import asyncio import asyncio
from unittest.mock import MagicMock from unittest.mock import MagicMock, patch
from tests.utils import asyncio_patch, AsyncioMagicMock from tests.utils import asyncio_patch, AsyncioMagicMock
from gns3server.compute.docker import Docker from gns3server.compute.docker import Docker, DOCKER_PREFERRED_API_VERSION, DOCKER_MINIMUM_API_VERSION
from gns3server.compute.docker.docker_error import DockerError, DockerHttp404Error from gns3server.compute.docker.docker_error import DockerError, DockerHttp404Error
@ -162,3 +162,40 @@ def test_pull_image(loop):
with asyncio_patch("gns3server.compute.docker.Docker.http_query", return_value=mock_query) as mock: with asyncio_patch("gns3server.compute.docker.Docker.http_query", return_value=mock_query) as mock:
images = loop.run_until_complete(asyncio.async(Docker.instance().pull_image("ubuntu"))) images = loop.run_until_complete(asyncio.async(Docker.instance().pull_image("ubuntu")))
mock.assert_called_with("POST", "images/create", params={"fromImage": "ubuntu"}, timeout=None) mock.assert_called_with("POST", "images/create", params={"fromImage": "ubuntu"}, timeout=None)
def test_docker_check_connection_docker_minimum_version(vm, loop):
response = {
'ApiVersion': '1.01',
'Version': '1.12'
}
with patch("gns3server.compute.docker.Docker.connector"), \
asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response):
vm._connected = False
with pytest.raises(DockerError):
loop.run_until_complete(asyncio.async(vm._check_connection()))
def test_docker_check_connection_docker_preferred_version_against_newer(vm, loop):
response = {
'ApiVersion': '1.31'
}
with patch("gns3server.compute.docker.Docker.connector"), \
asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response):
vm._connected = False
loop.run_until_complete(asyncio.async(vm._check_connection()))
assert vm._api_version == DOCKER_PREFERRED_API_VERSION
def test_docker_check_connection_docker_preferred_version_against_older(vm, loop):
response = {
'ApiVersion': '1.27',
}
with patch("gns3server.compute.docker.Docker.connector"), \
asyncio_patch("gns3server.compute.docker.Docker.query", return_value=response):
vm._connected = False
loop.run_until_complete(asyncio.async(vm._check_connection()))
assert vm._api_version == DOCKER_MINIMUM_API_VERSION