Skip to content
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
16 changes: 15 additions & 1 deletion docker/models/containers.py
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,10 @@ def run(self, image, command=None, stdout=True, stderr=False,
This mode is incompatible with ``ports``.

Incompatible with ``network``.
network_driver_opt (dict): A dictionary of options to provide
to the network driver. Defaults to ``None``. Used in
conjuction with ``network``. Incompatible
with ``network_mode``.
oom_kill_disable (bool): Whether to disable OOM killer.
oom_score_adj (int): An integer value containing the score given
to the container in order to tune OOM killer preferences.
Expand Down Expand Up @@ -842,6 +846,12 @@ def run(self, image, command=None, stdout=True, stderr=False,
'together.'
)

if kwargs.get('network_driver_opt') and not kwargs.get('network'):
raise RuntimeError(
'The options "network_driver_opt" can not be used '
'without "network".'
)

try:
container = self.create(image=image, command=command,
detach=detach, **kwargs)
Expand Down Expand Up @@ -1112,8 +1122,12 @@ def _create_container_args(kwargs):
host_config_kwargs['binds'] = volumes

network = kwargs.pop('network', None)
network_driver_opt = kwargs.pop('network_driver_opt', None)
if network:
create_kwargs['networking_config'] = {network: None}
network_configuration = {'driver_opt': network_driver_opt} \
if network_driver_opt else None

create_kwargs['networking_config'] = {network: network_configuration}
host_config_kwargs['network_mode'] = network

# All kwargs should have been consumed by this point, so raise
Expand Down
84 changes: 83 additions & 1 deletion tests/unit/models_containers_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ def test_create_container_args(self):
name='somename',
network_disabled=False,
network='foo',
network_driver_opt={'key1': 'a'},
oom_kill_disable=True,
oom_score_adj=5,
pid_mode='host',
Expand Down Expand Up @@ -188,7 +189,7 @@ def test_create_container_args(self):
mac_address='abc123',
name='somename',
network_disabled=False,
networking_config={'foo': None},
networking_config={'foo': {'driver_opt': {'key1': 'a'}}},
platform='linux',
ports=[('1111', 'tcp'), ('2222', 'tcp')],
stdin_open=True,
Expand Down Expand Up @@ -345,6 +346,42 @@ def test_run_platform(self):
host_config={'NetworkMode': 'default'},
)

def test_run_network_driver_opts_without_network(self):
client = make_fake_client()

with pytest.raises(RuntimeError):
client.containers.run(
image='alpine',
network_driver_opt={'key1': 'a'}
)

def test_run_network_driver_opts_with_network_mode(self):
client = make_fake_client()

with pytest.raises(RuntimeError):
client.containers.run(
image='alpine',
network_mode='none',
network_driver_opt={'key1': 'a'}
)

def test_run_network_driver_opts(self):
client = make_fake_client()

client.containers.run(
image='alpine',
network='foo',
network_driver_opt={'key1': 'a'}
)

client.api.create_container.assert_called_with(
detach=False,
image='alpine',
command=None,
networking_config={'foo': {'driver_opt': {'key1': 'a'}}},
host_config={'NetworkMode': 'foo'}
)

def test_create(self):
client = make_fake_client()
container = client.containers.create(
Expand Down Expand Up @@ -372,6 +409,51 @@ def test_create_with_image_object(self):
host_config={'NetworkMode': 'default'}
)

def test_create_network_driver_opts_without_network(self):
client = make_fake_client()

client.containers.create(
image='alpine',
network_driver_opt={'key1': 'a'}
)

client.api.create_container.assert_called_with(
image='alpine',
command=None,
host_config={'NetworkMode': 'default'}
)

def test_create_network_driver_opts_with_network_mode(self):
client = make_fake_client()

client.containers.create(
image='alpine',
network_mode='none',
network_driver_opt={'key1': 'a'}
)

client.api.create_container.assert_called_with(
image='alpine',
command=None,
host_config={'NetworkMode': 'none'}
)

def test_create_network_driver_opts(self):
client = make_fake_client()

client.containers.create(
image='alpine',
network='foo',
network_driver_opt={'key1': 'a'}
)

client.api.create_container.assert_called_with(
image='alpine',
command=None,
networking_config={'foo': {'driver_opt': {'key1': 'a'}}},
host_config={'NetworkMode': 'foo'}
)

def test_get(self):
client = make_fake_client()
container = client.containers.get(FAKE_CONTAINER_ID)
Expand Down