mirror of https://github.com/docker/compose.git
Merge pull request #6390 from ulyssessouza/6369-override-networks-settings
Fix merge on networks section
This commit is contained in:
commit
b7374b6271
|
@ -1040,7 +1040,6 @@ def merge_service_dicts(base, override, version):
|
||||||
md.merge_mapping('environment', parse_environment)
|
md.merge_mapping('environment', parse_environment)
|
||||||
md.merge_mapping('labels', parse_labels)
|
md.merge_mapping('labels', parse_labels)
|
||||||
md.merge_mapping('ulimits', parse_flat_dict)
|
md.merge_mapping('ulimits', parse_flat_dict)
|
||||||
md.merge_mapping('networks', parse_networks)
|
|
||||||
md.merge_mapping('sysctls', parse_sysctls)
|
md.merge_mapping('sysctls', parse_sysctls)
|
||||||
md.merge_mapping('depends_on', parse_depends_on)
|
md.merge_mapping('depends_on', parse_depends_on)
|
||||||
md.merge_mapping('storage_opt', parse_flat_dict)
|
md.merge_mapping('storage_opt', parse_flat_dict)
|
||||||
|
@ -1050,6 +1049,7 @@ def merge_service_dicts(base, override, version):
|
||||||
md.merge_sequence('security_opt', types.SecurityOpt.parse)
|
md.merge_sequence('security_opt', types.SecurityOpt.parse)
|
||||||
md.merge_mapping('extra_hosts', parse_extra_hosts)
|
md.merge_mapping('extra_hosts', parse_extra_hosts)
|
||||||
|
|
||||||
|
md.merge_field('networks', merge_networks, default={})
|
||||||
for field in ['volumes', 'devices']:
|
for field in ['volumes', 'devices']:
|
||||||
md.merge_field(field, merge_path_mappings)
|
md.merge_field(field, merge_path_mappings)
|
||||||
|
|
||||||
|
@ -1154,6 +1154,22 @@ def merge_deploy(base, override):
|
||||||
return dict(md)
|
return dict(md)
|
||||||
|
|
||||||
|
|
||||||
|
def merge_networks(base, override):
|
||||||
|
merged_networks = {}
|
||||||
|
all_network_names = set(base) | set(override)
|
||||||
|
base = {k: {} for k in base} if isinstance(base, list) else base
|
||||||
|
override = {k: {} for k in override} if isinstance(override, list) else override
|
||||||
|
for network_name in all_network_names:
|
||||||
|
md = MergeDict(base.get(network_name, {}), override.get(network_name, {}))
|
||||||
|
md.merge_field('aliases', merge_unique_items_lists, [])
|
||||||
|
md.merge_field('link_local_ips', merge_unique_items_lists, [])
|
||||||
|
md.merge_scalar('priority')
|
||||||
|
md.merge_scalar('ipv4_address')
|
||||||
|
md.merge_scalar('ipv6_address')
|
||||||
|
merged_networks[network_name] = dict(md)
|
||||||
|
return merged_networks
|
||||||
|
|
||||||
|
|
||||||
def merge_reservations(base, override):
|
def merge_reservations(base, override):
|
||||||
md = MergeDict(base, override)
|
md = MergeDict(base, override)
|
||||||
md.merge_scalar('cpus')
|
md.merge_scalar('cpus')
|
||||||
|
|
|
@ -1085,8 +1085,43 @@ class ConfigTest(unittest.TestCase):
|
||||||
details = config.ConfigDetails('.', [base_file, override_file])
|
details = config.ConfigDetails('.', [base_file, override_file])
|
||||||
web_service = config.load(details).services[0]
|
web_service = config.load(details).services[0]
|
||||||
assert web_service['networks'] == {
|
assert web_service['networks'] == {
|
||||||
'foobar': {'aliases': ['foo', 'bar']},
|
'foobar': {'aliases': ['bar', 'foo']},
|
||||||
'baz': None
|
'baz': {}
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_load_with_multiple_files_mismatched_networks_format_inverse_order(self):
|
||||||
|
base_file = config.ConfigFile(
|
||||||
|
'override.yaml',
|
||||||
|
{
|
||||||
|
'version': '2',
|
||||||
|
'services': {
|
||||||
|
'web': {
|
||||||
|
'networks': ['baz']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
override_file = config.ConfigFile(
|
||||||
|
'base.yaml',
|
||||||
|
{
|
||||||
|
'version': '2',
|
||||||
|
'services': {
|
||||||
|
'web': {
|
||||||
|
'image': 'example/web',
|
||||||
|
'networks': {
|
||||||
|
'foobar': {'aliases': ['foo', 'bar']}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'networks': {'foobar': {}, 'baz': {}}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
details = config.ConfigDetails('.', [base_file, override_file])
|
||||||
|
web_service = config.load(details).services[0]
|
||||||
|
assert web_service['networks'] == {
|
||||||
|
'foobar': {'aliases': ['bar', 'foo']},
|
||||||
|
'baz': {}
|
||||||
}
|
}
|
||||||
|
|
||||||
def test_load_with_multiple_files_v2(self):
|
def test_load_with_multiple_files_v2(self):
|
||||||
|
@ -3843,8 +3878,77 @@ class MergePortsTest(unittest.TestCase, MergeListsTest):
|
||||||
|
|
||||||
class MergeNetworksTest(unittest.TestCase, MergeListsTest):
|
class MergeNetworksTest(unittest.TestCase, MergeListsTest):
|
||||||
config_name = 'networks'
|
config_name = 'networks'
|
||||||
base_config = ['frontend', 'backend']
|
base_config = {'default': {'aliases': ['foo.bar', 'foo.baz']}}
|
||||||
override_config = ['monitoring']
|
override_config = {'default': {'ipv4_address': '123.234.123.234'}}
|
||||||
|
|
||||||
|
def test_no_network_overrides(self):
|
||||||
|
service_dict = config.merge_service_dicts(
|
||||||
|
{self.config_name: self.base_config},
|
||||||
|
{self.config_name: self.override_config},
|
||||||
|
DEFAULT_VERSION)
|
||||||
|
assert service_dict[self.config_name] == {
|
||||||
|
'default': {
|
||||||
|
'aliases': ['foo.bar', 'foo.baz'],
|
||||||
|
'ipv4_address': '123.234.123.234'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_all_properties(self):
|
||||||
|
service_dict = config.merge_service_dicts(
|
||||||
|
{self.config_name: {
|
||||||
|
'default': {
|
||||||
|
'aliases': ['foo.bar', 'foo.baz'],
|
||||||
|
'link_local_ips': ['192.168.1.10', '192.168.1.11'],
|
||||||
|
'ipv4_address': '111.111.111.111',
|
||||||
|
'ipv6_address': 'FE80:CD00:0000:0CDE:1257:0000:211E:729C-first'
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{self.config_name: {
|
||||||
|
'default': {
|
||||||
|
'aliases': ['foo.baz', 'foo.baz2'],
|
||||||
|
'link_local_ips': ['192.168.1.11', '192.168.1.12'],
|
||||||
|
'ipv4_address': '123.234.123.234',
|
||||||
|
'ipv6_address': 'FE80:CD00:0000:0CDE:1257:0000:211E:729C-second'
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
DEFAULT_VERSION)
|
||||||
|
|
||||||
|
assert service_dict[self.config_name] == {
|
||||||
|
'default': {
|
||||||
|
'aliases': ['foo.bar', 'foo.baz', 'foo.baz2'],
|
||||||
|
'link_local_ips': ['192.168.1.10', '192.168.1.11', '192.168.1.12'],
|
||||||
|
'ipv4_address': '123.234.123.234',
|
||||||
|
'ipv6_address': 'FE80:CD00:0000:0CDE:1257:0000:211E:729C-second'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def test_no_network_name_overrides(self):
|
||||||
|
service_dict = config.merge_service_dicts(
|
||||||
|
{
|
||||||
|
self.config_name: {
|
||||||
|
'default': {
|
||||||
|
'aliases': ['foo.bar', 'foo.baz'],
|
||||||
|
'ipv4_address': '123.234.123.234'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
self.config_name: {
|
||||||
|
'another_network': {
|
||||||
|
'ipv4_address': '123.234.123.234'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
DEFAULT_VERSION)
|
||||||
|
assert service_dict[self.config_name] == {
|
||||||
|
'default': {
|
||||||
|
'aliases': ['foo.bar', 'foo.baz'],
|
||||||
|
'ipv4_address': '123.234.123.234'
|
||||||
|
},
|
||||||
|
'another_network': {
|
||||||
|
'ipv4_address': '123.234.123.234'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class MergeStringsOrListsTest(unittest.TestCase):
|
class MergeStringsOrListsTest(unittest.TestCase):
|
||||||
|
|
Loading…
Reference in New Issue