Improve NeutronFixture and remove unncessary stubbing
With a small improvement on NeutronFixture that allows creating more than two ports we can let our tests to exercise and therefore cover most of the neutronv2/api code as well. To do that this path removes a lot of fake_network.set_stub_network_methods() calls from the tests. The remaining calls are not that trivial to remove so those are left in for a later patch. The numa functional tests uses the libvirt fixture and during the guest config xml generation it tries to instantiate OVOs from os_vif. To make this work the libvirt fixture has to make sure that the os_vif.initialize() is called as that call registers the OVOs. Change-Id: I1dbccc2be6ba79bf267edac9208c80e187e6256a
This commit is contained in:
parent
25b3e2d69b
commit
acd3216a8b
|
@ -22,6 +22,7 @@ from contextlib import contextmanager
|
|||
import copy
|
||||
import logging as std_logging
|
||||
import os
|
||||
import random
|
||||
import warnings
|
||||
|
||||
import fixtures
|
||||
|
@ -1121,6 +1122,7 @@ class NeutronFixture(fixtures.Fixture):
|
|||
'admin_state_up': True,
|
||||
'tenant_id': tenant_id,
|
||||
'id': '3cb9bc59-5699-4588-a4b1-b87f96708bc6',
|
||||
'shared': False,
|
||||
}
|
||||
subnet_1 = {
|
||||
'name': 'private-subnet',
|
||||
|
@ -1156,7 +1158,8 @@ class NeutronFixture(fixtures.Fixture):
|
|||
'subnet_id': subnet_1['id']
|
||||
}
|
||||
],
|
||||
'tenant_id': tenant_id
|
||||
'tenant_id': tenant_id,
|
||||
'binding:vif_type': 'ovs'
|
||||
}
|
||||
|
||||
port_2 = {
|
||||
|
@ -1171,7 +1174,8 @@ class NeutronFixture(fixtures.Fixture):
|
|||
'subnet_id': subnet_1['id']
|
||||
}
|
||||
],
|
||||
'tenant_id': tenant_id
|
||||
'tenant_id': tenant_id,
|
||||
'binding:vif_type': 'ovs'
|
||||
}
|
||||
|
||||
nw_info = [{
|
||||
|
@ -1235,10 +1239,6 @@ class NeutronFixture(fixtures.Fixture):
|
|||
def setUp(self):
|
||||
super(NeutronFixture, self).setUp()
|
||||
|
||||
self.test.stub_out(
|
||||
'nova.network.neutronv2.api.API.'
|
||||
'validate_networks',
|
||||
lambda *args, **kwargs: 1)
|
||||
self.test.stub_out(
|
||||
'nova.network.neutronv2.api.API.setup_networks_on_host',
|
||||
lambda *args, **kwargs: None)
|
||||
|
@ -1302,6 +1302,9 @@ class NeutronFixture(fixtures.Fixture):
|
|||
networks = copy.deepcopy(self._networks)
|
||||
if 'id' in _params:
|
||||
networks = [x for x in networks if x['id'] in _params['id']]
|
||||
if 'shared' in _params:
|
||||
networks = [x for x in networks if x['shared'] ==
|
||||
_params['shared']]
|
||||
return {'networks': networks}
|
||||
|
||||
def list_ports(self, retrieve_all=True, **_params):
|
||||
|
@ -1314,8 +1317,23 @@ class NeutronFixture(fixtures.Fixture):
|
|||
return copy.deepcopy({'floatingips': self._floatingips})
|
||||
|
||||
def create_port(self, body=None):
|
||||
self._ports.append(copy.deepcopy(NeutronFixture.port_2))
|
||||
return copy.deepcopy({'port': NeutronFixture.port_2})
|
||||
if self._get_first_id_match(NeutronFixture.port_2['id'],
|
||||
self._ports) is None:
|
||||
# we need the double copy as port_2 is a class variable but
|
||||
# self._ports is an instance variable
|
||||
new_port = copy.deepcopy(NeutronFixture.port_2)
|
||||
self._ports.append(new_port)
|
||||
else:
|
||||
new_port = copy.deepcopy(NeutronFixture.port_2)
|
||||
# we need truly random uuids instead of named sentinels as some
|
||||
# tests needs more than 3 ports
|
||||
new_port.update({
|
||||
'id': str(uuidutils.generate_uuid()),
|
||||
'mac_address': '00:' + ':'.join(
|
||||
['%02x' % random.randint(0, 255) for _ in range(5)]),
|
||||
})
|
||||
self._ports.append(new_port)
|
||||
return {'port': copy.deepcopy(new_port)}
|
||||
|
||||
def update_port(self, port_id, body=None):
|
||||
new_port = self._get_first_id_match(port_id, self._ports)
|
||||
|
@ -1326,6 +1344,10 @@ class NeutronFixture(fixtures.Fixture):
|
|||
|
||||
return {'port': new_port}
|
||||
|
||||
def show_quota(self, project_id):
|
||||
# unlimited quota
|
||||
return {'quota': {'port': -1}}
|
||||
|
||||
|
||||
class _NoopConductor(object):
|
||||
def __getattr__(self, key):
|
||||
|
|
|
@ -26,7 +26,6 @@ from nova import context
|
|||
from nova.db import api as db
|
||||
from nova.db.sqlalchemy import api as sqlalchemy_api
|
||||
from nova.tests.functional import test_servers
|
||||
from nova.tests.unit import fake_network
|
||||
|
||||
|
||||
class TestDatabaseArchive(test_servers.ServersTestBase):
|
||||
|
@ -59,10 +58,6 @@ class TestDatabaseArchive(test_servers.ServersTestBase):
|
|||
|
||||
:returns: created server (dict)
|
||||
"""
|
||||
# TODO(mriedem): We should pull this up into the parent class so we
|
||||
# don't have so much copy/paste in these functional tests.
|
||||
fake_network.set_stub_network_methods(self)
|
||||
|
||||
# Create a server
|
||||
server = self._build_minimal_create_server_request()
|
||||
created_server = self.api.post_server({'server': server})
|
||||
|
|
|
@ -20,7 +20,6 @@ from nova.objects import request_spec
|
|||
from nova import test
|
||||
from nova.tests import fixtures
|
||||
from nova.tests.functional import integrated_helpers
|
||||
from nova.tests.unit import fake_network
|
||||
from nova.tests.unit import fake_request_spec
|
||||
|
||||
|
||||
|
@ -98,11 +97,11 @@ class RequestSpecInstanceMigrationTestCase(
|
|||
_image_ref_parameter = 'imageRef'
|
||||
_flavor_ref_parameter = 'flavorRef'
|
||||
|
||||
USE_NEUTRON = True
|
||||
|
||||
def setUp(self):
|
||||
super(RequestSpecInstanceMigrationTestCase, self).setUp()
|
||||
|
||||
self.context = context.get_admin_context()
|
||||
fake_network.set_stub_network_methods(self)
|
||||
|
||||
def _create_instances(self, old=2, total=5):
|
||||
request = self._build_minimal_create_server_request()
|
||||
|
|
|
@ -27,12 +27,10 @@ from nova import test
|
|||
from nova.tests import fixtures as nova_fixtures
|
||||
from nova.tests.functional.api import client
|
||||
from nova.tests.functional.test_servers import ServersTestBase
|
||||
from nova.tests.unit import fake_network
|
||||
from nova.tests.unit.virt.libvirt import fake_imagebackend
|
||||
from nova.tests.unit.virt.libvirt import fake_libvirt_utils
|
||||
from nova.tests.unit.virt.libvirt import fakelibvirt
|
||||
|
||||
import os_vif
|
||||
|
||||
CONF = cfg.CONF
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -332,8 +330,6 @@ class NUMAAffinityNeutronFixture(nova_fixtures.NeutronFixture):
|
|||
|
||||
class NUMAServersWithNetworksTest(NUMAServersTestBase):
|
||||
|
||||
USE_NEUTRON = True
|
||||
|
||||
def setUp(self):
|
||||
# We need to enable neutron in this one
|
||||
self.flags(physnets=['foo', 'bar'], group='neutron')
|
||||
|
@ -344,18 +340,15 @@ class NUMAServersWithNetworksTest(NUMAServersTestBase):
|
|||
|
||||
super(NUMAServersWithNetworksTest, self).setUp()
|
||||
|
||||
# NOTE(mriedem): Unset the stub methods so we actually run our
|
||||
# neutronv2/api code and populate the net attributes on the
|
||||
# network model.
|
||||
fake_network.unset_stub_network_methods(self)
|
||||
|
||||
self.neutron_fixture = self.useFixture(
|
||||
NUMAAffinityNeutronFixture(self))
|
||||
# The ultimate base class _IntegratedTestBase uses NeutronFixture but
|
||||
# we need a bit more intelligent neutron for these tests. Applying the
|
||||
# new fixture here means that we re-stub what the previous neutron
|
||||
# fixture already stubbed.
|
||||
self.neutron = self.useFixture(NUMAAffinityNeutronFixture(self))
|
||||
|
||||
_p = mock.patch('nova.virt.libvirt.host.Host.get_connection')
|
||||
self.mock_conn = _p.start()
|
||||
self.addCleanup(_p.stop)
|
||||
os_vif.initialize()
|
||||
|
||||
def _test_create_server_with_networks(self, flavor_id, networks):
|
||||
host_info = fakelibvirt.NUMAHostInfo(cpu_nodes=2, cpu_sockets=1,
|
||||
|
|
|
@ -22,7 +22,6 @@ from nova.objects import fields
|
|||
from nova import test
|
||||
from nova.tests import fixtures as nova_fixtures
|
||||
from nova.tests.functional.test_servers import ServersTestBase
|
||||
from nova.tests.unit import fake_network
|
||||
from nova.tests.unit.virt.libvirt import fake_libvirt_utils
|
||||
from nova.tests.unit.virt.libvirt import fakelibvirt
|
||||
|
||||
|
@ -97,8 +96,6 @@ class SRIOVServersTest(ServersTestBase):
|
|||
self.compute = self.start_service('compute', host='test_compute0')
|
||||
self.compute_started = True
|
||||
|
||||
fake_network.set_stub_network_methods(self)
|
||||
|
||||
# Create server
|
||||
good_server = self._build_server(flavor_id)
|
||||
|
||||
|
|
|
@ -18,7 +18,6 @@ import mock
|
|||
|
||||
from nova.tests.functional.api import client
|
||||
from nova.tests.functional.test_servers import ServersTestBase
|
||||
from nova.tests.unit import fake_network
|
||||
from nova.tests.unit.virt.libvirt import fake_imagebackend
|
||||
from nova.tests.unit.virt.libvirt import fake_libvirt_utils
|
||||
from nova.tests.unit.virt.libvirt import fakelibvirt
|
||||
|
@ -79,7 +78,6 @@ class RealTimeServersTest(ServersTestBase):
|
|||
with mock.patch('nova.virt.libvirt.host.Host.get_connection',
|
||||
return_value=fake_connection):
|
||||
self.compute = self.start_service('compute', host='test_compute0')
|
||||
fake_network.set_stub_network_methods(self)
|
||||
|
||||
flavor = self._create_flavor(extra_spec={
|
||||
'hw:cpu_realtime': 'yes',
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
|
||||
from nova.tests.functional.api import client
|
||||
from nova.tests.functional import test_servers
|
||||
from nova.tests.unit import fake_network
|
||||
|
||||
|
||||
class InstanceActionsTestV2(test_servers.ServersTestBase):
|
||||
|
@ -28,9 +27,6 @@ class InstanceActionsTestV2(test_servers.ServersTestBase):
|
|||
|
||||
:returns: created server (dict)
|
||||
"""
|
||||
# TODO(mriedem): We should pull this up into the parent class so we
|
||||
# don't have so much copy/paste in these functional tests.
|
||||
fake_network.set_stub_network_methods(self)
|
||||
|
||||
# Create a server
|
||||
server = self._build_minimal_create_server_request()
|
||||
|
|
|
@ -18,7 +18,6 @@ from nova.api.openstack import compute
|
|||
from nova.api.openstack import wsgi
|
||||
from nova.tests.functional.api import client
|
||||
from nova.tests.functional import test_servers
|
||||
from nova.tests.unit import fake_network
|
||||
|
||||
|
||||
class LegacyV2CompatibleTestBase(test_servers.ServersTestBase):
|
||||
|
@ -50,7 +49,6 @@ class LegacyV2CompatibleTestBase(test_servers.ServersTestBase):
|
|||
self.assertNotIn('type', response.body["keypair"])
|
||||
|
||||
def test_request_with_pattern_properties_check(self):
|
||||
fake_network.set_stub_network_methods(self)
|
||||
server = self._build_minimal_create_server_request()
|
||||
post = {'server': server}
|
||||
created_server = self.api.post_server(post)
|
||||
|
@ -60,7 +58,6 @@ class LegacyV2CompatibleTestBase(test_servers.ServersTestBase):
|
|||
self.assertEqual(response, {'a': 'b'})
|
||||
|
||||
def test_request_with_pattern_properties_with_avoid_metadata(self):
|
||||
fake_network.set_stub_network_methods(self)
|
||||
server = self._build_minimal_create_server_request()
|
||||
post = {'server': server}
|
||||
created_server = self.api.post_server(post)
|
||||
|
|
|
@ -36,7 +36,6 @@ class TestMultiattachVolumes(integrated_helpers._IntegratedTestBase,
|
|||
self.useFixture(nova_fixtures.AllServicesCurrent())
|
||||
super(TestMultiattachVolumes, self).setUp()
|
||||
self.useFixture(nova_fixtures.CinderFixtureNewAttachFlow(self))
|
||||
self.useFixture(nova_fixtures.NeutronFixture(self))
|
||||
|
||||
def test_boot_from_volume_and_attach_to_second_server(self):
|
||||
"""This scenario creates a server from the multiattach volume, waits
|
||||
|
|
|
@ -25,7 +25,6 @@ from nova import test
|
|||
from nova.tests import fixtures as nova_fixtures
|
||||
from nova.tests.functional.api import client
|
||||
from nova.tests.functional import integrated_helpers
|
||||
from nova.tests.unit import fake_network
|
||||
from nova.tests.unit import policy_fixture
|
||||
from nova.virt import fake
|
||||
|
||||
|
@ -149,7 +148,6 @@ class ServerGroupTestV21(ServerGroupTestBase):
|
|||
fake.set_nodes(['host2'])
|
||||
self.addCleanup(fake.restore_nodes)
|
||||
self.compute2 = self.start_service('compute', host='host2')
|
||||
fake_network.set_stub_network_methods(self)
|
||||
|
||||
def test_get_no_groups(self):
|
||||
groups = self.api.get_server_groups()
|
||||
|
|
|
@ -38,7 +38,6 @@ from nova.tests.functional.api import client
|
|||
from nova.tests.functional import integrated_helpers
|
||||
from nova.tests.unit.api.openstack import fakes
|
||||
from nova.tests.unit import fake_block_device
|
||||
from nova.tests.unit import fake_network
|
||||
from nova.tests.unit import fake_notifier
|
||||
import nova.tests.unit.image.fake
|
||||
from nova.tests import uuidsentinel as uuids
|
||||
|
@ -70,13 +69,11 @@ class ServersTestBase(integrated_helpers._IntegratedTestBase):
|
|||
_return_resv_id_parameter = 'return_reservation_id'
|
||||
_min_count_parameter = 'min_count'
|
||||
|
||||
USE_NEUTRON = True
|
||||
|
||||
def setUp(self):
|
||||
self.computes = {}
|
||||
super(ServersTestBase, self).setUp()
|
||||
# The network service is called as part of server creates but no
|
||||
# networks have been populated in the db, so stub the methods.
|
||||
# The networks aren't relevant to what is being tested.
|
||||
fake_network.set_stub_network_methods(self)
|
||||
self.conductor = self.start_service(
|
||||
'conductor', manager='nova.conductor.manager.ConductorManager')
|
||||
|
||||
|
@ -1046,7 +1043,6 @@ class ServerTestV220(ServersTestBase):
|
|||
def setUp(self):
|
||||
super(ServerTestV220, self).setUp()
|
||||
self.api.microversion = '2.20'
|
||||
fake_network.set_stub_network_methods(self)
|
||||
self.ctxt = context.get_admin_context()
|
||||
|
||||
def _create_server(self):
|
||||
|
|
|
@ -54,13 +54,11 @@ class NotificationsTestCase(test.TestCase):
|
|||
|
||||
self.stub_out('nova.network.api.API.get_instance_nw_info',
|
||||
fake_get_nw_info)
|
||||
fake_network.set_stub_network_methods(self)
|
||||
|
||||
fake_notifier.stub_notifier(self)
|
||||
self.addCleanup(fake_notifier.reset)
|
||||
|
||||
self.flags(network_manager='nova.network.manager.FlatManager',
|
||||
host='testhost')
|
||||
self.flags(host='testhost')
|
||||
self.flags(notify_on_state_change="vm_and_task_state",
|
||||
group='notifications')
|
||||
|
||||
|
|
|
@ -1573,3 +1573,10 @@ class FakeLibvirtFixture(fixtures.Fixture):
|
|||
self.useFixture(fixtures.MonkeyPatch(
|
||||
'nova.virt.libvirt.vif.LibvirtGenericVIFDriver._plug_os_vif',
|
||||
lambda *a, **kw: None))
|
||||
|
||||
# os_vif.initialize is typically done in nova-compute startup
|
||||
# even if we are not planning to plug anything with os_vif in the test
|
||||
# we still need the object model initialized to be able to generate
|
||||
# guest config xml properly
|
||||
import os_vif
|
||||
os_vif.initialize()
|
||||
|
|
Loading…
Reference in New Issue