From: Sam Morrison Date: Thu, 18 Jun 2015 01:13:33 +0000 (+1000) Subject: Allow overriding of the neutron endpoint URL in metadata agent X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=2c98f6ee17f0fc589d327cc78487fe708779f964;p=openstack-build%2Fneutron-build.git Allow overriding of the neutron endpoint URL in metadata agent Allow operators to set the endpoint url for neutron in the config overriding the url that comes from the keystone catalog. Change-Id: I93f81ef1be2de1038d9a899b0c4becdb5a8e8775 DocImpact Closes-Bug: #1466258 --- diff --git a/neutron/agent/metadata/agent.py b/neutron/agent/metadata/agent.py index 769d8039b..b4dd33de2 100644 --- a/neutron/agent/metadata/agent.py +++ b/neutron/agent/metadata/agent.py @@ -87,20 +87,24 @@ class MetadataProxyHandler(object): self.use_rpc = True def _get_neutron_client(self): - qclient = client.Client( - username=self.conf.admin_user, - password=self.conf.admin_password, - tenant_name=self.conf.admin_tenant_name, - auth_url=self.conf.auth_url, - auth_strategy=self.conf.auth_strategy, - region_name=self.conf.auth_region, - token=self.auth_info.get('auth_token'), - insecure=self.conf.auth_insecure, - ca_cert=self.conf.auth_ca_cert, - endpoint_url=self.auth_info.get('endpoint_url'), - endpoint_type=self.conf.endpoint_type - ) - return qclient + params = { + 'username': self.conf.admin_user, + 'password': self.conf.admin_password, + 'tenant_name': self.conf.admin_tenant_name, + 'auth_url': self.conf.auth_url, + 'auth_strategy': self.conf.auth_strategy, + 'region_name': self.conf.auth_region, + 'token': self.auth_info.get('auth_token'), + 'insecure': self.conf.auth_insecure, + 'ca_cert': self.conf.auth_ca_cert, + } + if self.conf.endpoint_url: + params['endpoint_url'] = self.conf.endpoint_url + else: + params['endpoint_url'] = self.auth_info.get('endpoint_url') + params['endpoint_type'] = self.conf.endpoint_type + + return client.Client(**params) @webob.dec.wsgify(RequestClass=webob.Request) def __call__(self, req): diff --git a/neutron/agent/metadata/config.py b/neutron/agent/metadata/config.py index 2a5706e8e..e32590372 100644 --- a/neutron/agent/metadata/config.py +++ b/neutron/agent/metadata/config.py @@ -74,6 +74,10 @@ METADATA_PROXY_HANDLER_OPTS = [ default='adminURL', help=_("Network service endpoint type to pull from " "the keystone catalog")), + cfg.StrOpt('endpoint_url', + default=None, + help=_("Neutron endpoint URL, if not set will use endpoint " + "from the keystone catalog along with endpoint_type")), cfg.StrOpt('nova_metadata_ip', default='127.0.0.1', help=_("IP address used by Nova metadata server.")), cfg.IntOpt('nova_metadata_port', diff --git a/neutron/tests/unit/agent/metadata/test_agent.py b/neutron/tests/unit/agent/metadata/test_agent.py index eaa5a773f..874b80173 100644 --- a/neutron/tests/unit/agent/metadata/test_agent.py +++ b/neutron/tests/unit/agent/metadata/test_agent.py @@ -23,6 +23,7 @@ from neutron.agent import metadata_agent from neutron.common import constants from neutron.common import utils from neutron.tests import base +from neutronclient.v2_0 import client class FakeConf(object): @@ -43,12 +44,55 @@ class FakeConf(object): nova_client_cert = 'nova_cert' nova_client_priv_key = 'nova_priv_key' cache_url = '' + endpoint_url = None class FakeConfCache(FakeConf): cache_url = 'memory://?default_ttl=5' +class FakeConfEndpoint(FakeConf): + endpoint_url = 'http://127.0.0.0:8776' + + +class TestNeutronClient(base.BaseTestCase): + fake_conf = FakeConf + expected_params = { + 'username': 'neutron', + 'region_name': 'region', + 'ca_cert': None, + 'tenant_name': 'tenant', + 'insecure': False, + 'token': None, + 'endpoint_type': 'adminURL', + 'auth_url': 'http://127.0.0.1', + 'password': 'password', + 'endpoint_url': None, + 'auth_strategy': 'keystone', + } + + def test_client_params(self): + handler = agent.MetadataProxyHandler(self.fake_conf) + + with mock.patch.object( + client.Client, "__init__", return_value=None) as mock_init: + handler._get_neutron_client() + mock_init.assert_called_once_with(**self.expected_params) + + def test_client_with_endpoint_url(self): + fake_conf = FakeConfEndpoint + handler = agent.MetadataProxyHandler(fake_conf) + + expected_params = self.expected_params.copy() + del expected_params['endpoint_type'] + expected_params['endpoint_url'] = 'http://127.0.0.0:8776' + + with mock.patch.object( + client.Client, "__init__", return_value=None) as mock_init: + handler._get_neutron_client() + mock_init.assert_called_once_with(**expected_params) + + class TestMetadataProxyHandlerBase(base.BaseTestCase): fake_conf = FakeConf