Signed-off-by: IWASE Yusuke <[email protected]>
---
ryu/lib/ovs/bridge.py | 5 +++++
ryu/lib/ovs/vsctl.py | 37 ++++++++++++++++++++++++++++++++++++
ryu/tests/unit/lib/ovs/test_vsctl.py | 24 +++++++++++++++++++++++
3 files changed, 66 insertions(+)
diff --git a/ryu/lib/ovs/bridge.py b/ryu/lib/ovs/bridge.py
index 337867e..e48052f 100644
--- a/ryu/lib/ovs/bridge.py
+++ b/ryu/lib/ovs/bridge.py
@@ -25,6 +25,8 @@ from ryu import cfg
import ryu.exception as ryu_exc
import ryu.lib.dpid as dpid_lib
import ryu.lib.ovs.vsctl as ovs_vsctl
+from ryu.lib.ovs.vsctl import valid_ovsdb_addr
+
LOG = logging.getLogger(__name__)
@@ -95,6 +97,7 @@ class OVSBridge(object):
exception=None):
super(OVSBridge, self).__init__()
self.datapath_id = datapath_id
+ self.ovsdb_addr = ovsdb_addr
self.vsctl = ovs_vsctl.VSCtl(ovsdb_addr)
self.timeout = timeout or CONF.ovsdb_timeout
self.exception = exception
@@ -105,6 +108,8 @@ class OVSBridge(object):
self.vsctl.run_command(commands, self.timeout, self.exception)
def init(self):
+ if not valid_ovsdb_addr(self.ovsdb_addr):
+ raise ValueError('Invalid OVSDB address: %s' % self.ovsdb_addr)
if self.br_name is None:
self.br_name = self._get_bridge_name()
diff --git a/ryu/lib/ovs/vsctl.py b/ryu/lib/ovs/vsctl.py
index 82ff52b..2391c90 100644
--- a/ryu/lib/ovs/vsctl.py
+++ b/ryu/lib/ovs/vsctl.py
@@ -20,6 +20,7 @@ from __future__ import print_function
import logging
import operator
import os
+import re
import sys
import weakref
@@ -37,6 +38,7 @@ from ovs import stream
from ovs.db import idl
from ryu.lib import hub
+from ryu.lib import ip
from ryu.lib.ovs import vswitch_idl
from ryu.lib.stringify import StringifyMixin
@@ -44,6 +46,41 @@ from ryu.lib.stringify import StringifyMixin
LOG = logging.getLogger(__name__) # use ovs.vlog?
+def valid_ovsdb_addr(addr):
+ """
+ Returns True if the given addr is valid OVSDB server address, otherwise
+ False.
+
+ The valid formats are:
+
+ - unix:file
+ - tcp:ip:port
+ - ssl:ip:port
+
+ If ip is IPv6 address, wrap ip with brackets (e.g., ssl:[::1]:6640).
+
+ :param addr: str value of OVSDB server address.
+ :return: True if valid, otherwise False.
+ """
+ # Assumes Unix socket format: "unix:file"
+ m = re.match('unix:(\S+)', addr)
+ if m:
+ file = m.group(1)
+ return os.path.isfile(file)
+ # Assumes TCP/SSL socket format: "tcp:ip:port" or "ssl:ip:port"
+ m = re.match('(tcp|ssl):(\S+):(\d+)', addr)
+ if m:
+ address = m.group(2)
+ port = m.group(3)
+ if '[' in address:
+ address = address.strip('[').strip(']')
+ return ip.valid_ipv6(address) and port.isdigit()
+ else:
+ return ip.valid_ipv4(address) and port.isdigit()
+ # Assumes invalid format or unsupported type
+ return False
+
+
# for debug
def ovsrec_row_changes_to_string(ovsrec_row):
if not ovsrec_row._changes:
diff --git a/ryu/tests/unit/lib/ovs/test_vsctl.py
b/ryu/tests/unit/lib/ovs/test_vsctl.py
index 28edf6e..84698ee 100644
--- a/ryu/tests/unit/lib/ovs/test_vsctl.py
+++ b/ryu/tests/unit/lib/ovs/test_vsctl.py
@@ -24,6 +24,11 @@ from nose.tools import ok_
from ryu.lib.hub import sleep
from ryu.lib.ovs import vsctl
+try:
+ import mock # Python 2
+except ImportError:
+ from unittest import mock # Python 3
+
LOG = logging.getLogger(__name__)
@@ -39,6 +44,25 @@ def setUpModule():
'Docker is not available. Test in %s will be skipped.' % __name__)
+class TestUtils(unittest.TestCase):
+ """
+ Test cases for utilities defined in module.
+ """
+
+ @mock.patch('os.path.isfile', mock.MagicMock(return_value=True))
+ def test_valid_ovsdb_addr_with_unix(self):
+ ok_(vsctl.valid_ovsdb_addr('unix:/var/run/openvswitch/db.sock'))
+
+ def test_valid_ovsdb_addr_with_ipv4(self):
+ ok_(vsctl.valid_ovsdb_addr('tcp:127.0.0.1:6640'))
+
+ def test_valid_ovsdb_addr_with_ipv6(self):
+ ok_(vsctl.valid_ovsdb_addr('ssl:[::1]:6640'))
+
+ def test_valid_ovsdb_addr_with_invalid_type(self):
+ eq_(vsctl.valid_ovsdb_addr('invalid:127.0.0.1:6640'), False)
+
+
def _run(command):
popen = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
popen.wait()
--
2.7.4
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel