mirror of
https://github.com/docker/compose.git
synced 2025-07-22 13:14:29 +02:00
Speed up integration test and make cleanup easier by using labels
Signed-off-by: Daniel Nephin <dnephin@gmail.com>
This commit is contained in:
parent
d827809ffb
commit
60351a8e07
1
tests/fixtures/build-ctx/Dockerfile
vendored
1
tests/fixtures/build-ctx/Dockerfile
vendored
@ -1,2 +1,3 @@
|
|||||||
FROM busybox:latest
|
FROM busybox:latest
|
||||||
|
LABEL com.docker.compose.test_image=true
|
||||||
CMD echo "success"
|
CMD echo "success"
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
FROM busybox
|
FROM busybox:latest
|
||||||
|
LABEL com.docker.compose.test_image=true
|
||||||
VOLUME /data
|
VOLUME /data
|
||||||
CMD top
|
CMD top
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
FROM busybox:latest
|
FROM busybox:latest
|
||||||
|
LABEL com.docker.compose.test_image=true
|
||||||
ENTRYPOINT echo "From prebuilt entrypoint"
|
ENTRYPOINT echo "From prebuilt entrypoint"
|
||||||
|
1
tests/fixtures/simple-dockerfile/Dockerfile
vendored
1
tests/fixtures/simple-dockerfile/Dockerfile
vendored
@ -1,2 +1,3 @@
|
|||||||
FROM busybox:latest
|
FROM busybox:latest
|
||||||
|
LABEL com.docker.compose.test_image=true
|
||||||
CMD echo "success"
|
CMD echo "success"
|
||||||
|
@ -24,6 +24,7 @@ class CLITestCase(DockerClientTestCase):
|
|||||||
self.project.remove_stopped()
|
self.project.remove_stopped()
|
||||||
for container in self.project.containers(stopped=True, one_off=True):
|
for container in self.project.containers(stopped=True, one_off=True):
|
||||||
container.remove(force=True)
|
container.remove(force=True)
|
||||||
|
super(CLITestCase, self).tearDown()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def project(self):
|
def project(self):
|
||||||
@ -207,13 +208,10 @@ class CLITestCase(DockerClientTestCase):
|
|||||||
self.assertEqual(old_ids, new_ids)
|
self.assertEqual(old_ids, new_ids)
|
||||||
|
|
||||||
@patch('dockerpty.start')
|
@patch('dockerpty.start')
|
||||||
def test_run_without_command(self, __):
|
def test_run_without_command(self, _):
|
||||||
self.command.base_dir = 'tests/fixtures/commands-composefile'
|
self.command.base_dir = 'tests/fixtures/commands-composefile'
|
||||||
self.check_build('tests/fixtures/simple-dockerfile', tag='composetest_test')
|
self.check_build('tests/fixtures/simple-dockerfile', tag='composetest_test')
|
||||||
|
|
||||||
for c in self.project.containers(stopped=True, one_off=True):
|
|
||||||
c.remove()
|
|
||||||
|
|
||||||
self.command.dispatch(['run', 'implicit'], None)
|
self.command.dispatch(['run', 'implicit'], None)
|
||||||
service = self.project.get_service('implicit')
|
service = self.project.get_service('implicit')
|
||||||
containers = service.containers(stopped=True, one_off=True)
|
containers = service.containers(stopped=True, one_off=True)
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
|
from docker.errors import APIError
|
||||||
|
|
||||||
from compose import legacy
|
from compose import legacy
|
||||||
from compose.project import Project
|
from compose.project import Project
|
||||||
from .testcases import DockerClientTestCase
|
from .testcases import DockerClientTestCase
|
||||||
|
|
||||||
|
|
||||||
class ProjectTest(DockerClientTestCase):
|
class LegacyTestCase(DockerClientTestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(ProjectTest, self).setUp()
|
super(LegacyTestCase, self).setUp()
|
||||||
|
self.containers = []
|
||||||
|
|
||||||
db = self.create_service('db')
|
db = self.create_service('db')
|
||||||
web = self.create_service('web', links=[(db, 'db')])
|
web = self.create_service('web', links=[(db, 'db')])
|
||||||
@ -23,12 +26,25 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
**service.options
|
**service.options
|
||||||
)
|
)
|
||||||
self.client.start(container)
|
self.client.start(container)
|
||||||
|
self.containers.append(container)
|
||||||
|
|
||||||
# Create a single one-off legacy container
|
# Create a single one-off legacy container
|
||||||
self.client.create_container(
|
self.containers.append(self.client.create_container(
|
||||||
name='{}_{}_run_1'.format(self.project.name, self.services[0].name),
|
name='{}_{}_run_1'.format(self.project.name, self.services[0].name),
|
||||||
**self.services[0].options
|
**self.services[0].options
|
||||||
)
|
))
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
super(LegacyTestCase, self).tearDown()
|
||||||
|
for container in self.containers:
|
||||||
|
try:
|
||||||
|
self.client.kill(container)
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
self.client.remove_container(container)
|
||||||
|
except APIError:
|
||||||
|
pass
|
||||||
|
|
||||||
def get_legacy_containers(self, **kwargs):
|
def get_legacy_containers(self, **kwargs):
|
||||||
return list(legacy.get_legacy_containers(
|
return list(legacy.get_legacy_containers(
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from compose import config
|
from compose import config
|
||||||
|
from compose.const import LABEL_PROJECT
|
||||||
from compose.project import Project
|
from compose.project import Project
|
||||||
from compose.container import Container
|
from compose.container import Container
|
||||||
from .testcases import DockerClientTestCase
|
from .testcases import DockerClientTestCase
|
||||||
@ -55,6 +57,7 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
image='busybox:latest',
|
image='busybox:latest',
|
||||||
volumes=['/var/data'],
|
volumes=['/var/data'],
|
||||||
name='composetest_data_container',
|
name='composetest_data_container',
|
||||||
|
labels={LABEL_PROJECT: 'composetest'},
|
||||||
)
|
)
|
||||||
project = Project.from_dicts(
|
project = Project.from_dicts(
|
||||||
name='composetest',
|
name='composetest',
|
||||||
@ -69,9 +72,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
db = project.get_service('db')
|
db = project.get_service('db')
|
||||||
self.assertEqual(db.volumes_from, [data_container])
|
self.assertEqual(db.volumes_from, [data_container])
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_net_from_service(self):
|
def test_net_from_service(self):
|
||||||
project = Project.from_dicts(
|
project = Project.from_dicts(
|
||||||
name='composetest',
|
name='composetest',
|
||||||
@ -95,15 +95,13 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
net = project.get_service('net')
|
net = project.get_service('net')
|
||||||
self.assertEqual(web._get_net(), 'container:' + net.containers()[0].id)
|
self.assertEqual(web._get_net(), 'container:' + net.containers()[0].id)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_net_from_container(self):
|
def test_net_from_container(self):
|
||||||
net_container = Container.create(
|
net_container = Container.create(
|
||||||
self.client,
|
self.client,
|
||||||
image='busybox:latest',
|
image='busybox:latest',
|
||||||
name='composetest_net_container',
|
name='composetest_net_container',
|
||||||
command='top'
|
command='top',
|
||||||
|
labels={LABEL_PROJECT: 'composetest'},
|
||||||
)
|
)
|
||||||
net_container.start()
|
net_container.start()
|
||||||
|
|
||||||
@ -123,9 +121,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
web = project.get_service('web')
|
web = project.get_service('web')
|
||||||
self.assertEqual(web._get_net(), 'container:' + net_container.id)
|
self.assertEqual(web._get_net(), 'container:' + net_container.id)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_start_stop_kill_remove(self):
|
def test_start_stop_kill_remove(self):
|
||||||
web = self.create_service('web')
|
web = self.create_service('web')
|
||||||
db = self.create_service('db')
|
db = self.create_service('db')
|
||||||
@ -171,9 +166,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertEqual(len(db.containers()), 1)
|
self.assertEqual(len(db.containers()), 1)
|
||||||
self.assertEqual(len(web.containers()), 0)
|
self.assertEqual(len(web.containers()), 0)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_project_up_starts_uncreated_services(self):
|
def test_project_up_starts_uncreated_services(self):
|
||||||
db = self.create_service('db')
|
db = self.create_service('db')
|
||||||
web = self.create_service('web', links=[(db, 'db')])
|
web = self.create_service('web', links=[(db, 'db')])
|
||||||
@ -205,9 +197,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertNotEqual(db_container.id, old_db_id)
|
self.assertNotEqual(db_container.id, old_db_id)
|
||||||
self.assertEqual(db_container.get('Volumes./etc'), db_volume_path)
|
self.assertEqual(db_container.get('Volumes./etc'), db_volume_path)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_project_up_with_no_recreate_running(self):
|
def test_project_up_with_no_recreate_running(self):
|
||||||
web = self.create_service('web')
|
web = self.create_service('web')
|
||||||
db = self.create_service('db', volumes=['/var/db'])
|
db = self.create_service('db', volumes=['/var/db'])
|
||||||
@ -228,9 +217,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertEqual(db_container.inspect()['Volumes']['/var/db'],
|
self.assertEqual(db_container.inspect()['Volumes']['/var/db'],
|
||||||
db_volume_path)
|
db_volume_path)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_project_up_with_no_recreate_stopped(self):
|
def test_project_up_with_no_recreate_stopped(self):
|
||||||
web = self.create_service('web')
|
web = self.create_service('web')
|
||||||
db = self.create_service('db', volumes=['/var/db'])
|
db = self.create_service('db', volumes=['/var/db'])
|
||||||
@ -258,9 +244,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertEqual(db_container.inspect()['Volumes']['/var/db'],
|
self.assertEqual(db_container.inspect()['Volumes']['/var/db'],
|
||||||
db_volume_path)
|
db_volume_path)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_project_up_without_all_services(self):
|
def test_project_up_without_all_services(self):
|
||||||
console = self.create_service('console')
|
console = self.create_service('console')
|
||||||
db = self.create_service('db')
|
db = self.create_service('db')
|
||||||
@ -273,9 +256,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertEqual(len(db.containers()), 1)
|
self.assertEqual(len(db.containers()), 1)
|
||||||
self.assertEqual(len(console.containers()), 1)
|
self.assertEqual(len(console.containers()), 1)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_project_up_starts_links(self):
|
def test_project_up_starts_links(self):
|
||||||
console = self.create_service('console')
|
console = self.create_service('console')
|
||||||
db = self.create_service('db', volumes=['/var/db'])
|
db = self.create_service('db', volumes=['/var/db'])
|
||||||
@ -291,9 +271,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertEqual(len(db.containers()), 1)
|
self.assertEqual(len(db.containers()), 1)
|
||||||
self.assertEqual(len(console.containers()), 0)
|
self.assertEqual(len(console.containers()), 0)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_project_up_starts_depends(self):
|
def test_project_up_starts_depends(self):
|
||||||
project = Project.from_dicts(
|
project = Project.from_dicts(
|
||||||
name='composetest',
|
name='composetest',
|
||||||
@ -329,9 +306,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertEqual(len(project.get_service('data').containers()), 1)
|
self.assertEqual(len(project.get_service('data').containers()), 1)
|
||||||
self.assertEqual(len(project.get_service('console').containers()), 0)
|
self.assertEqual(len(project.get_service('console').containers()), 0)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_project_up_with_no_deps(self):
|
def test_project_up_with_no_deps(self):
|
||||||
project = Project.from_dicts(
|
project = Project.from_dicts(
|
||||||
name='composetest',
|
name='composetest',
|
||||||
@ -368,9 +342,6 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
self.assertEqual(len(project.get_service('data').containers(stopped=True)), 1)
|
self.assertEqual(len(project.get_service('data').containers(stopped=True)), 1)
|
||||||
self.assertEqual(len(project.get_service('console').containers()), 0)
|
self.assertEqual(len(project.get_service('console').containers()), 0)
|
||||||
|
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
|
||||||
def test_unscale_after_restart(self):
|
def test_unscale_after_restart(self):
|
||||||
web = self.create_service('web')
|
web = self.create_service('web')
|
||||||
project = Project('composetest', [web], self.client)
|
project = Project('composetest', [web], self.client)
|
||||||
@ -395,5 +366,3 @@ class ProjectTest(DockerClientTestCase):
|
|||||||
project.up()
|
project.up()
|
||||||
service = project.get_service('web')
|
service = project.get_service('web')
|
||||||
self.assertEqual(len(service.containers()), 1)
|
self.assertEqual(len(service.containers()), 1)
|
||||||
project.kill()
|
|
||||||
project.remove_stopped()
|
|
||||||
|
@ -235,7 +235,12 @@ class ServiceTest(DockerClientTestCase):
|
|||||||
def test_create_container_with_volumes_from(self):
|
def test_create_container_with_volumes_from(self):
|
||||||
volume_service = self.create_service('data')
|
volume_service = self.create_service('data')
|
||||||
volume_container_1 = volume_service.create_container()
|
volume_container_1 = volume_service.create_container()
|
||||||
volume_container_2 = Container.create(self.client, image='busybox:latest', command=["top"])
|
volume_container_2 = Container.create(
|
||||||
|
self.client,
|
||||||
|
image='busybox:latest',
|
||||||
|
command=["top"],
|
||||||
|
labels={LABEL_PROJECT: 'composetest'},
|
||||||
|
)
|
||||||
host_service = self.create_service('host', volumes_from=[volume_service, volume_container_2])
|
host_service = self.create_service('host', volumes_from=[volume_service, volume_container_2])
|
||||||
host_container = host_service.create_container()
|
host_container = host_service.create_container()
|
||||||
host_service.start_container(host_container)
|
host_service.start_container(host_container)
|
||||||
@ -408,7 +413,7 @@ class ServiceTest(DockerClientTestCase):
|
|||||||
self.assertEqual(len(self.client.images(name='composetest_test')), 1)
|
self.assertEqual(len(self.client.images(name='composetest_test')), 1)
|
||||||
|
|
||||||
def test_start_container_uses_tagged_image_if_it_exists(self):
|
def test_start_container_uses_tagged_image_if_it_exists(self):
|
||||||
self.client.build('tests/fixtures/simple-dockerfile', tag='composetest_test')
|
self.check_build('tests/fixtures/simple-dockerfile', tag='composetest_test')
|
||||||
service = Service(
|
service = Service(
|
||||||
name='test',
|
name='test',
|
||||||
client=self.client,
|
client=self.client,
|
||||||
|
@ -216,18 +216,19 @@ class ServiceStateTest(DockerClientTestCase):
|
|||||||
|
|
||||||
def test_trigger_recreate_with_build(self):
|
def test_trigger_recreate_with_build(self):
|
||||||
context = tempfile.mkdtemp()
|
context = tempfile.mkdtemp()
|
||||||
|
base_image = "FROM busybox\nLABEL com.docker.compose.test_image=true\n"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
dockerfile = os.path.join(context, 'Dockerfile')
|
dockerfile = os.path.join(context, 'Dockerfile')
|
||||||
|
|
||||||
with open(dockerfile, 'w') as f:
|
with open(dockerfile, 'w') as f:
|
||||||
f.write('FROM busybox\n')
|
f.write(base_image)
|
||||||
|
|
||||||
web = self.create_service('web', build=context)
|
web = self.create_service('web', build=context)
|
||||||
container = web.create_container()
|
container = web.create_container()
|
||||||
|
|
||||||
with open(dockerfile, 'w') as f:
|
with open(dockerfile, 'w') as f:
|
||||||
f.write('FROM busybox\nCMD echo hello world\n')
|
f.write(base_image + 'CMD echo hello world\n')
|
||||||
web.build()
|
web.build()
|
||||||
|
|
||||||
web = self.create_service('web', build=context)
|
web = self.create_service('web', build=context)
|
||||||
|
@ -13,14 +13,14 @@ class DockerClientTestCase(unittest.TestCase):
|
|||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
cls.client = docker_client()
|
cls.client = docker_client()
|
||||||
|
|
||||||
def setUp(self):
|
def tearDown(self):
|
||||||
for c in self.client.containers(
|
for c in self.client.containers(
|
||||||
all=True,
|
all=True,
|
||||||
filters={'label': '%s=composetest' % LABEL_PROJECT}):
|
filters={'label': '%s=composetest' % LABEL_PROJECT}):
|
||||||
self.client.kill(c['Id'])
|
self.client.kill(c['Id'])
|
||||||
self.client.remove_container(c['Id'])
|
self.client.remove_container(c['Id'])
|
||||||
for i in self.client.images():
|
for i in self.client.images(
|
||||||
if isinstance(i.get('Tag'), basestring) and 'composetest' in i['Tag']:
|
filters={'label': 'com.docker.compose.test_image'}):
|
||||||
self.client.remove_image(i)
|
self.client.remove_image(i)
|
||||||
|
|
||||||
def create_service(self, name, **kwargs):
|
def create_service(self, name, **kwargs):
|
||||||
@ -37,5 +37,6 @@ class DockerClientTestCase(unittest.TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def check_build(self, *args, **kwargs):
|
def check_build(self, *args, **kwargs):
|
||||||
|
kwargs.setdefault('rm', True)
|
||||||
build_output = self.client.build(*args, **kwargs)
|
build_output = self.client.build(*args, **kwargs)
|
||||||
stream_output(build_output, open('/dev/null', 'w'))
|
stream_output(build_output, open('/dev/null', 'w'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user