Merge "Improve metadata performance"
This commit is contained in:
commit
e5b819fb75
|
@ -258,10 +258,19 @@ class MetadataRequestHandler(wsgi.Application):
|
|||
self._validate_shared_secret(provider_id, signature,
|
||||
instance_address)
|
||||
|
||||
instance_id, tenant_id = self._get_instance_id_from_lb(
|
||||
provider_id, instance_address)
|
||||
LOG.debug('Instance %s with address %s matches provider %s',
|
||||
instance_id, remote_address, provider_id)
|
||||
cache_key = 'provider-%s-%s' % (provider_id, instance_address)
|
||||
data = self._cache.get(cache_key)
|
||||
if data:
|
||||
LOG.debug("Using cached metadata for %s for %s",
|
||||
provider_id, instance_address)
|
||||
instance_id, tenant_id = data
|
||||
else:
|
||||
instance_id, tenant_id = self._get_instance_id_from_lb(
|
||||
provider_id, instance_address)
|
||||
if CONF.api.metadata_cache_expiration > 0:
|
||||
self._cache.set(cache_key, (instance_id, tenant_id))
|
||||
LOG.debug('Instance %s with address %s matches provider %s',
|
||||
instance_id, remote_address, provider_id)
|
||||
return self._get_meta_by_instance_id(instance_id, tenant_id,
|
||||
instance_address)
|
||||
|
||||
|
|
|
@ -1412,6 +1412,52 @@ class MetadataHandlerTestCase(test.TestCase):
|
|||
|
||||
self.assertEqual(200, response.status_int)
|
||||
|
||||
@mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
|
||||
def _metadata_handler_with_provider_id(self, hnd, mock_get_client):
|
||||
# with X-Metadata-Provider
|
||||
proxy_lb_id = 'edge-x'
|
||||
|
||||
mock_client = mock_get_client()
|
||||
mock_client.list_ports.return_value = {
|
||||
'ports': [{'device_id': 'a-b-c-d', 'tenant_id': 'test'}]}
|
||||
mock_client.list_subnets.return_value = {
|
||||
'subnets': [{'network_id': 'f-f-f-f'}]}
|
||||
|
||||
response = fake_request(
|
||||
self, self.mdinst,
|
||||
relpath="/2009-04-04/user-data",
|
||||
address="192.192.192.2",
|
||||
app=hnd,
|
||||
headers={'X-Forwarded-For': '192.192.192.2',
|
||||
'X-Metadata-Provider': proxy_lb_id})
|
||||
|
||||
self.assertEqual(200, response.status_int)
|
||||
self.assertEqual(base64.decode_as_bytes(self.instance['user_data']),
|
||||
response.body)
|
||||
|
||||
@mock.patch.object(base, 'get_metadata_by_instance_id')
|
||||
def _test__handler_with_provider_id(self,
|
||||
expected_calls,
|
||||
get_by_uuid):
|
||||
get_by_uuid.return_value = self.mdinst
|
||||
hnd = handler.MetadataRequestHandler()
|
||||
with mock.patch.object(hnd, '_get_instance_id_from_lb',
|
||||
return_value=('a-b-c-d',
|
||||
'test')) as _get_id_from_lb:
|
||||
self._metadata_handler_with_provider_id(hnd)
|
||||
self._metadata_handler_with_provider_id(hnd)
|
||||
self.assertEqual(expected_calls, _get_id_from_lb.call_count)
|
||||
|
||||
def test_metadata_handler_with_provider_id(self):
|
||||
self.flags(service_metadata_proxy=True, group='neutron')
|
||||
self.flags(metadata_cache_expiration=15, group='api')
|
||||
self._test__handler_with_provider_id(1)
|
||||
|
||||
def test_metadata_handler_with_provider_id_no_cache(self):
|
||||
self.flags(service_metadata_proxy=True, group='neutron')
|
||||
self.flags(metadata_cache_expiration=0, group='api')
|
||||
self._test__handler_with_provider_id(2)
|
||||
|
||||
@mock.patch.object(neutronapi, 'get_client', return_value=mock.Mock())
|
||||
def test_metadata_lb_proxy_chain(self, mock_get_client):
|
||||
|
||||
|
|
Loading…
Reference in New Issue