Merge pull request #2646 from dnephin/docker_compose_down
docker-compose down
This commit is contained in:
commit
172b955d79
14 changed files with 208 additions and 9 deletions
|
|
@ -314,6 +314,22 @@ class CLITestCase(DockerClientTestCase):
|
|||
['create', '--force-recreate', '--no-recreate'],
|
||||
returncode=1)
|
||||
|
||||
def test_down_invalid_rmi_flag(self):
|
||||
result = self.dispatch(['down', '--rmi', 'bogus'], returncode=1)
|
||||
assert '--rmi flag must be' in result.stderr
|
||||
|
||||
def test_down(self):
|
||||
self.base_dir = 'tests/fixtures/shutdown'
|
||||
self.dispatch(['up', '-d'])
|
||||
wait_on_condition(ContainerCountCondition(self.project, 1))
|
||||
|
||||
result = self.dispatch(['down', '--rmi=local', '--volumes'])
|
||||
assert 'Stopping shutdown_web_1' in result.stderr
|
||||
assert 'Removing shutdown_web_1' in result.stderr
|
||||
assert 'Removing volume shutdown_data' in result.stderr
|
||||
assert 'Removing image shutdown_web' in result.stderr
|
||||
assert 'Removing network shutdown_default' in result.stderr
|
||||
|
||||
def test_up_detached(self):
|
||||
self.dispatch(['up', '-d'])
|
||||
service = self.project.get_service('simple')
|
||||
|
|
|
|||
4
tests/fixtures/shutdown/Dockerfile
vendored
Normal file
4
tests/fixtures/shutdown/Dockerfile
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
FROM busybox:latest
|
||||
RUN echo something
|
||||
CMD top
|
||||
10
tests/fixtures/shutdown/docker-compose.yml
vendored
Normal file
10
tests/fixtures/shutdown/docker-compose.yml
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
|
||||
version: 2
|
||||
|
||||
volumes:
|
||||
data:
|
||||
driver: local
|
||||
|
||||
services:
|
||||
web:
|
||||
build: .
|
||||
|
|
@ -616,13 +616,13 @@ class ServiceTest(DockerClientTestCase):
|
|||
service.create_container(number=next_number)
|
||||
service.create_container(number=next_number + 1)
|
||||
|
||||
with mock.patch('sys.stdout', new_callable=StringIO) as mock_stdout:
|
||||
with mock.patch('sys.stderr', new_callable=StringIO) as mock_stderr:
|
||||
service.scale(2)
|
||||
for container in service.containers():
|
||||
self.assertTrue(container.is_running)
|
||||
self.assertTrue(container.number in valid_numbers)
|
||||
|
||||
captured_output = mock_stdout.getvalue()
|
||||
captured_output = mock_stderr.getvalue()
|
||||
self.assertNotIn('Creating', captured_output)
|
||||
self.assertIn('Starting', captured_output)
|
||||
|
||||
|
|
@ -639,14 +639,14 @@ class ServiceTest(DockerClientTestCase):
|
|||
for container in service.containers():
|
||||
self.assertFalse(container.is_running)
|
||||
|
||||
with mock.patch('sys.stdout', new_callable=StringIO) as mock_stdout:
|
||||
with mock.patch('sys.stderr', new_callable=StringIO) as mock_stderr:
|
||||
service.scale(2)
|
||||
|
||||
self.assertEqual(len(service.containers()), 2)
|
||||
for container in service.containers():
|
||||
self.assertTrue(container.is_running)
|
||||
|
||||
captured_output = mock_stdout.getvalue()
|
||||
captured_output = mock_stderr.getvalue()
|
||||
self.assertIn('Creating', captured_output)
|
||||
self.assertIn('Starting', captured_output)
|
||||
|
||||
|
|
@ -665,12 +665,12 @@ class ServiceTest(DockerClientTestCase):
|
|||
response={},
|
||||
explanation="Boom")):
|
||||
|
||||
with mock.patch('sys.stdout', new_callable=StringIO) as mock_stdout:
|
||||
with mock.patch('sys.stderr', new_callable=StringIO) as mock_stderr:
|
||||
service.scale(3)
|
||||
|
||||
self.assertEqual(len(service.containers()), 1)
|
||||
self.assertTrue(service.containers()[0].is_running)
|
||||
self.assertIn("ERROR: for 2 Boom", mock_stdout.getvalue())
|
||||
self.assertIn("ERROR: for 2 Boom", mock_stderr.getvalue())
|
||||
|
||||
def test_scale_with_unexpected_exception(self):
|
||||
"""Test that when scaling if the API returns an error, that is not of type
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ from __future__ import absolute_import
|
|||
from __future__ import unicode_literals
|
||||
|
||||
import docker
|
||||
from docker.errors import APIError
|
||||
|
||||
from .. import mock
|
||||
from .. import unittest
|
||||
|
|
@ -16,6 +17,7 @@ from compose.service import build_ulimits
|
|||
from compose.service import build_volume_binding
|
||||
from compose.service import ContainerNet
|
||||
from compose.service import get_container_data_volumes
|
||||
from compose.service import ImageType
|
||||
from compose.service import merge_volume_bindings
|
||||
from compose.service import NeedsBuildError
|
||||
from compose.service import Net
|
||||
|
|
@ -422,6 +424,38 @@ class ServiceTest(unittest.TestCase):
|
|||
}
|
||||
self.assertEqual(config_dict, expected)
|
||||
|
||||
def test_remove_image_none(self):
|
||||
web = Service('web', image='example', client=self.mock_client)
|
||||
assert not web.remove_image(ImageType.none)
|
||||
assert not self.mock_client.remove_image.called
|
||||
|
||||
def test_remove_image_local_with_image_name_doesnt_remove(self):
|
||||
web = Service('web', image='example', client=self.mock_client)
|
||||
assert not web.remove_image(ImageType.local)
|
||||
assert not self.mock_client.remove_image.called
|
||||
|
||||
def test_remove_image_local_without_image_name_does_remove(self):
|
||||
web = Service('web', build='.', client=self.mock_client)
|
||||
assert web.remove_image(ImageType.local)
|
||||
self.mock_client.remove_image.assert_called_once_with(web.image_name)
|
||||
|
||||
def test_remove_image_all_does_remove(self):
|
||||
web = Service('web', image='example', client=self.mock_client)
|
||||
assert web.remove_image(ImageType.all)
|
||||
self.mock_client.remove_image.assert_called_once_with(web.image_name)
|
||||
|
||||
def test_remove_image_with_error(self):
|
||||
self.mock_client.remove_image.side_effect = error = APIError(
|
||||
message="testing",
|
||||
response={},
|
||||
explanation="Boom")
|
||||
|
||||
web = Service('web', image='example', client=self.mock_client)
|
||||
with mock.patch('compose.service.log', autospec=True) as mock_log:
|
||||
assert not web.remove_image(ImageType.all)
|
||||
mock_log.error.assert_called_once_with(
|
||||
"Failed to remove image for service %s: %s", web.name, error)
|
||||
|
||||
def test_specifies_host_port_with_no_ports(self):
|
||||
service = Service(
|
||||
'foo',
|
||||
|
|
|
|||
26
tests/unit/volume_test.py
Normal file
26
tests/unit/volume_test.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
from __future__ import absolute_import
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import docker
|
||||
import pytest
|
||||
|
||||
from compose import volume
|
||||
from tests import mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_client():
|
||||
return mock.create_autospec(docker.Client)
|
||||
|
||||
|
||||
class TestVolume(object):
|
||||
|
||||
def test_remove_local_volume(self, mock_client):
|
||||
vol = volume.Volume(mock_client, 'foo', 'project')
|
||||
vol.remove()
|
||||
mock_client.remove_volume.assert_called_once_with('foo_project')
|
||||
|
||||
def test_remove_external_volume(self, mock_client):
|
||||
vol = volume.Volume(mock_client, 'foo', 'project', external_name='data')
|
||||
vol.remove()
|
||||
assert not mock_client.remove_volume.called
|
||||
Loading…
Add table
Add a link
Reference in a new issue