mirror of https://github.com/docker/docker-py.git
Fetch network details with network lists greedily
Signed-off-by: Viktor Adam <rycus86@gmail.com>
This commit is contained in:
parent
1d6b5b2032
commit
7829b728a4
|
@ -6,7 +6,7 @@ from .. import utils
|
|||
|
||||
class NetworkApiMixin(object):
|
||||
@minimum_version('1.21')
|
||||
def networks(self, names=None, ids=None, filters=None):
|
||||
def networks(self, names=None, ids=None, filters=None, greedy=False):
|
||||
"""
|
||||
List networks. Similar to the ``docker networks ls`` command.
|
||||
|
||||
|
@ -18,6 +18,8 @@ class NetworkApiMixin(object):
|
|||
- ``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:
|
||||
(dict): List of network objects.
|
||||
|
@ -36,7 +38,11 @@ class NetworkApiMixin(object):
|
|||
params = {'filters': utils.convert_filters(filters)}
|
||||
url = self._url("/networks")
|
||||
res = self._get(url, params=params)
|
||||
return self._result(res, json=True)
|
||||
result = self._result(res, json=True)
|
||||
if greedy:
|
||||
return [self.inspect_network(net['Id']) for net in result]
|
||||
else:
|
||||
return result
|
||||
|
||||
@minimum_version('1.21')
|
||||
def create_network(self, name, driver=None, options=None, ipam=None,
|
||||
|
|
|
@ -153,7 +153,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 +175,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 +186,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.
|
||||
|
|
|
@ -112,6 +112,16 @@ class TestNetworks(BaseAPIIntegrationTest):
|
|||
[container['Id']]
|
||||
)
|
||||
|
||||
network_list = self.client.networks(ids=[net_id], greedy=True)
|
||||
self.assertEqual(
|
||||
list(
|
||||
key
|
||||
for net in network_list
|
||||
for key in net['Containers'].keys()
|
||||
),
|
||||
[container['Id']]
|
||||
)
|
||||
|
||||
with pytest.raises(docker.errors.APIError):
|
||||
self.client.connect_container_to_network(container, net_id)
|
||||
|
||||
|
@ -140,10 +150,27 @@ class TestNetworks(BaseAPIIntegrationTest):
|
|||
[container['Id']]
|
||||
)
|
||||
|
||||
network_list = self.client.networks(ids=[net_id], greedy=True)
|
||||
self.assertEqual(
|
||||
list(
|
||||
key
|
||||
for net in network_list
|
||||
for key in net['Containers'].keys()
|
||||
),
|
||||
[container['Id']]
|
||||
)
|
||||
|
||||
self.client.disconnect_container_from_network(container, net_id, True)
|
||||
network_data = self.client.inspect_network(net_id)
|
||||
self.assertFalse(network_data.get('Containers'))
|
||||
|
||||
network_list = self.client.networks(ids=[net_id], greedy=True)
|
||||
self.assertFalse(list(
|
||||
key
|
||||
for net in network_list
|
||||
for key in net['Containers'].keys()
|
||||
))
|
||||
|
||||
with pytest.raises(docker.errors.APIError):
|
||||
self.client.disconnect_container_from_network(
|
||||
container, net_id, force=True
|
||||
|
@ -183,6 +210,16 @@ class TestNetworks(BaseAPIIntegrationTest):
|
|||
list(network_data['Containers'].keys()),
|
||||
[container['Id']])
|
||||
|
||||
network_list = self.client.networks(ids=[net_id], greedy=True)
|
||||
self.assertEqual(
|
||||
list(
|
||||
key
|
||||
for net in network_list
|
||||
for key in net['Containers'].keys()
|
||||
),
|
||||
[container['Id']]
|
||||
)
|
||||
|
||||
self.client.disconnect_container_from_network(container, net_id)
|
||||
network_data = self.client.inspect_network(net_id)
|
||||
self.assertFalse(network_data.get('Containers'))
|
||||
|
|
|
@ -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(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,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()
|
||||
|
@ -36,8 +36,12 @@ class ImageCollectionTest(unittest.TestCase):
|
|||
client.networks.list(names=["foobar"])
|
||||
assert client.api.networks.called_once_with(names=["foobar"])
|
||||
|
||||
client = make_fake_client()
|
||||
client.networks.list(greedy=True)
|
||||
assert client.api.networks.called_once_with(greedy=True)
|
||||
|
||||
class ImageTest(unittest.TestCase):
|
||||
|
||||
class NetworkTest(unittest.TestCase):
|
||||
|
||||
def test_connect(self):
|
||||
client = make_fake_client()
|
||||
|
|
Loading…
Reference in New Issue