Skip to content

Commit

Permalink
Make sure we can get watch server url in uwsgi mode
Browse files Browse the repository at this point in the history
We get the 'watch' server url by translating the
'cfn' server url if the 'watch' server url is not
configurated, but in uwsgi mode, the code logic is
incorrect, this patch changes the logic to make sure
that we can get the watch server url in both modes.

Change-Id: Iebf2480f97c11474412d74726eba9cf5c8ed2193
Closes-Bug: #1716815
(cherry picked from commit a8af89e)
  • Loading branch information
huangtianhua committed Sep 28, 2017
1 parent 317b841 commit def03c7
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 21 deletions.
24 changes: 18 additions & 6 deletions heat/engine/clients/os/heat_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

from oslo_config import cfg
import six
from six.moves import urllib

from heatclient import client as hc
from heatclient import exc
Expand Down Expand Up @@ -91,12 +92,23 @@ def get_cfn_metadata_server_url(self):

def get_watch_server_url(self):
cfn_url = self.get_heat_cfn_url()
url_parts = cfn_url.split(':')
port_and_version = url_parts[-1].split('/')
port_and_version[0] = (
six.text_type(cfg.CONF.heat_api_cloudwatch.bind_port))
url_parts[-1] = '/'.join(port_and_version)
return ':'.join(url_parts)
parsed_url = urllib.parse.urlparse(cfn_url)
separator = ':'
(host, separator, port) = parsed_url.netloc.partition(separator)
# The old url model, like http://localhost:port/v1
if port:
watch_api_port = (
six.text_type(cfg.CONF.heat_api_cloudwatch.bind_port))
replaced_netloc = ':'.join([host, str(watch_api_port)])
parsed_url = parsed_url._replace(netloc=replaced_netloc)
# The uwsgi url mode, like http://ip/heat-api-cfn/v1
else:
paths = parsed_url.path.split('/')
paths[1] = 'heat-api-cloudwatch'
replaced_paths = '/'.join(paths)
parsed_url = parsed_url._replace(path=replaced_paths)

return urllib.parse.urlunparse(parsed_url)

def get_insecure_option(self):
return self._get_client_option(CLIENT_NAME, 'insecure')
15 changes: 12 additions & 3 deletions heat/tests/clients/test_clients.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,18 @@ def test_clients_get_heat_url(self):
obj._get_client_option.return_value = result
self.assertEqual(result, obj.get_heat_url())

def _client_cfn_url(self):
def _client_cfn_url(self, use_uwsgi=False):
con = mock.Mock()
c = clients.Clients(con)
con.clients = c
obj = c.client_plugin('heat')
obj._get_client_option = mock.Mock()
obj._get_client_option.return_value = None
obj.url_for = mock.Mock(name="url_for")
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):
Expand All @@ -92,7 +95,13 @@ def test_clients_get_heat_cfn_url(self):

def test_clients_get_watch_server_url(self):
obj = self._client_cfn_url()
self.assertEqual("http://0.0.0.0:8003/v1/", obj.get_watch_server_url())
self.assertEqual("http://0.0.0.0:8003/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/",
obj.get_watch_server_url())

def test_clients_get_heat_cfn_metadata_url(self):
obj = self._client_cfn_url()
Expand Down
24 changes: 12 additions & 12 deletions heat/tests/openstack/nova/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -786,14 +786,14 @@ def _server_create_software_config(self, md=None,

@mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for')
def test_server_create_software_config(self, fake_url):
fake_url.return_value = 'the-cfn-url'
fake_url.return_value = 'http://ip:port/v1'
server = self._server_create_software_config()

self.assertEqual({
'os-collect-config': {
'cfn': {
'access_key_id': '4567',
'metadata_url': 'the-cfn-url/v1/',
'metadata_url': 'http://ip:port/v1/',
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'software_config_s'
Expand All @@ -805,13 +805,13 @@ def test_server_create_software_config(self, fake_url):

@mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for')
def test_resolve_attribute_os_collect_config(self, fake_url):
fake_url.return_value = 'the-cfn-url'
fake_url.return_value = 'http://ip/heat-api-cfn/v1'
server = self._server_create_software_config()

self.assertEqual({
'cfn': {
'access_key_id': '4567',
'metadata_url': 'the-cfn-url/v1/',
'metadata_url': 'http://ip/heat-api-cfn/v1/',
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'software_config_s'
Expand All @@ -822,14 +822,14 @@ def test_resolve_attribute_os_collect_config(self, fake_url):
@mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for')
def test_server_create_software_config_metadata(self, fake_url):
md = {'os-collect-config': {'polling_interval': 10}}
fake_url.return_value = 'the-cfn-url'
fake_url.return_value = 'http://ip/heat-api-cfn/v1'
server = self._server_create_software_config(md=md)

self.assertEqual({
'os-collect-config': {
'cfn': {
'access_key_id': '4567',
'metadata_url': 'the-cfn-url/v1/',
'metadata_url': 'http://ip/heat-api-cfn/v1/',
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'software_config_s'
Expand Down Expand Up @@ -1650,15 +1650,15 @@ def test_server_update_metadata(self):

@mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for')
def test_server_update_metadata_software_config(self, fake_url):
fake_url.return_value = 'the-cfn-url'
fake_url.return_value = 'http://ip:port/v1'
server, ud_tmpl = self._server_create_software_config(
stack_name='update_meta_sc', ret_tmpl=True)

expected_md = {
'os-collect-config': {
'cfn': {
'access_key_id': '4567',
'metadata_url': 'the-cfn-url/v1/',
'metadata_url': 'http://ip:port/v1/',
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'update_meta_sc'
Expand All @@ -1678,7 +1678,7 @@ def test_server_update_metadata_software_config(self, fake_url):
@mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for')
def test_server_update_metadata_software_config_merge(self, fake_url):
md = {'os-collect-config': {'polling_interval': 10}}
fake_url.return_value = 'the-cfn-url'
fake_url.return_value = 'http://ip/heat-api-cfn/v1'
server, ud_tmpl = self._server_create_software_config(
stack_name='update_meta_sc', ret_tmpl=True,
md=md)
Expand All @@ -1687,7 +1687,7 @@ def test_server_update_metadata_software_config_merge(self, fake_url):
'os-collect-config': {
'cfn': {
'access_key_id': '4567',
'metadata_url': 'the-cfn-url/v1/',
'metadata_url': 'http://ip/heat-api-cfn/v1/',
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'update_meta_sc'
Expand All @@ -1708,15 +1708,15 @@ def test_server_update_metadata_software_config_merge(self, fake_url):
@mock.patch.object(heat_plugin.HeatClientPlugin, 'url_for')
def test_server_update_software_config_transport(self, fake_url):
md = {'os-collect-config': {'polling_interval': 10}}
fake_url.return_value = 'the-cfn-url'
fake_url.return_value = 'http://ip/heat-api-cfn/v1'
server = self._server_create_software_config(
stack_name='update_meta_sc', md=md)

expected_md = {
'os-collect-config': {
'cfn': {
'access_key_id': '4567',
'metadata_url': 'the-cfn-url/v1/',
'metadata_url': 'http://ip/heat-api-cfn/v1/',
'path': 'WebServer.Metadata',
'secret_access_key': '8901',
'stack_name': 'update_meta_sc'
Expand Down

0 comments on commit def03c7

Please sign in to comment.