Skip to content

Commit

Permalink
Make _is_multi_host() use objects
Browse files Browse the repository at this point in the history
This makes the network api _is_multi_host() method use objects
instead of direct database access so that compute manager can
call it directly.

Note that the previous unit tests for this method used the
random.choice() method to selectively test the is/is-not multihost
case. Unit tests should not be non-deterministic like this, for
coverage and stability reasons. This patch pulls out the two
possibilities for each into separate cases to ensure both are
tested.

Related to blueprint compute-manager-objects-juno

Change-Id: I432a759a666948f2cfaa29d82f749dc9a39141be
  • Loading branch information
kk7ds committed Apr 15, 2014
1 parent 2960a5a commit 869b435
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 38 deletions.
13 changes: 8 additions & 5 deletions nova/network/api.py
Expand Up @@ -24,7 +24,9 @@
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 network as network_obj
from nova.openstack.common.gettextutils import _
from nova.openstack.common import log as logging
from nova import policy
Expand Down Expand Up @@ -458,13 +460,14 @@ def setup_networks_on_host(self, context, instance, host=None,

def _is_multi_host(self, context, instance):
try:
fixed_ips = self.db.fixed_ip_get_by_instance(context,
instance['uuid'])
fixed_ips = fixed_ip_obj.FixedIPList.get_by_instance_uuid(
context, instance['uuid'])
except exception.FixedIpNotFoundForInstance:
return False
network = self.db.network_get(context, fixed_ips[0]['network_id'],
project_only='allow_none')
return network['multi_host']
network = network_obj.Network.get_by_id(context,
fixed_ips[0].network_id,
project_only='allow_none')
return network.multi_host

def _get_floating_ip_addresses(self, context, instance):
floating_ips = self.db.instance_floating_address_get_all(context,
Expand Down
65 changes: 32 additions & 33 deletions nova/tests/network/test_api.py
Expand Up @@ -17,7 +17,6 @@

import contextlib
import itertools
import random

import mock
import mox
Expand All @@ -32,6 +31,8 @@
from nova.network import model as network_model
from nova.network import rpcapi as network_rpcapi
from nova.objects import fields
from nova.objects import fixed_ip as fixed_ip_obj
from nova.objects import network as network_obj
from nova import policy
from nova import test
from nova.tests import fake_instance
Expand Down Expand Up @@ -235,46 +236,44 @@ def fake_fixed_ip_get_by_instance(ctxt, uuid):
self.assertFalse(self.network_api._is_multi_host(self.context,
instance))

def test_is_multi_host_network_has_no_project_id(self):
is_multi_host = random.choice([True, False])
network = {'project_id': None,
'multi_host': is_multi_host, }
network_ref = self.network_api.db.network_create_safe(
self.context.elevated(),
network)

def fake_fixed_ip_get_by_instance(ctxt, uuid):
fixed_ip = [{'network_id': network_ref['id'],
'instance_uuid': FAKE_UUID, }]
return fixed_ip

self.stubs.Set(self.network_api.db, 'fixed_ip_get_by_instance',
fake_fixed_ip_get_by_instance)

@mock.patch('nova.objects.fixed_ip.FixedIPList.get_by_instance_uuid')
@mock.patch('nova.objects.network.Network.get_by_id')
def _test_is_multi_host_network_has_no_project_id(self, is_multi_host,
net_get, fip_get):
net_get.return_value = network_obj.Network(id=123,
project_id=None,
multi_host=is_multi_host)
fip_get.return_value = [fixed_ip_obj.FixedIP(
network_id=123, instance_uuid=FAKE_UUID)]
instance = {'uuid': FAKE_UUID}
result = self.network_api._is_multi_host(self.context, instance)
self.assertEqual(is_multi_host, result)

def test_is_multi_host_network_has_project_id(self):
is_multi_host = random.choice([True, False])
network = {'project_id': self.context.project_id,
'multi_host': is_multi_host, }
network_ref = self.network_api.db.network_create_safe(
self.context.elevated(),
network)

def fake_fixed_ip_get_by_instance(ctxt, uuid):
fixed_ip = [{'network_id': network_ref['id'],
'instance_uuid': FAKE_UUID, }]
return fixed_ip

self.stubs.Set(self.network_api.db, 'fixed_ip_get_by_instance',
fake_fixed_ip_get_by_instance)

def test_is_multi_host_network_has_no_project_id_multi(self):
self._test_is_multi_host_network_has_no_project_id(True)

def test_is_multi_host_network_has_no_project_id_non_multi(self):
self._test_is_multi_host_network_has_no_project_id(False)

@mock.patch('nova.objects.fixed_ip.FixedIPList.get_by_instance_uuid')
@mock.patch('nova.objects.network.Network.get_by_id')
def _test_is_multi_host_network_has_project_id(self, is_multi_host,
net_get, fip_get):
net_get.return_value = network_obj.Network(
id=123, project_id=self.context.project_id,
multi_host=is_multi_host)
fip_get.return_value = [
fixed_ip_obj.FixedIP(network_id=123, instance_uuid=FAKE_UUID)]
instance = {'uuid': FAKE_UUID}
result = self.network_api._is_multi_host(self.context, instance)
self.assertEqual(is_multi_host, result)

def test_is_multi_host_network_has_project_id_multi(self):
self._test_is_multi_host_network_has_project_id(True)

def test_is_multi_host_network_has_project_id_non_multi(self):
self._test_is_multi_host_network_has_project_id(False)

def test_network_disassociate_project(self):
def fake_network_disassociate(ctx, network_id, disassociate_host,
disassociate_project):
Expand Down

0 comments on commit 869b435

Please sign in to comment.