commit 50090b442fa0e40117cd155289073eddd855457a
Author: fumihiko kakuma <kakuma@valinux.co.jp>
Date:   Wed Jan 29 11:19:59 2014 +0900

    This is modules for the ryu plugin agent to a neutron ml2 plugin.
    In this version, the ryu agent do as one of thread on this module.
---
 bin/neutron-ryu-ml2-agent |   19 ++++++++++
 ryu/cmd/ryu_ml2_agent.py  |   88 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 107 insertions(+)

diff --git a/bin/neutron-ryu-ml2-agent b/bin/neutron-ryu-ml2-agent
new file mode 100755
index 0000000..ea487e7
--- /dev/null
+++ b/bin/neutron-ryu-ml2-agent
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+
+# Copyright (C) 2011, 2012 Nippon Telegraph and Telephone Corporation.
+#
+# 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 ryu.cmd.ryu_ml2_agent import main
+main()
diff --git a/ryu/cmd/ryu_ml2_agent.py b/ryu/cmd/ryu_ml2_agent.py
new file mode 100755
index 0000000..f79fdbb
--- /dev/null
+++ b/ryu/cmd/ryu_ml2_agent.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2014 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2014 VA Linux Systems Japan K.K.
+#
+# 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.
+# @author: Fumihiko Kakuma, VA Linux Systems Japan K.K.
+
+from ryu.lib import hub
+hub.patch()
+
+# TODO:
+#   Right now, we have our own patched copy of ovs python bindings
+#   Once our modification is upstreamed and widely deployed,
+#   use it
+#
+# NOTE: this modifies sys.path and thus affects the following imports.
+# eg. oslo.config.cfg.
+import ryu.contrib
+
+from oslo.config import cfg
+import sys
+
+from neutron.openstack.common import log as os_logging
+from neutron.common import config as osn_config
+
+from ryu import flags
+from ryu import version
+from ryu.app import wsgi
+from ryu.base.app_manager import AppManager
+from ryu.controller import controller
+from ryu.topology import switches
+
+
+LOG = os_logging.getLogger(__name__)
+CONF = cfg.CONF
+CONF.register_cli_opts([
+    cfg.ListOpt('app-lists', default=[],
+                help='application module name to run'),
+    cfg.MultiStrOpt('app', positional=True, default=[],
+                    help='application module name to run')
+])
+
+
+def main():
+    try:
+        CONF(project='ryu', version='neutron-ryu-ml2-agent %s' % version,
+             default_config_files=['/usr/local/etc/ryu/ryu.conf'])
+    except cfg.ConfigFilesNotFoundError:
+        CONF(project='ryu', version='neutron-ryu-ml2-agent %s' % version)
+
+    osn_config.setup_logging(CONF)
+
+    app_lists = CONF.app_lists + CONF.app
+    if not app_lists:
+        app_lists = ['ryu.app.ofctl.service',
+                     'neutron.plugins.ryu.agent.ryu_ml2_agent']
+
+    app_mgr = AppManager.get_instance()
+    app_mgr.load_apps(app_lists)
+    contexts = app_mgr.create_contexts()
+    services = []
+    services.extend(app_mgr.instantiate_apps(**contexts))
+
+    webapp = wsgi.start_service(app_mgr)
+    if webapp:
+        thr = hub.spawn(webapp)
+        services.append(thr)
+
+    try:
+        hub.joinall(services)
+    finally:
+        app_mgr.close()
+
+
+if __name__ == "__main__":
+    main()
