diff --git a/neutron/agent/metadata/agent.py b/neutron/agent/metadata/agent.py index 9e764c126fc..60a571f087c 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 8a89dc38e5e..6c6cadba612 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 c79f991eb1d..20aeba05085 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