Skip to content

Commit 18eb08e

Browse files
committed
Prevent Swarm address conflicts
Signed-off-by: Joffrey F <[email protected]>
1 parent 041ffd9 commit 18eb08e

File tree

8 files changed

+48
-28
lines changed

8 files changed

+48
-28
lines changed

Jenkinsfile

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ def imageNameBase = "dockerbuildbot/docker-py"
44
def imageNamePy2
55
def imageNamePy3
66
def images = [:]
7-
def dockerVersions = ["1.12.3", "1.13.0-rc3"]
7+
def dockerVersions = ["1.12.0", "1.13.0-rc3"]
88

99
def buildImage = { name, buildargs, pyTag ->
1010
img = docker.image(name)
@@ -33,6 +33,7 @@ def buildImages = { ->
3333

3434
def runTests = { Map settings ->
3535
def dockerVersion = settings.get("dockerVersion", null)
36+
def pythonVersion = settings.get("pythonVersion", null)
3637
def testImage = settings.get("testImage", null)
3738

3839
if (!testImage) {
@@ -41,26 +42,31 @@ def runTests = { Map settings ->
4142
if (!dockerVersion) {
4243
throw new Exception("Need Docker version to test, e.g.: `runTests(dockerVersion: '1.12.3')`")
4344
}
45+
if (!pythonVersion) {
46+
throw new Exception("Need Python version being tested, e.g.: `runTests(pythonVersion: 'py2.7')`")
47+
}
4448

4549
{ ->
4650
wrappedNode(label: "ubuntu && !zfs && amd64", cleanWorkspace: true) {
47-
stage("test image=${testImage} / docker=${dockerVersion}") {
51+
stage("test python=${pythonVersion} / docker=${dockerVersion}") {
4852
checkout(scm)
53+
def dindContainerName = "dpy-dind-\$BUILD_NUMBER-\$EXECUTOR_NUMBER"
54+
def testContainerName = "dpy-tests-\$BUILD_NUMBER-\$EXECUTOR_NUMBER"
4955
try {
50-
sh """docker run -d --name dpy-dind-\$BUILD_NUMBER -v /tmp --privileged \\
56+
sh """docker run -d --name ${dindContainerName} -v /tmp --privileged \\
5157
dockerswarm/dind:${dockerVersion} docker daemon -H tcp://0.0.0.0:2375
5258
"""
5359
sh """docker run \\
54-
--name dpy-tests-\$BUILD_NUMBER --volumes-from dpy-dind-\$BUILD_NUMBER \\
60+
--name ${testContainerName} --volumes-from ${dindContainerName} \\
5561
-e 'DOCKER_HOST=tcp://docker:2375' \\
56-
--link=dpy-dind-\$BUILD_NUMBER:docker \\
62+
--link=${dindContainerName}:docker \\
5763
${testImage} \\
58-
py.test -rxs tests/integration
64+
py.test -v -rxs tests/integration
5965
"""
6066
} finally {
6167
sh """
62-
docker stop dpy-tests-\$BUILD_NUMBER dpy-dind-\$BUILD_NUMBER
63-
docker rm -vf dpy-tests-\$BUILD_NUMBER dpy-dind-\$BUILD_NUMBER
68+
docker stop ${dindContainerName} ${testContainerName}
69+
docker rm -vf ${dindContainerName} ${testContainerName}
6470
"""
6571
}
6672
}
@@ -75,7 +81,7 @@ def testMatrix = [failFast: false]
7581

7682
for (imgKey in new ArrayList(images.keySet())) {
7783
for (version in dockerVersions) {
78-
testMatrix["${imgKey}_${version}"] = runTests([testImage: images[imgKey], dockerVersion: version])
84+
testMatrix["${imgKey}_${version}"] = runTests([testImage: images[imgKey], dockerVersion: version, pythonVersion: imgKey])
7985
}
8086
}
8187

tests/helpers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,7 @@ def force_leave_swarm(client):
7474
continue
7575
else:
7676
return
77+
78+
79+
def swarm_listen_addr():
80+
return '0.0.0.0:{0}'.format(random.randrange(10000, 25000))

tests/integration/api_service_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class ServiceTest(BaseAPIIntegrationTest):
1010
def setUp(self):
1111
super(ServiceTest, self).setUp()
1212
self.client.leave_swarm(force=True)
13-
self.client.init_swarm('eth0')
13+
self.init_swarm()
1414

1515
def tearDown(self):
1616
super(ServiceTest, self).tearDown()

tests/integration/api_swarm_test.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,37 @@ def tearDown(self):
1717

1818
@requires_api_version('1.24')
1919
def test_init_swarm_simple(self):
20-
assert self.client.init_swarm('eth0')
20+
assert self.init_swarm()
2121

2222
@requires_api_version('1.24')
2323
def test_init_swarm_force_new_cluster(self):
2424
pytest.skip('Test stalls the engine on 1.12.0')
2525

26-
assert self.client.init_swarm('eth0')
26+
assert self.init_swarm()
2727
version_1 = self.client.inspect_swarm()['Version']['Index']
28-
assert self.client.init_swarm('eth0', force_new_cluster=True)
28+
assert self.client.init_swarm(force_new_cluster=True)
2929
version_2 = self.client.inspect_swarm()['Version']['Index']
3030
assert version_2 != version_1
3131

3232
@requires_api_version('1.24')
3333
def test_init_already_in_cluster(self):
34-
assert self.client.init_swarm('eth0')
34+
assert self.init_swarm()
3535
with pytest.raises(docker.errors.APIError):
36-
self.client.init_swarm('eth0')
36+
self.init_swarm()
3737

3838
@requires_api_version('1.24')
3939
def test_init_swarm_custom_raft_spec(self):
4040
spec = self.client.create_swarm_spec(
4141
snapshot_interval=5000, log_entries_for_slow_followers=1200
4242
)
43-
assert self.client.init_swarm(
44-
advertise_addr='eth0', swarm_spec=spec
45-
)
43+
assert self.init_swarm(swarm_spec=spec)
4644
swarm_info = self.client.inspect_swarm()
4745
assert swarm_info['Spec']['Raft']['SnapshotInterval'] == 5000
4846
assert swarm_info['Spec']['Raft']['LogEntriesForSlowFollowers'] == 1200
4947

5048
@requires_api_version('1.24')
5149
def test_leave_swarm(self):
52-
assert self.client.init_swarm('eth0')
50+
assert self.init_swarm()
5351
with pytest.raises(docker.errors.APIError) as exc_info:
5452
self.client.leave_swarm()
5553
exc_info.value.response.status_code == 500
@@ -61,7 +59,7 @@ def test_leave_swarm(self):
6159

6260
@requires_api_version('1.24')
6361
def test_update_swarm(self):
64-
assert self.client.init_swarm('eth0')
62+
assert self.init_swarm()
6563
swarm_info_1 = self.client.inspect_swarm()
6664
spec = self.client.create_swarm_spec(
6765
snapshot_interval=5000, log_entries_for_slow_followers=1200,
@@ -92,7 +90,7 @@ def test_update_swarm(self):
9290

9391
@requires_api_version('1.24')
9492
def test_update_swarm_name(self):
95-
assert self.client.init_swarm('eth0')
93+
assert self.init_swarm()
9694
swarm_info_1 = self.client.inspect_swarm()
9795
spec = self.client.create_swarm_spec(
9896
node_cert_expiry=7776000000000000, name='reimuhakurei'
@@ -110,7 +108,7 @@ def test_update_swarm_name(self):
110108

111109
@requires_api_version('1.24')
112110
def test_list_nodes(self):
113-
assert self.client.init_swarm('eth0')
111+
assert self.init_swarm()
114112
nodes_list = self.client.nodes()
115113
assert len(nodes_list) == 1
116114
node = nodes_list[0]
@@ -129,7 +127,7 @@ def test_list_nodes(self):
129127

130128
@requires_api_version('1.24')
131129
def test_inspect_node(self):
132-
assert self.client.init_swarm('eth0')
130+
assert self.init_swarm()
133131
nodes_list = self.client.nodes()
134132
assert len(nodes_list) == 1
135133
node = nodes_list[0]
@@ -139,7 +137,7 @@ def test_inspect_node(self):
139137

140138
@requires_api_version('1.24')
141139
def test_update_node(self):
142-
assert self.client.init_swarm('eth0')
140+
assert self.init_swarm()
143141
nodes_list = self.client.nodes()
144142
node = nodes_list[0]
145143
orig_spec = node['Spec']
@@ -162,7 +160,7 @@ def test_update_node(self):
162160

163161
@requires_api_version('1.24')
164162
def test_remove_main_node(self):
165-
assert self.client.init_swarm('eth0')
163+
assert self.init_swarm()
166164
nodes_list = self.client.nodes()
167165
node_id = nodes_list[0]['ID']
168166
with pytest.raises(docker.errors.NotFound):

tests/integration/base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from docker.utils import kwargs_from_env
66
import six
77

8+
from .. import helpers
89

910
BUSYBOX = 'busybox:buildroot-2014.02'
1011

@@ -90,3 +91,8 @@ def execute(self, container, cmd, exit_code=0, **kwargs):
9091
msg = "Expected `{}` to exit with code {} but returned {}:\n{}".format(
9192
" ".join(cmd), exit_code, actual_exit_code, output)
9293
assert actual_exit_code == exit_code, msg
94+
95+
def init_swarm(self, **kwargs):
96+
return self.client.init_swarm(
97+
'eth0', listen_addr=helpers.swarm_listen_addr(), **kwargs
98+
)

tests/integration/models_nodes_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import unittest
2+
23
import docker
4+
35
from .. import helpers
46

57

@@ -12,7 +14,7 @@ def tearDown(self):
1214

1315
def test_list_get_update(self):
1416
client = docker.from_env()
15-
client.swarm.init()
17+
client.swarm.init(listen_addr=helpers.swarm_listen_addr())
1618
nodes = client.nodes.list()
1719
assert len(nodes) == 1
1820
assert nodes[0].attrs['Spec']['Role'] == 'manager'

tests/integration/models_services_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ServiceTest(unittest.TestCase):
1111
def setUpClass(cls):
1212
client = docker.from_env()
1313
helpers.force_leave_swarm(client)
14-
client.swarm.init()
14+
client.swarm.init(listen_addr=helpers.swarm_listen_addr())
1515

1616
@classmethod
1717
def tearDownClass(cls):

tests/integration/models_swarm_test.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import unittest
2+
23
import docker
4+
35
from .. import helpers
46

57

@@ -12,7 +14,9 @@ def tearDown(self):
1214

1315
def test_init_update_leave(self):
1416
client = docker.from_env()
15-
client.swarm.init(snapshot_interval=5000)
17+
client.swarm.init(
18+
snapshot_interval=5000, listen_addr=helpers.swarm_listen_addr()
19+
)
1620
assert client.swarm.attrs['Spec']['Raft']['SnapshotInterval'] == 5000
1721
client.swarm.update(snapshot_interval=10000)
1822
assert client.swarm.attrs['Spec']['Raft']['SnapshotInterval'] == 10000

0 commit comments

Comments
 (0)