aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/openstack/neutron/plugin/networking-onos/networking-onos/networking_onos/plugins/ml2/driver.py
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/openstack/neutron/plugin/networking-onos/networking-onos/networking_onos/plugins/ml2/driver.py')
-rw-r--r--framework/src/openstack/neutron/plugin/networking-onos/networking-onos/networking_onos/plugins/ml2/driver.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/framework/src/openstack/neutron/plugin/networking-onos/networking-onos/networking_onos/plugins/ml2/driver.py b/framework/src/openstack/neutron/plugin/networking-onos/networking-onos/networking_onos/plugins/ml2/driver.py
new file mode 100644
index 00000000..b78775f4
--- /dev/null
+++ b/framework/src/openstack/neutron/plugin/networking-onos/networking-onos/networking_onos/plugins/ml2/driver.py
@@ -0,0 +1,140 @@
+# Copyright (c) 2015 Huawei Technologies India Pvt Ltd
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from oslo_config import cfg
+from oslo_log import helpers as log_helpers
+from oslo_log import log as logging
+
+from neutron.common import constants as n_const
+from neutron.extensions import portbindings
+from neutron.plugins.common import constants
+from neutron.plugins.ml2 import driver_api as api
+
+from networking_onos.common import config # noqa
+from networking_onos.common import utils as onos_utils
+
+LOG = logging.getLogger(__name__)
+
+
+class ONOSMechanismDriver(api.MechanismDriver):
+
+ """Open Networking Operating System ML2 Driver for Neutron.
+
+ Code which makes communication between ONOS and OpenStack Neutron
+ possible.
+ """
+ def __init__(self):
+ self.onos_path = cfg.CONF.onos.url_path
+ self.onos_auth = (cfg.CONF.onos.username, cfg.CONF.onos.password)
+ self.vif_type = portbindings.VIF_TYPE_OVS
+ self.vif_details = {portbindings.CAP_PORT_FILTER: True}
+
+ def initialize(self):
+ # No action required as of now. Can be extended in
+ # the future if required.
+ pass
+
+ @log_helpers.log_method_call
+ def create_network_postcommit(self, context):
+ entity_path = 'networks'
+ resource = context.current.copy()
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'post',
+ entity_path, {'network': resource})
+
+ @log_helpers.log_method_call
+ def update_network_postcommit(self, context):
+ entity_path = 'networks/' + context.current['id']
+ resource = context.current.copy()
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'put',
+ entity_path, {'network': resource})
+
+ @log_helpers.log_method_call
+ def delete_network_postcommit(self, context):
+ entity_path = 'networks/' + context.current['id']
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'delete',
+ entity_path)
+
+ @log_helpers.log_method_call
+ def create_subnet_postcommit(self, context):
+ entity_path = 'subnets'
+ resource = context.current.copy()
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'post',
+ entity_path, {'subnet': resource})
+
+ @log_helpers.log_method_call
+ def update_subnet_postcommit(self, context):
+ entity_path = 'subnets/' + context.current['id']
+ resource = context.current.copy()
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'put',
+ entity_path, {'subnet': resource})
+
+ @log_helpers.log_method_call
+ def delete_subnet_postcommit(self, context):
+ entity_path = 'subnets/' + context.current['id']
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'delete',
+ entity_path)
+
+ @log_helpers.log_method_call
+ def create_port_postcommit(self, context):
+ entity_path = 'ports'
+ resource = context.current.copy()
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'post',
+ entity_path, {'port': resource})
+
+ @log_helpers.log_method_call
+ def update_port_postcommit(self, context):
+ entity_path = 'ports/' + context.current['id']
+ resource = context.current.copy()
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'put',
+ entity_path, {'port': resource})
+
+ @log_helpers.log_method_call
+ def delete_port_postcommit(self, context):
+ entity_path = 'ports/' + context.current['id']
+ onos_utils.send_msg(self.onos_path, self.onos_auth, 'delete',
+ entity_path)
+
+ @log_helpers.log_method_call
+ def bind_port(self, context):
+ """Set port binding data for use with nova."""
+ LOG.debug("Attempting to bind port %(port)s on network %(network)s",
+ {'port': context.current['id'],
+ 'network': context.network.current['id']})
+ # Prepared porting binding data
+ for segment in context.segments_to_bind:
+ if self.check_segment(segment):
+ context.set_binding(segment[api.ID],
+ self.vif_type,
+ self.vif_details,
+ status=n_const.PORT_STATUS_ACTIVE)
+ LOG.debug("Port bound successful for segment: %s", segment)
+ return
+ else:
+ LOG.debug("Port bound un-successfult for segment ID %(id)s, "
+ "segment %(seg)s, phys net %(physnet)s, and "
+ "network type %(nettype)s",
+ {'id': segment[api.ID],
+ 'seg': segment[api.SEGMENTATION_ID],
+ 'physnet': segment[api.PHYSICAL_NETWORK],
+ 'nettype': segment[api.NETWORK_TYPE]})
+
+ @log_helpers.log_method_call
+ def check_segment(self, segment):
+ """Check whether segment is valid for the ONOS MechanismDriver."""
+
+ return segment[api.NETWORK_TYPE] in [constants.TYPE_LOCAL,
+ constants.TYPE_GRE,
+ constants.TYPE_VXLAN,
+ constants.TYPE_VLAN]