From 633e349ab97af63849fc739eb9596be6f6f24362 Mon Sep 17 00:00:00 2001
From: Joffrey F <joffrey@docker.com>
Date: Fri, 12 Feb 2016 16:58:29 -0800
Subject: [PATCH] Test network_aliases feature

Signed-off-by: Joffrey F <joffrey@docker.com>
---
 compose/config/validation.py                |  2 +-
 compose/project.py                          |  4 ++-
 tests/acceptance/cli_test.py                | 27 +++++++++++++++++++++
 tests/fixtures/networks/network-aliases.yml | 18 ++++++++++++++
 tests/unit/config/config_test.py            | 21 ++++++++++++++++
 5 files changed, 70 insertions(+), 2 deletions(-)
 create mode 100644 tests/fixtures/networks/network-aliases.yml

diff --git a/compose/config/validation.py b/compose/config/validation.py
index 539291509..59ce9f54e 100644
--- a/compose/config/validation.py
+++ b/compose/config/validation.py
@@ -97,7 +97,7 @@ def match_network_aliases(service_dict):
     for n in aliased_networks:
         if n not in networks:
             raise ConfigurationError(
-                'Network "{0}" is referenced in network_aliases, but is not'
+                'Network "{0}" is referenced in network_aliases, but is not '
                 'declared in the networks list for service "{1}"'.format(
                     n, service_dict.get('name')
                 )
diff --git a/compose/project.py b/compose/project.py
index 0394fa15a..cfb11aa05 100644
--- a/compose/project.py
+++ b/compose/project.py
@@ -73,7 +73,9 @@ class Project(object):
 
             service_dict.pop('networks', None)
             links = project.get_links(service_dict)
-            network_mode = project.get_network_mode(service_dict, service_networks.keys())
+            network_mode = project.get_network_mode(
+                service_dict, list(service_networks.keys())
+            )
             volumes_from = get_volumes_from(project, service_dict)
 
             if config_data.version != V1:
diff --git a/tests/acceptance/cli_test.py b/tests/acceptance/cli_test.py
index ea3d132a5..49048fb79 100644
--- a/tests/acceptance/cli_test.py
+++ b/tests/acceptance/cli_test.py
@@ -445,6 +445,33 @@ class CLITestCase(DockerClientTestCase):
 
         assert networks[0]['Options']['com.docker.network.bridge.enable_icc'] == 'false'
 
+    def test_up_with_network_aliases(self):
+        filename = 'network-aliases.yml'
+        self.base_dir = 'tests/fixtures/networks'
+        self.dispatch(['-f', filename, 'up', '-d'], None)
+        back_name = '{}_back'.format(self.project.name)
+        front_name = '{}_front'.format(self.project.name)
+
+        networks = [
+            n for n in self.client.networks()
+            if n['Name'].startswith('{}_'.format(self.project.name))
+        ]
+
+        # Two networks were created: back and front
+        assert sorted(n['Name'] for n in networks) == [back_name, front_name]
+        web_container = self.project.get_service('web').containers()[0]
+
+        back_aliases = web_container.get(
+            'NetworkSettings.Networks.{}.Aliases'.format(back_name)
+        )
+        assert 'web' in back_aliases
+        front_aliases = web_container.get(
+            'NetworkSettings.Networks.{}.Aliases'.format(front_name)
+        )
+        assert 'web' in front_aliases
+        assert 'forward_facing' in front_aliases
+        assert 'ahead' in front_aliases
+
     @v2_only()
     def test_up_with_networks(self):
         self.base_dir = 'tests/fixtures/networks'
diff --git a/tests/fixtures/networks/network-aliases.yml b/tests/fixtures/networks/network-aliases.yml
new file mode 100644
index 000000000..987b0809a
--- /dev/null
+++ b/tests/fixtures/networks/network-aliases.yml
@@ -0,0 +1,18 @@
+version: "2"
+
+services:
+  web:
+    image: busybox
+    command: top
+    networks:
+      - front
+      - back
+
+    network_aliases:
+      front:
+        - forward_facing
+        - ahead
+
+networks:
+  front: {}
+  back: {}
diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py
index 1d6f1cbb0..88d46a143 100644
--- a/tests/unit/config/config_test.py
+++ b/tests/unit/config/config_test.py
@@ -556,6 +556,27 @@ class ConfigTest(unittest.TestCase):
         assert services[1]['name'] == 'db'
         assert services[2]['name'] == 'web'
 
+    def test_invalid_network_alias(self):
+        config_details = build_config_details({
+            'version': '2',
+            'services': {
+                'web': {
+                    'image': 'busybox',
+                    'networks': ['hello'],
+                    'network_aliases': {
+                        'world': ['planet', 'universe']
+                    }
+                }
+            },
+            'networks': {
+                'hello': {},
+                'world': {}
+            }
+        })
+        with pytest.raises(ConfigurationError) as exc:
+            config.load(config_details)
+        assert 'not declared in the networks list' in exc.exconly()
+
     def test_config_build_configuration(self):
         service = config.load(
             build_config_details(