Fixes bugs for requests sent to SDN-VE controller

This patchset fixes a couple of bugs wrt processing requests
before sending them to the backend controller and adjusts the
requests based on the controller requirements. It also corrects
typos, add quotas and changes the default for a configuration
parameter.

Change-Id: I4b64c2b49ff4854949afc1e54cba1057f376b058
Closes-Bug: #1311260
DocImpact: The default tenant type is chganged from OF to OVERLAY
This commit is contained in:
Mohammad Banikazemi 2014-04-22 12:32:33 -04:00
parent 09e5726336
commit c4f0c4ba96
5 changed files with 47 additions and 16 deletions

View File

@ -1,6 +1,6 @@
[sdnve]
# (ListOpt) The IP address of one (or more) SDN-VE controllers
# Default value is : controller_ips = 127.0.0.1
# Default value is: controller_ips = 127.0.0.1
# Example: controller_ips = 127.0.0.1,127.0.0.2
# (StrOpt) The integration bridge for OF based implementation
# The default value for integration_bridge is None
@ -17,7 +17,7 @@
# Example: out_of_band = False
#
# (BoolOpt) The fake controller for testing purposes
# Default value is : use_fake_controller = False
# Default value is: use_fake_controller = False
# (StrOpt) The port number for use with controller
# The default value for the port is 8443
# Example: port = 8443
@ -29,8 +29,9 @@
# Example: password = sdnve_password
#
# (StrOpt) The default type of tenants (and associated resources)
# Default value for OF is: default_tenant = OF
# Example: default_tenant = OVERLAY
# Available choices are: OVERLAY or OF
# The default value for tenant type is OVERLAY
# Example: default_tenant_type = OVERLAY
# (StrOpt) The string in tenant description that indicates
# Default value for OF tenants: of_signature = SDNVE-OF
# (StrOpt) The string in tenant description that indicates

View File

@ -49,8 +49,8 @@ sdnve_opts = [
cfg.ListOpt('interface_mappings',
default=DEFAULT_INTERFACE_MAPPINGS,
help=_("List of <physical_network_name>:<interface_name>")),
cfg.StrOpt('default_tenant_type', default='OF',
help=_("Tenant type: OF (default) and OVERLAY")),
cfg.StrOpt('default_tenant_type', default='OVERLAY',
help=_("Tenant type: OVERLAY (default) or OF")),
cfg.StrOpt('overlay_signature', default='SDNVE-OVERLAY',
help=_("The string in tenant description that indicates "
"the tenant is a OVERLAY tenant")),

View File

@ -226,6 +226,7 @@ class Client(RequestHandler):
body = dict(
(k.replace(':', '_'), v) for k, v in body.items()
if attributes.is_attr_set(v))
return body
def sdnve_list(self, resource, **params):
'''Fetches a list of resources.'''
@ -255,7 +256,7 @@ class Client(RequestHandler):
LOG.info(_("Bad resource for forming a create request"))
return 0, ''
self.process_request(body)
body = self.process_request(body)
status, data = self.post(res, body=body)
return (status, data)
@ -267,7 +268,7 @@ class Client(RequestHandler):
LOG.info(_("Bad resource for forming a update request"))
return 0, ''
self.process_request(body)
body = self.process_request(body)
return self.put(res + specific, body=body)
def sdnve_delete(self, resource, specific):

View File

@ -21,15 +21,16 @@ import functools
from oslo.config import cfg
from neutron.common import constants as q_const
from neutron.common import constants as n_const
from neutron.common import exceptions as n_exc
from neutron.common import rpc as q_rpc
from neutron.common import rpc as n_rpc
from neutron.common import topics
from neutron.db import agents_db
from neutron.db import db_base_plugin_v2
from neutron.db import external_net_db
from neutron.db import l3_gwmode_db
from neutron.db import portbindings_db
from neutron.db import quota_db # noqa
from neutron.extensions import portbindings
from neutron.openstack.common import excutils
from neutron.openstack.common import log as logging
@ -54,7 +55,7 @@ class SdnveRpcCallbacks():
If a manager would like to set an rpc API version, or support more than
one class as the target of rpc messages, override this method.
'''
return q_rpc.PluginRpcDispatcher([self,
return n_rpc.PluginRpcDispatcher([self,
agents_db.AgentExtRpcCallback()])
def sdnve_info(self, rpc_context, **kwargs):
@ -119,7 +120,7 @@ class SdnvePluginV2(db_base_plugin_v2.NeutronDbPluginV2,
__native_sorting_support = False
supported_extension_aliases = ["binding", "router", "external-net",
"agent"]
"agent", "quotas"]
def __init__(self, configfile=None):
self.base_binding_dict = {
@ -266,7 +267,7 @@ class SdnvePluginV2(db_base_plugin_v2.NeutronDbPluginV2,
session = context.session
# Set port status as 'ACTIVE' to avoid needing the agent
port['port']['status'] = q_const.PORT_STATUS_ACTIVE
port['port']['status'] = n_const.PORT_STATUS_ACTIVE
port_data = port['port']
with session.begin(subtransactions=True):
@ -480,6 +481,11 @@ class SdnvePluginV2(db_base_plugin_v2.NeutronDbPluginV2,
context, id, router)
if processed_request['router']:
egw = processed_request['router'].get('external_gateway_info')
# Check for existing empty set (different from None) in request
if egw == {}:
processed_request['router'][
'external_gateway_info'] = {'network_id': 'null'}
(res, data) = self.sdnve_client.sdnve_update(
'router', id, processed_request['router'])
if res not in constants.HTTP_ACCEPTABLE:
@ -555,11 +561,11 @@ class SdnvePluginV2(db_base_plugin_v2.NeutronDbPluginV2,
{'router_id': router_id, 'interface_info': interface_info})
subnet_id = interface_info.get('subnet_id')
port_id = interface_info.get('port_id')
if not subnet_id:
portid = interface_info.get('port_id')
if not portid:
if not port_id:
raise sdnve_exc.BadInputException(msg=_('No port ID'))
myport = super(SdnvePluginV2, self).get_port(context, portid)
myport = super(SdnvePluginV2, self).get_port(context, port_id)
LOG.debug(_("SdnvePluginV2.remove_router_interface port: %s"),
myport)
myfixed_ips = myport.get('fixed_ips')
@ -571,6 +577,21 @@ class SdnvePluginV2(db_base_plugin_v2.NeutronDbPluginV2,
LOG.debug(
_("SdnvePluginV2.remove_router_interface subnet_id: %s"),
subnet_id)
else:
if not port_id:
# The backend requires port id info in the request
subnet = super(SdnvePluginV2, self).get_subnet(context,
subnet_id)
df = {'device_id': [router_id],
'device_owner': [n_const.DEVICE_OWNER_ROUTER_INTF],
'network_id': [subnet['network_id']]}
ports = self.get_ports(context, filters=df)
if ports:
pid = ports[0]['id']
interface_info['port_id'] = pid
msg = ("SdnvePluginV2.remove_router_interface "
"subnet_id: %(sid)s port_id: %(pid)s")
LOG.debug(msg, {'sid': subnet_id, 'pid': pid})
(res, data) = self.sdnve_client.sdnve_update(
'router', router_id + '/remove_router_interface', interface_info)

View File

@ -135,3 +135,11 @@ class TestSdnveApi(base.BaseTestCase):
result = self.api.sdnve_check_and_create_tenant(
id, constants.TENANT_TYPE_OF)
self.assertIsNone(result)
def test_process_request(self):
my_request = {'key_1': 'value_1', 'router:external': 'True',
'key_2': 'value_2'}
expected = {'key_1': 'value_1', 'router_external': 'True',
'key_2': 'value_2'}
result = self.api.process_request(my_request)
self.assertEqual(expected, result)