summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <f.joffrey@gmail.com>2017-12-13 16:33:06 -0800
committerGitHub <noreply@github.com>2017-12-13 16:33:06 -0800
commitaad0c760026abf4283e772d729889ba58c343e7d (patch)
treed47ee76110ad5be61329a809fdb32fb8dccdbba8
parenta916bfdde24e5452ea1b1b074ec04badd29377c5 (diff)
parent36ed843e2bbfd50698c16bfbd898d915019ca94d (diff)
downloaddocker-py-aad0c760026abf4283e772d729889ba58c343e7d.tar.gz
Merge pull request #1812 from rycus86/greedy_network_list
Fetch network details with network lists greedily
-rw-r--r--docker/models/networks.py21
-rw-r--r--tests/integration/models_networks_test.py10
-rw-r--r--tests/unit/models_networks_test.py4
3 files changed, 28 insertions, 7 deletions
diff --git a/docker/models/networks.py b/docker/models/networks.py
index 158af99..1c2fbf2 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 @@ class NetworkCollection(Collection):
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 @@ class NetworkCollection(Collection):
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 @@ class NetworkCollection(Collection):
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.
@@ -192,8 +202,13 @@ class NetworkCollection(Collection):
: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 105dcc5..08d7ad2 100644
--- a/tests/integration/models_networks_test.py
+++ b/tests/integration/models_networks_test.py
@@ -3,7 +3,7 @@ from .. import helpers
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 @@ class ImageCollectionTest(BaseIntegrationTest):
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 @@ class ImageTest(BaseIntegrationTest):
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 943b904..58c9fce 100644
--- a/tests/unit/models_networks_test.py
+++ b/tests/unit/models_networks_test.py
@@ -4,7 +4,7 @@ from .fake_api import FAKE_NETWORK_ID, FAKE_CONTAINER_ID
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 @@ class ImageCollectionTest(unittest.TestCase):
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()