Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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
  • Loading branch information
markmcclain committed Oct 22, 2012
1 parent 16d653a commit 83a8418
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
8 changes: 6 additions & 2 deletions nova/api/openstack/compute/servers.py
Expand Up @@ -32,6 +32,8 @@
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
Expand Down Expand Up @@ -597,8 +599,10 @@ def _get_injected_files(self, personality):
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."""
Expand Down
52 changes: 52 additions & 0 deletions nova/tests/api/openstack/compute/test_servers.py
Expand Up @@ -40,6 +40,7 @@
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
Expand Down Expand Up @@ -135,6 +136,11 @@ def test_decode_base64_illegal_bytes(self):
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):
Expand Down Expand Up @@ -175,6 +181,52 @@ def test_requested_networks_prefix(self):
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)
Expand Down

0 comments on commit 83a8418

Please sign in to comment.