diff --git a/docker/models/networks.py b/docker/models/networks.py index 158af99b8d..1c2fbf2465 100644 --- a/docker/models/networks.py +++ b/docker/models/networks.py @@ -1,4 +1,5 @@ from ..api import APIClient +from ..utils import version_gte from .containers import Container from .resource import Model, Collection @@ -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. @@ -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): """ @@ -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=[]`` Matches a network's driver. + - ``label=[]`` or ``label=[=]``. + - ``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. @@ -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) diff --git a/tests/integration/models_networks_test.py b/tests/integration/models_networks_test.py index 105dcc594a..08d7ad2955 100644 --- a/tests/integration/models_networks_test.py +++ b/tests/integration/models_networks_test.py @@ -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) @@ -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) @@ -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 == [] diff --git a/tests/unit/models_networks_test.py b/tests/unit/models_networks_test.py index 943b904568..58c9fce669 100644 --- a/tests/unit/models_networks_test.py +++ b/tests/unit/models_networks_test.py @@ -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() @@ -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()