Merge 2.x and 3.x schemas

Signed-off-by: aiordache <anca.iordache@docker.com>
This commit is contained in:
aiordache 2020-06-26 10:21:48 +02:00
parent 789bfb0e8b
commit b78c1ec193
30 changed files with 522 additions and 7748 deletions

View file

@ -20,6 +20,8 @@ from ..helpers import BUSYBOX_IMAGE_WITH_TAG
from ..helpers import create_host_file
from compose.cli.command import get_project
from compose.config.errors import DuplicateOverrideFileFound
from compose.const import COMPOSEFILE_V1 as V1
from compose.const import COMPOSEFILE_V4 as VERSION
from compose.container import Container
from compose.project import OneOffFilter
from compose.utils import nanoseconds_from_time_seconds
@ -29,10 +31,6 @@ from tests.integration.testcases import is_cluster
from tests.integration.testcases import no_cluster
from tests.integration.testcases import pull_busybox
from tests.integration.testcases import SWARM_SKIP_RM_VOLUMES
from tests.integration.testcases import v2_1_only
from tests.integration.testcases import v2_2_only
from tests.integration.testcases import v2_only
from tests.integration.testcases import v3_only
DOCKER_COMPOSE_EXECUTABLE = 'docker-compose'
@ -42,7 +40,7 @@ ProcessResult = namedtuple('ProcessResult', 'stdout stderr')
BUILD_CACHE_TEXT = 'Using cache'
BUILD_PULL_TEXT = 'Status: Image is up to date for busybox:1.27.2'
COMPOSE_COMPATIBILITY_DICT = {
'version': '2.3',
'version': str(VERSION),
'volumes': {'foo': {'driver': 'default'}},
'networks': {'bar': {}},
'services': {
@ -287,7 +285,7 @@ services:
output = yaml.safe_load(result.stdout)
expected = {
'version': '2.0',
'version': str(VERSION),
'volumes': {'data': {'driver': 'local'}},
'networks': {'front': {}},
'services': {
@ -311,7 +309,7 @@ services:
self.base_dir = 'tests/fixtures/restart'
result = self.dispatch(['config'])
assert yaml.safe_load(result.stdout) == {
'version': '2.0',
'version': str(VERSION),
'services': {
'never': {
'image': 'busybox',
@ -343,10 +341,12 @@ services:
assert 'networks' in json_result
assert json_result['networks'] == {
'networks_foo': {
'external': True # {'name': 'networks_foo'}
'external': True,
'name': 'networks_foo'
},
'bar': {
'external': {'name': 'networks_bar'}
'external': True,
'name': 'networks_bar'
}
}
@ -355,14 +355,14 @@ services:
result = self.dispatch(['config'])
json_result = yaml.safe_load(result.stdout)
assert json_result == {
'version': str(VERSION),
'services': {
'web': {
'command': 'true',
'image': 'alpine:latest',
'ports': ['5643/tcp', '9999/tcp']
'ports': [{'target': 5643}, {'target': 9999}]
}
},
'version': '2.4'
}
}
def test_config_with_env_file(self):
@ -370,14 +370,14 @@ services:
result = self.dispatch(['--env-file', '.env2', 'config'])
json_result = yaml.safe_load(result.stdout)
assert json_result == {
'version': str(VERSION),
'services': {
'web': {
'command': 'false',
'image': 'alpine:latest',
'ports': ['5644/tcp', '9998/tcp']
'ports': [{'target': 5644}, {'target': 9998}]
}
},
'version': '2.4'
}
}
def test_config_with_dot_env_and_override_dir(self):
@ -385,14 +385,14 @@ services:
result = self.dispatch(['--project-directory', 'alt/', 'config'])
json_result = yaml.safe_load(result.stdout)
assert json_result == {
'version': str(VERSION),
'services': {
'web': {
'command': 'echo uwu',
'image': 'alpine:3.10.1',
'ports': ['3341/tcp', '4449/tcp']
'ports': [{'target': 3341}, {'target': 4449}]
}
},
'version': '2.4'
}
}
def test_config_external_volume_v2(self):
@ -403,11 +403,11 @@ services:
assert json_result['volumes'] == {
'foo': {
'external': True,
'name': 'foo',
},
'bar': {
'external': {
'name': 'some_bar',
},
'external': True,
'name': 'some_bar',
}
}
@ -435,11 +435,11 @@ services:
assert json_result['volumes'] == {
'foo': {
'external': True,
'name': 'foo',
},
'bar': {
'external': {
'name': 'some_bar',
},
'external': True,
'name': 'some_bar',
}
}
@ -479,7 +479,7 @@ services:
self.base_dir = 'tests/fixtures/v1-config'
result = self.dispatch(['config'])
assert yaml.safe_load(result.stdout) == {
'version': '2.1',
'version': str(V1),
'services': {
'net': {
'image': 'busybox',
@ -498,13 +498,11 @@ services:
},
}
@v3_only()
def test_config_v3(self):
self.base_dir = 'tests/fixtures/v3-full'
result = self.dispatch(['config'])
assert yaml.safe_load(result.stdout) == {
'version': '3.5',
'version': str(VERSION),
'volumes': {
'foobar': {
'labels': {
@ -576,12 +574,14 @@ services:
},
}
@pytest.mark.skip(reason='deprecated option')
def test_config_compatibility_mode(self):
self.base_dir = 'tests/fixtures/compatibility-mode'
result = self.dispatch(['--compatibility', 'config'])
assert yaml.load(result.stdout) == COMPOSE_COMPATIBILITY_DICT
@pytest.mark.skip(reason='deprecated option')
@mock.patch.dict(os.environ)
def test_config_compatibility_mode_from_env(self):
self.base_dir = 'tests/fixtures/compatibility-mode'
@ -590,6 +590,7 @@ services:
assert yaml.load(result.stdout) == COMPOSE_COMPATIBILITY_DICT
@pytest.mark.skip(reason='deprecated option')
@mock.patch.dict(os.environ)
def test_config_compatibility_mode_from_env_and_option_precedence(self):
self.base_dir = 'tests/fixtures/compatibility-mode'
@ -1018,7 +1019,6 @@ services:
result = self.dispatch(['down', '--rmi', 'bogus'], returncode=1)
assert '--rmi flag must be' in result.stderr
@v2_only()
def test_down(self):
self.base_dir = 'tests/fixtures/v2-full'
@ -1103,7 +1103,6 @@ services:
assert '{} exited with code 0'.format(simple_name) in result.stdout
assert '{} exited with code 0'.format(another_name) in result.stdout
@v2_only()
def test_up(self):
self.base_dir = 'tests/fixtures/v2-simple'
self.dispatch(['up', '-d'], None)
@ -1135,7 +1134,6 @@ services:
for service in services:
assert self.lookup(container, service.name)
@v2_only()
def test_up_no_start(self):
self.base_dir = 'tests/fixtures/v2-full'
self.dispatch(['up', '--no-start'], None)
@ -1166,7 +1164,6 @@ services:
]
assert len(remote_volumes) > 0
@v2_only()
def test_up_no_start_remove_orphans(self):
self.base_dir = 'tests/fixtures/v2-simple'
self.dispatch(['up', '--no-start'], None)
@ -1182,7 +1179,6 @@ services:
stopped=True) + next.containers(stopped=True)), services)
assert len(stopped2) == 1
@v2_only()
def test_up_no_ansi(self):
self.base_dir = 'tests/fixtures/v2-simple'
result = self.dispatch(['--no-ansi', 'up', '-d'], None)
@ -1190,7 +1186,6 @@ services:
assert "%c[1A" % 27 not in result.stderr
assert "%c[1B" % 27 not in result.stderr
@v2_only()
def test_up_with_default_network_config(self):
filename = 'default-network-config.yml'
@ -1204,7 +1199,6 @@ services:
assert networks[0]['Options']['com.docker.network.bridge.enable_icc'] == 'false'
@v2_only()
def test_up_with_network_aliases(self):
filename = 'network-aliases.yml'
self.base_dir = 'tests/fixtures/networks'
@ -1232,7 +1226,6 @@ services:
assert 'forward_facing' in front_aliases
assert 'ahead' in front_aliases
@v2_only()
def test_up_with_network_internal(self):
self.require_api_version('1.23')
filename = 'network-internal.yml'
@ -1250,7 +1243,6 @@ services:
assert networks[0]['Internal'] is True
@v2_only()
def test_up_with_network_static_addresses(self):
filename = 'network-static-addresses.yml'
ipv4_address = '172.16.100.100'
@ -1274,7 +1266,6 @@ services:
assert ipv4_address in ipam_config.values()
assert ipv6_address in ipam_config.values()
@v2_only()
def test_up_with_networks(self):
self.base_dir = 'tests/fixtures/networks'
self.dispatch(['up', '-d'], None)
@ -1322,7 +1313,6 @@ services:
# app has aliased db to "database"
assert self.lookup(app_container, "database")
@v2_only()
def test_up_missing_network(self):
self.base_dir = 'tests/fixtures/networks'
@ -1332,7 +1322,6 @@ services:
assert 'Service "web" uses an undefined network "foo"' in result.stderr
@v2_only()
@no_cluster('container networks not supported in Swarm')
def test_up_with_network_mode(self):
c = self.client.create_container(
@ -1371,7 +1360,6 @@ services:
assert not container_mode_container.get('NetworkSettings.Networks')
assert container_mode_container.get('HostConfig.NetworkMode') == container_mode_source
@v2_only()
def test_up_external_networks(self):
filename = 'external-networks.yml'
@ -1395,7 +1383,6 @@ services:
container = self.project.containers()[0]
assert sorted(list(container.get('NetworkSettings.Networks'))) == sorted(network_names)
@v2_only()
def test_up_with_external_default_network(self):
filename = 'external-default.yml'
@ -1418,7 +1405,6 @@ services:
container = self.project.containers()[0]
assert list(container.get('NetworkSettings.Networks')) == [network_name]
@v2_1_only()
def test_up_with_network_labels(self):
filename = 'network-label.yml'
@ -1438,7 +1424,6 @@ services:
assert 'label_key' in networks[0]['Labels']
assert networks[0]['Labels']['label_key'] == 'label_val'
@v2_1_only()
def test_up_with_volume_labels(self):
filename = 'volume-label.yml'
@ -1458,7 +1443,6 @@ services:
assert 'label_key' in volumes[0]['Labels']
assert volumes[0]['Labels']['label_key'] == 'label_val'
@v2_only()
def test_up_no_services(self):
self.base_dir = 'tests/fixtures/no-services'
self.dispatch(['up', '-d'], None)
@ -1515,7 +1499,6 @@ services:
bar_container.id
)
@v3_only()
def test_up_with_healthcheck(self):
def wait_on_health_status(container, status):
def condition():
@ -1649,7 +1632,6 @@ services:
os.kill(proc.pid, signal.SIGTERM)
wait_on_condition(ContainerCountCondition(self.project, 0))
@v2_only()
def test_up_handles_force_shutdown(self):
self.base_dir = 'tests/fixtures/sleeps-composefile'
proc = start_process(self.base_dir, ['up', '-t', '200'])
@ -1674,7 +1656,6 @@ services:
proc.wait()
assert proc.returncode == 1
@v2_only()
@no_cluster('Container PID mode does not work across clusters')
def test_up_with_pid_mode(self):
c = self.client.create_container(
@ -1738,7 +1719,6 @@ services:
assert stdout == "operator\n"
assert stderr == ""
@v3_only()
def test_exec_workdir(self):
self.base_dir = 'tests/fixtures/links-composefile'
os.environ['COMPOSE_API_VERSION'] = '1.35'
@ -1748,7 +1728,6 @@ services:
stdout, stderr = self.dispatch(['exec', '-T', '--workdir', '/etc', 'console', 'ls'])
assert 'passwd' in stdout
@v2_2_only()
def test_exec_service_with_environment_overridden(self):
name = 'service'
self.base_dir = 'tests/fixtures/environment-exec'
@ -1793,7 +1772,6 @@ services:
assert len(db.containers()) == 1
assert len(console.containers()) == 0
@v2_only()
def test_run_service_with_dependencies(self):
self.base_dir = 'tests/fixtures/v2-dependencies'
self.dispatch(['run', 'web', '/bin/true'], None)
@ -2105,7 +2083,6 @@ services:
container = service.containers(stopped=True, one_off=True)[0]
assert workdir == container.get('Config.WorkingDir')
@v2_only()
def test_run_service_with_use_aliases(self):
filename = 'network-aliases.yml'
self.base_dir = 'tests/fixtures/networks'
@ -2127,7 +2104,6 @@ services:
assert 'forward_facing' in front_aliases
assert 'ahead' in front_aliases
@v2_only()
def test_run_interactive_connects_to_network(self):
self.base_dir = 'tests/fixtures/networks'
@ -2153,7 +2129,6 @@ services:
aliases = set(config['Aliases'] or []) - {container.short_id}
assert not aliases
@v2_only()
def test_run_detached_connects_to_network(self):
self.base_dir = 'tests/fixtures/networks'
self.dispatch(['up', '-d'])
@ -2332,7 +2307,6 @@ services:
assert 'failed' in result.stderr
assert 'No containers to start' in result.stderr
@v2_only()
def test_up_logging(self):
self.base_dir = 'tests/fixtures/logging-composefile'
self.dispatch(['up', '-d'])
@ -2563,11 +2537,6 @@ services:
assert len(project.get_service('simple').containers()) == 0
assert len(project.get_service('another').containers()) == 0
def test_scale_v2_2(self):
self.base_dir = 'tests/fixtures/scale'
result = self.dispatch(['scale', 'web=1'], returncode=1)
assert 'incompatible with the v2.2 format' in result.stderr
def test_up_scale_scale_up(self):
self.base_dir = 'tests/fixtures/scale'
project = self.project