Remove metadata's network-api dependence on the database

This makes the metadata server use instance.info_cache for getting
an instance's info cache instead of going direct to the network-api
(and thus, the database) for it. It also converts the network-api
implementation of get_fixed_ip_by_address() to use and return an
object. Since that translates to the same DB call in the end, none
of the network tests need to change.

Conflicts:

        nova/tests/network/test_api.py

Change-Id: Iab444b1669628604f7d96d9550eb684645c554cb
Closes-bug: #1306009
(cherry picked from commit 20d0cef993)
This commit is contained in:
Dan Smith 2014-04-14 11:13:32 -07:00
parent 61e060e2b4
commit 395ec823a5
4 changed files with 21 additions and 13 deletions

View File

@ -116,9 +116,12 @@ class InstanceMetadata():
# NOTE(danms): This should be removed after bp:compute-manager-objects
if not isinstance(instance, instance_obj.Instance):
expected = ['metadata', 'system_metadata']
if 'info_cache' in instance:
expected.append('info_cache')
instance = instance_obj.Instance._from_db_object(
ctxt, instance_obj.Instance(), instance,
expected_attrs=['metadata', 'system_metadata'])
expected_attrs=expected)
self.instance = instance
self.extra_md = extra_md
@ -158,8 +161,7 @@ class InstanceMetadata():
# get network info, and the rendered network template
if network_info is None:
network_info = network.API().get_instance_nw_info(ctxt,
instance)
network_info = instance.info_cache.network_info
self.ip_info = \
ec2utils.get_ip_info_for_instance_from_nw_info(network_info)

View File

@ -25,6 +25,7 @@ from nova import exception
from nova.network import floating_ips
from nova.network import model as network_model
from nova.network import rpcapi as network_rpcapi
from nova.objects import fixed_ip as fixed_ip_obj
from nova.objects import instance as instance_obj
from nova.objects import instance_info_cache as info_cache_obj
from nova.openstack.common import excutils
@ -157,7 +158,7 @@ class API(base.Base):
@wrap_check_policy
def get_fixed_ip_by_address(self, context, address):
return self.db.fixed_ip_get_by_address(context, address)
return fixed_ip_obj.FixedIP.get_by_address(context, address)
@wrap_check_policy
def get_floating_ip(self, context, id):

View File

@ -18,6 +18,7 @@
import itertools
import random
import mock
import mox
from nova.compute import flavors
@ -29,8 +30,10 @@ from nova.network import api
from nova.network import floating_ips
from nova.network import model as network_model
from nova.network import rpcapi as network_rpcapi
from nova.objects import fixed_ip as fixed_ip_obj
from nova import policy
from nova import test
from nova.tests.objects import test_fixed_ip
from nova import utils
FAKE_UUID = 'a47ae74e-ab08-547f-9eee-ffd23fc46c16'
@ -286,6 +289,13 @@ class ApiTestCase(test.TestCase):
self.network_api.associate(self.context, FAKE_UUID, project=None)
@mock.patch('nova.db.fixed_ip_get_by_address')
def test_get_fixed_ip_by_address(self, fip_get):
fip_get.return_value = test_fixed_ip.fake_fixed_ip
fip = self.network_api.get_fixed_ip_by_address(self.context,
'fake-addr')
self.assertIsInstance(fip, fixed_ip_obj.FixedIP)
class TestUpdateInstanceCache(test.TestCase):
def setUp(self):

View File

@ -27,7 +27,6 @@ try:
except ImportError:
import pickle
import mox
from oslo.config import cfg
import webob
@ -47,6 +46,7 @@ from nova import test
from nova.tests import fake_block_device
from nova.tests import fake_instance
from nova.tests import fake_network
from nova.tests.objects import test_instance_info_cache
from nova.tests.objects import test_security_group
from nova.virt import netutils
@ -71,7 +71,7 @@ INSTANCE = fake_instance.fake_db_instance(**
'vcpus': 1,
'fixed_ips': [],
'root_device_name': '/dev/sda1',
'info_cache': {'network_info': []},
'info_cache': test_instance_info_cache.fake_info_cache,
'hostname': 'test.novadomain',
'display_name': 'my_displayname',
'metadata': {},
@ -82,7 +82,8 @@ INSTANCE = fake_instance.fake_db_instance(**
def fake_inst_obj(context):
return instance_obj.Instance._from_db_object(
context, instance_obj.Instance(), INSTANCE,
expected_attrs=['metadata', 'system_metadata'])
expected_attrs=['metadata', 'system_metadata',
'info_cache'])
def get_default_sys_meta():
@ -310,12 +311,6 @@ class MetadataTestCase(test.TestCase):
def test_InstanceMetadata_queries_network_API_when_needed(self):
network_info_from_api = []
self.mox.StubOutWithMock(network_api.API, "get_instance_nw_info")
network_api.API.get_instance_nw_info(
mox.IgnoreArg(),
mox.IgnoreArg()).AndReturn(network_info_from_api)
self.mox.StubOutWithMock(netutils, "get_injected_network_template")
netutils.get_injected_network_template(