Merge "Fixes bugs for requests sent to SDN-VE controller"

This commit is contained in:
Jenkins 2014-05-27 00:07:11 +00:00 committed by Gerrit Code Review
commit 9a7a5c7e4c
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 = {
@ -270,7 +271,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):
@ -484,6 +485,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:
@ -559,11 +565,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')
@ -575,6 +581,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)