mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 18:07:40 +00:00
This adds a Python version of the async DNS support added in: 771680d96 DNS: Add basic support for asynchronous DNS resolving The above version uses the unbound C library, and this implimentation uses the SWIG-wrapped Python version of that. In the event that the Python unbound library is not available, a warning will be logged and the resolve() method will just return None. For the case where inet_parse_active() is passed an IP address, it will not try to resolve it, so existing behavior should be preserved in the case that the unbound library is unavailable. Intentional differences from the C version are as follows: OVS_HOSTS_FILE environment variable can bet set to override the system 'hosts' file. This is primarily to allow testing to be done without requiring network connectivity. Since resolution can still be done via hosts file lookup, DNS lookups are not disabled when resolv.conf cannot be loaded. The Python socket_util module has fallen behind its C equivalent. The bare minimum change was done to inet_parse_active() to support sync/async dns, as there is no equivalent to parse_sockaddr_components(), inet_parse_passive(), etc. A TODO was added to bring socket_util.py up to equivalency to the C version. Signed-off-by: Terry Wilson <twilson@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
130 lines
4.2 KiB
Python
130 lines
4.2 KiB
Python
# 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 os
|
|
import sys
|
|
|
|
from setuptools.command.build_ext import build_ext
|
|
try:
|
|
from setuptools.errors import CCompilerError, ExecError, PlatformError
|
|
except ImportError: # Needed for setuptools < 59.0
|
|
from distutils.errors import CCompilerError
|
|
from distutils.errors import DistutilsExecError as ExecError
|
|
from distutils.errors import DistutilsPlatformError as PlatformError
|
|
|
|
import setuptools
|
|
|
|
VERSION = "unknown"
|
|
|
|
try:
|
|
# Try to set the version from the generated ovs/version.py
|
|
exec(open("ovs/version.py").read())
|
|
except IOError:
|
|
print("Ensure version.py is created by running make python/ovs/version.py",
|
|
file=sys.stderr)
|
|
sys.exit(-1)
|
|
|
|
try:
|
|
# Try to open generated ovs/dirs.py. However, in this case we
|
|
# don't need to exec()
|
|
open("ovs/dirs.py")
|
|
except IOError:
|
|
print("Ensure dirs.py is created by running make python/ovs/dirs.py",
|
|
file=sys.stderr)
|
|
sys.exit(-1)
|
|
|
|
ext_errors = (CCompilerError, ExecError, PlatformError)
|
|
if sys.platform == 'win32':
|
|
ext_errors += (IOError, ValueError)
|
|
|
|
|
|
class BuildFailed(Exception):
|
|
pass
|
|
|
|
|
|
class try_build_ext(build_ext):
|
|
# This class allows C extension building to fail
|
|
# NOTE: build_ext is not a new-style class
|
|
|
|
def run(self):
|
|
try:
|
|
build_ext.run(self)
|
|
except PlatformError:
|
|
raise BuildFailed()
|
|
|
|
def build_extension(self, ext):
|
|
try:
|
|
build_ext.build_extension(self, ext)
|
|
except ext_errors:
|
|
raise BuildFailed()
|
|
|
|
|
|
# Allow caller of setup.py to pass in libopenvswitch.a as an object for linking
|
|
# plus all the dependencies through the use of 'extra_cflags' and 'extra_libs'
|
|
# environment variables when not building a shared openvswitch library.
|
|
|
|
if os.environ.get('enable_shared', '') == 'no':
|
|
libraries = []
|
|
else:
|
|
libraries = ['openvswitch']
|
|
|
|
extra_cflags = os.environ.get('extra_cflags', '').split()
|
|
extra_libs = os.environ.get('extra_libs', '').split()
|
|
|
|
|
|
setup_args = dict(
|
|
name='ovs',
|
|
description='Open vSwitch library',
|
|
version=VERSION,
|
|
url='http://www.openvswitch.org/',
|
|
author='Open vSwitch',
|
|
author_email='dev@openvswitch.org',
|
|
packages=['ovs', 'ovs.compat', 'ovs.compat.sortedcontainers',
|
|
'ovs.db', 'ovs.unixctl', 'ovs.flow'],
|
|
keywords=['openvswitch', 'ovs', 'OVSDB'],
|
|
license='Apache 2.0',
|
|
classifiers=[
|
|
'Development Status :: 5 - Production/Stable',
|
|
'Topic :: Database :: Front-Ends',
|
|
'Topic :: Software Development :: Libraries :: Python Modules',
|
|
'Topic :: System :: Networking',
|
|
'License :: OSI Approved :: Apache Software License',
|
|
'Programming Language :: Python :: 3',
|
|
'Programming Language :: Python :: 3.6',
|
|
],
|
|
ext_modules=[setuptools.Extension("ovs._json",
|
|
sources=["ovs/_json.c"],
|
|
libraries=libraries,
|
|
extra_compile_args=extra_cflags,
|
|
extra_link_args=extra_libs)],
|
|
cmdclass={'build_ext': try_build_ext},
|
|
install_requires=['sortedcontainers'],
|
|
extras_require={':sys_platform == "win32"': ['pywin32 >= 1.0'],
|
|
'flow': ['netaddr', 'pyparsing'],
|
|
'dns': ['unbound']},
|
|
)
|
|
|
|
try:
|
|
setuptools.setup(**setup_args)
|
|
except BuildFailed:
|
|
BUILD_EXT_WARNING = ("WARNING: The C extension could not be compiled, "
|
|
"speedups are not enabled.")
|
|
print("*" * 75)
|
|
print(BUILD_EXT_WARNING)
|
|
print("Failure information, if any, is above.")
|
|
print("Retrying the build without the C extension.")
|
|
print("*" * 75)
|
|
|
|
del setup_args['cmdclass']
|
|
del setup_args['ext_modules']
|
|
setuptools.setup(**setup_args)
|