Skip to content

Commit d978787

Browse files
committed
Merge pull request #439 from dnephin/faster_integration_tests
Faster integration testing
2 parents b9eb55a + e0b0801 commit d978787

3 files changed

Lines changed: 34 additions & 30 deletions

File tree

fig/service.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from __future__ import unicode_literals
22
from __future__ import absolute_import
33
from collections import namedtuple
4-
from docker.errors import APIError
54
import logging
65
import re
76
import os
87
import sys
8+
9+
from docker.errors import APIError
10+
911
from .container import Container
1012
from .progress_stream import stream_output, StreamOutputError
1113

@@ -43,6 +45,9 @@ class ConfigError(ValueError):
4345
VolumeSpec = namedtuple('VolumeSpec', 'external internal mode')
4446

4547

48+
ServiceName = namedtuple('ServiceName', 'project service number')
49+
50+
4651
class Service(object):
4752
def __init__(self, name, client=None, project='default', links=None, volumes_from=None, **options):
4853
if not re.match('^%s+$' % VALID_NAME_CHARS, name):
@@ -185,8 +190,8 @@ def recreate_containers(self, **override_options):
185190
"""
186191
containers = self.containers(stopped=True)
187192

188-
if len(containers) == 0:
189-
log.info("Creating %s..." % self.next_container_name())
193+
if not containers:
194+
log.info("Creating %s..." % self._next_container_name(containers))
190195
container = self.create_container(**override_options)
191196
self.start_container(container)
192197
return [(None, container)]
@@ -264,7 +269,7 @@ def start_or_create_containers(self):
264269
containers = self.containers(stopped=True)
265270

266271
if not containers:
267-
log.info("Creating %s..." % self.next_container_name())
272+
log.info("Creating %s..." % self._next_container_name(containers))
268273
new_container = self.create_container()
269274
return [self.start_container(new_container)]
270275
else:
@@ -273,19 +278,15 @@ def start_or_create_containers(self):
273278
def get_linked_names(self):
274279
return [s.name for (s, _) in self.links]
275280

276-
def next_container_name(self, one_off=False):
281+
def _next_container_name(self, all_containers, one_off=False):
277282
bits = [self.project, self.name]
278283
if one_off:
279284
bits.append('run')
280-
return '_'.join(bits + [str(self.next_container_number(one_off=one_off))])
285+
return '_'.join(bits + [str(self._next_container_number(all_containers))])
281286

282-
def next_container_number(self, one_off=False):
283-
numbers = [parse_name(c.name)[2] for c in self.containers(stopped=True, one_off=one_off)]
284-
285-
if len(numbers) == 0:
286-
return 1
287-
else:
288-
return max(numbers) + 1
287+
def _next_container_number(self, all_containers):
288+
numbers = [parse_name(c.name).number for c in all_containers]
289+
return 1 if not numbers else max(numbers) + 1
289290

290291
def _get_links(self, link_to_self):
291292
links = []
@@ -319,7 +320,9 @@ def _get_container_create_options(self, override_options, one_off=False):
319320
container_options = dict((k, self.options[k]) for k in DOCKER_CONFIG_KEYS if k in self.options)
320321
container_options.update(override_options)
321322

322-
container_options['name'] = self.next_container_name(one_off)
323+
container_options['name'] = self._next_container_name(
324+
self.containers(stopped=True, one_off=one_off),
325+
one_off)
323326

324327
# If a qualified hostname was given, split it into an
325328
# unqualified hostname and a domainname unless domainname
@@ -429,10 +432,10 @@ def is_valid_name(name, one_off=False):
429432
return match.group(3) is None
430433

431434

432-
def parse_name(name, one_off=False):
435+
def parse_name(name):
433436
match = NAME_RE.match(name)
434437
(project, service_name, _, suffix) = match.groups()
435-
return (project, service_name, int(suffix))
438+
return ServiceName(project, service_name, int(suffix))
436439

437440

438441
def get_container_name(container):

tests/integration/testcases.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ class DockerClientTestCase(unittest.TestCase):
1010
@classmethod
1111
def setUpClass(cls):
1212
cls.client = Client(docker_url())
13-
cls.client.pull('busybox', tag='latest')
1413

1514
def setUp(self):
1615
for c in self.client.containers(all=True):

tests/unit/service_test.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818

1919
class ServiceTest(unittest.TestCase):
20+
21+
def setUp(self):
22+
self.mock_client = mock.create_autospec(docker.Client)
23+
2024
def test_name_validations(self):
2125
self.assertRaises(ConfigError, lambda: Service(name=''))
2226

@@ -70,29 +74,27 @@ def test_split_port_invalid(self):
7074
split_port("0.0.0.0:1000:2000:tcp")
7175

7276
def test_split_domainname_none(self):
73-
service = Service('foo',
74-
hostname = 'name',
75-
)
76-
service.next_container_name = lambda x: 'foo'
77+
service = Service('foo', hostname='name', client=self.mock_client)
78+
self.mock_client.containers.return_value = []
7779
opts = service._get_container_create_options({})
7880
self.assertEqual(opts['hostname'], 'name', 'hostname')
7981
self.assertFalse('domainname' in opts, 'domainname')
8082

8183
def test_split_domainname_fqdn(self):
8284
service = Service('foo',
83-
hostname = 'name.domain.tld',
84-
)
85-
service.next_container_name = lambda x: 'foo'
85+
hostname='name.domain.tld',
86+
client=self.mock_client)
87+
self.mock_client.containers.return_value = []
8688
opts = service._get_container_create_options({})
8789
self.assertEqual(opts['hostname'], 'name', 'hostname')
8890
self.assertEqual(opts['domainname'], 'domain.tld', 'domainname')
8991

9092
def test_split_domainname_both(self):
9193
service = Service('foo',
92-
hostname = 'name',
93-
domainname = 'domain.tld',
94-
)
95-
service.next_container_name = lambda x: 'foo'
94+
hostname='name',
95+
domainname='domain.tld',
96+
client=self.mock_client)
97+
self.mock_client.containers.return_value = []
9698
opts = service._get_container_create_options({})
9799
self.assertEqual(opts['hostname'], 'name', 'hostname')
98100
self.assertEqual(opts['domainname'], 'domain.tld', 'domainname')
@@ -101,8 +103,8 @@ def test_split_domainname_weird(self):
101103
service = Service('foo',
102104
hostname='name.sub',
103105
domainname='domain.tld',
104-
)
105-
service.next_container_name = lambda x: 'foo'
106+
client=self.mock_client)
107+
self.mock_client.containers.return_value = []
106108
opts = service._get_container_create_options({})
107109
self.assertEqual(opts['hostname'], 'name.sub', 'hostname')
108110
self.assertEqual(opts['domainname'], 'domain.tld', 'domainname')

0 commit comments

Comments
 (0)