Adding ML2 driver code from zhanghaoyu7 commit id dece5b5cf0c9d8daaee74f77ab4c2a220c7... 47/1447/1
authorAshlee Young <ashlee@onosfw.com>
Thu, 10 Sep 2015 05:05:14 +0000 (22:05 -0700)
committerAshlee Young <ashlee@onosfw.com>
Thu, 10 Sep 2015 05:05:14 +0000 (22:05 -0700)
Change-Id: If6d0525ae818b53afecd417d1af1a78543f052a3

framework/src/openstack/neutron/plugin/networking-onos/README.onos [new file with mode: 0644]
framework/src/openstack/neutron/plugin/networking-onos/__init__.py [new file with mode: 0644]
framework/src/openstack/neutron/plugin/networking-onos/mech_driver.py [new file with mode: 0644]

diff --git a/framework/src/openstack/neutron/plugin/networking-onos/README.onos b/framework/src/openstack/neutron/plugin/networking-onos/README.onos
new file mode 100644 (file)
index 0000000..667fa36
--- /dev/null
@@ -0,0 +1,29 @@
+Open Networking Operating System (ONOS) ML2 MechanismDriver
+==========================================================
+ONOS is a carrier grade SDN open operating system designed for
+High Availability, scale-out and better performance.
+
+    http://www.onosproject.org/
+
+Mode of Working:
+================
+The networking-onos project provides a thin layer which makes the
+communication between ONOS and openstack neutron possible via ReST
+call. The driver code can be downloaded from:
+
+    https://git.openstack.org/cgit/openstack/networking-onos
+
+Using ONOS ML2 MechanismDriver
+==============================
+To use ONOS ML2 MechanismDriver one should
+1. Make sure networking-onos code is downloaded and installed. If doing
+   mannually then download the code, go inside networking_onos folder
+   and finally run "sudo python setup.py install" otherwise install
+   using pip.
+
+2. Configure ONOS as the required ML2 "mechanism_drivers" in
+   neutron/plugins/ml2/ml2_conf.ini:
+
+    mechanism_drivers=onos
+
+3. Configure "[ml2_onos]" in networking_onos/etc/ml2_onos_conf.ini
\ No newline at end of file
diff --git a/framework/src/openstack/neutron/plugin/networking-onos/__init__.py b/framework/src/openstack/neutron/plugin/networking-onos/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/framework/src/openstack/neutron/plugin/networking-onos/mech_driver.py b/framework/src/openstack/neutron/plugin/networking-onos/mech_driver.py
new file mode 100644 (file)
index 0000000..207dc69
--- /dev/null
@@ -0,0 +1,133 @@
+# 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.
+
+import requests
+
+from oslo_config import cfg
+#from oslo_log import helpers as log_helpers
+from neutron.openstack.common import log as logging
+from neutron.openstack.common import jsonutils
+
+from neutron.plugins.ml2 import driver_api as api
+
+LOG = logging.getLogger(__name__)
+
+ONOS_DRIVER_OPTS = [
+    cfg.StrOpt('path',
+               default='',
+               help=_('ONOS ReST interface URL')),
+    cfg.StrOpt('username',
+               default='',
+               help=_('Username for authentication.')),
+    cfg.StrOpt('password',
+               default='',
+               secret=True,  # do not expose value in the logs
+               help=_('Password for authentication.'))
+]
+
+cfg.CONF.register_opts(ONOS_DRIVER_OPTS, "ml2_onos")
+
+
+def send_msg(onos_path, onos_auth, msg_type, entity_path, entity=None):
+    """Send message to the ONOS controller."""
+
+    path = '/'.join([onos_path, entity_path])
+    LOG.debug("Sending MSG (%(msg)) URL (%(path)s) JSON (%(entity)s)",
+              {'msg': msg_type, 'path': path, 'entity': entity})
+    hdr = {'Content-Type': 'application/json'}
+    body = jsonutils.dumps(entity, indent=2) if entity else None
+    req = requests.request(method=msg_type, url=path,
+                           headers=hdr, data=body,
+                           auth=onos_auth)
+    # Let's raise voice for an error
+    req.raise_for_status()
+
+
+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):
+        conf = cfg.CONF.ml2_onos
+        self.onos_path = conf.url_path
+        self.onos_auth = (conf.username, conf.password)
+
+    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/' + context.current['id']
+        resource = context.current.copy()
+        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()
+        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']
+        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/' + context.current['id']
+        resource = context.current.copy()
+        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()
+        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']
+        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/' + context.current['id']
+        resource = context.current.copy()
+        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()
+        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']
+        send_msg(self.onos_path, self.onos_auth, 'delete',
+                 entity_path)