Skip to content

Commit 6422133

Browse files
committed
Add prune_networks method
Ensure all integration tests use the same version of the busybox image Signed-off-by: Joffrey F <[email protected]>
1 parent 0984c7c commit 6422133

File tree

6 files changed

+71
-24
lines changed

6 files changed

+71
-24
lines changed

docker/api/network.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,28 @@ def create_network(self, name, driver=None, options=None, ipam=None,
133133
res = self._post_json(url, data=data)
134134
return self._result(res, json=True)
135135

136+
@minimum_version('1.25')
137+
def prune_networks(self, filters=None):
138+
"""
139+
Delete unused networks
140+
141+
Args:
142+
filters (dict): Filters to process on the prune list.
143+
144+
Returns:
145+
(dict): A dict containing a list of deleted network names and
146+
the amount of disk space reclaimed in bytes.
147+
148+
Raises:
149+
:py:class:`docker.errors.APIError`
150+
If the server returns an error.
151+
"""
152+
params = {}
153+
if filters:
154+
params['filters'] = utils.convert_filters(filters)
155+
url = self._url('/networks/prune')
156+
return self._result(self._post(url, params=params), True)
157+
136158
@minimum_version('1.21')
137159
def remove_network(self, net_id):
138160
"""

docker/models/networks.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from ..api import APIClient
12
from .containers import Container
23
from .resource import Model, Collection
34

@@ -180,3 +181,7 @@ def list(self, *args, **kwargs):
180181
"""
181182
resp = self.client.api.networks(*args, **kwargs)
182183
return [self.prepare_model(item) for item in resp]
184+
185+
def prune(self, filters=None):
186+
self.client.api.prune_networks(filters=filters)
187+
prune.__doc__ = APIClient.prune_networks.__doc__

tests/integration/api_image_test.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,23 @@ def test_prune_images(self):
295295
self.client.remove_image('hello-world')
296296
except docker.errors.APIError:
297297
pass
298+
299+
# Ensure busybox does not get pruned
300+
ctnr = self.client.create_container(BUSYBOX, ['sleep', '9999'])
301+
self.tmp_containers.append(ctnr)
302+
298303
self.client.pull('hello-world')
299304
self.tmp_imgs.append('hello-world')
300305
img_id = self.client.inspect_image('hello-world')['Id']
301306
result = self.client.prune_images()
302-
assert img_id in [img['Deleted'] for img in result['ImagesDeleted']]
307+
assert img_id not in [
308+
img.get('Deleted') for img in result['ImagesDeleted']
309+
]
310+
result = self.client.prune_images({'dangling': False})
303311
assert result['SpaceReclaimed'] > 0
312+
assert 'hello-world:latest' in [
313+
img.get('Untagged') for img in result['ImagesDeleted']
314+
]
315+
assert img_id in [
316+
img.get('Deleted') for img in result['ImagesDeleted']
317+
]

tests/integration/api_network_test.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import pytest
44

55
from ..helpers import random_name, requires_api_version
6-
from .base import BaseAPIIntegrationTest
6+
from .base import BaseAPIIntegrationTest, BUSYBOX
77

88

99
class TestNetworks(BaseAPIIntegrationTest):
@@ -98,7 +98,7 @@ def test_remove_network(self):
9898
def test_connect_and_disconnect_container(self):
9999
net_name, net_id = self.create_network()
100100

101-
container = self.client.create_container('busybox', 'top')
101+
container = self.client.create_container(BUSYBOX, 'top')
102102
self.tmp_containers.append(container)
103103
self.client.start(container)
104104

@@ -126,7 +126,7 @@ def test_connect_and_disconnect_container(self):
126126
def test_connect_and_force_disconnect_container(self):
127127
net_name, net_id = self.create_network()
128128

129-
container = self.client.create_container('busybox', 'top')
129+
container = self.client.create_container(BUSYBOX, 'top')
130130
self.tmp_containers.append(container)
131131
self.client.start(container)
132132

@@ -153,7 +153,7 @@ def test_connect_and_force_disconnect_container(self):
153153
def test_connect_with_aliases(self):
154154
net_name, net_id = self.create_network()
155155

156-
container = self.client.create_container('busybox', 'top')
156+
container = self.client.create_container(BUSYBOX, 'top')
157157
self.tmp_containers.append(container)
158158
self.client.start(container)
159159

@@ -171,7 +171,7 @@ def test_connect_on_container_create(self):
171171
net_name, net_id = self.create_network()
172172

173173
container = self.client.create_container(
174-
image='busybox',
174+
image=BUSYBOX,
175175
command='top',
176176
host_config=self.client.create_host_config(network_mode=net_name),
177177
)
@@ -192,7 +192,7 @@ def test_create_with_aliases(self):
192192
net_name, net_id = self.create_network()
193193

194194
container = self.client.create_container(
195-
image='busybox',
195+
image=BUSYBOX,
196196
command='top',
197197
host_config=self.client.create_host_config(
198198
network_mode=net_name,
@@ -222,7 +222,7 @@ def test_create_with_ipv4_address(self):
222222
),
223223
)
224224
container = self.client.create_container(
225-
image='busybox', command='top',
225+
image=BUSYBOX, command='top',
226226
host_config=self.client.create_host_config(network_mode=net_name),
227227
networking_config=self.client.create_networking_config({
228228
net_name: self.client.create_endpoint_config(
@@ -251,7 +251,7 @@ def test_create_with_ipv6_address(self):
251251
),
252252
)
253253
container = self.client.create_container(
254-
image='busybox', command='top',
254+
image=BUSYBOX, command='top',
255255
host_config=self.client.create_host_config(network_mode=net_name),
256256
networking_config=self.client.create_networking_config({
257257
net_name: self.client.create_endpoint_config(
@@ -274,7 +274,7 @@ def test_create_with_ipv6_address(self):
274274
@requires_api_version('1.24')
275275
def test_create_with_linklocal_ips(self):
276276
container = self.client.create_container(
277-
'busybox', 'top',
277+
BUSYBOX, 'top',
278278
networking_config=self.client.create_networking_config(
279279
{
280280
'bridge': self.client.create_endpoint_config(
@@ -451,3 +451,9 @@ def test_create_network_attachable(self):
451451
_, net_id = self.create_network(driver='overlay', attachable=True)
452452
net = self.client.inspect_network(net_id)
453453
assert net['Attachable'] is True
454+
455+
@requires_api_version('1.25')
456+
def test_prune_networks(self):
457+
net_name, _ = self.create_network()
458+
result = self.client.prune_networks()
459+
assert net_name in result['NetworksDeleted']

tests/integration/api_service_test.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import docker
44

55
from ..helpers import force_leave_swarm, requires_api_version
6-
from .base import BaseAPIIntegrationTest
6+
from .base import BaseAPIIntegrationTest, BUSYBOX
77

88

99
class ServiceTest(BaseAPIIntegrationTest):
@@ -31,7 +31,7 @@ def create_simple_service(self, name=None):
3131
name = self.get_service_name()
3232

3333
container_spec = docker.types.ContainerSpec(
34-
'busybox', ['echo', 'hello']
34+
BUSYBOX, ['echo', 'hello']
3535
)
3636
task_tmpl = docker.types.TaskTemplate(container_spec)
3737
return name, self.client.create_service(task_tmpl, name=name)
@@ -81,7 +81,7 @@ def test_create_service_simple(self):
8181

8282
def test_create_service_custom_log_driver(self):
8383
container_spec = docker.types.ContainerSpec(
84-
'busybox', ['echo', 'hello']
84+
BUSYBOX, ['echo', 'hello']
8585
)
8686
log_cfg = docker.types.DriverConfig('none')
8787
task_tmpl = docker.types.TaskTemplate(
@@ -99,7 +99,7 @@ def test_create_service_custom_log_driver(self):
9999
def test_create_service_with_volume_mount(self):
100100
vol_name = self.get_service_name()
101101
container_spec = docker.types.ContainerSpec(
102-
'busybox', ['ls'],
102+
BUSYBOX, ['ls'],
103103
mounts=[
104104
docker.types.Mount(target='/test', source=vol_name)
105105
]
@@ -119,7 +119,7 @@ def test_create_service_with_volume_mount(self):
119119
assert mount['Type'] == 'volume'
120120

121121
def test_create_service_with_resources_constraints(self):
122-
container_spec = docker.types.ContainerSpec('busybox', ['true'])
122+
container_spec = docker.types.ContainerSpec(BUSYBOX, ['true'])
123123
resources = docker.types.Resources(
124124
cpu_limit=4000000, mem_limit=3 * 1024 * 1024 * 1024,
125125
cpu_reservation=3500000, mem_reservation=2 * 1024 * 1024 * 1024
@@ -139,7 +139,7 @@ def test_create_service_with_resources_constraints(self):
139139
]
140140

141141
def test_create_service_with_update_config(self):
142-
container_spec = docker.types.ContainerSpec('busybox', ['true'])
142+
container_spec = docker.types.ContainerSpec(BUSYBOX, ['true'])
143143
task_tmpl = docker.types.TaskTemplate(container_spec)
144144
update_config = docker.types.UpdateConfig(
145145
parallelism=10, delay=5, failure_action='pause'
@@ -173,7 +173,7 @@ def test_create_service_with_update_config_monitor(self):
173173
assert update_config['MaxFailureRatio'] == uc['MaxFailureRatio']
174174

175175
def test_create_service_with_restart_policy(self):
176-
container_spec = docker.types.ContainerSpec('busybox', ['true'])
176+
container_spec = docker.types.ContainerSpec(BUSYBOX, ['true'])
177177
policy = docker.types.RestartPolicy(
178178
docker.types.RestartPolicy.condition_types.ANY,
179179
delay=5, max_attempts=5
@@ -196,7 +196,7 @@ def test_create_service_with_custom_networks(self):
196196
'dockerpytest_2', driver='overlay', ipam={'Driver': 'default'}
197197
)
198198
self.tmp_networks.append(net2['Id'])
199-
container_spec = docker.types.ContainerSpec('busybox', ['true'])
199+
container_spec = docker.types.ContainerSpec(BUSYBOX, ['true'])
200200
task_tmpl = docker.types.TaskTemplate(container_spec)
201201
name = self.get_service_name()
202202
svc_id = self.client.create_service(
@@ -212,7 +212,7 @@ def test_create_service_with_custom_networks(self):
212212

213213
def test_create_service_with_placement(self):
214214
node_id = self.client.nodes()[0]['ID']
215-
container_spec = docker.types.ContainerSpec('busybox', ['true'])
215+
container_spec = docker.types.ContainerSpec(BUSYBOX, ['true'])
216216
task_tmpl = docker.types.TaskTemplate(
217217
container_spec, placement=['node.id=={}'.format(node_id)]
218218
)
@@ -224,7 +224,7 @@ def test_create_service_with_placement(self):
224224
{'Constraints': ['node.id=={}'.format(node_id)]})
225225

226226
def test_create_service_with_endpoint_spec(self):
227-
container_spec = docker.types.ContainerSpec('busybox', ['true'])
227+
container_spec = docker.types.ContainerSpec(BUSYBOX, ['true'])
228228
task_tmpl = docker.types.TaskTemplate(container_spec)
229229
name = self.get_service_name()
230230
endpoint_spec = docker.types.EndpointSpec(ports={
@@ -255,7 +255,7 @@ def test_create_service_with_endpoint_spec(self):
255255

256256
def test_create_service_with_env(self):
257257
container_spec = docker.types.ContainerSpec(
258-
'busybox', ['true'], env={'DOCKER_PY_TEST': 1}
258+
BUSYBOX, ['true'], env={'DOCKER_PY_TEST': 1}
259259
)
260260
task_tmpl = docker.types.TaskTemplate(
261261
container_spec,
@@ -271,7 +271,7 @@ def test_create_service_with_env(self):
271271

272272
def test_create_service_global_mode(self):
273273
container_spec = docker.types.ContainerSpec(
274-
'busybox', ['echo', 'hello']
274+
BUSYBOX, ['echo', 'hello']
275275
)
276276
task_tmpl = docker.types.TaskTemplate(container_spec)
277277
name = self.get_service_name()
@@ -284,7 +284,7 @@ def test_create_service_global_mode(self):
284284

285285
def test_create_service_replicated_mode(self):
286286
container_spec = docker.types.ContainerSpec(
287-
'busybox', ['echo', 'hello']
287+
BUSYBOX, ['echo', 'hello']
288288
)
289289
task_tmpl = docker.types.TaskTemplate(container_spec)
290290
name = self.get_service_name()

tests/integration/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def run_container(self, *args, **kwargs):
8181

8282
return container
8383

84-
def create_and_start(self, image='busybox', command='top', **kwargs):
84+
def create_and_start(self, image=BUSYBOX, command='top', **kwargs):
8585
container = self.client.create_container(
8686
image=image, command=command, **kwargs)
8787
self.tmp_containers.append(container)

0 commit comments

Comments
 (0)