[ovs-dev] [PATCH V2 4/16] python tests: Ported UNIX sockets to Windows
Paul Boca
pboca at cloudbasesolutions.com
Tue Jun 21 09:51:11 UTC 2016
Disregard this patch.
The Subject is wrong, it should be "V2 14/16" not "V2 4/16"
> -----Original Message-----
> From: dev [mailto:dev-bounces at openvswitch.org] On Behalf Of Paul Boca
> Sent: Tuesday, June 21, 2016 12:43 PM
> To: dev at openvswitch.org
> Subject: [ovs-dev] [PATCH V2 4/16] python tests: Ported UNIX sockets to
> Windows
>
> AF_UNIX sockets are not supported on Windows.
> Instead of an AF_UNIX socket use localhost tcp connections to communicate
> between components. This makes the python sockets compatible with
> the ones used in Windows applications.
>
> In case the socket returns WSAEWOULDBLOCK, it is replaced by EAGAIN error
> in order to be compatible with Windows.
>
> Signed-off-by: Paul-Daniel Boca <pboca at cloudbasesolutions.com>
> ---
> V2: Fixed Python function inet_open_active, treat WSAEWOULDBLOCK error
> as
> EINPROGRESS on Windows
> ---
> python/ovs/jsonrpc.py | 3 +++
> python/ovs/socket_util.py | 53
> ++++++++++++++++++++++++++++++++++++--------
> python/ovs/stream.py | 6 +++--
> python/ovs/unixctl/server.py | 15 +++++++++----
> 4 files changed, 62 insertions(+), 15 deletions(-)
>
> diff --git a/python/ovs/jsonrpc.py b/python/ovs/jsonrpc.py
> index 6300c67..74438c9 100644
> --- a/python/ovs/jsonrpc.py
> +++ b/python/ovs/jsonrpc.py
> @@ -14,6 +14,7 @@
>
> import errno
> import os
> +import sys
>
> import six
>
> @@ -274,6 +275,8 @@ class Connection(object):
> except UnicodeError:
> error = errno.EILSEQ
> if error:
> + if sys.platform == "win32" and error ==
> errno.WSAEWOULDBLOCK:
> + error = errno.EAGAIN
> if error == errno.EAGAIN:
> return error, None
> else:
> diff --git a/python/ovs/socket_util.py b/python/ovs/socket_util.py
> index b358b05..cf88969 100644
> --- a/python/ovs/socket_util.py
> +++ b/python/ovs/socket_util.py
> @@ -17,6 +17,7 @@ import os
> import os.path
> import random
> import socket
> +import sys
>
> import six
> from six.moves import range
> @@ -53,6 +54,23 @@ def free_short_name(short_name):
> link_name = os.path.dirname(short_name)
> ovs.fatal_signal.unlink_file_now(link_name)
>
> +def compat_read_unix_socket(path):
> + try:
> + file_handle = open(path, "r+")
> + except IOError as e:
> + vlog.warn("%s: open: %s" % (path, e.strerror))
> + raise socket.error(errno.ENOENT)
> +
> + return int(file_handle.readline())
> +
> +def compat_write_unix_socket(path, port):
> + try:
> + file_handle = open(path, "w")
> + except IOError as e:
> + vlog.warn("%s: open: %s" % (path, e.strerror))
> + raise socket.error(errno.ENOENT)
> +
> + file_handle.write(str(port))
>
> def make_unix_socket(style, nonblock, bind_path, connect_path,
> short=False):
> """Creates a Unix domain socket in the given 'style' (either
> @@ -65,7 +83,10 @@ def make_unix_socket(style, nonblock, bind_path,
> connect_path, short=False):
> None."""
>
> try:
> - sock = socket.socket(socket.AF_UNIX, style)
> + if sys.platform == "win32":
> + sock = socket.socket(socket.AF_INET, style)
> + else:
> + sock = socket.socket(socket.AF_UNIX, style)
> except socket.error as e:
> return get_exception_errno(e), None
>
> @@ -81,17 +102,28 @@ def make_unix_socket(style, nonblock, bind_path,
> connect_path, short=False):
> return e.errno, None
>
> ovs.fatal_signal.add_file_to_unlink(bind_path)
> - sock.bind(bind_path)
> + if sys.platform == "win32":
> + sock.bind(("127.0.0.1", 0))
> + compat_write_unix_socket(bind_path, sock.getsockname()[1])
> + else:
> + sock.bind(bind_path)
>
> - try:
> - os.fchmod(sock.fileno(), 0o700)
> - except OSError as e:
> - pass
> + try:
> + os.fchmod(sock.fileno(), 0o700)
> + except OSError as e:
> + pass
> if connect_path is not None:
> try:
> - sock.connect(connect_path)
> + if sys.platform == "win32":
> + port = compat_read_unix_socket(connect_path)
> + sock.connect(("127.0.0.1", port))
> + else:
> + sock.connect(connect_path)
> except socket.error as e:
> - if get_exception_errno(e) != errno.EINPROGRESS:
> + error = get_exception_errno(e)
> + if sys.platform == "win32" and error == errno.WSAEWOULDBLOCK:
> + error = errno.EINPROGRESS
> + if error != errno.EINPROGRESS:
> raise
> return 0, sock
> except socket.error as e:
> @@ -228,7 +260,10 @@ def inet_open_active(style, target, default_port,
> dscp):
> try:
> sock.connect(address)
> except socket.error as e:
> - if get_exception_errno(e) != errno.EINPROGRESS:
> + error = get_exception_errno(e)
> + if sys.platform == "win32" and error == errno.WSAEWOULDBLOCK:
> + error = errno.EINPROGRESS
> + if error != errno.EINPROGRESS:
> raise
> return 0, sock
> except socket.error as e:
> diff --git a/python/ovs/stream.py b/python/ovs/stream.py
> index 97b22ac..fd894d9 100644
> --- a/python/ovs/stream.py
> +++ b/python/ovs/stream.py
> @@ -15,7 +15,7 @@
> import errno
> import os
> import socket
> -
> +import sys
> import six
>
> import ovs.poller
> @@ -136,6 +136,8 @@ class Stream(object):
> if not error:
> while True:
> error = stream.connect()
> + if sys.platform == "win32" and error == errno.WSAEWOULDBLOCK:
> + error = errno.EAGAIN
> if error != errno.EAGAIN:
> break
> stream.run()
> @@ -338,7 +340,7 @@ class PassiveStream(object):
> try:
> sock, addr = self.socket.accept()
> ovs.socket_util.set_nonblocking(sock)
> - if (sock.family == socket.AF_UNIX):
> + if (sys.platform != "win32") and (sock.family == socket.AF_UNIX):
> return 0, Stream(sock, "unix:%s" % addr, 0)
> return 0, Stream(sock, 'ptcp:%s:%s' % (addr[0],
> str(addr[1])), 0)
> diff --git a/python/ovs/unixctl/server.py b/python/ovs/unixctl/server.py
> index cc712bf..4aa02bb 100644
> --- a/python/ovs/unixctl/server.py
> +++ b/python/ovs/unixctl/server.py
> @@ -15,6 +15,7 @@
> import copy
> import errno
> import os
> +import sys
>
> import six
> from six.moves import range
> @@ -147,6 +148,8 @@ class UnixctlServer(object):
> def run(self):
> for _ in range(10):
> error, stream = self._listener.accept()
> + if sys.platform == "win32" and error == errno.WSAEWOULDBLOCK:
> + error = errno.EAGAIN
> if not error:
> rpc = ovs.jsonrpc.Connection(stream)
> self._conns.append(UnixctlConnection(rpc))
> @@ -154,8 +157,8 @@ class UnixctlServer(object):
> break
> else:
> # XXX: rate-limit
> - vlog.warn("%s: accept failed: %s" % (self._listener.name,
> - os.strerror(error)))
> + vlog.warn("%s: accept failed: %s %d %d" % (self._listener.name,
> + os.strerror(error), error))
>
> for conn in copy.copy(self._conns):
> error = conn.run()
> @@ -188,8 +191,12 @@ class UnixctlServer(object):
> if path is not None:
> path = "punix:%s" % ovs.util.abs_file_name(ovs.dirs.RUNDIR, path)
> else:
> - path = "punix:%s/%s.%d.ctl" % (ovs.dirs.RUNDIR,
> - ovs.util.PROGRAM_NAME, os.getpid())
> + if sys.platform == "win32":
> + path = "punix:%s/%s.ctl" % (ovs.dirs.RUNDIR,
> + ovs.util.PROGRAM_NAME)
> + else:
> + path = "punix:%s/%s.%d.ctl" % (ovs.dirs.RUNDIR,
> + ovs.util.PROGRAM_NAME, os.getpid())
>
> if version is None:
> version = ovs.version.VERSION
> --
> 2.7.2.windows.1
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list