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
21 changes: 18 additions & 3 deletions docker/models/networks.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from ..api import APIClient
from ..utils import version_gte
from .containers import Container
from .resource import Model, Collection

Expand Down Expand Up @@ -153,7 +154,7 @@ def create(self, name, *args, **kwargs):
resp = self.client.api.create_network(name, *args, **kwargs)
return self.get(resp['Id'])

def get(self, network_id):
def get(self, network_id, *args, **kwargs):
"""
Get a network by its ID.

Expand All @@ -175,7 +176,9 @@ def get(self, network_id):
If the server returns an error.

"""
return self.prepare_model(self.client.api.inspect_network(network_id))
return self.prepare_model(
self.client.api.inspect_network(network_id, *args, **kwargs)
)

def list(self, *args, **kwargs):
"""
Expand All @@ -184,6 +187,13 @@ def list(self, *args, **kwargs):
Args:
names (:py:class:`list`): List of names to filter by.
ids (:py:class:`list`): List of ids to filter by.
filters (dict): Filters to be processed on the network list.
Available filters:
- ``driver=[<driver-name>]`` Matches a network's driver.
- ``label=[<key>]`` or ``label=[<key>=<value>]``.
- ``type=["custom"|"builtin"]`` Filters networks by type.
greedy (bool): Fetch more details for each network individually.
You might want this to get the containers attached to them.

Returns:
(list of :py:class:`Network`) The networks on the server.
Expand All @@ -192,8 +202,13 @@ def list(self, *args, **kwargs):
:py:class:`docker.errors.APIError`
If the server returns an error.
"""
greedy = kwargs.pop('greedy', False)
resp = self.client.api.networks(*args, **kwargs)
return [self.prepare_model(item) for item in resp]
networks = [self.prepare_model(item) for item in resp]
if greedy and version_gte(self.client.api._version, '1.28'):
for net in networks:
net.reload()
return networks

def prune(self, filters=None):
self.client.api.prune_networks(filters=filters)
Expand Down
10 changes: 8 additions & 2 deletions tests/integration/models_networks_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from .base import BaseIntegrationTest, TEST_API_VERSION


class ImageCollectionTest(BaseIntegrationTest):
class NetworkCollectionTest(BaseIntegrationTest):

def test_create(self):
client = docker.from_env(version=TEST_API_VERSION)
Expand Down Expand Up @@ -47,7 +47,7 @@ def test_list_remove(self):
assert network.id not in [n.id for n in client.networks.list()]


class ImageTest(BaseIntegrationTest):
class NetworkTest(BaseIntegrationTest):

def test_connect_disconnect(self):
client = docker.from_env(version=TEST_API_VERSION)
Expand All @@ -59,6 +59,12 @@ def test_connect_disconnect(self):
network.connect(container)
container.start()
assert client.networks.get(network.id).containers == [container]
network_containers = list(
c
for net in client.networks.list(ids=[network.id], greedy=True)
for c in net.containers
)
assert network_containers == [container]
network.disconnect(container)
assert network.containers == []
assert client.networks.get(network.id).containers == []
4 changes: 2 additions & 2 deletions tests/unit/models_networks_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from .fake_api_client import make_fake_client


class ImageCollectionTest(unittest.TestCase):
class NetworkCollectionTest(unittest.TestCase):

def test_create(self):
client = make_fake_client()
Expand Down Expand Up @@ -37,7 +37,7 @@ def test_list(self):
assert client.api.networks.called_once_with(names=["foobar"])


class ImageTest(unittest.TestCase):
class NetworkTest(unittest.TestCase):

def test_connect(self):
client = make_fake_client()
Expand Down