Skip to content

Commit f5d43b6

Browse files
committed
Resolves #455 - volumes_from a service with no containers.
Signed-off-by: Daniel Nephin <dnephin@gmail.com>
1 parent 2827786 commit f5d43b6

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
@@ -5,6 +5,7 @@
55
import logging
66
import re
77
import os
8+
from operator import attrgetter
89
import sys
910
from .container import Container
1011
from .progress_stream import stream_output, StreamOutputError
@@ -285,12 +286,17 @@ def _get_links(self, link_to_self):
285286

286287
def _get_volumes_from(self, intermediate_container=None):
287288
volumes_from = []
288-
for v in self.volumes_from:
289-
if isinstance(v, Service):
290-
for container in v.containers(stopped=True):
291-
volumes_from.append(container.id)
292-
elif isinstance(v, Container):
293-
volumes_from.append(v.id)
289+
for volume_source in self.volumes_from:
290+
if isinstance(volume_source, Service):
291+
containers = volume_source.containers(stopped=True)
292+
293+
if not containers:
294+
volumes_from.append(volume_source.create_container().id)
295+
else:
296+
volumes_from.extend(map(attrgetter('id'), containers))
297+
298+
elif isinstance(volume_source, Container):
299+
volumes_from.append(volume_source.id)
294300

295301
if intermediate_container:
296302
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
@@ -6,6 +6,7 @@
66
import mock
77

88
from fig import Service
9+
from fig.container import Container
910
from fig.service import (
1011
ConfigError,
1112
split_port,
@@ -38,6 +39,44 @@ def test_config_validation(self):
3839
self.assertRaises(ConfigError, lambda: Service(name='foo', port=['8000']))
3940
Service(name='foo', ports=['8000'])
4041

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

0 commit comments

Comments
 (0)