|
@@ -18,6 +18,7 @@ from docker import errors
|
|
|
from .. import mock
|
|
from .. import mock
|
|
|
from compose.cli.command import get_project
|
|
from compose.cli.command import get_project
|
|
|
from compose.container import Container
|
|
from compose.container import Container
|
|
|
|
|
+from compose.project import OneOffFilter
|
|
|
from tests.integration.testcases import DockerClientTestCase
|
|
from tests.integration.testcases import DockerClientTestCase
|
|
|
from tests.integration.testcases import get_links
|
|
from tests.integration.testcases import get_links
|
|
|
from tests.integration.testcases import pull_busybox
|
|
from tests.integration.testcases import pull_busybox
|
|
@@ -105,7 +106,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
self.project.kill()
|
|
self.project.kill()
|
|
|
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=OneOffFilter.only):
|
|
|
container.remove(force=True)
|
|
container.remove(force=True)
|
|
|
|
|
|
|
|
networks = self.client.networks()
|
|
networks = self.client.networks()
|
|
@@ -365,14 +366,22 @@ class CLITestCase(DockerClientTestCase):
|
|
|
@v2_only()
|
|
@v2_only()
|
|
|
def test_down(self):
|
|
def test_down(self):
|
|
|
self.base_dir = 'tests/fixtures/v2-full'
|
|
self.base_dir = 'tests/fixtures/v2-full'
|
|
|
|
|
+
|
|
|
self.dispatch(['up', '-d'])
|
|
self.dispatch(['up', '-d'])
|
|
|
wait_on_condition(ContainerCountCondition(self.project, 2))
|
|
wait_on_condition(ContainerCountCondition(self.project, 2))
|
|
|
|
|
|
|
|
|
|
+ self.dispatch(['run', 'web', 'true'])
|
|
|
|
|
+ self.dispatch(['run', '-d', 'web', 'tail', '-f', '/dev/null'])
|
|
|
|
|
+ assert len(self.project.containers(one_off=OneOffFilter.only, stopped=True)) == 2
|
|
|
|
|
+
|
|
|
result = self.dispatch(['down', '--rmi=local', '--volumes'])
|
|
result = self.dispatch(['down', '--rmi=local', '--volumes'])
|
|
|
assert 'Stopping v2full_web_1' in result.stderr
|
|
assert 'Stopping v2full_web_1' in result.stderr
|
|
|
assert 'Stopping v2full_other_1' in result.stderr
|
|
assert 'Stopping v2full_other_1' in result.stderr
|
|
|
|
|
+ assert 'Stopping v2full_web_run_2' in result.stderr
|
|
|
assert 'Removing v2full_web_1' in result.stderr
|
|
assert 'Removing v2full_web_1' in result.stderr
|
|
|
assert 'Removing v2full_other_1' in result.stderr
|
|
assert 'Removing v2full_other_1' in result.stderr
|
|
|
|
|
+ assert 'Removing v2full_web_run_1' in result.stderr
|
|
|
|
|
+ assert 'Removing v2full_web_run_2' in result.stderr
|
|
|
assert 'Removing volume v2full_data' in result.stderr
|
|
assert 'Removing volume v2full_data' in result.stderr
|
|
|
assert 'Removing image v2full_web' in result.stderr
|
|
assert 'Removing image v2full_web' in result.stderr
|
|
|
assert 'Removing image busybox' not in result.stderr
|
|
assert 'Removing image busybox' not in result.stderr
|
|
@@ -802,7 +811,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
self.assertEqual(len(self.project.containers()), 0)
|
|
self.assertEqual(len(self.project.containers()), 0)
|
|
|
|
|
|
|
|
# Ensure stdin/out was open
|
|
# Ensure stdin/out was open
|
|
|
- container = self.project.containers(stopped=True, one_off=True)[0]
|
|
|
|
|
|
|
+ container = self.project.containers(stopped=True, one_off=OneOffFilter.only)[0]
|
|
|
config = container.inspect()['Config']
|
|
config = container.inspect()['Config']
|
|
|
self.assertTrue(config['AttachStderr'])
|
|
self.assertTrue(config['AttachStderr'])
|
|
|
self.assertTrue(config['AttachStdout'])
|
|
self.assertTrue(config['AttachStdout'])
|
|
@@ -852,7 +861,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
|
|
|
|
|
self.dispatch(['run', 'implicit'])
|
|
self.dispatch(['run', 'implicit'])
|
|
|
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=OneOffFilter.only)
|
|
|
self.assertEqual(
|
|
self.assertEqual(
|
|
|
[c.human_readable_command for c in containers],
|
|
[c.human_readable_command for c in containers],
|
|
|
[u'/bin/sh -c echo "success"'],
|
|
[u'/bin/sh -c echo "success"'],
|
|
@@ -860,7 +869,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
|
|
|
|
|
self.dispatch(['run', 'explicit'])
|
|
self.dispatch(['run', 'explicit'])
|
|
|
service = self.project.get_service('explicit')
|
|
service = self.project.get_service('explicit')
|
|
|
- containers = service.containers(stopped=True, one_off=True)
|
|
|
|
|
|
|
+ containers = service.containers(stopped=True, one_off=OneOffFilter.only)
|
|
|
self.assertEqual(
|
|
self.assertEqual(
|
|
|
[c.human_readable_command for c in containers],
|
|
[c.human_readable_command for c in containers],
|
|
|
[u'/bin/true'],
|
|
[u'/bin/true'],
|
|
@@ -871,7 +880,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
name = 'service'
|
|
name = 'service'
|
|
|
self.dispatch(['run', '--entrypoint', '/bin/echo', name, 'helloworld'])
|
|
self.dispatch(['run', '--entrypoint', '/bin/echo', name, 'helloworld'])
|
|
|
service = self.project.get_service(name)
|
|
service = self.project.get_service(name)
|
|
|
- container = service.containers(stopped=True, one_off=True)[0]
|
|
|
|
|
|
|
+ container = service.containers(stopped=True, one_off=OneOffFilter.only)[0]
|
|
|
self.assertEqual(
|
|
self.assertEqual(
|
|
|
shlex.split(container.human_readable_command),
|
|
shlex.split(container.human_readable_command),
|
|
|
[u'/bin/echo', u'helloworld'],
|
|
[u'/bin/echo', u'helloworld'],
|
|
@@ -883,7 +892,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
user = 'sshd'
|
|
user = 'sshd'
|
|
|
self.dispatch(['run', '--user={user}'.format(user=user), name], returncode=1)
|
|
self.dispatch(['run', '--user={user}'.format(user=user), name], returncode=1)
|
|
|
service = self.project.get_service(name)
|
|
service = self.project.get_service(name)
|
|
|
- container = service.containers(stopped=True, one_off=True)[0]
|
|
|
|
|
|
|
+ container = service.containers(stopped=True, one_off=OneOffFilter.only)[0]
|
|
|
self.assertEqual(user, container.get('Config.User'))
|
|
self.assertEqual(user, container.get('Config.User'))
|
|
|
|
|
|
|
|
def test_run_service_with_user_overridden_short_form(self):
|
|
def test_run_service_with_user_overridden_short_form(self):
|
|
@@ -892,7 +901,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
user = 'sshd'
|
|
user = 'sshd'
|
|
|
self.dispatch(['run', '-u', user, name], returncode=1)
|
|
self.dispatch(['run', '-u', user, name], returncode=1)
|
|
|
service = self.project.get_service(name)
|
|
service = self.project.get_service(name)
|
|
|
- container = service.containers(stopped=True, one_off=True)[0]
|
|
|
|
|
|
|
+ container = service.containers(stopped=True, one_off=OneOffFilter.only)[0]
|
|
|
self.assertEqual(user, container.get('Config.User'))
|
|
self.assertEqual(user, container.get('Config.User'))
|
|
|
|
|
|
|
|
def test_run_service_with_environement_overridden(self):
|
|
def test_run_service_with_environement_overridden(self):
|
|
@@ -906,7 +915,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
'/bin/true',
|
|
'/bin/true',
|
|
|
])
|
|
])
|
|
|
service = self.project.get_service(name)
|
|
service = self.project.get_service(name)
|
|
|
- container = service.containers(stopped=True, one_off=True)[0]
|
|
|
|
|
|
|
+ container = service.containers(stopped=True, one_off=OneOffFilter.only)[0]
|
|
|
# env overriden
|
|
# env overriden
|
|
|
self.assertEqual('notbar', container.environment['foo'])
|
|
self.assertEqual('notbar', container.environment['foo'])
|
|
|
# keep environement from yaml
|
|
# keep environement from yaml
|
|
@@ -920,7 +929,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
# create one off container
|
|
# create one off container
|
|
|
self.base_dir = 'tests/fixtures/ports-composefile'
|
|
self.base_dir = 'tests/fixtures/ports-composefile'
|
|
|
self.dispatch(['run', '-d', 'simple'])
|
|
self.dispatch(['run', '-d', 'simple'])
|
|
|
- container = self.project.get_service('simple').containers(one_off=True)[0]
|
|
|
|
|
|
|
+ container = self.project.get_service('simple').containers(one_off=OneOffFilter.only)[0]
|
|
|
|
|
|
|
|
# get port information
|
|
# get port information
|
|
|
port_random = container.get_local_port(3000)
|
|
port_random = container.get_local_port(3000)
|
|
@@ -937,7 +946,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
# create one off container
|
|
# create one off container
|
|
|
self.base_dir = 'tests/fixtures/ports-composefile'
|
|
self.base_dir = 'tests/fixtures/ports-composefile'
|
|
|
self.dispatch(['run', '-d', '--service-ports', 'simple'])
|
|
self.dispatch(['run', '-d', '--service-ports', 'simple'])
|
|
|
- container = self.project.get_service('simple').containers(one_off=True)[0]
|
|
|
|
|
|
|
+ container = self.project.get_service('simple').containers(one_off=OneOffFilter.only)[0]
|
|
|
|
|
|
|
|
# get port information
|
|
# get port information
|
|
|
port_random = container.get_local_port(3000)
|
|
port_random = container.get_local_port(3000)
|
|
@@ -958,7 +967,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
# create one off container
|
|
# create one off container
|
|
|
self.base_dir = 'tests/fixtures/ports-composefile'
|
|
self.base_dir = 'tests/fixtures/ports-composefile'
|
|
|
self.dispatch(['run', '-d', '-p', '30000:3000', '--publish', '30001:3001', 'simple'])
|
|
self.dispatch(['run', '-d', '-p', '30000:3000', '--publish', '30001:3001', 'simple'])
|
|
|
- container = self.project.get_service('simple').containers(one_off=True)[0]
|
|
|
|
|
|
|
+ container = self.project.get_service('simple').containers(one_off=OneOffFilter.only)[0]
|
|
|
|
|
|
|
|
# get port information
|
|
# get port information
|
|
|
port_short = container.get_local_port(3000)
|
|
port_short = container.get_local_port(3000)
|
|
@@ -980,7 +989,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
'--publish', '127.0.0.1:30001:3001',
|
|
'--publish', '127.0.0.1:30001:3001',
|
|
|
'simple'
|
|
'simple'
|
|
|
])
|
|
])
|
|
|
- container = self.project.get_service('simple').containers(one_off=True)[0]
|
|
|
|
|
|
|
+ container = self.project.get_service('simple').containers(one_off=OneOffFilter.only)[0]
|
|
|
|
|
|
|
|
# get port information
|
|
# get port information
|
|
|
port_short = container.get_local_port(3000)
|
|
port_short = container.get_local_port(3000)
|
|
@@ -997,7 +1006,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
# create one off container
|
|
# create one off container
|
|
|
self.base_dir = 'tests/fixtures/expose-composefile'
|
|
self.base_dir = 'tests/fixtures/expose-composefile'
|
|
|
self.dispatch(['run', '-d', '--service-ports', 'simple'])
|
|
self.dispatch(['run', '-d', '--service-ports', 'simple'])
|
|
|
- container = self.project.get_service('simple').containers(one_off=True)[0]
|
|
|
|
|
|
|
+ container = self.project.get_service('simple').containers(one_off=OneOffFilter.only)[0]
|
|
|
|
|
|
|
|
ports = container.ports
|
|
ports = container.ports
|
|
|
self.assertEqual(len(ports), 9)
|
|
self.assertEqual(len(ports), 9)
|
|
@@ -1021,7 +1030,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
self.dispatch(['run', '--name', name, 'service', '/bin/true'])
|
|
self.dispatch(['run', '--name', name, 'service', '/bin/true'])
|
|
|
|
|
|
|
|
service = self.project.get_service('service')
|
|
service = self.project.get_service('service')
|
|
|
- container, = service.containers(stopped=True, one_off=True)
|
|
|
|
|
|
|
+ container, = service.containers(stopped=True, one_off=OneOffFilter.only)
|
|
|
self.assertEqual(container.name, name)
|
|
self.assertEqual(container.name, name)
|
|
|
|
|
|
|
|
def test_run_service_with_workdir_overridden(self):
|
|
def test_run_service_with_workdir_overridden(self):
|
|
@@ -1051,7 +1060,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
self.dispatch(['run', 'app', 'nslookup', 'db'])
|
|
self.dispatch(['run', 'app', 'nslookup', 'db'])
|
|
|
|
|
|
|
|
containers = self.project.get_service('app').containers(
|
|
containers = self.project.get_service('app').containers(
|
|
|
- stopped=True, one_off=True)
|
|
|
|
|
|
|
+ stopped=True, one_off=OneOffFilter.only)
|
|
|
assert len(containers) == 2
|
|
assert len(containers) == 2
|
|
|
|
|
|
|
|
for container in containers:
|
|
for container in containers:
|
|
@@ -1071,7 +1080,7 @@ class CLITestCase(DockerClientTestCase):
|
|
|
self.dispatch(['up', '-d'])
|
|
self.dispatch(['up', '-d'])
|
|
|
self.dispatch(['run', '-d', 'app', 'top'])
|
|
self.dispatch(['run', '-d', 'app', 'top'])
|
|
|
|
|
|
|
|
- container = self.project.get_service('app').containers(one_off=True)[0]
|
|
|
|
|
|
|
+ container = self.project.get_service('app').containers(one_off=OneOffFilter.only)[0]
|
|
|
networks = container.get('NetworkSettings.Networks')
|
|
networks = container.get('NetworkSettings.Networks')
|
|
|
|
|
|
|
|
assert sorted(list(networks)) == [
|
|
assert sorted(list(networks)) == [
|
|
@@ -1125,6 +1134,28 @@ class CLITestCase(DockerClientTestCase):
|
|
|
self.dispatch(['rm', '-f'], None)
|
|
self.dispatch(['rm', '-f'], None)
|
|
|
self.assertEqual(len(service.containers(stopped=True)), 0)
|
|
self.assertEqual(len(service.containers(stopped=True)), 0)
|
|
|
|
|
|
|
|
|
|
+ def test_rm_all(self):
|
|
|
|
|
+ service = self.project.get_service('simple')
|
|
|
|
|
+ service.create_container(one_off=False)
|
|
|
|
|
+ service.create_container(one_off=True)
|
|
|
|
|
+ kill_service(service)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True)), 1)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True, one_off=OneOffFilter.only)), 1)
|
|
|
|
|
+ self.dispatch(['rm', '-f'], None)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True)), 0)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True, one_off=OneOffFilter.only)), 1)
|
|
|
|
|
+ self.dispatch(['rm', '-f', '-a'], None)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True, one_off=OneOffFilter.only)), 0)
|
|
|
|
|
+
|
|
|
|
|
+ service.create_container(one_off=False)
|
|
|
|
|
+ service.create_container(one_off=True)
|
|
|
|
|
+ kill_service(service)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True)), 1)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True, one_off=OneOffFilter.only)), 1)
|
|
|
|
|
+ self.dispatch(['rm', '-f', '--all'], None)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True)), 0)
|
|
|
|
|
+ self.assertEqual(len(service.containers(stopped=True, one_off=OneOffFilter.only)), 0)
|
|
|
|
|
+
|
|
|
def test_stop(self):
|
|
def test_stop(self):
|
|
|
self.dispatch(['up', '-d'], None)
|
|
self.dispatch(['up', '-d'], None)
|
|
|
service = self.project.get_service('simple')
|
|
service = self.project.get_service('simple')
|