From 48c5cd82fc91b874fb1502149a58f5f72a026a91 Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Thu, 8 Dec 2016 13:08:05 -0800 Subject: Prevent Swarm address conflicts Signed-off-by: Joffrey F --- Jenkinsfile | 24 +++++++++++++++--------- tests/helpers.py | 4 ++++ tests/integration/api_service_test.py | 2 +- tests/integration/api_swarm_test.py | 28 +++++++++++++--------------- tests/integration/base.py | 6 ++++++ tests/integration/models_nodes_test.py | 4 +++- tests/integration/models_services_test.py | 2 +- tests/integration/models_swarm_test.py | 6 +++++- 8 files changed, 48 insertions(+), 28 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3af2b16..b73a78e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -4,7 +4,7 @@ def imageNameBase = "dockerbuildbot/docker-py" def imageNamePy2 def imageNamePy3 def images = [:] -def dockerVersions = ["1.12.3", "1.13.0-rc3"] +def dockerVersions = ["1.12.0", "1.13.0-rc3"] def buildImage = { name, buildargs, pyTag -> img = docker.image(name) @@ -33,6 +33,7 @@ def buildImages = { -> def runTests = { Map settings -> def dockerVersion = settings.get("dockerVersion", null) + def pythonVersion = settings.get("pythonVersion", null) def testImage = settings.get("testImage", null) if (!testImage) { @@ -41,26 +42,31 @@ def runTests = { Map settings -> if (!dockerVersion) { throw new Exception("Need Docker version to test, e.g.: `runTests(dockerVersion: '1.12.3')`") } + if (!pythonVersion) { + throw new Exception("Need Python version being tested, e.g.: `runTests(pythonVersion: 'py2.7')`") + } { -> wrappedNode(label: "ubuntu && !zfs && amd64", cleanWorkspace: true) { - stage("test image=${testImage} / docker=${dockerVersion}") { + stage("test python=${pythonVersion} / docker=${dockerVersion}") { checkout(scm) + def dindContainerName = "dpy-dind-\$BUILD_NUMBER-\$EXECUTOR_NUMBER" + def testContainerName = "dpy-tests-\$BUILD_NUMBER-\$EXECUTOR_NUMBER" try { - sh """docker run -d --name dpy-dind-\$BUILD_NUMBER -v /tmp --privileged \\ + sh """docker run -d --name ${dindContainerName} -v /tmp --privileged \\ dockerswarm/dind:${dockerVersion} docker daemon -H tcp://0.0.0.0:2375 """ sh """docker run \\ - --name dpy-tests-\$BUILD_NUMBER --volumes-from dpy-dind-\$BUILD_NUMBER \\ + --name ${testContainerName} --volumes-from ${dindContainerName} \\ -e 'DOCKER_HOST=tcp://docker:2375' \\ - --link=dpy-dind-\$BUILD_NUMBER:docker \\ + --link=${dindContainerName}:docker \\ ${testImage} \\ - py.test -rxs tests/integration + py.test -v -rxs tests/integration """ } finally { sh """ - docker stop dpy-tests-\$BUILD_NUMBER dpy-dind-\$BUILD_NUMBER - docker rm -vf dpy-tests-\$BUILD_NUMBER dpy-dind-\$BUILD_NUMBER + docker stop ${dindContainerName} ${testContainerName} + docker rm -vf ${dindContainerName} ${testContainerName} """ } } @@ -75,7 +81,7 @@ def testMatrix = [failFast: false] for (imgKey in new ArrayList(images.keySet())) { for (version in dockerVersions) { - testMatrix["${imgKey}_${version}"] = runTests([testImage: images[imgKey], dockerVersion: version]) + testMatrix["${imgKey}_${version}"] = runTests([testImage: images[imgKey], dockerVersion: version, pythonVersion: imgKey]) } } diff --git a/tests/helpers.py b/tests/helpers.py index 53cf57a..1e42363 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -74,3 +74,7 @@ def force_leave_swarm(client): continue else: return + + +def swarm_listen_addr(): + return '0.0.0.0:{0}'.format(random.randrange(10000, 25000)) diff --git a/tests/integration/api_service_test.py b/tests/integration/api_service_test.py index 04f2fe0..fc79400 100644 --- a/tests/integration/api_service_test.py +++ b/tests/integration/api_service_test.py @@ -10,7 +10,7 @@ class ServiceTest(BaseAPIIntegrationTest): def setUp(self): super(ServiceTest, self).setUp() self.client.leave_swarm(force=True) - self.client.init_swarm('eth0') + self.init_swarm() def tearDown(self): super(ServiceTest, self).tearDown() diff --git a/tests/integration/api_swarm_test.py b/tests/integration/api_swarm_test.py index a10437b..a8f439c 100644 --- a/tests/integration/api_swarm_test.py +++ b/tests/integration/api_swarm_test.py @@ -17,39 +17,37 @@ class SwarmTest(BaseAPIIntegrationTest): @requires_api_version('1.24') def test_init_swarm_simple(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() @requires_api_version('1.24') def test_init_swarm_force_new_cluster(self): pytest.skip('Test stalls the engine on 1.12.0') - assert self.client.init_swarm('eth0') + assert self.init_swarm() version_1 = self.client.inspect_swarm()['Version']['Index'] - assert self.client.init_swarm('eth0', force_new_cluster=True) + assert self.client.init_swarm(force_new_cluster=True) version_2 = self.client.inspect_swarm()['Version']['Index'] assert version_2 != version_1 @requires_api_version('1.24') def test_init_already_in_cluster(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() with pytest.raises(docker.errors.APIError): - self.client.init_swarm('eth0') + self.init_swarm() @requires_api_version('1.24') def test_init_swarm_custom_raft_spec(self): spec = self.client.create_swarm_spec( snapshot_interval=5000, log_entries_for_slow_followers=1200 ) - assert self.client.init_swarm( - advertise_addr='eth0', swarm_spec=spec - ) + assert self.init_swarm(swarm_spec=spec) swarm_info = self.client.inspect_swarm() assert swarm_info['Spec']['Raft']['SnapshotInterval'] == 5000 assert swarm_info['Spec']['Raft']['LogEntriesForSlowFollowers'] == 1200 @requires_api_version('1.24') def test_leave_swarm(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() with pytest.raises(docker.errors.APIError) as exc_info: self.client.leave_swarm() exc_info.value.response.status_code == 500 @@ -61,7 +59,7 @@ class SwarmTest(BaseAPIIntegrationTest): @requires_api_version('1.24') def test_update_swarm(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() swarm_info_1 = self.client.inspect_swarm() spec = self.client.create_swarm_spec( snapshot_interval=5000, log_entries_for_slow_followers=1200, @@ -92,7 +90,7 @@ class SwarmTest(BaseAPIIntegrationTest): @requires_api_version('1.24') def test_update_swarm_name(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() swarm_info_1 = self.client.inspect_swarm() spec = self.client.create_swarm_spec( node_cert_expiry=7776000000000000, name='reimuhakurei' @@ -110,7 +108,7 @@ class SwarmTest(BaseAPIIntegrationTest): @requires_api_version('1.24') def test_list_nodes(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() nodes_list = self.client.nodes() assert len(nodes_list) == 1 node = nodes_list[0] @@ -129,7 +127,7 @@ class SwarmTest(BaseAPIIntegrationTest): @requires_api_version('1.24') def test_inspect_node(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() nodes_list = self.client.nodes() assert len(nodes_list) == 1 node = nodes_list[0] @@ -139,7 +137,7 @@ class SwarmTest(BaseAPIIntegrationTest): @requires_api_version('1.24') def test_update_node(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() nodes_list = self.client.nodes() node = nodes_list[0] orig_spec = node['Spec'] @@ -162,7 +160,7 @@ class SwarmTest(BaseAPIIntegrationTest): @requires_api_version('1.24') def test_remove_main_node(self): - assert self.client.init_swarm('eth0') + assert self.init_swarm() nodes_list = self.client.nodes() node_id = nodes_list[0]['ID'] with pytest.raises(docker.errors.NotFound): diff --git a/tests/integration/base.py b/tests/integration/base.py index ea43d05..4a41e6b 100644 --- a/tests/integration/base.py +++ b/tests/integration/base.py @@ -5,6 +5,7 @@ import docker from docker.utils import kwargs_from_env import six +from .. import helpers BUSYBOX = 'busybox:buildroot-2014.02' @@ -90,3 +91,8 @@ class BaseAPIIntegrationTest(BaseIntegrationTest): msg = "Expected `{}` to exit with code {} but returned {}:\n{}".format( " ".join(cmd), exit_code, actual_exit_code, output) assert actual_exit_code == exit_code, msg + + def init_swarm(self, **kwargs): + return self.client.init_swarm( + 'eth0', listen_addr=helpers.swarm_listen_addr(), **kwargs + ) diff --git a/tests/integration/models_nodes_test.py b/tests/integration/models_nodes_test.py index 0199d69..9fd1659 100644 --- a/tests/integration/models_nodes_test.py +++ b/tests/integration/models_nodes_test.py @@ -1,5 +1,7 @@ import unittest + import docker + from .. import helpers @@ -12,7 +14,7 @@ class NodesTest(unittest.TestCase): def test_list_get_update(self): client = docker.from_env() - client.swarm.init() + client.swarm.init(listen_addr=helpers.swarm_listen_addr()) nodes = client.nodes.list() assert len(nodes) == 1 assert nodes[0].attrs['Spec']['Role'] == 'manager' diff --git a/tests/integration/models_services_test.py b/tests/integration/models_services_test.py index baa40a9..a795df9 100644 --- a/tests/integration/models_services_test.py +++ b/tests/integration/models_services_test.py @@ -11,7 +11,7 @@ class ServiceTest(unittest.TestCase): def setUpClass(cls): client = docker.from_env() helpers.force_leave_swarm(client) - client.swarm.init() + client.swarm.init(listen_addr=helpers.swarm_listen_addr()) @classmethod def tearDownClass(cls): diff --git a/tests/integration/models_swarm_test.py b/tests/integration/models_swarm_test.py index 72bf9e5..4f177f1 100644 --- a/tests/integration/models_swarm_test.py +++ b/tests/integration/models_swarm_test.py @@ -1,5 +1,7 @@ import unittest + import docker + from .. import helpers @@ -12,7 +14,9 @@ class SwarmTest(unittest.TestCase): def test_init_update_leave(self): client = docker.from_env() - client.swarm.init(snapshot_interval=5000) + client.swarm.init( + snapshot_interval=5000, listen_addr=helpers.swarm_listen_addr() + ) assert client.swarm.attrs['Spec']['Raft']['SnapshotInterval'] == 5000 client.swarm.update(snapshot_interval=10000) assert client.swarm.attrs['Spec']['Raft']['SnapshotInterval'] == 10000 -- cgit v1.2.1