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:
Mark McClain
2012-10-22 18:15:24 -04:00
parent 16d653a306
commit 83a84182cd
2 changed files with 58 additions and 2 deletions
+6 -2
View File
@@ -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)