From a0add5cc129f3f7a4d43db777155daafccac371b Mon Sep 17 00:00:00 2001
From: Joffrey F <joffrey@docker.com>
Date: Tue, 21 Mar 2017 17:23:29 -0700
Subject: [PATCH] Fix ports reparsing for service extends

Signed-off-by: Joffrey F <joffrey@docker.com>
---
 compose/config/types.py          |  4 ++++
 tests/unit/config/config_test.py | 24 +++++++++++++++++++++++-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/compose/config/types.py b/compose/config/types.py
index a8d366fba..96846b5ba 100644
--- a/compose/config/types.py
+++ b/compose/config/types.py
@@ -266,6 +266,10 @@ class ServicePort(namedtuple('_ServicePort', 'target published protocol mode ext
 
     @classmethod
     def parse(cls, spec):
+        if isinstance(spec, cls):
+            # WHen extending a service with ports, the port definitions have already been parsed
+            return [spec]
+
         if not isinstance(spec, dict):
             result = []
             for k, v in build_port_bindings([spec]).items():
diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py
index 195efe3b9..4db87ecb6 100644
--- a/tests/unit/config/config_test.py
+++ b/tests/unit/config/config_test.py
@@ -3403,7 +3403,7 @@ class ExtendsTest(unittest.TestCase):
         self.assertEqual(service[0]['command'], "top")
 
     def test_extends_with_depends_on(self):
-        tmpdir = py.test.ensuretemp('test_extends_with_defined_version')
+        tmpdir = py.test.ensuretemp('test_extends_with_depends_on')
         self.addCleanup(tmpdir.remove)
         tmpdir.join('docker-compose.yml').write("""
             version: "2"
@@ -3435,6 +3435,28 @@ class ExtendsTest(unittest.TestCase):
             }
         }]
 
+    def test_extends_with_ports(self):
+        tmpdir = py.test.ensuretemp('test_extends_with_ports')
+        self.addCleanup(tmpdir.remove)
+        tmpdir.join('docker-compose.yml').write("""
+            version: '2'
+
+            services:
+              a:
+                image: nginx
+                ports:
+                  - 80
+
+              b:
+                extends:
+                  service: a
+        """)
+        services = load_from_filename(str(tmpdir.join('docker-compose.yml')))
+
+        assert len(services) == 2
+        for svc in services:
+            assert svc['ports'] == [types.ServicePort('80', None, None, None, None)]
+
 
 @pytest.mark.xfail(IS_WINDOWS_PLATFORM, reason='paths use slash')
 class ExpandPathTest(unittest.TestCase):