[ovs-dev] [PATCH V4 1/5] Python tests: Add winutils.py module

Guru Shetty guru at ovn.org
Tue Jan 3 21:07:38 UTC 2017


On 3 January 2017 at 12:10, Alin Balutoiu <abalutoiu at cloudbasesolutions.com>
wrote:

> From: Alin Balutoiu <abalutoiu at cloudbasesolutions.com>
>
> This patch adds a new python module which contains
> helper functions. These will be neccessary for the
> Windows implementation.
>
> They cover the following aspects: sockets and namedpipes.
>
> Signed-off-by: Alin-Gheorghe Balutoiu <abalutoiu at cloudbasesolutions.com>
>

I changed your Signed-off-by to the previous version and applied the series.


> Acked-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions>
> ---
> V2: No changes.
> V3: Changed Signed-off-by name and added previous Acked-by's.
> V4: Fixed typo and included myself in the AUTHORS file.
> ---
>  AUTHORS.rst            |   1 +
>  python/automake.mk     |   3 +-
>  python/ovs/winutils.py | 226 ++++++++++++++++++++++++++++++
> +++++++++++++++++++
>  3 files changed, 229 insertions(+), 1 deletion(-)
>  create mode 100644 python/ovs/winutils.py
>
> diff --git a/AUTHORS.rst b/AUTHORS.rst
> index d30511a..1efb332 100644
> --- a/AUTHORS.rst
> +++ b/AUTHORS.rst
> @@ -39,6 +39,7 @@ Alexei Starovoitov              ast at plumgrid.com
>  Alexey I. Froloff               raorn at raorn.name
>  Alex Wang                       ee07b291 at gmail.com
>  Alfredo Finelli                 alf at computationes.de
> +Alin Balutoiu                   abalutoiu at cloudbasesolutions.com
>  Alin Serdean                    aserdean at cloudbasesolutions.com
>  Ambika Arora                    ambika.arora at tcs.com
>  Amit Bose                       bose at noironetworks.com
> diff --git a/python/automake.mk b/python/automake.mk
> index 1c8fa38..e417483 100644
> --- a/python/automake.mk
> +++ b/python/automake.mk
> @@ -34,7 +34,8 @@ ovs_pyfiles = \
>         python/ovs/unixctl/server.py \
>         python/ovs/util.py \
>         python/ovs/version.py \
> -       python/ovs/vlog.py
> +       python/ovs/vlog.py \
> +       python/ovs/winutils.py
>
>  # These python files are used at build time but not runtime,
>  # so they are not installed.
> diff --git a/python/ovs/winutils.py b/python/ovs/winutils.py
> new file mode 100644
> index 0000000..3a235f8
> --- /dev/null
> +++ b/python/ovs/winutils.py
> @@ -0,0 +1,226 @@
> +# Copyright (c) 2016 Cloudbase Solutions Srl
> +#
> +# 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 six
> +import sys
> +
> +if sys.platform != 'win32':
> +    raise Exception("Intended to use only on Windows")
> +else:
> +    import pywintypes
> +    import winerror
> +    import win32pipe
> +    import win32con
> +    import win32security
> +    import win32file
> +    import win32event
> +
> +
> +def close_handle(handle, logger=None):
> +    try:
> +        win32file.CloseHandle(handle)
> +        return None
> +    except pywintypes.error as e:
> +        if logger is not None:
> +            logger("failed to close handle: %s" % e.strerror)
> +        return e.winerror
> +
> +
> +def windows_create_pipe(sAttrs=-1, nSize=None):
> +    # Default values if parameters are not passed
> +    if sAttrs == -1:
> +        sAttrs = win32security.SECURITY_ATTRIBUTES()
> +        sAttrs.bInheritHandle = 1
> +    if nSize is None:
> +        # If this parameter is zero, the system uses the default buffer
> size.
> +        nSize = 0
> +
> +    try:
> +        (read_pipe, write_pipe) = win32pipe.CreatePipe(sAttrs, nSize)
> +    except pywintypes.error:
> +        raise
> +
> +    return (read_pipe, write_pipe)
> +
> +
> +def windows_read_pipe(fd, length):
> +    try:
> +        (error, data) = win32file.ReadFile(fd, length)
> +        return error, data
> +    except pywintypes.error as e:
> +        return e.winerror, ""
> +
> +
> +def create_file(filename, desiredAccess=None, shareMode=None,
> attributes=-1,
> +                CreationDisposition=None, flagsAndAttributes=None,
> +                hTemplateFile=-1):
> +    # Default values if parameters are not passed
> +    if desiredAccess is None:
> +        desiredAccess = win32file.GENERIC_READ | win32file.GENERIC_WRITE
> +    if shareMode is None:
> +        shareMode = 0
> +    if attributes == -1:
> +        # attributes can be None
> +        attributes = None
> +    if CreationDisposition is None:
> +        CreationDisposition = win32file.OPEN_EXISTING
> +    if flagsAndAttributes is None:
> +        flagsAndAttributes = (win32file.FILE_ATTRIBUTE_NORMAL |
> +                              win32file.FILE_FLAG_OVERLAPPED |
> +                              win32file.FILE_FLAG_NO_BUFFERING)
> +    if hTemplateFile == -1:
> +        hTemplateFile = None
> +
> +    try:
> +        npipe = win32file.CreateFile(filename,
> +                                     desiredAccess,
> +                                     shareMode,
> +                                     attributes,
> +                                     CreationDisposition,
> +                                     flagsAndAttributes,
> +                                     hTemplateFile)
> +    except pywintypes.error:
> +        raise
> +    return npipe
> +
> +
> +def write_file(handle, data, overlapped=None):
> +    try:
> +        (errCode, nBytesWritten) = win32file.WriteFile(handle,
> +                                                       data,
> +                                                       overlapped)
> +        # Note: win32file.WriteFile doesn't throw an exception
> +        # in case it receives ERROR_IO_PENDING.
> +        return (errCode, nBytesWritten)
> +    except pywintypes.error as e:
> +        return (e.winerror, 0)
> +
> +
> +def read_file(handle, bufsize, overlapped=None):
> +    try:
> +        # Note: win32file.ReadFile doesn't throw an exception
> +        # in case it receives ERROR_IO_PENDING.
> +        (errCode, read_buffer) = win32file.ReadFile(
> +            handle, bufsize, overlapped)
> +        return (errCode, read_buffer)
> +    except pywintypes.error as e:
> +        return (e.winerror, "")
> +
> +
> +def create_named_pipe(pipename, openMode=None, pipeMode=None,
> +                      nMaxInstances=None, nOutBufferSize=None,
> +                      nInBufferSize=None, nDefaultTimeOut=None,
> +                      saAttr=-1):
> +    # Default values if parameters are not passed
> +    if openMode is None:
> +        openMode = win32con.PIPE_ACCESS_DUPLEX |
> win32con.FILE_FLAG_OVERLAPPED
> +    if pipeMode is None:
> +        pipeMode = (win32con.PIPE_TYPE_MESSAGE |
> +                    win32con.PIPE_READMODE_BYTE |
> +                    win32con.PIPE_WAIT)
> +    if nMaxInstances is None:
> +        nMaxInstances = 64
> +    if nOutBufferSize is None:
> +        nOutBufferSize = 65000
> +    if nInBufferSize is None:
> +        nInBufferSize = 65000
> +    if nDefaultTimeOut is None:
> +        nDefaultTimeOut = 0
> +    if saAttr == -1:
> +        # saAttr can be None
> +        saAttr = win32security.SECURITY_ATTRIBUTES()
> +        saAttr.bInheritHandle = 1
> +
> +    try:
> +        npipe = win32pipe.CreateNamedPipe(pipename,
> +                                          openMode,
> +                                          pipeMode,
> +                                          nMaxInstances,
> +                                          nOutBufferSize,
> +                                          nInBufferSize,
> +                                          nDefaultTimeOut,
> +                                          saAttr)
> +
> +        if npipe == win32file.INVALID_HANDLE_VALUE:
> +            return None
> +
> +        return npipe
> +    except pywintypes.error:
> +        return None
> +
> +
> +def set_pipe_mode(hPipe, mode=-1, maxCollectionCount=None,
> +                  collectDataTimeout=None):
> +    # Default values if parameters are not passed
> +    if mode == -1:
> +        mode = win32pipe.PIPE_READMODE_BYTE
> +    try:
> +        win32pipe.SetNamedPipeHandleState(
> +            hPipe, mode, maxCollectionCount, collectDataTimeout)
> +    except pywintypes.error:
> +        raise
> +
> +
> +def connect_named_pipe(pipe_handle, overlapped=None):
> +    try:
> +        # If the result of ConnectNamedPipe is ERROR_IO_PENDING or
> +        # ERROR_PIPE_CONNECTED, then this value is returned.
> +        # All other error values raise a win32 exception
> +        error = win32pipe.ConnectNamedPipe(pipe_handle, overlapped)
> +        return error
> +    except pywintypes.error as e:
> +        return e.winerror
> +
> +
> +def get_pipe_name(name):
> +    name = name.replace('/', '')
> +    name = name.replace('\\', '')
> +    name = "\\\\.\\pipe\\" + name
> +    return name
> +
> +
> +def get_overlapped_result(handle, overlapped=None, bWait=False):
> +    try:
> +        return win32file.GetOverlappedResult(handle, overlapped, bWait)
> +    except pywintypes.error:
> +        raise
> +
> +
> +def get_decoded_buffer(recvBuffer):
> +    if six.PY3:
> +        return bytes(recvBuffer).decode("utf-8")
> +    else:
> +        return str(recvBuffer)
> +
> +
> +def get_encoded_buffer(buff):
> +    # Python 3 has separate types for strings and bytes.
> +    # We must have bytes here.
> +    if not isinstance(buff, six.binary_type):
> +        if six.PY3:
> +            buff = six.binary_type(buff, 'utf-8')
> +        else:
> +            buff = six.binary_type(buff)
> +    return buff
> +
> +
> +def get_new_event(sa=None, bManualReset=True, bInitialState=True,
> +                  objectName=None):
> +    return win32event.CreateEvent(sa, bManualReset, bInitialState,
> objectName)
> +
> +
> +pipe_disconnected_errors = [winerror.ERROR_PIPE_NOT_CONNECTED,
> +                            winerror.ERROR_BAD_PIPE,
> +                            winerror.ERROR_NO_DATA,
> +                            winerror.ERROR_BROKEN_PIPE]
> --
> 2.10.0.windows.1
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>


More information about the dev mailing list