Skip to content

Commit 267be12

Browse files
committed
Merge pull request #456 from dnephin/volumes_from_service
Fix volumes_from a service with no containers
2 parents ec5c864 + f5d43b6 commit 267be12

2 files changed

Lines changed: 51 additions & 6 deletions

File tree

fig/service.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import logging
55
import re
66
import os
7+
from operator import attrgetter
78
import sys
89

910
from docker.errors import APIError
@@ -308,12 +309,17 @@ def _get_links(self, link_to_self):
308309

309310
def _get_volumes_from(self, intermediate_container=None):
310311
volumes_from = []
311-
for v in self.volumes_from:
312-
if isinstance(v, Service):
313-
for container in v.containers(stopped=True):
314-
volumes_from.append(container.id)
315-
elif isinstance(v, Container):
316-
volumes_from.append(v.id)
312+
for volume_source in self.volumes_from:
313+
if isinstance(volume_source, Service):
314+
containers = volume_source.containers(stopped=True)
315+
316+
if not containers:
317+
volumes_from.append(volume_source.create_container().id)
318+
else:
319+
volumes_from.extend(map(attrgetter('id'), containers))
320+
321+
elif isinstance(volume_source, Container):
322+
volumes_from.append(volume_source.id)
317323

318324
if intermediate_container:
319325
volumes_from.append(intermediate_container.id)

tests/unit/service_test.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import docker
99

1010
from fig import Service
11+
from fig.container import Container
1112
from fig.service import (
1213
ConfigError,
1314
split_port,
@@ -44,6 +45,44 @@ def test_config_validation(self):
4445
self.assertRaises(ConfigError, lambda: Service(name='foo', port=['8000']))
4546
Service(name='foo', ports=['8000'])
4647

48+
def test_get_volumes_from_container(self):
49+
container_id = 'aabbccddee'
50+
service = Service(
51+
'test',
52+
volumes_from=[mock.Mock(id=container_id, spec=Container)])
53+
54+
self.assertEqual(service._get_volumes_from(), [container_id])
55+
56+
def test_get_volumes_from_intermediate_container(self):
57+
container_id = 'aabbccddee'
58+
service = Service('test')
59+
container = mock.Mock(id=container_id, spec=Container)
60+
61+
self.assertEqual(service._get_volumes_from(container), [container_id])
62+
63+
def test_get_volumes_from_service_container_exists(self):
64+
container_ids = ['aabbccddee', '12345']
65+
from_service = mock.create_autospec(Service)
66+
from_service.containers.return_value = [
67+
mock.Mock(id=container_id, spec=Container)
68+
for container_id in container_ids
69+
]
70+
service = Service('test', volumes_from=[from_service])
71+
72+
self.assertEqual(service._get_volumes_from(), container_ids)
73+
74+
def test_get_volumes_from_service_no_container(self):
75+
container_id = 'abababab'
76+
from_service = mock.create_autospec(Service)
77+
from_service.containers.return_value = []
78+
from_service.create_container.return_value = mock.Mock(
79+
id=container_id,
80+
spec=Container)
81+
service = Service('test', volumes_from=[from_service])
82+
83+
self.assertEqual(service._get_volumes_from(), [container_id])
84+
from_service.create_container.assert_called_once_with()
85+
4786
def test_split_port_with_host_ip(self):
4887
internal_port, external_port = split_port("127.0.0.1:1000:2000")
4988
self.assertEqual(internal_port, "2000")

0 commit comments

Comments
 (0)