Skip to content

Commit 9682422

Browse files
authored
Merge pull request #2303 from hannseman/swarm-DataPathAddr
Add support for swarm DataPathAddr
2 parents cc13b82 + 110c676 commit 9682422

File tree

4 files changed

+50
-8
lines changed

4 files changed

+50
-8
lines changed

docker/api/swarm.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ def get_unlock_key(self):
8484
@utils.minimum_version('1.24')
8585
def init_swarm(self, advertise_addr=None, listen_addr='0.0.0.0:2377',
8686
force_new_cluster=False, swarm_spec=None,
87-
default_addr_pool=None, subnet_size=None):
87+
default_addr_pool=None, subnet_size=None,
88+
data_path_addr=None):
8889
"""
8990
Initialize a new Swarm using the current connected engine as the first
9091
node.
@@ -115,6 +116,8 @@ def init_swarm(self, advertise_addr=None, listen_addr='0.0.0.0:2377',
115116
Default: None
116117
subnet_size (int): SubnetSize specifies the subnet size of the
117118
networks created from the default subnet pool. Default: None
119+
data_path_addr (string): Address or interface to use for data path
120+
traffic. For example, 192.168.1.1, or an interface, like eth0.
118121
119122
Returns:
120123
``True`` if successful.
@@ -154,6 +157,15 @@ def init_swarm(self, advertise_addr=None, listen_addr='0.0.0.0:2377',
154157
'ForceNewCluster': force_new_cluster,
155158
'Spec': swarm_spec,
156159
}
160+
161+
if data_path_addr is not None:
162+
if utils.version_lt(self._version, '1.30'):
163+
raise errors.InvalidVersion(
164+
'Data address path is only available for '
165+
'API version >= 1.30'
166+
)
167+
data['DataPathAddr'] = data_path_addr
168+
157169
response = self._post_json(url, data=data)
158170
self._raise_for_status(response)
159171
return True
@@ -194,7 +206,7 @@ def inspect_node(self, node_id):
194206

195207
@utils.minimum_version('1.24')
196208
def join_swarm(self, remote_addrs, join_token, listen_addr='0.0.0.0:2377',
197-
advertise_addr=None):
209+
advertise_addr=None, data_path_addr=None):
198210
"""
199211
Make this Engine join a swarm that has already been created.
200212
@@ -213,6 +225,8 @@ def join_swarm(self, remote_addrs, join_token, listen_addr='0.0.0.0:2377',
213225
the port number from the listen address is used. If
214226
AdvertiseAddr is not specified, it will be automatically
215227
detected when possible. Default: ``None``
228+
data_path_addr (string): Address or interface to use for data path
229+
traffic. For example, 192.168.1.1, or an interface, like eth0.
216230
217231
Returns:
218232
``True`` if the request went through.
@@ -222,11 +236,20 @@ def join_swarm(self, remote_addrs, join_token, listen_addr='0.0.0.0:2377',
222236
If the server returns an error.
223237
"""
224238
data = {
225-
"RemoteAddrs": remote_addrs,
226-
"ListenAddr": listen_addr,
227-
"JoinToken": join_token,
228-
"AdvertiseAddr": advertise_addr,
239+
'RemoteAddrs': remote_addrs,
240+
'ListenAddr': listen_addr,
241+
'JoinToken': join_token,
242+
'AdvertiseAddr': advertise_addr,
229243
}
244+
245+
if data_path_addr is not None:
246+
if utils.version_lt(self._version, '1.30'):
247+
raise errors.InvalidVersion(
248+
'Data address path is only available for '
249+
'API version >= 1.30'
250+
)
251+
data['DataPathAddr'] = data_path_addr
252+
230253
url = self._url('/swarm/join')
231254
response = self._post_json(url, data=data)
232255
self._raise_for_status(response)

docker/models/swarm.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def get_unlock_key(self):
3535

3636
def init(self, advertise_addr=None, listen_addr='0.0.0.0:2377',
3737
force_new_cluster=False, default_addr_pool=None,
38-
subnet_size=None, **kwargs):
38+
subnet_size=None, data_path_addr=None, **kwargs):
3939
"""
4040
Initialize a new swarm on this Engine.
4141
@@ -63,6 +63,8 @@ def init(self, advertise_addr=None, listen_addr='0.0.0.0:2377',
6363
Default: None
6464
subnet_size (int): SubnetSize specifies the subnet size of the
6565
networks created from the default subnet pool. Default: None
66+
data_path_addr (string): Address or interface to use for data path
67+
traffic. For example, 192.168.1.1, or an interface, like eth0.
6668
task_history_retention_limit (int): Maximum number of tasks
6769
history stored.
6870
snapshot_interval (int): Number of logs entries between snapshot.
@@ -117,7 +119,8 @@ def init(self, advertise_addr=None, listen_addr='0.0.0.0:2377',
117119
'listen_addr': listen_addr,
118120
'force_new_cluster': force_new_cluster,
119121
'default_addr_pool': default_addr_pool,
120-
'subnet_size': subnet_size
122+
'subnet_size': subnet_size,
123+
'data_path_addr': data_path_addr,
121124
}
122125
init_kwargs['swarm_spec'] = self.client.api.create_swarm_spec(**kwargs)
123126
self.client.api.init_swarm(**init_kwargs)

tests/integration/api_swarm_test.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,3 +233,7 @@ def test_remove_main_node(self):
233233
self.client.remove_node(node_id, True)
234234

235235
assert e.value.response.status_code >= 400
236+
237+
@requires_api_version('1.30')
238+
def test_init_swarm_data_path_addr(self):
239+
assert self.init_swarm(data_path_addr='eth0')

tests/integration/models_swarm_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,15 @@ def test_init_update_leave(self):
3131
cm.value.response.status_code == 406 or
3232
cm.value.response.status_code == 503
3333
)
34+
35+
def test_join_on_already_joined_swarm(self):
36+
client = docker.from_env(version=TEST_API_VERSION)
37+
client.swarm.init()
38+
join_token = client.swarm.attrs['JoinTokens']['Manager']
39+
with pytest.raises(docker.errors.APIError) as cm:
40+
client.swarm.join(
41+
remote_addrs=['127.0.0.1'],
42+
join_token=join_token,
43+
)
44+
assert cm.value.response.status_code == 503
45+
assert 'This node is already part of a swarm.' in cm.value.explanation

0 commit comments

Comments
 (0)