add port support when QuantumV2 subclass is used
fixes bug 1070045 Fix the current implementation by checking if FLAGS.network_api_class is a subclass of nova.network.quantumv2.api.API. Previously, the API would not accept port references unless the network_api_class string was anything other than the QuantumV2 class. This limitation prevented subclassing. This changeset includes additional API unit tests focused on QuantumV2 and requested networks. Change-Id: I6b7b7389e127ff8b084ac379cb9aebccc102620c
This commit is contained in:
@@ -32,6 +32,8 @@ from nova import compute
|
||||
from nova.compute import instance_types
|
||||
from nova import exception
|
||||
from nova import flags
|
||||
from nova.network.quantumv2 import api as quantum_api
|
||||
from nova.openstack.common import importutils
|
||||
from nova.openstack.common import log as logging
|
||||
from nova.openstack.common.rpc import common as rpc_common
|
||||
from nova.openstack.common import timeutils
|
||||
@@ -597,8 +599,10 @@ class Controller(wsgi.Controller):
|
||||
return injected_files
|
||||
|
||||
def _is_quantum_v2(self):
|
||||
return FLAGS.network_api_class ==\
|
||||
"nova.network.quantumv2.api.API"
|
||||
return issubclass(
|
||||
importutils.import_class(FLAGS.network_api_class),
|
||||
quantum_api.API
|
||||
)
|
||||
|
||||
def _get_requested_networks(self, requested_networks):
|
||||
"""Create a list of requested networks from the networks attribute."""
|
||||
|
||||
@@ -40,6 +40,7 @@ from nova.db.sqlalchemy import models
|
||||
from nova import exception
|
||||
from nova import flags
|
||||
from nova.network import manager
|
||||
from nova.network import quantumv2
|
||||
from nova.openstack.common import jsonutils
|
||||
from nova.openstack.common import rpc
|
||||
from nova import test
|
||||
@@ -135,6 +136,11 @@ class Base64ValidationTest(test.TestCase):
|
||||
self.assertEqual(result, None)
|
||||
|
||||
|
||||
class QuantumV2Subclass(quantumv2.api.API):
|
||||
"""Used to ensure that API handles subclasses properly."""
|
||||
pass
|
||||
|
||||
|
||||
class ServersControllerTest(test.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
@@ -175,6 +181,52 @@ class ServersControllerTest(test.TestCase):
|
||||
res = self.controller._get_requested_networks(requested_networks)
|
||||
self.assertTrue((uuid, None) in res)
|
||||
|
||||
def test_requested_networks_quantumv2_enabled_with_port(self):
|
||||
self.flags(network_api_class='nova.network.quantumv2.api.API')
|
||||
port = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
|
||||
requested_networks = [{'port': port}]
|
||||
res = self.controller._get_requested_networks(requested_networks)
|
||||
self.assertEquals(res, [(None, None, port)])
|
||||
|
||||
def test_requested_networks_quantumv2_enabled_with_network(self):
|
||||
self.flags(network_api_class='nova.network.quantumv2.api.API')
|
||||
network = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
|
||||
requested_networks = [{'uuid': network}]
|
||||
res = self.controller._get_requested_networks(requested_networks)
|
||||
self.assertEquals(res, [(network, None, None)])
|
||||
|
||||
def test_requested_networks_quantumv2_enabled_with_network_and_port(self):
|
||||
self.flags(network_api_class='nova.network.quantumv2.api.API')
|
||||
network = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
|
||||
port = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
|
||||
requested_networks = [{'uuid': network, 'port': port}]
|
||||
res = self.controller._get_requested_networks(requested_networks)
|
||||
self.assertEquals(res, [(None, None, port)])
|
||||
|
||||
def test_requested_networks_quantumv2_disabled_with_port(self):
|
||||
port = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
|
||||
requested_networks = [{'port': port}]
|
||||
self.assertRaises(
|
||||
webob.exc.HTTPBadRequest,
|
||||
self.controller._get_requested_networks,
|
||||
requested_networks)
|
||||
|
||||
def test_requested_networks_api_enabled_with_v2_subclass(self):
|
||||
self.flags(network_api_class='nova.network.quantumv2.api.API')
|
||||
network = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
|
||||
port = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
|
||||
requested_networks = [{'uuid': network, 'port': port}]
|
||||
res = self.controller._get_requested_networks(requested_networks)
|
||||
self.assertEquals(res, [(None, None, port)])
|
||||
|
||||
def test_requested_networks_quantumv2_subclass_with_port(self):
|
||||
cls = 'nova.tests.api.openstack.compute.test_servers.QuantumV2Subclass'
|
||||
self.flags(network_api_class=cls)
|
||||
port = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee'
|
||||
requested_networks = [{'port': port}]
|
||||
res = self.controller._get_requested_networks(requested_networks)
|
||||
self.assertEquals(res, [(None, None, port)])
|
||||
|
||||
def test_get_server_by_uuid(self):
|
||||
req = fakes.HTTPRequest.blank('/v2/fake/servers/%s' % FAKE_UUID)
|
||||
res_dict = self.controller.show(req, FAKE_UUID)
|
||||
|
||||
Reference in New Issue
Block a user