diff --git a/heat/engine/clients/os/heat_plugin.py b/heat/engine/clients/os/heat_plugin.py index 49240ddf2c..3cb408d147 100644 --- a/heat/engine/clients/os/heat_plugin.py +++ b/heat/engine/clients/os/heat_plugin.py @@ -93,8 +93,11 @@ class HeatClientPlugin(client_plugin.ClientPlugin): def get_watch_server_url(self): cfn_url = self.get_heat_cfn_url() parsed_url = urllib.parse.urlparse(cfn_url) - separator = ':' - (host, separator, port) = parsed_url.netloc.partition(separator) + host = parsed_url.hostname + port = parsed_url.port + # For ipv6 we need to include the host in brackets + if parsed_url.netloc.startswith('['): + host = "[%s]" % host # The old url model, like http://localhost:port/v1 if port: watch_api_port = ( diff --git a/heat/tests/clients/test_clients.py b/heat/tests/clients/test_clients.py index e99a01fe85..2a4c64311e 100644 --- a/heat/tests/clients/test_clients.py +++ b/heat/tests/clients/test_clients.py @@ -75,7 +75,7 @@ class ClientsTest(common.HeatTestCase): obj._get_client_option.return_value = result self.assertEqual(result, obj.get_heat_url()) - def _client_cfn_url(self, use_uwsgi=False): + def _client_cfn_url(self, use_uwsgi=False, use_ipv6=False): con = mock.Mock() c = clients.Clients(con) con.clients = c @@ -83,10 +83,16 @@ class ClientsTest(common.HeatTestCase): obj._get_client_option = mock.Mock() obj._get_client_option.return_value = None obj.url_for = mock.Mock(name="url_for") - if use_uwsgi: - obj.url_for.return_value = "http://0.0.0.0/heat-api-cfn/v1/" + if use_ipv6: + if use_uwsgi: + obj.url_for.return_value = "http://[::1]/heat-api-cfn/v1/" + else: + obj.url_for.return_value = "http://[::1]:8000/v1/" else: - obj.url_for.return_value = "http://0.0.0.0:8000/v1/" + if use_uwsgi: + obj.url_for.return_value = "http://0.0.0.0/heat-api-cfn/v1/" + else: + obj.url_for.return_value = "http://0.0.0.0:8000/v1/" return obj def test_clients_get_heat_cfn_url(self): @@ -98,6 +104,16 @@ class ClientsTest(common.HeatTestCase): self.assertEqual("http://0.0.0.0:8003/v1/", obj.get_watch_server_url()) + def test_clients_get_watch_server_url_ipv6(self): + obj = self._client_cfn_url(use_ipv6=True) + self.assertEqual("http://[::1]:8003/v1/", + obj.get_watch_server_url()) + + def test_clients_get_watch_server_url_use_uwsgi_ipv6(self): + obj = self._client_cfn_url(use_uwsgi=True, use_ipv6=True) + self.assertEqual("http://[::1]/heat-api-cloudwatch/v1/", + obj.get_watch_server_url()) + def test_clients_get_watch_server_url_use_uwsgi(self): obj = self._client_cfn_url(use_uwsgi=True) self.assertEqual("http://0.0.0.0/heat-api-cloudwatch/v1/", diff --git a/heat/tests/openstack/nova/test_server.py b/heat/tests/openstack/nova/test_server.py index dabf499587..66badace69 100644 --- a/heat/tests/openstack/nova/test_server.py +++ b/heat/tests/openstack/nova/test_server.py @@ -786,14 +786,14 @@ class ServersTest(common.HeatTestCase): @mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for') def test_server_create_software_config(self, fake_url): - fake_url.return_value = 'http://ip:port/v1' + fake_url.return_value = 'http://ip:8000/v1' server = self._server_create_software_config() self.assertEqual({ 'os-collect-config': { 'cfn': { 'access_key_id': '4567', - 'metadata_url': 'http://ip:port/v1/', + 'metadata_url': 'http://ip:8000/v1/', 'path': 'WebServer.Metadata', 'secret_access_key': '8901', 'stack_name': 'software_config_s' @@ -1650,7 +1650,7 @@ class ServersTest(common.HeatTestCase): @mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for') def test_server_update_metadata_software_config(self, fake_url): - fake_url.return_value = 'http://ip:port/v1' + fake_url.return_value = 'http://ip:8000/v1' server, ud_tmpl = self._server_create_software_config( stack_name='update_meta_sc', ret_tmpl=True) @@ -1658,7 +1658,7 @@ class ServersTest(common.HeatTestCase): 'os-collect-config': { 'cfn': { 'access_key_id': '4567', - 'metadata_url': 'http://ip:port/v1/', + 'metadata_url': 'http://ip:8000/v1/', 'path': 'WebServer.Metadata', 'secret_access_key': '8901', 'stack_name': 'update_meta_sc'