diff mbox series

[ovs-dev,ovn,v3] Require Python 3 and remove support for Python 2.

Message ID 20191122172156.964306-1-numans@ovn.org
State Accepted
Headers show
Series [ovs-dev,ovn,v3] Require Python 3 and remove support for Python 2. | expand

Commit Message

Numan Siddique Nov. 22, 2019, 5:21 p.m. UTC
From: Numan Siddique <numans@ovn.org>

OVS removed the support for Python 2 in the commit [1].
And its time we do the same for OVN. Python3 is now mandatory,
otherwise configure will fail.

This patch takes care of removing Python 2 references.

[1] - 1ca0323e7c29("Require Python 3 and remove support for Python 2.")

Signed-off-by: Numan Siddique <numans@ovn.org>
---

v2 -> v3
=====
  * Rebased to the latest master

v1 -> v2
=======
  * Addressed the review comments from Mark - Removed HAVE_PYTHON3 var
    and fixed ovn-detrace.in exception seen with python3.

 Makefile.am                             | 12 ++--
 automake.mk                             |  8 +--
 build-aux/dpdkstrip.py                  |  2 +-
 build-aux/sodepends.py                  |  2 +-
 build-aux/soexpand.py                   |  2 +-
 configure.ac                            |  2 -
 ipsec/ovs-monitor-ipsec.in              |  2 +-
 m4/ovn.m4                               | 89 ++-----------------------
 rhel/ovn-fedora.spec.in                 | 35 +---------
 tests/atlocal.in                        | 23 ++-----
 tests/checkpatch.at                     | 12 ++--
 tests/ovn-controller-vtep.at            |  1 -
 tests/ovn-northd.at                     | 10 ---
 tests/ovn.at                            | 63 -----------------
 tests/ovsdb-macros.at                   |  4 --
 tests/system-kmod-macros.at             |  1 -
 tests/system-userspace-macros.at        |  1 -
 tutorial/ovs-sandbox                    |  1 +
 utilities/bugtool/automake.mk           |  2 -
 utilities/checkpatch.py                 |  3 +-
 utilities/ovn-detrace.in                |  6 +-
 utilities/ovn-docker-overlay-driver.in  |  2 +-
 utilities/ovn-docker-underlay-driver.in |  2 +-
 23 files changed, 36 insertions(+), 249 deletions(-)

Comments

0-day Robot Nov. 22, 2019, 5:57 p.m. UTC | #1
Bleep bloop.  Greetings Numan Siddique, I am a robot and I have tried out your patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


git-am:
error: Your local changes to the following files would be overwritten by merge:
	utilities/checkpatch.py
Please, commit your changes or stash them before you can merge.
Aborting
Failed to merge in the changes.
Patch failed at 0001 Require Python 3 and remove support for Python 2.
The copy of the patch that failed is found in:
   /var/lib/jenkins/jobs/upstream_build_from_pw/workspace/OVN/.git/rebase-apply/patch
When you have resolved this problem, run "git am --resolved".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".


Please check this out.  If you feel there has been an error, please email aconole@redhat.com

Thanks,
0-day Robot
Mark Michelson Nov. 22, 2019, 7:17 p.m. UTC | #2
Acked-by: Mark Michelson <mmichels@redhat.com>

On 11/22/19 12:21 PM, numans@ovn.org wrote:
> From: Numan Siddique <numans@ovn.org>
> 
> OVS removed the support for Python 2 in the commit [1].
> And its time we do the same for OVN. Python3 is now mandatory,
> otherwise configure will fail.
> 
> This patch takes care of removing Python 2 references.
> 
> [1] - 1ca0323e7c29("Require Python 3 and remove support for Python 2.")
> 
> Signed-off-by: Numan Siddique <numans@ovn.org>
> ---
> 
> v2 -> v3
> =====
>    * Rebased to the latest master
> 
> v1 -> v2
> =======
>    * Addressed the review comments from Mark - Removed HAVE_PYTHON3 var
>      and fixed ovn-detrace.in exception seen with python3.
> 
>   Makefile.am                             | 12 ++--
>   automake.mk                             |  8 +--
>   build-aux/dpdkstrip.py                  |  2 +-
>   build-aux/sodepends.py                  |  2 +-
>   build-aux/soexpand.py                   |  2 +-
>   configure.ac                            |  2 -
>   ipsec/ovs-monitor-ipsec.in              |  2 +-
>   m4/ovn.m4                               | 89 ++-----------------------
>   rhel/ovn-fedora.spec.in                 | 35 +---------
>   tests/atlocal.in                        | 23 ++-----
>   tests/checkpatch.at                     | 12 ++--
>   tests/ovn-controller-vtep.at            |  1 -
>   tests/ovn-northd.at                     | 10 ---
>   tests/ovn.at                            | 63 -----------------
>   tests/ovsdb-macros.at                   |  4 --
>   tests/system-kmod-macros.at             |  1 -
>   tests/system-userspace-macros.at        |  1 -
>   tutorial/ovs-sandbox                    |  1 +
>   utilities/bugtool/automake.mk           |  2 -
>   utilities/checkpatch.py                 |  3 +-
>   utilities/ovn-detrace.in                |  6 +-
>   utilities/ovn-docker-overlay-driver.in  |  2 +-
>   utilities/ovn-docker-underlay-driver.in |  2 +-
>   23 files changed, 36 insertions(+), 249 deletions(-)
> 
> diff --git a/Makefile.am b/Makefile.am
> index 1e41e49ea..8eed7a72b 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -71,7 +71,7 @@ endif
>   # foo/__init__.pyc will cause Python to ignore foo.py.
>   run_python = \
>   	PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH \
> -	PYTHONDONTWRITEBYTECODE=yes $(PYTHON)
> +	PYTHONDONTWRITEBYTECODE=yes $(PYTHON3)
>   
>   ALL_LOCAL =
>   BUILT_SOURCES =
> @@ -165,13 +165,13 @@ ro_shell = printf '\043 Generated automatically -- do not modify!    -*- buffer-
>   
>   SUFFIXES += .in
>   .in:
> -	$(AM_V_GEN)PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON) $(srcdir)/build-aux/soexpand.py -I$(srcdir) -I$(OVS_SRCDIR) < $< | \
> -	  $(PYTHON) $(srcdir)/build-aux/dpdkstrip.py $(DPDKSTRIP_FLAGS) | \
> +	$(AM_V_GEN)PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON3) $(srcdir)/build-aux/soexpand.py -I$(srcdir) -I$(OVS_SRCDIR) < $< | \
> +	  $(PYTHON3) $(srcdir)/build-aux/dpdkstrip.py $(DPDKSTRIP_FLAGS) | \
>   	  sed \
>   	    -e 's,[@]PKIDIR[@],$(PKIDIR),g' \
>   	    -e 's,[@]LOGDIR[@],$(LOGDIR),g' \
>   	    -e 's,[@]DBDIR[@],$(DBDIR),g' \
> -	    -e 's,[@]PYTHON[@],$(PYTHON),g' \
> +	    -e 's,[@]PYTHON3[@],$(PYTHON3),g' \
>   	    -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \
>   	    -e 's,[@]OVSBUILDDIR[@],$(OVSBUILDDIR),g' \
>   	    -e 's,[@]VERSION[@],$(VERSION),g' \
> @@ -197,7 +197,7 @@ SUFFIXES += .xml
>   	  PKIDIR='$(PKIDIR)' \
>   	  LOGDIR='$(LOGDIR)' \
>   	  DBDIR='$(DBDIR)' \
> -	  PYTHON='$(PYTHON)' \
> +	  PYTHON3='$(PYTHON3)' \
>   	  RUNDIR='$(RUNDIR)' \
>   	  OVN_RUNDIR='$(OVN_RUNDIR)' \
>   	  VERSION='$(VERSION)' \
> @@ -425,7 +425,7 @@ CLEANFILES += flake8-check
>   
>   include $(srcdir)/manpages.mk
>   $(srcdir)/manpages.mk: $(MAN_ROOTS) build-aux/sodepends.py $(OVS_SRCDIR)/python/build/soutil.py
> -	@PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) -I$(OVS_MANDIR) $(MAN_ROOTS) >$(@F).tmp
> +	@PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON3) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) -I$(OVS_MANDIR) $(MAN_ROOTS) >$(@F).tmp
>   	@if cmp -s $(@F).tmp $@; then \
>   	  touch $@; \
>   	  rm -f $(@F).tmp; \
> diff --git a/automake.mk b/automake.mk
> index ad801f1e5..591e00751 100644
> --- a/automake.mk
> +++ b/automake.mk
> @@ -6,19 +6,17 @@ CLEANFILES += ovn-architecture.7
>   #
>   # If "python" or "dot" is not available, then we do not add graphical diagram
>   # to the documentation.
> -if HAVE_PYTHON
>   if HAVE_DOT
>   OVSDB_DOT = $(run_python) ${OVSDIR}/ovsdb/ovsdb-dot.in
>   ovn-nb.gv: ${OVSDIR}/ovsdb/ovsdb-dot.in $(srcdir)/ovn-nb.ovsschema
>   	$(AM_V_GEN)$(OVSDB_DOT) --no-arrows $(srcdir)/ovn-nb.ovsschema > $@
>   ovn-nb.pic: ovn-nb.gv ${OVSDIR}/ovsdb/dot2pic
> -	$(AM_V_GEN)(dot -T plain < ovn-nb.gv | $(PYTHON) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
> +	$(AM_V_GEN)(dot -T plain < ovn-nb.gv | $(PYTHON3) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
>   	mv $@.tmp $@
>   OVN_NB_PIC = ovn-nb.pic
>   OVN_NB_DOT_DIAGRAM_ARG = --er-diagram=$(OVN_NB_PIC)
>   CLEANFILES += ovn-nb.gv ovn-nb.pic
>   endif
> -endif
>   
>   # OVN northbound schema documentation
>   EXTRA_DIST += ovn-nb.xml
> @@ -39,18 +37,16 @@ ovn-nb.5: \
>   #
>   # If "python" or "dot" is not available, then we do not add graphical diagram
>   # to the documentation.
> -if HAVE_PYTHON
>   if HAVE_DOT
>   ovn-sb.gv: ${OVSDIR}/ovsdb/ovsdb-dot.in $(srcdir)/ovn-sb.ovsschema
>   	$(AM_V_GEN)$(OVSDB_DOT) --no-arrows $(srcdir)/ovn-sb.ovsschema > $@
>   ovn-sb.pic: ovn-sb.gv ${OVSDIR}/ovsdb/dot2pic
> -	$(AM_V_GEN)(dot -T plain < ovn-sb.gv | $(PYTHON) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
> +	$(AM_V_GEN)(dot -T plain < ovn-sb.gv | $(PYTHON3) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
>   	mv $@.tmp $@
>   OVN_SB_PIC = ovn-sb.pic
>   OVN_SB_DOT_DIAGRAM_ARG = --er-diagram=$(OVN_SB_PIC)
>   CLEANFILES += ovn-sb.gv ovn-sb.pic
>   endif
> -endif
>   
>   # OVN southbound schema documentation
>   EXTRA_DIST += ovn-sb.xml
> diff --git a/build-aux/dpdkstrip.py b/build-aux/dpdkstrip.py
> index 48c7f0693..b8b8ba9c8 100755
> --- a/build-aux/dpdkstrip.py
> +++ b/build-aux/dpdkstrip.py
> @@ -1,4 +1,4 @@
> -#! /usr/bin/env python
> +#! /usr/bin/env python3
>   # Copyright (c) 2017 Red Hat, Inc.
>   #
>   # Licensed under the Apache License, Version 2.0 (the "License");
> diff --git a/build-aux/sodepends.py b/build-aux/sodepends.py
> index 90cfaa0f7..45812bcbd 100755
> --- a/build-aux/sodepends.py
> +++ b/build-aux/sodepends.py
> @@ -1,4 +1,4 @@
> -#! /usr/bin/env python
> +#! /usr/bin/env python3
>   
>   # Copyright (c) 2008, 2011, 2017 Nicira, Inc.
>   #
> diff --git a/build-aux/soexpand.py b/build-aux/soexpand.py
> index 53ca64073..00adcf47a 100755
> --- a/build-aux/soexpand.py
> +++ b/build-aux/soexpand.py
> @@ -1,4 +1,4 @@
> -#! /usr/bin/env python
> +#! /usr/bin/env python3
>   
>   # Copyright (c) 2008, 2017 Nicira, Inc.
>   #
> diff --git a/configure.ac b/configure.ac
> index 78498181c..9b29cbfe4 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -89,9 +89,7 @@ OVN_CHECK_COVERAGE
>   OVS_CHECK_NDEBUG
>   OVS_CHECK_OPENSSL
>   OVN_CHECK_LOGDIR
> -OVN_CHECK_PYTHON2
>   OVN_CHECK_PYTHON3
> -OVN_CHECK_PYTHON
>   OVN_CHECK_FLAKE8
>   OVN_CHECK_SPHINX
>   OVN_CHECK_DOT
> diff --git a/ipsec/ovs-monitor-ipsec.in b/ipsec/ovs-monitor-ipsec.in
> index 4710be039..37e370324 100755
> --- a/ipsec/ovs-monitor-ipsec.in
> +++ b/ipsec/ovs-monitor-ipsec.in
> @@ -1,4 +1,4 @@
> -#! @PYTHON@
> +#! @PYTHON3@
>   # Copyright (c) 2017 Nicira, Inc.
>   #
>   # Licensed under the Apache License, Version 2.0 (the "License");
> diff --git a/m4/ovn.m4 b/m4/ovn.m4
> index 277468f7f..dacfabb2a 100644
> --- a/m4/ovn.m4
> +++ b/m4/ovn.m4
> @@ -300,57 +300,16 @@ dnl Checks for valgrind/valgrind.h.
>   AC_DEFUN([OVN_CHECK_VALGRIND],
>     [AC_CHECK_HEADERS([valgrind/valgrind.h])])
>   
> -dnl Checks for Python 2.x, x >= 7.
> -AC_DEFUN([OVN_CHECK_PYTHON2],
> -  [AC_CACHE_CHECK(
> -     [for Python 2.x for x >= 7],
> -     [ovs_cv_python2],
> -     [if test -n "$PYTHON2"; then
> -        ovs_cv_python2=$PYTHON2
> -      else
> -        ovs_cv_python2=no
> -        for binary in python2 python2.7 python; do
> -          ovs_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> -          for dir in $PATH; do
> -            IFS=$ovs_save_IFS
> -            test -z "$dir" && dir=.
> -            if test -x "$dir"/"$binary" && "$dir"/"$binary" -c 'import sys
> -if sys.hexversion >= 0x02070000 and sys.hexversion < 0x03000000:
> -    sys.exit(0)
> -else:
> -    sys.exit(1)'; then
> -              ovs_cv_python2=$dir/$binary
> -              break 2
> -            fi
> -          done
> -        done
> -        if test "$ovs_cv_python2" != no && test -x "$ovs_cv_python2"; then
> -          if ! "$ovs_cv_python2" -c 'import six ; six.moves.range' >&AS_MESSAGE_LOG_FD 2>&1; then
> -            ovs_cv_python2=no
> -            AC_MSG_WARN([Missing Python six library or version too old.])
> -          fi
> -        fi
> -      fi])
> -   AC_SUBST([HAVE_PYTHON2])
> -   AM_MISSING_PROG([PYTHON2], [python2])
> -   if test "$ovs_cv_python2" != no; then
> -     PYTHON2=$ovs_cv_python2
> -     HAVE_PYTHON2=yes
> -   else
> -     HAVE_PYTHON2=no
> -   fi
> -   AM_CONDITIONAL([HAVE_PYTHON2], [test "$HAVE_PYTHON2" = yes])])
> -
> -dnl Checks for Python 3.x, x >= 4.
> +dnl Checks for Python 3.4 or later.
>   AC_DEFUN([OVN_CHECK_PYTHON3],
>     [AC_CACHE_CHECK(
> -     [for Python 3.x for x >= 4],
> +     [for Python 3 (version 3.4 or later)],
>        [ovs_cv_python3],
>        [if test -n "$PYTHON3"; then
>           ovs_cv_python3=$PYTHON3
>         else
>           ovs_cv_python3=no
> -        for binary in python3 python3.4; do
> +        for binary in python3 python3.4 python3.5 python3.6 python3.7; do
>             ovs_save_IFS=$IFS; IFS=$PATH_SEPARATOR
>             for dir in $PATH; do
>               IFS=$ovs_save_IFS
> @@ -365,46 +324,12 @@ else:
>               fi
>             done
>           done
> -        if test "$ovs_cv_python3" != no; then
> -          if test -x "$ovs_cv_python3" && ! "$ovs_cv_python3" -c 'import six' >/dev/null 2>&1; then
> -            ovs_cv_python3=no
> -            AC_MSG_WARN([Missing Python six library.])
> -          fi
> -        fi
>         fi])
> -   AC_SUBST([HAVE_PYTHON3])
> -   AM_MISSING_PROG([PYTHON3], [python3])
> -   if test "$ovs_cv_python3" != no; then
> -     PYTHON3=$ovs_cv_python3
> -     HAVE_PYTHON3=yes
> -   else
> -     HAVE_PYTHON3=no
> +   if test "$ovs_cv_python3" = no; then
> +     AC_MSG_ERROR([Python 3.4 or later is required but not found in $PATH, please install it or set $PYTHON3 to point to it])
>      fi
> -   AM_CONDITIONAL([HAVE_PYTHON3], [test "$HAVE_PYTHON3" = yes])])
> -
> -dnl Checks if you have any compatible Python version installed.
> -dnl Python 2.7+ has the preference to 3.4+
> -AC_DEFUN([OVN_CHECK_PYTHON],
> -  [AC_CACHE_CHECK(
> -     [for Python 2 or 3],
> -     [ovs_cv_python],
> -     [if test -n "$PYTHON"; then
> -        ovs_cv_python=$PYTHON
> -      else
> -        ovs_cv_python=no
> -        if test "$ovs_cv_python2" != no; then
> -          ovs_cv_python=$ovs_cv_python2
> -        elif test "$ovs_cv_python3" != no; then
> -          ovs_cv_python=$ovs_cv_python3
> -        else
> -          AC_MSG_ERROR([Missing Python.])
> -        fi
> -      fi])
> -    AC_SUBST([PYTHON])
> -    PYTHON=$ovs_cv_python
> -    AC_SUBST([HAVE_PYTHON])
> -    HAVE_PYTHON=yes
> -    AM_CONDITIONAL([HAVE_PYTHON], [test "$HAVE_PYTHON" = yes])])
> +   AC_ARG_VAR([PYTHON3])
> +   PYTHON3=$ovs_cv_python3])
>   
>   dnl Checks for flake8.
>   AC_DEFUN([OVN_CHECK_FLAKE8],
> diff --git a/rhel/ovn-fedora.spec.in b/rhel/ovn-fedora.spec.in
> index 447b4fe6e..acde99793 100644
> --- a/rhel/ovn-fedora.spec.in
> +++ b/rhel/ovn-fedora.spec.in
> @@ -16,11 +16,6 @@
>   # as regular user, specify the '--without libcapng'
>   %bcond_without libcapng
>   
> -# Enable Python 3 by specifying '--with build_python3'.
> -# This is enabled by default for versions of the distribution that
> -# have Python 3 by default (Fedora > 22).
> -%bcond_with build_python3
> -
>   # Enable PIE, bz#955181
>   %global _hardened_build 1
>   
> @@ -30,16 +25,6 @@
>   %define _rundir /run
>   %endif
>   
> -# define the python package prefix based on distribution version so that we can
> -# simultaneously support RHEL-based and later Fedora versions in this spec file.
> -%if 0%{?fedora} >= 25
> -%define _py2 python2
> -%endif
> -
> -%if 0%{?rhel} || 0%{?fedora} < 25
> -%define _py2 python
> -%endif
> -
>   Name: ovn
>   Summary: Open Virtual Network support
>   Group: System Environment/Daemons
> @@ -61,16 +46,12 @@ Source10: http://openvswitch.org/releases/openvswitch-%{ovsver}.tar.gz
>   BuildRequires: gcc gcc-c++
>   BuildRequires: autoconf automake libtool
>   BuildRequires: systemd-units openssl openssl-devel
> -BuildRequires: %{_py2}-devel
> -%if 0%{?fedora} > 22 || %{with build_python3}
>   BuildRequires: python3-devel
> -%endif
>   BuildRequires: desktop-file-utils
>   BuildRequires: groff graphviz
>   BuildRequires: checkpolicy, selinux-policy-devel
>   BuildRequires: /usr/bin/sphinx-build
>   # make check dependencies
> -BuildRequires: %{_py2}-twisted%{?rhel:-core} %{_py2}-zope-interface %{_py2}-six
>   BuildRequires: procps-ng
>   %if %{with libcapng}
>   BuildRequires: libcap-ng libcap-ng-devel
> @@ -127,7 +108,7 @@ OVN vtep controller
>   %package docker
>   Summary: Open Virtual Network support
>   License: ASL 2.0
> -Requires: ovn %{_py2}-openvswitch
> +Requires: ovn python3-openvswitch
>   Obsoletes: openvswitch-ovn-docker
>   Provides: openvswitch-ovn-docker = %{?epoch:%{epoch}:}%{version}-%{release}
>   
> @@ -153,12 +134,7 @@ cd openvswitch-%{ovsver}
>   %endif
>           --enable-ssl \
>           --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
> -%if 0%{?fedora} > 22 || %{with build_python3}
> -        PYTHON3=%{__python3} \
> -        PYTHON=%{__python2}
> -%else
> -        PYTHON=%{__python}
> -%endif
> +        PYTHON3=%{__python3}
>   
>   make %{?_smp_mflags}
>   cd -
> @@ -173,12 +149,7 @@ cd -
>   %endif
>           --enable-ssl \
>           --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
> -%if 0%{?fedora} > 22 || %{with build_python3}
> -        PYTHON3=%{__python3} \
> -        PYTHON=%{__python2}
> -%else
> -        PYTHON=%{__python}
> -%endif
> +        PYTHON3=%{__python3}
>   
>   make %{?_smp_mflags}
>   
> diff --git a/tests/atlocal.in b/tests/atlocal.in
> index f79473583..5f14c3da0 100644
> --- a/tests/atlocal.in
> +++ b/tests/atlocal.in
> @@ -1,23 +1,12 @@
>   # -*- shell-script -*-
>   HAVE_OPENSSL='@HAVE_OPENSSL@'
>   OPENSSL_SUPPORTS_SNI='@OPENSSL_SUPPORTS_SNI@'
> -HAVE_PYTHON='@HAVE_PYTHON@'
> -HAVE_PYTHON2='@HAVE_PYTHON2@'
> -HAVE_PYTHON3='@HAVE_PYTHON3@'
>   HAVE_UNBOUND='@HAVE_UNBOUND@'
>   EGREP='@EGREP@'
>   
> -if test x"$PYTHON" = x; then
> -    PYTHON='@PYTHON@'
> -fi
> -
> -if test x"$PYTHON2" = x; then
> -    PYTHON2='@PYTHON2@'
> -fi
> -
>   if test x"$PYTHON3" = x; then
>       PYTHON3='@PYTHON3@'
> -
> +    PYTHON='@PYTHON3@'
>       # PYTHONCOERCECLOCALE=0 disables the Unicode compatibility warning on
>       # stderr that breaks almost any Python3 test (PEP 0538)
>       PYTHONCOERCECLOCALE=0
> @@ -149,13 +138,9 @@ find_l7_lib()
>   {
>       set +x
>       var=HAVE_`echo "$1" | tr '[a-z]' '[A-Z]'`
> -    if test "$HAVE_PYTHON" = "yes"; then
> -        result=$($PYTHON $abs_top_srcdir/tests/test-l7.py --help | grep "$1")
> -        if test "x${result}" != x; then
> -            eval ${var}="yes"
> -        else
> -            eval ${var}="no"
> -        fi
> +    result=$($PYTHON3 $abs_top_srcdir/tests/test-l7.py --help | grep "$1")
> +    if test "x${result}" != x; then
> +        eval ${var}="yes"
>       else
>           eval ${var}="no"
>       fi
> diff --git a/tests/checkpatch.at b/tests/checkpatch.at
> index fe21acdf2..8f45beac9 100755
> --- a/tests/checkpatch.at
> +++ b/tests/checkpatch.at
> @@ -6,7 +6,6 @@ OVS_START_SHELL_HELPERS
>   # Runs checkpatch under Python 2 and Python 3, if installed, on the given
>   # PATCH, expecting the specified set of ERRORS (and warnings).
>   try_checkpatch() {
> -    AT_SKIP_IF([test $HAVE_PYTHON2 = no && test $HAVE_PYTHON3 = no])
>       # Take the patch to test from $1.  Remove an initial four-space indent
>       # from it and, if it is just headers with no body, add a null body.
>       echo "$1" | sed 's/^    //' > test.patch
> @@ -22,18 +21,15 @@ try_checkpatch() {
>           : > expout
>       fi
>   
> -    try_checkpatch__ "$HAVE_PYTHON2" "$PYTHON2"
> -    try_checkpatch__ "$HAVE_PYTHON3" "$PYTHON3"
> +    try_checkpatch__ "$PYTHON3"
>   }
>   try_checkpatch__() {
> -    if test $1 = no; then
> -        :
> -    elif test -s expout; then
> -        AT_CHECK([$2 $top_srcdir/utilities/checkpatch.py -q test.patch],
> +    if test -s expout; then
> +        AT_CHECK([$1 $top_srcdir/utilities/checkpatch.py -q test.patch],
>                    [1], [stdout])
>           AT_CHECK([sed '/^Lines checked:/,$d' stdout], [0], [expout])
>       else
> -        AT_CHECK([$2 $top_srcdir/utilities/checkpatch.py -q test.patch])
> +        AT_CHECK([$1 $top_srcdir/utilities/checkpatch.py -q test.patch])
>       fi
>   }
>   OVS_END_SHELL_HELPERS
> diff --git a/tests/ovn-controller-vtep.at b/tests/ovn-controller-vtep.at
> index d4744d76e..3092dd5ca 100644
> --- a/tests/ovn-controller-vtep.at
> +++ b/tests/ovn-controller-vtep.at
> @@ -15,7 +15,6 @@ m4_define([OVN_CONTROLLER_VTEP_START],
>     [
>      AT_KEYWORDS([ovn])
>      # this will cause skip when 'make check' using Windows setup.
> -   AT_SKIP_IF([test $HAVE_PYTHON = no])
>   
>      dnl Create databases (ovn-nb, ovn-sb, vtep).
>      AT_CHECK([ovsdb-tool create vswitchd.db $ovs_srcdir/vswitchd/vswitch.ovsschema])
> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> index c73fd9003..b69e0d1e5 100644
> --- a/tests/ovn-northd.at
> +++ b/tests/ovn-northd.at
> @@ -1,6 +1,5 @@
>   AT_BANNER([OVN northd])
>   AT_SETUP([ovn -- check   from NBDB to SBDB])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl create Logical_Router name=R1
> @@ -151,7 +150,6 @@ AT_CHECK([ovn-sbctl list ha_chassis_group | wc -l], [0], [0
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check Gateway_Chassis propagation from NBDB to SBDB backwards compatibility])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl create Logical_Router name=R1
> @@ -200,7 +198,6 @@ AT_CHECK([ovn-sbctl list ha_chassis_group | wc -l], [0], [0
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check up state of VIF LSP])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add S1
> @@ -214,7 +211,6 @@ AT_CHECK([test x`ovn-nbctl lsp-get-up S1-vm1` = xup])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check up state of router LSP linked to a distributed LR])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl lr-add R1
> @@ -230,7 +226,6 @@ AT_CHECK([test x`ovn-nbctl lsp-get-up S1-R1` = xup])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check up state of router LSP linked to a gateway LR])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> @@ -250,7 +245,6 @@ AT_CHECK([test x`ovn-nbctl lsp-get-up S1-R1` = xup])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check up state of router LSP linked to an LRP with set Gateway Chassis])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> @@ -418,7 +412,6 @@ OVS_APP_EXIT_AND_WAIT([ovn-northd])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check HA_Chassis_Group propagation from NBDB to SBDB])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl --wait=sb ha-chassis-group-add hagrp1
> @@ -909,7 +902,6 @@ AT_CHECK([as northd ovn-appctl -t ovn-northd status], [0], [Status: active
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- ovn-northd pause and resume])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   AT_CHECK([test xfalse = x`as northd ovs-appctl -t ovn-northd is-paused`])
> @@ -947,7 +939,6 @@ OVS_WAIT_UNTIL([
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check Redirect Chassis propagation from NB to SB])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> @@ -977,7 +968,6 @@ OVS_WAIT_UNTIL([ovn-sbctl get Port_Binding ${uuid} options:redirect-type], [0],
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- check stateless dnat_and_snat rule])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 0cab187a3..f54823b5d 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -1503,7 +1503,6 @@ AT_BANNER([OVN end-to-end tests])
>   # 3 hypervisors, one logical switch, 3 logical ports per hypervisor
>   AT_SETUP([ovn -- 3 HVs, 1 LS, 3 lports/HV])
>   AT_KEYWORDS([ovnarp])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Create hypervisors hv[123].
> @@ -1798,7 +1797,6 @@ AT_CLEANUP
>   # logical ports bound to chassis encap-ip.
>   AT_SETUP([ovn -- 2 HVs, 1 LS, 2 lports/HV])
>   AT_KEYWORDS([ovnarp])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Create hypervisors hv[12].
> @@ -1975,7 +1973,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- trace 1 LS, 3 LSPs])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Create a logical switch and some logical ports.
> @@ -2198,7 +2195,6 @@ AT_CLEANUP
>   # 2 locally attached networks (one flat, one vlan tagged over same device)
>   # 2 ports per HV on each network
>   AT_SETUP([ovn -- 2 HVs, 4 lports/HV, localnet ports])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # In this test cases we create 3 switches, all connected to same
> @@ -2392,7 +2388,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- vtep: 3 HVs, 1 VIFs/HV, 1 GW, 1 LS])
>   AT_KEYWORDS([vtep])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Configure the Northbound database
> @@ -2594,7 +2589,6 @@ AT_CLEANUP
>   
>   # Similar test to "hardware GW"
>   AT_SETUP([ovn -- 3 HVs, 1 VIFs/HV, 1 software GW, 1 LS])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Configure the Northbound database
> @@ -2743,7 +2737,6 @@ AT_CLEANUP
>   
>   # 3 hypervisors, 3 logical switches with 3 logical ports each, 1 logical router
>   AT_SETUP([ovn -- 3 HVs, 3 LS, 3 lports/LS, 1 LR])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -3156,7 +3149,6 @@ OVN_CLEANUP([hv1], [hv2], [hv3])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- IP relocation using GARP request])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -3359,7 +3351,6 @@ AT_CLEANUP
>   
>   # 3 hypervisors, one logical switch, 3 logical ports per hypervisor
>   AT_SETUP([ovn -- portsecurity : 3 HVs, 1 LS, 3 lports/HV])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Create hypervisors hv[123].
> @@ -3736,7 +3727,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 2 HVs, 2 LS, 1 lport/LS, 2 peer LRs])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -3883,7 +3873,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- 1 HV, 1 LS, 2 lport/LS, 1 LR])
>   AT_KEYWORDS([router-admin-state])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -3995,7 +3984,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- 1 HV, 2 LSs, 1 lport/LS, 1 LR])
>   AT_KEYWORDS([router-admin-state])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -4110,7 +4098,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 2 HVs, 3 LS, 1 lport/LS, 2 peer LRs, static routes])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -4263,7 +4250,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- send gratuitous arp on localnet])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   ovn-nbctl ls-add lsw0
>   net_add n1
> @@ -4317,7 +4303,6 @@ OVN_CLEANUP([hv])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 2 HVs, 3 LRs connected via LS, static routes])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -4494,7 +4479,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- dhcpv4 : 1 HV, 2 LS, 2 LSPs/LS])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add ls1
> @@ -4927,7 +4911,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- dhcpv6 : 1 HV, 2 LS, 5 LSPs])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add ls1
> @@ -5199,7 +5182,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 2 HVs, 2 LRs connected via LS, gateway router])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -5376,7 +5358,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- icmp_reply: 1 HVs, 2 LSs, 1 lport/LS, 1 LR])
>   AT_KEYWORDS([router-icmp-reply])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -5522,7 +5503,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- policy-based routing: 1 HVs, 2 LSs, 1 lport/LS, 1 LR])
>   AT_KEYWORDS([policy-based-routing])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -5708,7 +5688,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- policy-based routing IPv6: 1 HVs, 3 LSs, 1 lport/LS, 1 LR])
>   AT_KEYWORDS([policy-based-routing])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -5985,7 +5964,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- nd_na ])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   #TODO: since patch port for IPv6 logical router port is not ready not,
> @@ -6084,7 +6062,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- ipam])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Add a port to a switch that does not have a subnet set, then set the
> @@ -6496,7 +6473,6 @@ OVS_APP_EXIT_AND_WAIT([ovn-northd])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- ipam connectivity])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl lr-add R1
> @@ -6626,7 +6602,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- ovs-vswitchd restart])
>   AT_KEYWORDS([vswitchd])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add ls1
> @@ -6720,7 +6695,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- send arp for nexthop])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Topology: Two LSs - ls1 and ls2 are connected via router r0
> @@ -6830,7 +6804,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- send gratuitous arp for nat ips in localnet])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   # Create logical switch
>   ovn-nbctl ls-add ls0
> @@ -6882,7 +6855,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- send gratuitous arp with nat-addresses router in localnet])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   # Create logical switch
>   ovn-nbctl ls-add ls0
> @@ -6980,7 +6952,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- conntrack zone allocation])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -7534,7 +7505,6 @@ OVN_CLEANUP([hv])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- read-only sb db:ptcp access])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   
>   : > .$1.db.~lock~
>   ovsdb-tool create ovn-sb.db "$abs_top_srcdir"/ovn-sb.ovsschema
> @@ -7570,7 +7540,6 @@ OVS_APP_EXIT_AND_WAIT([ovsdb-server])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- read-only sb db:pssl access])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
>   PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
>   AT_SKIP_IF([expr "$PKIDIR" : ".*[ 	'\"
> @@ -7627,7 +7596,6 @@ OVS_APP_EXIT_AND_WAIT([ovsdb-server])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- nb connection/ssl commands])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
>   PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
>   AT_SKIP_IF([expr "$PKIDIR" : ".*[ 	'\"
> @@ -7679,7 +7647,6 @@ OVS_APP_EXIT_AND_WAIT([ovsdb-server])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- sb connection/ssl commands])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
>   PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
>   AT_SKIP_IF([expr "$PKIDIR" : ".*[ 	'\"
> @@ -7936,7 +7903,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 3 HVs, 3 LRs connected via LS, source IP based routes])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -8137,7 +8103,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- dns lookup : 1 HV, 2 LS, 2 LSPs/LS])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add ls1
> @@ -8551,7 +8516,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 4 HV, 1 LS, 1 LR, packet test with HA distributed router gateway port])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   net_add n1
> @@ -8778,7 +8742,6 @@ OVN_CLEANUP([hv1],[gw1],[ext1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 4 HV, 3 LS, 2 LR, packet test with HA distributed router gateway port])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   net_add n1
> @@ -8997,7 +8960,6 @@ OVN_CLEANUP([hv1],[gw1],[gw2],[ext1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 1 LR with distributed router gateway port])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -9325,7 +9287,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- send gratuitous arp for NAT rules on distributed router])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   # Create logical switches
>   ovn-nbctl ls-add ls0
> @@ -9467,7 +9428,6 @@ AT_CLEANUP
>   # gateway port should use vlans(i.e input network vlan tag) across hypervisors
>   # instead of tunneling.
>   AT_SETUP([ovn -- vlan traffic for external network with distributed router gateway port])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -9786,7 +9746,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- IPv6 ND Router Solicitation responder])
>   AT_KEYWORDS([ovn-nd_ra])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # In this test case we create 1 lswitch with 3 VIF ports attached,
> @@ -10034,7 +9993,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- /32 router IP address])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -10132,7 +10090,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 2 HVs, 1 lport/HV, localport ports])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add ls1
> @@ -10254,7 +10211,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- 1 LR with HA distributed router gateway port])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   net_add n1
> @@ -10809,7 +10765,6 @@ OVN_CLEANUP([gw1],[gw2],[hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- send gratuitous ARP for NAT rules on HA distributed router])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   ovn-nbctl ls-add ls0
>   ovn-nbctl ls-add ls1
> @@ -10980,7 +10935,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- ensure one gw controller restart in HA doesn't bounce the master])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   net_add n1
> @@ -11077,7 +11031,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- IPv6 Neighbor Solicitation for unknown MAC])
>   AT_KEYWORDS([ovn-nd_ns for unknown mac])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add sw0_ip6
> @@ -11540,7 +11493,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- ACL reject rule test])
>   AT_KEYWORDS([acl-reject])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_DST IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM
> @@ -11682,7 +11634,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- Port Groups])
>   AT_KEYWORDS([ovnpg])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -11908,7 +11859,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- ACLs on Port Groups])
>   AT_KEYWORDS([ovnpg_acl])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -12394,7 +12344,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- TTL exceeded])
>   AT_KEYWORDS([ttl-exceeded])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_DST IPV4_ROUTER IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM
> @@ -12491,7 +12440,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- router port unreachable])
>   AT_KEYWORDS([router-port-unreachable])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_ROUTER L4_PROTCOL IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM EXP_ICMP_CODE
> @@ -12640,7 +12588,6 @@ OVN_CLEANUP([hv1], [hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- ovn-controller exit])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   # Logical network:
>   # One Logical Router: ro, with two logical switches sw1 and sw2.
> @@ -12731,7 +12678,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- external logical port])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   net_add n1
> @@ -13467,7 +13413,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- Address Set Incremental Processing])
>   AT_KEYWORDS([ovn_as_inc])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   net_add n1
> @@ -13541,7 +13486,6 @@ OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- ovn-controller restart])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -13694,7 +13638,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- router - check packet length - icmp defrag])
>   AT_KEYWORDS([check packet length])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ovn-nbctl ls-add sw0
> @@ -13869,7 +13812,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- IP packet buffering])
>   AT_KEYWORDS([ip-buffering])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -14014,7 +13956,6 @@ OVN_CLEANUP([hv1],[hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- neighbor update on same HV])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -14524,7 +14465,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- virtual ports])
>   AT_KEYWORDS([virtual ports])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   send_garp() {
> @@ -14949,7 +14889,6 @@ OVN_CLEANUP([hv1], [hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- IGMP snoop/querier/relay])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   # Logical network:
> @@ -16129,7 +16068,6 @@ AT_CLEANUP
>   
>   AT_SETUP([ovn -- ARP lookup before learning])
>   AT_KEYWORDS([virtual ports])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   send_garp() {
> @@ -16846,7 +16784,6 @@ OVN_CLEANUP([hv1], [hv2])
>   AT_CLEANUP
>   
>   AT_SETUP([ovn -- ARP/ND request broadcast limiting])
> -AT_SKIP_IF([test $HAVE_PYTHON = no])
>   ovn_start
>   
>   ip_to_hex() {
> diff --git a/tests/ovsdb-macros.at b/tests/ovsdb-macros.at
> index 83e3df750..7664a53cd 100644
> --- a/tests/ovsdb-macros.at
> +++ b/tests/ovsdb-macros.at
> @@ -38,7 +38,6 @@ m4_define([OVSDB_CHECK_POSITIVE],
>   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
>   m4_define([OVSDB_CHECK_POSITIVE_PY],
>     [AT_SETUP([$1])
> -   AT_SKIP_IF([test $HAVE_PYTHON2 = no])
>      $6
>      AT_KEYWORDS([ovsdb positive Python $4])
>      AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [0], [$3
> @@ -57,7 +56,6 @@ m4_define([OVSDB_CHECK_POSITIVE_PY],
>   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
>   m4_define([OVSDB_CHECK_POSITIVE_PY3],
>     [AT_SETUP([$1])
> -   AT_SKIP_IF([test $HAVE_PYTHON3 = no])
>      $6
>      AT_KEYWORDS([ovsdb positive Python $4])
>      AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [0], [$3
> @@ -100,7 +98,6 @@ m4_define([OVSDB_CHECK_NEGATIVE],
>   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
>   m4_define([OVSDB_CHECK_NEGATIVE_PY],
>     [AT_SETUP([$1])
> -   AT_SKIP_IF([test $HAVE_PYTHON2 = no])
>      AT_KEYWORDS([ovsdb negative $4])
>      AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
>      m4_assert(m4_len([$3]))
> @@ -121,7 +118,6 @@ m4_define([OVSDB_CHECK_NEGATIVE_PY],
>   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
>   m4_define([OVSDB_CHECK_NEGATIVE_PY],
>     [AT_SETUP([$1])
> -   AT_SKIP_IF([test $HAVE_PYTHON3 = no])
>      AT_KEYWORDS([ovsdb negative $4])
>      AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
>      m4_assert(m4_len([$3]))
> diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
> index 48e94642b..f494af5f5 100644
> --- a/tests/system-kmod-macros.at
> +++ b/tests/system-kmod-macros.at
> @@ -59,7 +59,6 @@ m4_define([CONFIGURE_VETH_OFFLOADS],
>   # kernel conntrack tables when the test is finished.
>   #
>   m4_define([CHECK_CONNTRACK],
> -    [AT_SKIP_IF([test $HAVE_PYTHON = no])
>        m4_foreach([mod], [[nf_conntrack_ipv4], [nf_conntrack_ipv6], [nf_nat_ftp],
>                           [nf_nat_tftp]],
>                   [modprobe mod || echo "Module mod not loaded."
> diff --git a/tests/system-userspace-macros.at b/tests/system-userspace-macros.at
> index 89735bf16..d8cc686c2 100644
> --- a/tests/system-userspace-macros.at
> +++ b/tests/system-userspace-macros.at
> @@ -63,7 +63,6 @@ m4_define([CONFIGURE_VETH_OFFLOADS],
>   # Perform requirements checks for running conntrack tests.
>   #
>   m4_define([CHECK_CONNTRACK],
> -    [AT_SKIP_IF([test $HAVE_PYTHON = no])]
>   )
>   
>   # CHECK_CONNTRACK_ALG()
> diff --git a/tutorial/ovs-sandbox b/tutorial/ovs-sandbox
> index 510651add..36cdb6b68 100755
> --- a/tutorial/ovs-sandbox
> +++ b/tutorial/ovs-sandbox
> @@ -376,6 +376,7 @@ OVN_RUNDIR=$sandbox; export OVN_RUNDIR
>   OVS_LOGDIR=$sandbox; export OVS_LOGDIR
>   OVS_DBDIR=$sandbox; export OVS_DBDIR
>   OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR
> +PYTHONPATH=$ovssrcdir/python:$PYTHONPATH; export PYTHONPATH
>   
>   if $built; then
>       # Easy access to OVS manpages.
> diff --git a/utilities/bugtool/automake.mk b/utilities/bugtool/automake.mk
> index b8c52d339..69b29e600 100644
> --- a/utilities/bugtool/automake.mk
> +++ b/utilities/bugtool/automake.mk
> @@ -1,4 +1,3 @@
> -if HAVE_PYTHON2
>   bugtool_plugins = \
>   	utilities/bugtool/plugins/network-status/ovn.xml
>   
> @@ -35,7 +34,6 @@ bugtool-uninstall-local:
>   	    rm -rf "$(DESTDIR)$(bugtoolpluginsdir)/$$dir"; \
>   	  fi \
>   	done; exit 0
> -endif
>   
>   EXTRA_DIST += \
>   	$(bugtool_plugins) \
> diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
> index f8fa00e30..981a433be 100755
> --- a/utilities/checkpatch.py
> +++ b/utilities/checkpatch.py
> @@ -1,4 +1,4 @@
> -#!/usr/bin/env python
> +#!/usr/bin/env python3
>   # Copyright (c) 2016, 2017 Red Hat, Inc.
>   # Copyright (c) 2018 Nicira, Inc.
>   #
> @@ -13,7 +13,6 @@
>   # 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 __future__ import print_function
>   
>   import email
>   import getopt
> diff --git a/utilities/ovn-detrace.in b/utilities/ovn-detrace.in
> index 52f6f4f92..3bfb72067 100755
> --- a/utilities/ovn-detrace.in
> +++ b/utilities/ovn-detrace.in
> @@ -1,4 +1,4 @@
> -#! @PYTHON@
> +#! @PYTHON3@
>   #
>   # Copyright (c) 2017 eBay Inc.
>   #
> @@ -14,8 +14,6 @@
>   # See the License for the specific language governing permissions and
>   # limitations under the License.
>   
> -from __future__ import print_function
> -
>   import functools
>   import getopt
>   import os
> @@ -236,7 +234,7 @@ def main():
>           options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
>                                             ['help', 'version', 'ovs',
>                                              'ovnsb=', 'ovnnb=', 'ovsdb='])
> -    except getopt.GetoptError, geo:
> +    except (getopt.GetoptError, geo):
>           sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
>           sys.exit(1)
>   
> diff --git a/utilities/ovn-docker-overlay-driver.in b/utilities/ovn-docker-overlay-driver.in
> index 65edfcd9d..f408bbdd8 100755
> --- a/utilities/ovn-docker-overlay-driver.in
> +++ b/utilities/ovn-docker-overlay-driver.in
> @@ -1,4 +1,4 @@
> -#! @PYTHON@
> +#! @PYTHON3@
>   # Copyright (C) 2015 Nicira, Inc.
>   #
>   # Licensed under the Apache License, Version 2.0 (the "License");
> diff --git a/utilities/ovn-docker-underlay-driver.in b/utilities/ovn-docker-underlay-driver.in
> index d91ce9fca..229418500 100755
> --- a/utilities/ovn-docker-underlay-driver.in
> +++ b/utilities/ovn-docker-underlay-driver.in
> @@ -1,4 +1,4 @@
> -#! @PYTHON@
> +#! @PYTHON3@
>   # Copyright (C) 2015 Nicira, Inc.
>   #
>   # Licensed under the Apache License, Version 2.0 (the "License");
>
Numan Siddique Nov. 25, 2019, 11:11 a.m. UTC | #3
On Sat, Nov 23, 2019 at 12:47 AM Mark Michelson <mmichels@redhat.com> wrote:
>
> Acked-by: Mark Michelson <mmichels@redhat.com>

Thanks for the review. I applied this patch to master.

Numan

>
> On 11/22/19 12:21 PM, numans@ovn.org wrote:
> > From: Numan Siddique <numans@ovn.org>
> >
> > OVS removed the support for Python 2 in the commit [1].
> > And its time we do the same for OVN. Python3 is now mandatory,
> > otherwise configure will fail.
> >
> > This patch takes care of removing Python 2 references.
> >
> > [1] - 1ca0323e7c29("Require Python 3 and remove support for Python 2.")
> >
> > Signed-off-by: Numan Siddique <numans@ovn.org>
> > ---
> >
> > v2 -> v3
> > =====
> >    * Rebased to the latest master
> >
> > v1 -> v2
> > =======
> >    * Addressed the review comments from Mark - Removed HAVE_PYTHON3 var
> >      and fixed ovn-detrace.in exception seen with python3.
> >
> >   Makefile.am                             | 12 ++--
> >   automake.mk                             |  8 +--
> >   build-aux/dpdkstrip.py                  |  2 +-
> >   build-aux/sodepends.py                  |  2 +-
> >   build-aux/soexpand.py                   |  2 +-
> >   configure.ac                            |  2 -
> >   ipsec/ovs-monitor-ipsec.in              |  2 +-
> >   m4/ovn.m4                               | 89 ++-----------------------
> >   rhel/ovn-fedora.spec.in                 | 35 +---------
> >   tests/atlocal.in                        | 23 ++-----
> >   tests/checkpatch.at                     | 12 ++--
> >   tests/ovn-controller-vtep.at            |  1 -
> >   tests/ovn-northd.at                     | 10 ---
> >   tests/ovn.at                            | 63 -----------------
> >   tests/ovsdb-macros.at                   |  4 --
> >   tests/system-kmod-macros.at             |  1 -
> >   tests/system-userspace-macros.at        |  1 -
> >   tutorial/ovs-sandbox                    |  1 +
> >   utilities/bugtool/automake.mk           |  2 -
> >   utilities/checkpatch.py                 |  3 +-
> >   utilities/ovn-detrace.in                |  6 +-
> >   utilities/ovn-docker-overlay-driver.in  |  2 +-
> >   utilities/ovn-docker-underlay-driver.in |  2 +-
> >   23 files changed, 36 insertions(+), 249 deletions(-)
> >
> > diff --git a/Makefile.am b/Makefile.am
> > index 1e41e49ea..8eed7a72b 100644
> > --- a/Makefile.am
> > +++ b/Makefile.am
> > @@ -71,7 +71,7 @@ endif
> >   # foo/__init__.pyc will cause Python to ignore foo.py.
> >   run_python = \
> >       PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH \
> > -     PYTHONDONTWRITEBYTECODE=yes $(PYTHON)
> > +     PYTHONDONTWRITEBYTECODE=yes $(PYTHON3)
> >
> >   ALL_LOCAL =
> >   BUILT_SOURCES =
> > @@ -165,13 +165,13 @@ ro_shell = printf '\043 Generated automatically -- do not modify!    -*- buffer-
> >
> >   SUFFIXES += .in
> >   .in:
> > -     $(AM_V_GEN)PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON) $(srcdir)/build-aux/soexpand.py -I$(srcdir) -I$(OVS_SRCDIR) < $< | \
> > -       $(PYTHON) $(srcdir)/build-aux/dpdkstrip.py $(DPDKSTRIP_FLAGS) | \
> > +     $(AM_V_GEN)PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON3) $(srcdir)/build-aux/soexpand.py -I$(srcdir) -I$(OVS_SRCDIR) < $< | \
> > +       $(PYTHON3) $(srcdir)/build-aux/dpdkstrip.py $(DPDKSTRIP_FLAGS) | \
> >         sed \
> >           -e 's,[@]PKIDIR[@],$(PKIDIR),g' \
> >           -e 's,[@]LOGDIR[@],$(LOGDIR),g' \
> >           -e 's,[@]DBDIR[@],$(DBDIR),g' \
> > -         -e 's,[@]PYTHON[@],$(PYTHON),g' \
> > +         -e 's,[@]PYTHON3[@],$(PYTHON3),g' \
> >           -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \
> >           -e 's,[@]OVSBUILDDIR[@],$(OVSBUILDDIR),g' \
> >           -e 's,[@]VERSION[@],$(VERSION),g' \
> > @@ -197,7 +197,7 @@ SUFFIXES += .xml
> >         PKIDIR='$(PKIDIR)' \
> >         LOGDIR='$(LOGDIR)' \
> >         DBDIR='$(DBDIR)' \
> > -       PYTHON='$(PYTHON)' \
> > +       PYTHON3='$(PYTHON3)' \
> >         RUNDIR='$(RUNDIR)' \
> >         OVN_RUNDIR='$(OVN_RUNDIR)' \
> >         VERSION='$(VERSION)' \
> > @@ -425,7 +425,7 @@ CLEANFILES += flake8-check
> >
> >   include $(srcdir)/manpages.mk
> >   $(srcdir)/manpages.mk: $(MAN_ROOTS) build-aux/sodepends.py $(OVS_SRCDIR)/python/build/soutil.py
> > -     @PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) -I$(OVS_MANDIR) $(MAN_ROOTS) >$(@F).tmp
> > +     @PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON3) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) -I$(OVS_MANDIR) $(MAN_ROOTS) >$(@F).tmp
> >       @if cmp -s $(@F).tmp $@; then \
> >         touch $@; \
> >         rm -f $(@F).tmp; \
> > diff --git a/automake.mk b/automake.mk
> > index ad801f1e5..591e00751 100644
> > --- a/automake.mk
> > +++ b/automake.mk
> > @@ -6,19 +6,17 @@ CLEANFILES += ovn-architecture.7
> >   #
> >   # If "python" or "dot" is not available, then we do not add graphical diagram
> >   # to the documentation.
> > -if HAVE_PYTHON
> >   if HAVE_DOT
> >   OVSDB_DOT = $(run_python) ${OVSDIR}/ovsdb/ovsdb-dot.in
> >   ovn-nb.gv: ${OVSDIR}/ovsdb/ovsdb-dot.in $(srcdir)/ovn-nb.ovsschema
> >       $(AM_V_GEN)$(OVSDB_DOT) --no-arrows $(srcdir)/ovn-nb.ovsschema > $@
> >   ovn-nb.pic: ovn-nb.gv ${OVSDIR}/ovsdb/dot2pic
> > -     $(AM_V_GEN)(dot -T plain < ovn-nb.gv | $(PYTHON) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
> > +     $(AM_V_GEN)(dot -T plain < ovn-nb.gv | $(PYTHON3) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
> >       mv $@.tmp $@
> >   OVN_NB_PIC = ovn-nb.pic
> >   OVN_NB_DOT_DIAGRAM_ARG = --er-diagram=$(OVN_NB_PIC)
> >   CLEANFILES += ovn-nb.gv ovn-nb.pic
> >   endif
> > -endif
> >
> >   # OVN northbound schema documentation
> >   EXTRA_DIST += ovn-nb.xml
> > @@ -39,18 +37,16 @@ ovn-nb.5: \
> >   #
> >   # If "python" or "dot" is not available, then we do not add graphical diagram
> >   # to the documentation.
> > -if HAVE_PYTHON
> >   if HAVE_DOT
> >   ovn-sb.gv: ${OVSDIR}/ovsdb/ovsdb-dot.in $(srcdir)/ovn-sb.ovsschema
> >       $(AM_V_GEN)$(OVSDB_DOT) --no-arrows $(srcdir)/ovn-sb.ovsschema > $@
> >   ovn-sb.pic: ovn-sb.gv ${OVSDIR}/ovsdb/dot2pic
> > -     $(AM_V_GEN)(dot -T plain < ovn-sb.gv | $(PYTHON) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
> > +     $(AM_V_GEN)(dot -T plain < ovn-sb.gv | $(PYTHON3) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
> >       mv $@.tmp $@
> >   OVN_SB_PIC = ovn-sb.pic
> >   OVN_SB_DOT_DIAGRAM_ARG = --er-diagram=$(OVN_SB_PIC)
> >   CLEANFILES += ovn-sb.gv ovn-sb.pic
> >   endif
> > -endif
> >
> >   # OVN southbound schema documentation
> >   EXTRA_DIST += ovn-sb.xml
> > diff --git a/build-aux/dpdkstrip.py b/build-aux/dpdkstrip.py
> > index 48c7f0693..b8b8ba9c8 100755
> > --- a/build-aux/dpdkstrip.py
> > +++ b/build-aux/dpdkstrip.py
> > @@ -1,4 +1,4 @@
> > -#! /usr/bin/env python
> > +#! /usr/bin/env python3
> >   # Copyright (c) 2017 Red Hat, Inc.
> >   #
> >   # Licensed under the Apache License, Version 2.0 (the "License");
> > diff --git a/build-aux/sodepends.py b/build-aux/sodepends.py
> > index 90cfaa0f7..45812bcbd 100755
> > --- a/build-aux/sodepends.py
> > +++ b/build-aux/sodepends.py
> > @@ -1,4 +1,4 @@
> > -#! /usr/bin/env python
> > +#! /usr/bin/env python3
> >
> >   # Copyright (c) 2008, 2011, 2017 Nicira, Inc.
> >   #
> > diff --git a/build-aux/soexpand.py b/build-aux/soexpand.py
> > index 53ca64073..00adcf47a 100755
> > --- a/build-aux/soexpand.py
> > +++ b/build-aux/soexpand.py
> > @@ -1,4 +1,4 @@
> > -#! /usr/bin/env python
> > +#! /usr/bin/env python3
> >
> >   # Copyright (c) 2008, 2017 Nicira, Inc.
> >   #
> > diff --git a/configure.ac b/configure.ac
> > index 78498181c..9b29cbfe4 100644
> > --- a/configure.ac
> > +++ b/configure.ac
> > @@ -89,9 +89,7 @@ OVN_CHECK_COVERAGE
> >   OVS_CHECK_NDEBUG
> >   OVS_CHECK_OPENSSL
> >   OVN_CHECK_LOGDIR
> > -OVN_CHECK_PYTHON2
> >   OVN_CHECK_PYTHON3
> > -OVN_CHECK_PYTHON
> >   OVN_CHECK_FLAKE8
> >   OVN_CHECK_SPHINX
> >   OVN_CHECK_DOT
> > diff --git a/ipsec/ovs-monitor-ipsec.in b/ipsec/ovs-monitor-ipsec.in
> > index 4710be039..37e370324 100755
> > --- a/ipsec/ovs-monitor-ipsec.in
> > +++ b/ipsec/ovs-monitor-ipsec.in
> > @@ -1,4 +1,4 @@
> > -#! @PYTHON@
> > +#! @PYTHON3@
> >   # Copyright (c) 2017 Nicira, Inc.
> >   #
> >   # Licensed under the Apache License, Version 2.0 (the "License");
> > diff --git a/m4/ovn.m4 b/m4/ovn.m4
> > index 277468f7f..dacfabb2a 100644
> > --- a/m4/ovn.m4
> > +++ b/m4/ovn.m4
> > @@ -300,57 +300,16 @@ dnl Checks for valgrind/valgrind.h.
> >   AC_DEFUN([OVN_CHECK_VALGRIND],
> >     [AC_CHECK_HEADERS([valgrind/valgrind.h])])
> >
> > -dnl Checks for Python 2.x, x >= 7.
> > -AC_DEFUN([OVN_CHECK_PYTHON2],
> > -  [AC_CACHE_CHECK(
> > -     [for Python 2.x for x >= 7],
> > -     [ovs_cv_python2],
> > -     [if test -n "$PYTHON2"; then
> > -        ovs_cv_python2=$PYTHON2
> > -      else
> > -        ovs_cv_python2=no
> > -        for binary in python2 python2.7 python; do
> > -          ovs_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> > -          for dir in $PATH; do
> > -            IFS=$ovs_save_IFS
> > -            test -z "$dir" && dir=.
> > -            if test -x "$dir"/"$binary" && "$dir"/"$binary" -c 'import sys
> > -if sys.hexversion >= 0x02070000 and sys.hexversion < 0x03000000:
> > -    sys.exit(0)
> > -else:
> > -    sys.exit(1)'; then
> > -              ovs_cv_python2=$dir/$binary
> > -              break 2
> > -            fi
> > -          done
> > -        done
> > -        if test "$ovs_cv_python2" != no && test -x "$ovs_cv_python2"; then
> > -          if ! "$ovs_cv_python2" -c 'import six ; six.moves.range' >&AS_MESSAGE_LOG_FD 2>&1; then
> > -            ovs_cv_python2=no
> > -            AC_MSG_WARN([Missing Python six library or version too old.])
> > -          fi
> > -        fi
> > -      fi])
> > -   AC_SUBST([HAVE_PYTHON2])
> > -   AM_MISSING_PROG([PYTHON2], [python2])
> > -   if test "$ovs_cv_python2" != no; then
> > -     PYTHON2=$ovs_cv_python2
> > -     HAVE_PYTHON2=yes
> > -   else
> > -     HAVE_PYTHON2=no
> > -   fi
> > -   AM_CONDITIONAL([HAVE_PYTHON2], [test "$HAVE_PYTHON2" = yes])])
> > -
> > -dnl Checks for Python 3.x, x >= 4.
> > +dnl Checks for Python 3.4 or later.
> >   AC_DEFUN([OVN_CHECK_PYTHON3],
> >     [AC_CACHE_CHECK(
> > -     [for Python 3.x for x >= 4],
> > +     [for Python 3 (version 3.4 or later)],
> >        [ovs_cv_python3],
> >        [if test -n "$PYTHON3"; then
> >           ovs_cv_python3=$PYTHON3
> >         else
> >           ovs_cv_python3=no
> > -        for binary in python3 python3.4; do
> > +        for binary in python3 python3.4 python3.5 python3.6 python3.7; do
> >             ovs_save_IFS=$IFS; IFS=$PATH_SEPARATOR
> >             for dir in $PATH; do
> >               IFS=$ovs_save_IFS
> > @@ -365,46 +324,12 @@ else:
> >               fi
> >             done
> >           done
> > -        if test "$ovs_cv_python3" != no; then
> > -          if test -x "$ovs_cv_python3" && ! "$ovs_cv_python3" -c 'import six' >/dev/null 2>&1; then
> > -            ovs_cv_python3=no
> > -            AC_MSG_WARN([Missing Python six library.])
> > -          fi
> > -        fi
> >         fi])
> > -   AC_SUBST([HAVE_PYTHON3])
> > -   AM_MISSING_PROG([PYTHON3], [python3])
> > -   if test "$ovs_cv_python3" != no; then
> > -     PYTHON3=$ovs_cv_python3
> > -     HAVE_PYTHON3=yes
> > -   else
> > -     HAVE_PYTHON3=no
> > +   if test "$ovs_cv_python3" = no; then
> > +     AC_MSG_ERROR([Python 3.4 or later is required but not found in $PATH, please install it or set $PYTHON3 to point to it])
> >      fi
> > -   AM_CONDITIONAL([HAVE_PYTHON3], [test "$HAVE_PYTHON3" = yes])])
> > -
> > -dnl Checks if you have any compatible Python version installed.
> > -dnl Python 2.7+ has the preference to 3.4+
> > -AC_DEFUN([OVN_CHECK_PYTHON],
> > -  [AC_CACHE_CHECK(
> > -     [for Python 2 or 3],
> > -     [ovs_cv_python],
> > -     [if test -n "$PYTHON"; then
> > -        ovs_cv_python=$PYTHON
> > -      else
> > -        ovs_cv_python=no
> > -        if test "$ovs_cv_python2" != no; then
> > -          ovs_cv_python=$ovs_cv_python2
> > -        elif test "$ovs_cv_python3" != no; then
> > -          ovs_cv_python=$ovs_cv_python3
> > -        else
> > -          AC_MSG_ERROR([Missing Python.])
> > -        fi
> > -      fi])
> > -    AC_SUBST([PYTHON])
> > -    PYTHON=$ovs_cv_python
> > -    AC_SUBST([HAVE_PYTHON])
> > -    HAVE_PYTHON=yes
> > -    AM_CONDITIONAL([HAVE_PYTHON], [test "$HAVE_PYTHON" = yes])])
> > +   AC_ARG_VAR([PYTHON3])
> > +   PYTHON3=$ovs_cv_python3])
> >
> >   dnl Checks for flake8.
> >   AC_DEFUN([OVN_CHECK_FLAKE8],
> > diff --git a/rhel/ovn-fedora.spec.in b/rhel/ovn-fedora.spec.in
> > index 447b4fe6e..acde99793 100644
> > --- a/rhel/ovn-fedora.spec.in
> > +++ b/rhel/ovn-fedora.spec.in
> > @@ -16,11 +16,6 @@
> >   # as regular user, specify the '--without libcapng'
> >   %bcond_without libcapng
> >
> > -# Enable Python 3 by specifying '--with build_python3'.
> > -# This is enabled by default for versions of the distribution that
> > -# have Python 3 by default (Fedora > 22).
> > -%bcond_with build_python3
> > -
> >   # Enable PIE, bz#955181
> >   %global _hardened_build 1
> >
> > @@ -30,16 +25,6 @@
> >   %define _rundir /run
> >   %endif
> >
> > -# define the python package prefix based on distribution version so that we can
> > -# simultaneously support RHEL-based and later Fedora versions in this spec file.
> > -%if 0%{?fedora} >= 25
> > -%define _py2 python2
> > -%endif
> > -
> > -%if 0%{?rhel} || 0%{?fedora} < 25
> > -%define _py2 python
> > -%endif
> > -
> >   Name: ovn
> >   Summary: Open Virtual Network support
> >   Group: System Environment/Daemons
> > @@ -61,16 +46,12 @@ Source10: http://openvswitch.org/releases/openvswitch-%{ovsver}.tar.gz
> >   BuildRequires: gcc gcc-c++
> >   BuildRequires: autoconf automake libtool
> >   BuildRequires: systemd-units openssl openssl-devel
> > -BuildRequires: %{_py2}-devel
> > -%if 0%{?fedora} > 22 || %{with build_python3}
> >   BuildRequires: python3-devel
> > -%endif
> >   BuildRequires: desktop-file-utils
> >   BuildRequires: groff graphviz
> >   BuildRequires: checkpolicy, selinux-policy-devel
> >   BuildRequires: /usr/bin/sphinx-build
> >   # make check dependencies
> > -BuildRequires: %{_py2}-twisted%{?rhel:-core} %{_py2}-zope-interface %{_py2}-six
> >   BuildRequires: procps-ng
> >   %if %{with libcapng}
> >   BuildRequires: libcap-ng libcap-ng-devel
> > @@ -127,7 +108,7 @@ OVN vtep controller
> >   %package docker
> >   Summary: Open Virtual Network support
> >   License: ASL 2.0
> > -Requires: ovn %{_py2}-openvswitch
> > +Requires: ovn python3-openvswitch
> >   Obsoletes: openvswitch-ovn-docker
> >   Provides: openvswitch-ovn-docker = %{?epoch:%{epoch}:}%{version}-%{release}
> >
> > @@ -153,12 +134,7 @@ cd openvswitch-%{ovsver}
> >   %endif
> >           --enable-ssl \
> >           --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
> > -%if 0%{?fedora} > 22 || %{with build_python3}
> > -        PYTHON3=%{__python3} \
> > -        PYTHON=%{__python2}
> > -%else
> > -        PYTHON=%{__python}
> > -%endif
> > +        PYTHON3=%{__python3}
> >
> >   make %{?_smp_mflags}
> >   cd -
> > @@ -173,12 +149,7 @@ cd -
> >   %endif
> >           --enable-ssl \
> >           --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
> > -%if 0%{?fedora} > 22 || %{with build_python3}
> > -        PYTHON3=%{__python3} \
> > -        PYTHON=%{__python2}
> > -%else
> > -        PYTHON=%{__python}
> > -%endif
> > +        PYTHON3=%{__python3}
> >
> >   make %{?_smp_mflags}
> >
> > diff --git a/tests/atlocal.in b/tests/atlocal.in
> > index f79473583..5f14c3da0 100644
> > --- a/tests/atlocal.in
> > +++ b/tests/atlocal.in
> > @@ -1,23 +1,12 @@
> >   # -*- shell-script -*-
> >   HAVE_OPENSSL='@HAVE_OPENSSL@'
> >   OPENSSL_SUPPORTS_SNI='@OPENSSL_SUPPORTS_SNI@'
> > -HAVE_PYTHON='@HAVE_PYTHON@'
> > -HAVE_PYTHON2='@HAVE_PYTHON2@'
> > -HAVE_PYTHON3='@HAVE_PYTHON3@'
> >   HAVE_UNBOUND='@HAVE_UNBOUND@'
> >   EGREP='@EGREP@'
> >
> > -if test x"$PYTHON" = x; then
> > -    PYTHON='@PYTHON@'
> > -fi
> > -
> > -if test x"$PYTHON2" = x; then
> > -    PYTHON2='@PYTHON2@'
> > -fi
> > -
> >   if test x"$PYTHON3" = x; then
> >       PYTHON3='@PYTHON3@'
> > -
> > +    PYTHON='@PYTHON3@'
> >       # PYTHONCOERCECLOCALE=0 disables the Unicode compatibility warning on
> >       # stderr that breaks almost any Python3 test (PEP 0538)
> >       PYTHONCOERCECLOCALE=0
> > @@ -149,13 +138,9 @@ find_l7_lib()
> >   {
> >       set +x
> >       var=HAVE_`echo "$1" | tr '[a-z]' '[A-Z]'`
> > -    if test "$HAVE_PYTHON" = "yes"; then
> > -        result=$($PYTHON $abs_top_srcdir/tests/test-l7.py --help | grep "$1")
> > -        if test "x${result}" != x; then
> > -            eval ${var}="yes"
> > -        else
> > -            eval ${var}="no"
> > -        fi
> > +    result=$($PYTHON3 $abs_top_srcdir/tests/test-l7.py --help | grep "$1")
> > +    if test "x${result}" != x; then
> > +        eval ${var}="yes"
> >       else
> >           eval ${var}="no"
> >       fi
> > diff --git a/tests/checkpatch.at b/tests/checkpatch.at
> > index fe21acdf2..8f45beac9 100755
> > --- a/tests/checkpatch.at
> > +++ b/tests/checkpatch.at
> > @@ -6,7 +6,6 @@ OVS_START_SHELL_HELPERS
> >   # Runs checkpatch under Python 2 and Python 3, if installed, on the given
> >   # PATCH, expecting the specified set of ERRORS (and warnings).
> >   try_checkpatch() {
> > -    AT_SKIP_IF([test $HAVE_PYTHON2 = no && test $HAVE_PYTHON3 = no])
> >       # Take the patch to test from $1.  Remove an initial four-space indent
> >       # from it and, if it is just headers with no body, add a null body.
> >       echo "$1" | sed 's/^    //' > test.patch
> > @@ -22,18 +21,15 @@ try_checkpatch() {
> >           : > expout
> >       fi
> >
> > -    try_checkpatch__ "$HAVE_PYTHON2" "$PYTHON2"
> > -    try_checkpatch__ "$HAVE_PYTHON3" "$PYTHON3"
> > +    try_checkpatch__ "$PYTHON3"
> >   }
> >   try_checkpatch__() {
> > -    if test $1 = no; then
> > -        :
> > -    elif test -s expout; then
> > -        AT_CHECK([$2 $top_srcdir/utilities/checkpatch.py -q test.patch],
> > +    if test -s expout; then
> > +        AT_CHECK([$1 $top_srcdir/utilities/checkpatch.py -q test.patch],
> >                    [1], [stdout])
> >           AT_CHECK([sed '/^Lines checked:/,$d' stdout], [0], [expout])
> >       else
> > -        AT_CHECK([$2 $top_srcdir/utilities/checkpatch.py -q test.patch])
> > +        AT_CHECK([$1 $top_srcdir/utilities/checkpatch.py -q test.patch])
> >       fi
> >   }
> >   OVS_END_SHELL_HELPERS
> > diff --git a/tests/ovn-controller-vtep.at b/tests/ovn-controller-vtep.at
> > index d4744d76e..3092dd5ca 100644
> > --- a/tests/ovn-controller-vtep.at
> > +++ b/tests/ovn-controller-vtep.at
> > @@ -15,7 +15,6 @@ m4_define([OVN_CONTROLLER_VTEP_START],
> >     [
> >      AT_KEYWORDS([ovn])
> >      # this will cause skip when 'make check' using Windows setup.
> > -   AT_SKIP_IF([test $HAVE_PYTHON = no])
> >
> >      dnl Create databases (ovn-nb, ovn-sb, vtep).
> >      AT_CHECK([ovsdb-tool create vswitchd.db $ovs_srcdir/vswitchd/vswitch.ovsschema])
> > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> > index c73fd9003..b69e0d1e5 100644
> > --- a/tests/ovn-northd.at
> > +++ b/tests/ovn-northd.at
> > @@ -1,6 +1,5 @@
> >   AT_BANNER([OVN northd])
> >   AT_SETUP([ovn -- check   from NBDB to SBDB])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl create Logical_Router name=R1
> > @@ -151,7 +150,6 @@ AT_CHECK([ovn-sbctl list ha_chassis_group | wc -l], [0], [0
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check Gateway_Chassis propagation from NBDB to SBDB backwards compatibility])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl create Logical_Router name=R1
> > @@ -200,7 +198,6 @@ AT_CHECK([ovn-sbctl list ha_chassis_group | wc -l], [0], [0
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check up state of VIF LSP])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add S1
> > @@ -214,7 +211,6 @@ AT_CHECK([test x`ovn-nbctl lsp-get-up S1-vm1` = xup])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check up state of router LSP linked to a distributed LR])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl lr-add R1
> > @@ -230,7 +226,6 @@ AT_CHECK([test x`ovn-nbctl lsp-get-up S1-R1` = xup])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check up state of router LSP linked to a gateway LR])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> > @@ -250,7 +245,6 @@ AT_CHECK([test x`ovn-nbctl lsp-get-up S1-R1` = xup])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check up state of router LSP linked to an LRP with set Gateway Chassis])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> > @@ -418,7 +412,6 @@ OVS_APP_EXIT_AND_WAIT([ovn-northd])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check HA_Chassis_Group propagation from NBDB to SBDB])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl --wait=sb ha-chassis-group-add hagrp1
> > @@ -909,7 +902,6 @@ AT_CHECK([as northd ovn-appctl -t ovn-northd status], [0], [Status: active
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ovn-northd pause and resume])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   AT_CHECK([test xfalse = x`as northd ovs-appctl -t ovn-northd is-paused`])
> > @@ -947,7 +939,6 @@ OVS_WAIT_UNTIL([
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check Redirect Chassis propagation from NB to SB])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> > @@ -977,7 +968,6 @@ OVS_WAIT_UNTIL([ovn-sbctl get Port_Binding ${uuid} options:redirect-type], [0],
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- check stateless dnat_and_snat rule])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-sbctl chassis-add gw1 geneve 127.0.0.1
> > diff --git a/tests/ovn.at b/tests/ovn.at
> > index 0cab187a3..f54823b5d 100644
> > --- a/tests/ovn.at
> > +++ b/tests/ovn.at
> > @@ -1503,7 +1503,6 @@ AT_BANNER([OVN end-to-end tests])
> >   # 3 hypervisors, one logical switch, 3 logical ports per hypervisor
> >   AT_SETUP([ovn -- 3 HVs, 1 LS, 3 lports/HV])
> >   AT_KEYWORDS([ovnarp])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Create hypervisors hv[123].
> > @@ -1798,7 +1797,6 @@ AT_CLEANUP
> >   # logical ports bound to chassis encap-ip.
> >   AT_SETUP([ovn -- 2 HVs, 1 LS, 2 lports/HV])
> >   AT_KEYWORDS([ovnarp])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Create hypervisors hv[12].
> > @@ -1975,7 +1973,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- trace 1 LS, 3 LSPs])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Create a logical switch and some logical ports.
> > @@ -2198,7 +2195,6 @@ AT_CLEANUP
> >   # 2 locally attached networks (one flat, one vlan tagged over same device)
> >   # 2 ports per HV on each network
> >   AT_SETUP([ovn -- 2 HVs, 4 lports/HV, localnet ports])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # In this test cases we create 3 switches, all connected to same
> > @@ -2392,7 +2388,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- vtep: 3 HVs, 1 VIFs/HV, 1 GW, 1 LS])
> >   AT_KEYWORDS([vtep])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Configure the Northbound database
> > @@ -2594,7 +2589,6 @@ AT_CLEANUP
> >
> >   # Similar test to "hardware GW"
> >   AT_SETUP([ovn -- 3 HVs, 1 VIFs/HV, 1 software GW, 1 LS])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Configure the Northbound database
> > @@ -2743,7 +2737,6 @@ AT_CLEANUP
> >
> >   # 3 hypervisors, 3 logical switches with 3 logical ports each, 1 logical router
> >   AT_SETUP([ovn -- 3 HVs, 3 LS, 3 lports/LS, 1 LR])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -3156,7 +3149,6 @@ OVN_CLEANUP([hv1], [hv2], [hv3])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- IP relocation using GARP request])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -3359,7 +3351,6 @@ AT_CLEANUP
> >
> >   # 3 hypervisors, one logical switch, 3 logical ports per hypervisor
> >   AT_SETUP([ovn -- portsecurity : 3 HVs, 1 LS, 3 lports/HV])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Create hypervisors hv[123].
> > @@ -3736,7 +3727,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 2 HVs, 2 LS, 1 lport/LS, 2 peer LRs])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -3883,7 +3873,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 1 HV, 1 LS, 2 lport/LS, 1 LR])
> >   AT_KEYWORDS([router-admin-state])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -3995,7 +3984,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 1 HV, 2 LSs, 1 lport/LS, 1 LR])
> >   AT_KEYWORDS([router-admin-state])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -4110,7 +4098,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 2 HVs, 3 LS, 1 lport/LS, 2 peer LRs, static routes])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -4263,7 +4250,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- send gratuitous arp on localnet])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >   ovn-nbctl ls-add lsw0
> >   net_add n1
> > @@ -4317,7 +4303,6 @@ OVN_CLEANUP([hv])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 2 HVs, 3 LRs connected via LS, static routes])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -4494,7 +4479,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- dhcpv4 : 1 HV, 2 LS, 2 LSPs/LS])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add ls1
> > @@ -4927,7 +4911,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- dhcpv6 : 1 HV, 2 LS, 5 LSPs])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add ls1
> > @@ -5199,7 +5182,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 2 HVs, 2 LRs connected via LS, gateway router])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -5376,7 +5358,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- icmp_reply: 1 HVs, 2 LSs, 1 lport/LS, 1 LR])
> >   AT_KEYWORDS([router-icmp-reply])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -5522,7 +5503,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- policy-based routing: 1 HVs, 2 LSs, 1 lport/LS, 1 LR])
> >   AT_KEYWORDS([policy-based-routing])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -5708,7 +5688,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- policy-based routing IPv6: 1 HVs, 3 LSs, 1 lport/LS, 1 LR])
> >   AT_KEYWORDS([policy-based-routing])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -5985,7 +5964,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- nd_na ])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   #TODO: since patch port for IPv6 logical router port is not ready not,
> > @@ -6084,7 +6062,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ipam])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Add a port to a switch that does not have a subnet set, then set the
> > @@ -6496,7 +6473,6 @@ OVS_APP_EXIT_AND_WAIT([ovn-northd])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ipam connectivity])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl lr-add R1
> > @@ -6626,7 +6602,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ovs-vswitchd restart])
> >   AT_KEYWORDS([vswitchd])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add ls1
> > @@ -6720,7 +6695,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- send arp for nexthop])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Topology: Two LSs - ls1 and ls2 are connected via router r0
> > @@ -6830,7 +6804,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- send gratuitous arp for nat ips in localnet])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >   # Create logical switch
> >   ovn-nbctl ls-add ls0
> > @@ -6882,7 +6855,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- send gratuitous arp with nat-addresses router in localnet])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >   # Create logical switch
> >   ovn-nbctl ls-add ls0
> > @@ -6980,7 +6952,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- conntrack zone allocation])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -7534,7 +7505,6 @@ OVN_CLEANUP([hv])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- read-only sb db:ptcp access])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >
> >   : > .$1.db.~lock~
> >   ovsdb-tool create ovn-sb.db "$abs_top_srcdir"/ovn-sb.ovsschema
> > @@ -7570,7 +7540,6 @@ OVS_APP_EXIT_AND_WAIT([ovsdb-server])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- read-only sb db:pssl access])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
> >   PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
> >   AT_SKIP_IF([expr "$PKIDIR" : ".*[   '\"
> > @@ -7627,7 +7596,6 @@ OVS_APP_EXIT_AND_WAIT([ovsdb-server])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- nb connection/ssl commands])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
> >   PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
> >   AT_SKIP_IF([expr "$PKIDIR" : ".*[   '\"
> > @@ -7679,7 +7647,6 @@ OVS_APP_EXIT_AND_WAIT([ovsdb-server])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- sb connection/ssl commands])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
> >   PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
> >   AT_SKIP_IF([expr "$PKIDIR" : ".*[   '\"
> > @@ -7936,7 +7903,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 3 HVs, 3 LRs connected via LS, source IP based routes])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -8137,7 +8103,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- dns lookup : 1 HV, 2 LS, 2 LSPs/LS])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add ls1
> > @@ -8551,7 +8516,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 4 HV, 1 LS, 1 LR, packet test with HA distributed router gateway port])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   net_add n1
> > @@ -8778,7 +8742,6 @@ OVN_CLEANUP([hv1],[gw1],[ext1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 4 HV, 3 LS, 2 LR, packet test with HA distributed router gateway port])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   net_add n1
> > @@ -8997,7 +8960,6 @@ OVN_CLEANUP([hv1],[gw1],[gw2],[ext1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 1 LR with distributed router gateway port])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -9325,7 +9287,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- send gratuitous arp for NAT rules on distributed router])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >   # Create logical switches
> >   ovn-nbctl ls-add ls0
> > @@ -9467,7 +9428,6 @@ AT_CLEANUP
> >   # gateway port should use vlans(i.e input network vlan tag) across hypervisors
> >   # instead of tunneling.
> >   AT_SETUP([ovn -- vlan traffic for external network with distributed router gateway port])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -9786,7 +9746,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- IPv6 ND Router Solicitation responder])
> >   AT_KEYWORDS([ovn-nd_ra])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # In this test case we create 1 lswitch with 3 VIF ports attached,
> > @@ -10034,7 +9993,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- /32 router IP address])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -10132,7 +10090,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 2 HVs, 1 lport/HV, localport ports])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add ls1
> > @@ -10254,7 +10211,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- 1 LR with HA distributed router gateway port])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   net_add n1
> > @@ -10809,7 +10765,6 @@ OVN_CLEANUP([gw1],[gw2],[hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- send gratuitous ARP for NAT rules on HA distributed router])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >   ovn-nbctl ls-add ls0
> >   ovn-nbctl ls-add ls1
> > @@ -10980,7 +10935,6 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ensure one gw controller restart in HA doesn't bounce the master])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   net_add n1
> > @@ -11077,7 +11031,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- IPv6 Neighbor Solicitation for unknown MAC])
> >   AT_KEYWORDS([ovn-nd_ns for unknown mac])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add sw0_ip6
> > @@ -11540,7 +11493,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ACL reject rule test])
> >   AT_KEYWORDS([acl-reject])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_DST IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM
> > @@ -11682,7 +11634,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- Port Groups])
> >   AT_KEYWORDS([ovnpg])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -11908,7 +11859,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ACLs on Port Groups])
> >   AT_KEYWORDS([ovnpg_acl])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -12394,7 +12344,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- TTL exceeded])
> >   AT_KEYWORDS([ttl-exceeded])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_DST IPV4_ROUTER IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM
> > @@ -12491,7 +12440,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- router port unreachable])
> >   AT_KEYWORDS([router-port-unreachable])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_ROUTER L4_PROTCOL IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM EXP_ICMP_CODE
> > @@ -12640,7 +12588,6 @@ OVN_CLEANUP([hv1], [hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ovn-controller exit])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >   # Logical network:
> >   # One Logical Router: ro, with two logical switches sw1 and sw2.
> > @@ -12731,7 +12678,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- external logical port])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   net_add n1
> > @@ -13467,7 +13413,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- Address Set Incremental Processing])
> >   AT_KEYWORDS([ovn_as_inc])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   net_add n1
> > @@ -13541,7 +13486,6 @@ OVN_CLEANUP([hv1])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ovn-controller restart])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -13694,7 +13638,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- router - check packet length - icmp defrag])
> >   AT_KEYWORDS([check packet length])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ovn-nbctl ls-add sw0
> > @@ -13869,7 +13812,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- IP packet buffering])
> >   AT_KEYWORDS([ip-buffering])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -14014,7 +13956,6 @@ OVN_CLEANUP([hv1],[hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- neighbor update on same HV])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -14524,7 +14465,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- virtual ports])
> >   AT_KEYWORDS([virtual ports])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   send_garp() {
> > @@ -14949,7 +14889,6 @@ OVN_CLEANUP([hv1], [hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- IGMP snoop/querier/relay])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   # Logical network:
> > @@ -16129,7 +16068,6 @@ AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ARP lookup before learning])
> >   AT_KEYWORDS([virtual ports])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   send_garp() {
> > @@ -16846,7 +16784,6 @@ OVN_CLEANUP([hv1], [hv2])
> >   AT_CLEANUP
> >
> >   AT_SETUP([ovn -- ARP/ND request broadcast limiting])
> > -AT_SKIP_IF([test $HAVE_PYTHON = no])
> >   ovn_start
> >
> >   ip_to_hex() {
> > diff --git a/tests/ovsdb-macros.at b/tests/ovsdb-macros.at
> > index 83e3df750..7664a53cd 100644
> > --- a/tests/ovsdb-macros.at
> > +++ b/tests/ovsdb-macros.at
> > @@ -38,7 +38,6 @@ m4_define([OVSDB_CHECK_POSITIVE],
> >   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
> >   m4_define([OVSDB_CHECK_POSITIVE_PY],
> >     [AT_SETUP([$1])
> > -   AT_SKIP_IF([test $HAVE_PYTHON2 = no])
> >      $6
> >      AT_KEYWORDS([ovsdb positive Python $4])
> >      AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [0], [$3
> > @@ -57,7 +56,6 @@ m4_define([OVSDB_CHECK_POSITIVE_PY],
> >   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
> >   m4_define([OVSDB_CHECK_POSITIVE_PY3],
> >     [AT_SETUP([$1])
> > -   AT_SKIP_IF([test $HAVE_PYTHON3 = no])
> >      $6
> >      AT_KEYWORDS([ovsdb positive Python $4])
> >      AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [0], [$3
> > @@ -100,7 +98,6 @@ m4_define([OVSDB_CHECK_NEGATIVE],
> >   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
> >   m4_define([OVSDB_CHECK_NEGATIVE_PY],
> >     [AT_SETUP([$1])
> > -   AT_SKIP_IF([test $HAVE_PYTHON2 = no])
> >      AT_KEYWORDS([ovsdb negative $4])
> >      AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
> >      m4_assert(m4_len([$3]))
> > @@ -121,7 +118,6 @@ m4_define([OVSDB_CHECK_NEGATIVE_PY],
> >   # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
> >   m4_define([OVSDB_CHECK_NEGATIVE_PY],
> >     [AT_SETUP([$1])
> > -   AT_SKIP_IF([test $HAVE_PYTHON3 = no])
> >      AT_KEYWORDS([ovsdb negative $4])
> >      AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
> >      m4_assert(m4_len([$3]))
> > diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
> > index 48e94642b..f494af5f5 100644
> > --- a/tests/system-kmod-macros.at
> > +++ b/tests/system-kmod-macros.at
> > @@ -59,7 +59,6 @@ m4_define([CONFIGURE_VETH_OFFLOADS],
> >   # kernel conntrack tables when the test is finished.
> >   #
> >   m4_define([CHECK_CONNTRACK],
> > -    [AT_SKIP_IF([test $HAVE_PYTHON = no])
> >        m4_foreach([mod], [[nf_conntrack_ipv4], [nf_conntrack_ipv6], [nf_nat_ftp],
> >                           [nf_nat_tftp]],
> >                   [modprobe mod || echo "Module mod not loaded."
> > diff --git a/tests/system-userspace-macros.at b/tests/system-userspace-macros.at
> > index 89735bf16..d8cc686c2 100644
> > --- a/tests/system-userspace-macros.at
> > +++ b/tests/system-userspace-macros.at
> > @@ -63,7 +63,6 @@ m4_define([CONFIGURE_VETH_OFFLOADS],
> >   # Perform requirements checks for running conntrack tests.
> >   #
> >   m4_define([CHECK_CONNTRACK],
> > -    [AT_SKIP_IF([test $HAVE_PYTHON = no])]
> >   )
> >
> >   # CHECK_CONNTRACK_ALG()
> > diff --git a/tutorial/ovs-sandbox b/tutorial/ovs-sandbox
> > index 510651add..36cdb6b68 100755
> > --- a/tutorial/ovs-sandbox
> > +++ b/tutorial/ovs-sandbox
> > @@ -376,6 +376,7 @@ OVN_RUNDIR=$sandbox; export OVN_RUNDIR
> >   OVS_LOGDIR=$sandbox; export OVS_LOGDIR
> >   OVS_DBDIR=$sandbox; export OVS_DBDIR
> >   OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR
> > +PYTHONPATH=$ovssrcdir/python:$PYTHONPATH; export PYTHONPATH
> >
> >   if $built; then
> >       # Easy access to OVS manpages.
> > diff --git a/utilities/bugtool/automake.mk b/utilities/bugtool/automake.mk
> > index b8c52d339..69b29e600 100644
> > --- a/utilities/bugtool/automake.mk
> > +++ b/utilities/bugtool/automake.mk
> > @@ -1,4 +1,3 @@
> > -if HAVE_PYTHON2
> >   bugtool_plugins = \
> >       utilities/bugtool/plugins/network-status/ovn.xml
> >
> > @@ -35,7 +34,6 @@ bugtool-uninstall-local:
> >           rm -rf "$(DESTDIR)$(bugtoolpluginsdir)/$$dir"; \
> >         fi \
> >       done; exit 0
> > -endif
> >
> >   EXTRA_DIST += \
> >       $(bugtool_plugins) \
> > diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
> > index f8fa00e30..981a433be 100755
> > --- a/utilities/checkpatch.py
> > +++ b/utilities/checkpatch.py
> > @@ -1,4 +1,4 @@
> > -#!/usr/bin/env python
> > +#!/usr/bin/env python3
> >   # Copyright (c) 2016, 2017 Red Hat, Inc.
> >   # Copyright (c) 2018 Nicira, Inc.
> >   #
> > @@ -13,7 +13,6 @@
> >   # 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 __future__ import print_function
> >
> >   import email
> >   import getopt
> > diff --git a/utilities/ovn-detrace.in b/utilities/ovn-detrace.in
> > index 52f6f4f92..3bfb72067 100755
> > --- a/utilities/ovn-detrace.in
> > +++ b/utilities/ovn-detrace.in
> > @@ -1,4 +1,4 @@
> > -#! @PYTHON@
> > +#! @PYTHON3@
> >   #
> >   # Copyright (c) 2017 eBay Inc.
> >   #
> > @@ -14,8 +14,6 @@
> >   # See the License for the specific language governing permissions and
> >   # limitations under the License.
> >
> > -from __future__ import print_function
> > -
> >   import functools
> >   import getopt
> >   import os
> > @@ -236,7 +234,7 @@ def main():
> >           options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
> >                                             ['help', 'version', 'ovs',
> >                                              'ovnsb=', 'ovnnb=', 'ovsdb='])
> > -    except getopt.GetoptError, geo:
> > +    except (getopt.GetoptError, geo):
> >           sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
> >           sys.exit(1)
> >
> > diff --git a/utilities/ovn-docker-overlay-driver.in b/utilities/ovn-docker-overlay-driver.in
> > index 65edfcd9d..f408bbdd8 100755
> > --- a/utilities/ovn-docker-overlay-driver.in
> > +++ b/utilities/ovn-docker-overlay-driver.in
> > @@ -1,4 +1,4 @@
> > -#! @PYTHON@
> > +#! @PYTHON3@
> >   # Copyright (C) 2015 Nicira, Inc.
> >   #
> >   # Licensed under the Apache License, Version 2.0 (the "License");
> > diff --git a/utilities/ovn-docker-underlay-driver.in b/utilities/ovn-docker-underlay-driver.in
> > index d91ce9fca..229418500 100755
> > --- a/utilities/ovn-docker-underlay-driver.in
> > +++ b/utilities/ovn-docker-underlay-driver.in
> > @@ -1,4 +1,4 @@
> > -#! @PYTHON@
> > +#! @PYTHON3@
> >   # Copyright (C) 2015 Nicira, Inc.
> >   #
> >   # Licensed under the Apache License, Version 2.0 (the "License");
> >
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
diff mbox series

Patch

diff --git a/Makefile.am b/Makefile.am
index 1e41e49ea..8eed7a72b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -71,7 +71,7 @@  endif
 # foo/__init__.pyc will cause Python to ignore foo.py.
 run_python = \
 	PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH \
-	PYTHONDONTWRITEBYTECODE=yes $(PYTHON)
+	PYTHONDONTWRITEBYTECODE=yes $(PYTHON3)
 
 ALL_LOCAL =
 BUILT_SOURCES =
@@ -165,13 +165,13 @@  ro_shell = printf '\043 Generated automatically -- do not modify!    -*- buffer-
 
 SUFFIXES += .in
 .in:
-	$(AM_V_GEN)PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON) $(srcdir)/build-aux/soexpand.py -I$(srcdir) -I$(OVS_SRCDIR) < $< | \
-	  $(PYTHON) $(srcdir)/build-aux/dpdkstrip.py $(DPDKSTRIP_FLAGS) | \
+	$(AM_V_GEN)PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON3) $(srcdir)/build-aux/soexpand.py -I$(srcdir) -I$(OVS_SRCDIR) < $< | \
+	  $(PYTHON3) $(srcdir)/build-aux/dpdkstrip.py $(DPDKSTRIP_FLAGS) | \
 	  sed \
 	    -e 's,[@]PKIDIR[@],$(PKIDIR),g' \
 	    -e 's,[@]LOGDIR[@],$(LOGDIR),g' \
 	    -e 's,[@]DBDIR[@],$(DBDIR),g' \
-	    -e 's,[@]PYTHON[@],$(PYTHON),g' \
+	    -e 's,[@]PYTHON3[@],$(PYTHON3),g' \
 	    -e 's,[@]OVN_RUNDIR[@],$(OVN_RUNDIR),g' \
 	    -e 's,[@]OVSBUILDDIR[@],$(OVSBUILDDIR),g' \
 	    -e 's,[@]VERSION[@],$(VERSION),g' \
@@ -197,7 +197,7 @@  SUFFIXES += .xml
 	  PKIDIR='$(PKIDIR)' \
 	  LOGDIR='$(LOGDIR)' \
 	  DBDIR='$(DBDIR)' \
-	  PYTHON='$(PYTHON)' \
+	  PYTHON3='$(PYTHON3)' \
 	  RUNDIR='$(RUNDIR)' \
 	  OVN_RUNDIR='$(OVN_RUNDIR)' \
 	  VERSION='$(VERSION)' \
@@ -425,7 +425,7 @@  CLEANFILES += flake8-check
 
 include $(srcdir)/manpages.mk
 $(srcdir)/manpages.mk: $(MAN_ROOTS) build-aux/sodepends.py $(OVS_SRCDIR)/python/build/soutil.py
-	@PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) -I$(OVS_MANDIR) $(MAN_ROOTS) >$(@F).tmp
+	@PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON3) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) -I$(OVS_MANDIR) $(MAN_ROOTS) >$(@F).tmp
 	@if cmp -s $(@F).tmp $@; then \
 	  touch $@; \
 	  rm -f $(@F).tmp; \
diff --git a/automake.mk b/automake.mk
index ad801f1e5..591e00751 100644
--- a/automake.mk
+++ b/automake.mk
@@ -6,19 +6,17 @@  CLEANFILES += ovn-architecture.7
 #
 # If "python" or "dot" is not available, then we do not add graphical diagram
 # to the documentation.
-if HAVE_PYTHON
 if HAVE_DOT
 OVSDB_DOT = $(run_python) ${OVSDIR}/ovsdb/ovsdb-dot.in
 ovn-nb.gv: ${OVSDIR}/ovsdb/ovsdb-dot.in $(srcdir)/ovn-nb.ovsschema
 	$(AM_V_GEN)$(OVSDB_DOT) --no-arrows $(srcdir)/ovn-nb.ovsschema > $@
 ovn-nb.pic: ovn-nb.gv ${OVSDIR}/ovsdb/dot2pic
-	$(AM_V_GEN)(dot -T plain < ovn-nb.gv | $(PYTHON) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
+	$(AM_V_GEN)(dot -T plain < ovn-nb.gv | $(PYTHON3) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
 	mv $@.tmp $@
 OVN_NB_PIC = ovn-nb.pic
 OVN_NB_DOT_DIAGRAM_ARG = --er-diagram=$(OVN_NB_PIC)
 CLEANFILES += ovn-nb.gv ovn-nb.pic
 endif
-endif
 
 # OVN northbound schema documentation
 EXTRA_DIST += ovn-nb.xml
@@ -39,18 +37,16 @@  ovn-nb.5: \
 #
 # If "python" or "dot" is not available, then we do not add graphical diagram
 # to the documentation.
-if HAVE_PYTHON
 if HAVE_DOT
 ovn-sb.gv: ${OVSDIR}/ovsdb/ovsdb-dot.in $(srcdir)/ovn-sb.ovsschema
 	$(AM_V_GEN)$(OVSDB_DOT) --no-arrows $(srcdir)/ovn-sb.ovsschema > $@
 ovn-sb.pic: ovn-sb.gv ${OVSDIR}/ovsdb/dot2pic
-	$(AM_V_GEN)(dot -T plain < ovn-sb.gv | $(PYTHON) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
+	$(AM_V_GEN)(dot -T plain < ovn-sb.gv | $(PYTHON3) ${OVSDIR}/ovsdb/dot2pic -f 3) > $@.tmp && \
 	mv $@.tmp $@
 OVN_SB_PIC = ovn-sb.pic
 OVN_SB_DOT_DIAGRAM_ARG = --er-diagram=$(OVN_SB_PIC)
 CLEANFILES += ovn-sb.gv ovn-sb.pic
 endif
-endif
 
 # OVN southbound schema documentation
 EXTRA_DIST += ovn-sb.xml
diff --git a/build-aux/dpdkstrip.py b/build-aux/dpdkstrip.py
index 48c7f0693..b8b8ba9c8 100755
--- a/build-aux/dpdkstrip.py
+++ b/build-aux/dpdkstrip.py
@@ -1,4 +1,4 @@ 
-#! /usr/bin/env python
+#! /usr/bin/env python3
 # Copyright (c) 2017 Red Hat, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/build-aux/sodepends.py b/build-aux/sodepends.py
index 90cfaa0f7..45812bcbd 100755
--- a/build-aux/sodepends.py
+++ b/build-aux/sodepends.py
@@ -1,4 +1,4 @@ 
-#! /usr/bin/env python
+#! /usr/bin/env python3
 
 # Copyright (c) 2008, 2011, 2017 Nicira, Inc.
 #
diff --git a/build-aux/soexpand.py b/build-aux/soexpand.py
index 53ca64073..00adcf47a 100755
--- a/build-aux/soexpand.py
+++ b/build-aux/soexpand.py
@@ -1,4 +1,4 @@ 
-#! /usr/bin/env python
+#! /usr/bin/env python3
 
 # Copyright (c) 2008, 2017 Nicira, Inc.
 #
diff --git a/configure.ac b/configure.ac
index 78498181c..9b29cbfe4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -89,9 +89,7 @@  OVN_CHECK_COVERAGE
 OVS_CHECK_NDEBUG
 OVS_CHECK_OPENSSL
 OVN_CHECK_LOGDIR
-OVN_CHECK_PYTHON2
 OVN_CHECK_PYTHON3
-OVN_CHECK_PYTHON
 OVN_CHECK_FLAKE8
 OVN_CHECK_SPHINX
 OVN_CHECK_DOT
diff --git a/ipsec/ovs-monitor-ipsec.in b/ipsec/ovs-monitor-ipsec.in
index 4710be039..37e370324 100755
--- a/ipsec/ovs-monitor-ipsec.in
+++ b/ipsec/ovs-monitor-ipsec.in
@@ -1,4 +1,4 @@ 
-#! @PYTHON@
+#! @PYTHON3@
 # Copyright (c) 2017 Nicira, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/m4/ovn.m4 b/m4/ovn.m4
index 277468f7f..dacfabb2a 100644
--- a/m4/ovn.m4
+++ b/m4/ovn.m4
@@ -300,57 +300,16 @@  dnl Checks for valgrind/valgrind.h.
 AC_DEFUN([OVN_CHECK_VALGRIND],
   [AC_CHECK_HEADERS([valgrind/valgrind.h])])
 
-dnl Checks for Python 2.x, x >= 7.
-AC_DEFUN([OVN_CHECK_PYTHON2],
-  [AC_CACHE_CHECK(
-     [for Python 2.x for x >= 7],
-     [ovs_cv_python2],
-     [if test -n "$PYTHON2"; then
-        ovs_cv_python2=$PYTHON2
-      else
-        ovs_cv_python2=no
-        for binary in python2 python2.7 python; do
-          ovs_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-          for dir in $PATH; do
-            IFS=$ovs_save_IFS
-            test -z "$dir" && dir=.
-            if test -x "$dir"/"$binary" && "$dir"/"$binary" -c 'import sys
-if sys.hexversion >= 0x02070000 and sys.hexversion < 0x03000000:
-    sys.exit(0)
-else:
-    sys.exit(1)'; then
-              ovs_cv_python2=$dir/$binary
-              break 2
-            fi
-          done
-        done
-        if test "$ovs_cv_python2" != no && test -x "$ovs_cv_python2"; then
-          if ! "$ovs_cv_python2" -c 'import six ; six.moves.range' >&AS_MESSAGE_LOG_FD 2>&1; then
-            ovs_cv_python2=no
-            AC_MSG_WARN([Missing Python six library or version too old.])
-          fi
-        fi
-      fi])
-   AC_SUBST([HAVE_PYTHON2])
-   AM_MISSING_PROG([PYTHON2], [python2])
-   if test "$ovs_cv_python2" != no; then
-     PYTHON2=$ovs_cv_python2
-     HAVE_PYTHON2=yes
-   else
-     HAVE_PYTHON2=no
-   fi
-   AM_CONDITIONAL([HAVE_PYTHON2], [test "$HAVE_PYTHON2" = yes])])
-
-dnl Checks for Python 3.x, x >= 4.
+dnl Checks for Python 3.4 or later.
 AC_DEFUN([OVN_CHECK_PYTHON3],
   [AC_CACHE_CHECK(
-     [for Python 3.x for x >= 4],
+     [for Python 3 (version 3.4 or later)],
      [ovs_cv_python3],
      [if test -n "$PYTHON3"; then
         ovs_cv_python3=$PYTHON3
       else
         ovs_cv_python3=no
-        for binary in python3 python3.4; do
+        for binary in python3 python3.4 python3.5 python3.6 python3.7; do
           ovs_save_IFS=$IFS; IFS=$PATH_SEPARATOR
           for dir in $PATH; do
             IFS=$ovs_save_IFS
@@ -365,46 +324,12 @@  else:
             fi
           done
         done
-        if test "$ovs_cv_python3" != no; then
-          if test -x "$ovs_cv_python3" && ! "$ovs_cv_python3" -c 'import six' >/dev/null 2>&1; then
-            ovs_cv_python3=no
-            AC_MSG_WARN([Missing Python six library.])
-          fi
-        fi
       fi])
-   AC_SUBST([HAVE_PYTHON3])
-   AM_MISSING_PROG([PYTHON3], [python3])
-   if test "$ovs_cv_python3" != no; then
-     PYTHON3=$ovs_cv_python3
-     HAVE_PYTHON3=yes
-   else
-     HAVE_PYTHON3=no
+   if test "$ovs_cv_python3" = no; then
+     AC_MSG_ERROR([Python 3.4 or later is required but not found in $PATH, please install it or set $PYTHON3 to point to it])
    fi
-   AM_CONDITIONAL([HAVE_PYTHON3], [test "$HAVE_PYTHON3" = yes])])
-
-dnl Checks if you have any compatible Python version installed.
-dnl Python 2.7+ has the preference to 3.4+
-AC_DEFUN([OVN_CHECK_PYTHON],
-  [AC_CACHE_CHECK(
-     [for Python 2 or 3],
-     [ovs_cv_python],
-     [if test -n "$PYTHON"; then
-        ovs_cv_python=$PYTHON
-      else
-        ovs_cv_python=no
-        if test "$ovs_cv_python2" != no; then
-          ovs_cv_python=$ovs_cv_python2
-        elif test "$ovs_cv_python3" != no; then
-          ovs_cv_python=$ovs_cv_python3
-        else
-          AC_MSG_ERROR([Missing Python.])
-        fi
-      fi])
-    AC_SUBST([PYTHON])
-    PYTHON=$ovs_cv_python
-    AC_SUBST([HAVE_PYTHON])
-    HAVE_PYTHON=yes
-    AM_CONDITIONAL([HAVE_PYTHON], [test "$HAVE_PYTHON" = yes])])
+   AC_ARG_VAR([PYTHON3])
+   PYTHON3=$ovs_cv_python3])
 
 dnl Checks for flake8.
 AC_DEFUN([OVN_CHECK_FLAKE8],
diff --git a/rhel/ovn-fedora.spec.in b/rhel/ovn-fedora.spec.in
index 447b4fe6e..acde99793 100644
--- a/rhel/ovn-fedora.spec.in
+++ b/rhel/ovn-fedora.spec.in
@@ -16,11 +16,6 @@ 
 # as regular user, specify the '--without libcapng'
 %bcond_without libcapng
 
-# Enable Python 3 by specifying '--with build_python3'.
-# This is enabled by default for versions of the distribution that
-# have Python 3 by default (Fedora > 22).
-%bcond_with build_python3
-
 # Enable PIE, bz#955181
 %global _hardened_build 1
 
@@ -30,16 +25,6 @@ 
 %define _rundir /run
 %endif
 
-# define the python package prefix based on distribution version so that we can
-# simultaneously support RHEL-based and later Fedora versions in this spec file.
-%if 0%{?fedora} >= 25
-%define _py2 python2
-%endif
-
-%if 0%{?rhel} || 0%{?fedora} < 25
-%define _py2 python
-%endif
-
 Name: ovn
 Summary: Open Virtual Network support
 Group: System Environment/Daemons
@@ -61,16 +46,12 @@  Source10: http://openvswitch.org/releases/openvswitch-%{ovsver}.tar.gz
 BuildRequires: gcc gcc-c++
 BuildRequires: autoconf automake libtool
 BuildRequires: systemd-units openssl openssl-devel
-BuildRequires: %{_py2}-devel
-%if 0%{?fedora} > 22 || %{with build_python3}
 BuildRequires: python3-devel
-%endif
 BuildRequires: desktop-file-utils
 BuildRequires: groff graphviz
 BuildRequires: checkpolicy, selinux-policy-devel
 BuildRequires: /usr/bin/sphinx-build
 # make check dependencies
-BuildRequires: %{_py2}-twisted%{?rhel:-core} %{_py2}-zope-interface %{_py2}-six
 BuildRequires: procps-ng
 %if %{with libcapng}
 BuildRequires: libcap-ng libcap-ng-devel
@@ -127,7 +108,7 @@  OVN vtep controller
 %package docker
 Summary: Open Virtual Network support
 License: ASL 2.0
-Requires: ovn %{_py2}-openvswitch
+Requires: ovn python3-openvswitch
 Obsoletes: openvswitch-ovn-docker
 Provides: openvswitch-ovn-docker = %{?epoch:%{epoch}:}%{version}-%{release}
 
@@ -153,12 +134,7 @@  cd openvswitch-%{ovsver}
 %endif
         --enable-ssl \
         --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
-%if 0%{?fedora} > 22 || %{with build_python3}
-        PYTHON3=%{__python3} \
-        PYTHON=%{__python2}
-%else
-        PYTHON=%{__python}
-%endif
+        PYTHON3=%{__python3}
 
 make %{?_smp_mflags}
 cd -
@@ -173,12 +149,7 @@  cd -
 %endif
         --enable-ssl \
         --with-pkidir=%{_sharedstatedir}/openvswitch/pki \
-%if 0%{?fedora} > 22 || %{with build_python3}
-        PYTHON3=%{__python3} \
-        PYTHON=%{__python2}
-%else
-        PYTHON=%{__python}
-%endif
+        PYTHON3=%{__python3}
 
 make %{?_smp_mflags}
 
diff --git a/tests/atlocal.in b/tests/atlocal.in
index f79473583..5f14c3da0 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -1,23 +1,12 @@ 
 # -*- shell-script -*-
 HAVE_OPENSSL='@HAVE_OPENSSL@'
 OPENSSL_SUPPORTS_SNI='@OPENSSL_SUPPORTS_SNI@'
-HAVE_PYTHON='@HAVE_PYTHON@'
-HAVE_PYTHON2='@HAVE_PYTHON2@'
-HAVE_PYTHON3='@HAVE_PYTHON3@'
 HAVE_UNBOUND='@HAVE_UNBOUND@'
 EGREP='@EGREP@'
 
-if test x"$PYTHON" = x; then
-    PYTHON='@PYTHON@'
-fi
-
-if test x"$PYTHON2" = x; then
-    PYTHON2='@PYTHON2@'
-fi
-
 if test x"$PYTHON3" = x; then
     PYTHON3='@PYTHON3@'
-
+    PYTHON='@PYTHON3@'
     # PYTHONCOERCECLOCALE=0 disables the Unicode compatibility warning on
     # stderr that breaks almost any Python3 test (PEP 0538)
     PYTHONCOERCECLOCALE=0
@@ -149,13 +138,9 @@  find_l7_lib()
 {
     set +x
     var=HAVE_`echo "$1" | tr '[a-z]' '[A-Z]'`
-    if test "$HAVE_PYTHON" = "yes"; then
-        result=$($PYTHON $abs_top_srcdir/tests/test-l7.py --help | grep "$1")
-        if test "x${result}" != x; then
-            eval ${var}="yes"
-        else
-            eval ${var}="no"
-        fi
+    result=$($PYTHON3 $abs_top_srcdir/tests/test-l7.py --help | grep "$1")
+    if test "x${result}" != x; then
+        eval ${var}="yes"
     else
         eval ${var}="no"
     fi
diff --git a/tests/checkpatch.at b/tests/checkpatch.at
index fe21acdf2..8f45beac9 100755
--- a/tests/checkpatch.at
+++ b/tests/checkpatch.at
@@ -6,7 +6,6 @@  OVS_START_SHELL_HELPERS
 # Runs checkpatch under Python 2 and Python 3, if installed, on the given
 # PATCH, expecting the specified set of ERRORS (and warnings).
 try_checkpatch() {
-    AT_SKIP_IF([test $HAVE_PYTHON2 = no && test $HAVE_PYTHON3 = no])
     # Take the patch to test from $1.  Remove an initial four-space indent
     # from it and, if it is just headers with no body, add a null body.
     echo "$1" | sed 's/^    //' > test.patch
@@ -22,18 +21,15 @@  try_checkpatch() {
         : > expout
     fi
 
-    try_checkpatch__ "$HAVE_PYTHON2" "$PYTHON2"
-    try_checkpatch__ "$HAVE_PYTHON3" "$PYTHON3"
+    try_checkpatch__ "$PYTHON3"
 }
 try_checkpatch__() {
-    if test $1 = no; then
-        :
-    elif test -s expout; then
-        AT_CHECK([$2 $top_srcdir/utilities/checkpatch.py -q test.patch],
+    if test -s expout; then
+        AT_CHECK([$1 $top_srcdir/utilities/checkpatch.py -q test.patch],
                  [1], [stdout])
         AT_CHECK([sed '/^Lines checked:/,$d' stdout], [0], [expout])
     else
-        AT_CHECK([$2 $top_srcdir/utilities/checkpatch.py -q test.patch])
+        AT_CHECK([$1 $top_srcdir/utilities/checkpatch.py -q test.patch])
     fi
 }
 OVS_END_SHELL_HELPERS
diff --git a/tests/ovn-controller-vtep.at b/tests/ovn-controller-vtep.at
index d4744d76e..3092dd5ca 100644
--- a/tests/ovn-controller-vtep.at
+++ b/tests/ovn-controller-vtep.at
@@ -15,7 +15,6 @@  m4_define([OVN_CONTROLLER_VTEP_START],
   [
    AT_KEYWORDS([ovn])
    # this will cause skip when 'make check' using Windows setup.
-   AT_SKIP_IF([test $HAVE_PYTHON = no])
 
    dnl Create databases (ovn-nb, ovn-sb, vtep).
    AT_CHECK([ovsdb-tool create vswitchd.db $ovs_srcdir/vswitchd/vswitch.ovsschema])
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index c73fd9003..b69e0d1e5 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -1,6 +1,5 @@ 
 AT_BANNER([OVN northd])
 AT_SETUP([ovn -- check   from NBDB to SBDB])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl create Logical_Router name=R1
@@ -151,7 +150,6 @@  AT_CHECK([ovn-sbctl list ha_chassis_group | wc -l], [0], [0
 AT_CLEANUP
 
 AT_SETUP([ovn -- check Gateway_Chassis propagation from NBDB to SBDB backwards compatibility])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl create Logical_Router name=R1
@@ -200,7 +198,6 @@  AT_CHECK([ovn-sbctl list ha_chassis_group | wc -l], [0], [0
 AT_CLEANUP
 
 AT_SETUP([ovn -- check up state of VIF LSP])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add S1
@@ -214,7 +211,6 @@  AT_CHECK([test x`ovn-nbctl lsp-get-up S1-vm1` = xup])
 AT_CLEANUP
 
 AT_SETUP([ovn -- check up state of router LSP linked to a distributed LR])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl lr-add R1
@@ -230,7 +226,6 @@  AT_CHECK([test x`ovn-nbctl lsp-get-up S1-R1` = xup])
 AT_CLEANUP
 
 AT_SETUP([ovn -- check up state of router LSP linked to a gateway LR])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-sbctl chassis-add gw1 geneve 127.0.0.1
@@ -250,7 +245,6 @@  AT_CHECK([test x`ovn-nbctl lsp-get-up S1-R1` = xup])
 AT_CLEANUP
 
 AT_SETUP([ovn -- check up state of router LSP linked to an LRP with set Gateway Chassis])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-sbctl chassis-add gw1 geneve 127.0.0.1
@@ -418,7 +412,6 @@  OVS_APP_EXIT_AND_WAIT([ovn-northd])
 AT_CLEANUP
 
 AT_SETUP([ovn -- check HA_Chassis_Group propagation from NBDB to SBDB])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl --wait=sb ha-chassis-group-add hagrp1
@@ -909,7 +902,6 @@  AT_CHECK([as northd ovn-appctl -t ovn-northd status], [0], [Status: active
 AT_CLEANUP
 
 AT_SETUP([ovn -- ovn-northd pause and resume])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 AT_CHECK([test xfalse = x`as northd ovs-appctl -t ovn-northd is-paused`])
@@ -947,7 +939,6 @@  OVS_WAIT_UNTIL([
 AT_CLEANUP
 
 AT_SETUP([ovn -- check Redirect Chassis propagation from NB to SB])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-sbctl chassis-add gw1 geneve 127.0.0.1
@@ -977,7 +968,6 @@  OVS_WAIT_UNTIL([ovn-sbctl get Port_Binding ${uuid} options:redirect-type], [0],
 AT_CLEANUP
 
 AT_SETUP([ovn -- check stateless dnat_and_snat rule])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-sbctl chassis-add gw1 geneve 127.0.0.1
diff --git a/tests/ovn.at b/tests/ovn.at
index 0cab187a3..f54823b5d 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -1503,7 +1503,6 @@  AT_BANNER([OVN end-to-end tests])
 # 3 hypervisors, one logical switch, 3 logical ports per hypervisor
 AT_SETUP([ovn -- 3 HVs, 1 LS, 3 lports/HV])
 AT_KEYWORDS([ovnarp])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Create hypervisors hv[123].
@@ -1798,7 +1797,6 @@  AT_CLEANUP
 # logical ports bound to chassis encap-ip.
 AT_SETUP([ovn -- 2 HVs, 1 LS, 2 lports/HV])
 AT_KEYWORDS([ovnarp])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Create hypervisors hv[12].
@@ -1975,7 +1973,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- trace 1 LS, 3 LSPs])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Create a logical switch and some logical ports.
@@ -2198,7 +2195,6 @@  AT_CLEANUP
 # 2 locally attached networks (one flat, one vlan tagged over same device)
 # 2 ports per HV on each network
 AT_SETUP([ovn -- 2 HVs, 4 lports/HV, localnet ports])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # In this test cases we create 3 switches, all connected to same
@@ -2392,7 +2388,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- vtep: 3 HVs, 1 VIFs/HV, 1 GW, 1 LS])
 AT_KEYWORDS([vtep])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Configure the Northbound database
@@ -2594,7 +2589,6 @@  AT_CLEANUP
 
 # Similar test to "hardware GW"
 AT_SETUP([ovn -- 3 HVs, 1 VIFs/HV, 1 software GW, 1 LS])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Configure the Northbound database
@@ -2743,7 +2737,6 @@  AT_CLEANUP
 
 # 3 hypervisors, 3 logical switches with 3 logical ports each, 1 logical router
 AT_SETUP([ovn -- 3 HVs, 3 LS, 3 lports/LS, 1 LR])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -3156,7 +3149,6 @@  OVN_CLEANUP([hv1], [hv2], [hv3])
 AT_CLEANUP
 
 AT_SETUP([ovn -- IP relocation using GARP request])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -3359,7 +3351,6 @@  AT_CLEANUP
 
 # 3 hypervisors, one logical switch, 3 logical ports per hypervisor
 AT_SETUP([ovn -- portsecurity : 3 HVs, 1 LS, 3 lports/HV])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Create hypervisors hv[123].
@@ -3736,7 +3727,6 @@  OVN_CLEANUP([hv1],[hv2],[hv3])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 2 HVs, 2 LS, 1 lport/LS, 2 peer LRs])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -3883,7 +3873,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- 1 HV, 1 LS, 2 lport/LS, 1 LR])
 AT_KEYWORDS([router-admin-state])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -3995,7 +3984,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- 1 HV, 2 LSs, 1 lport/LS, 1 LR])
 AT_KEYWORDS([router-admin-state])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -4110,7 +4098,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 2 HVs, 3 LS, 1 lport/LS, 2 peer LRs, static routes])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -4263,7 +4250,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- send gratuitous arp on localnet])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 ovn-nbctl ls-add lsw0
 net_add n1
@@ -4317,7 +4303,6 @@  OVN_CLEANUP([hv])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 2 HVs, 3 LRs connected via LS, static routes])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -4494,7 +4479,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- dhcpv4 : 1 HV, 2 LS, 2 LSPs/LS])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add ls1
@@ -4927,7 +4911,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- dhcpv6 : 1 HV, 2 LS, 5 LSPs])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add ls1
@@ -5199,7 +5182,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 2 HVs, 2 LRs connected via LS, gateway router])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -5376,7 +5358,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- icmp_reply: 1 HVs, 2 LSs, 1 lport/LS, 1 LR])
 AT_KEYWORDS([router-icmp-reply])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -5522,7 +5503,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- policy-based routing: 1 HVs, 2 LSs, 1 lport/LS, 1 LR])
 AT_KEYWORDS([policy-based-routing])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -5708,7 +5688,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- policy-based routing IPv6: 1 HVs, 3 LSs, 1 lport/LS, 1 LR])
 AT_KEYWORDS([policy-based-routing])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -5985,7 +5964,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- nd_na ])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 #TODO: since patch port for IPv6 logical router port is not ready not,
@@ -6084,7 +6062,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- ipam])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Add a port to a switch that does not have a subnet set, then set the
@@ -6496,7 +6473,6 @@  OVS_APP_EXIT_AND_WAIT([ovn-northd])
 AT_CLEANUP
 
 AT_SETUP([ovn -- ipam connectivity])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl lr-add R1
@@ -6626,7 +6602,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- ovs-vswitchd restart])
 AT_KEYWORDS([vswitchd])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add ls1
@@ -6720,7 +6695,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- send arp for nexthop])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Topology: Two LSs - ls1 and ls2 are connected via router r0
@@ -6830,7 +6804,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- send gratuitous arp for nat ips in localnet])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 # Create logical switch
 ovn-nbctl ls-add ls0
@@ -6882,7 +6855,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- send gratuitous arp with nat-addresses router in localnet])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 # Create logical switch
 ovn-nbctl ls-add ls0
@@ -6980,7 +6952,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- conntrack zone allocation])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -7534,7 +7505,6 @@  OVN_CLEANUP([hv])
 AT_CLEANUP
 
 AT_SETUP([ovn -- read-only sb db:ptcp access])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 
 : > .$1.db.~lock~
 ovsdb-tool create ovn-sb.db "$abs_top_srcdir"/ovn-sb.ovsschema
@@ -7570,7 +7540,6 @@  OVS_APP_EXIT_AND_WAIT([ovsdb-server])
 AT_CLEANUP
 
 AT_SETUP([ovn -- read-only sb db:pssl access])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
 PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
 AT_SKIP_IF([expr "$PKIDIR" : ".*[ 	'\"
@@ -7627,7 +7596,6 @@  OVS_APP_EXIT_AND_WAIT([ovsdb-server])
 AT_CLEANUP
 
 AT_SETUP([ovn -- nb connection/ssl commands])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
 PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
 AT_SKIP_IF([expr "$PKIDIR" : ".*[ 	'\"
@@ -7679,7 +7647,6 @@  OVS_APP_EXIT_AND_WAIT([ovsdb-server])
 AT_CLEANUP
 
 AT_SETUP([ovn -- sb connection/ssl commands])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
 PKIDIR="$(cd $abs_top_builddir/tests && pwd)"
 AT_SKIP_IF([expr "$PKIDIR" : ".*[ 	'\"
@@ -7936,7 +7903,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 3 HVs, 3 LRs connected via LS, source IP based routes])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -8137,7 +8103,6 @@  OVN_CLEANUP([hv1],[hv2],[hv3])
 AT_CLEANUP
 
 AT_SETUP([ovn -- dns lookup : 1 HV, 2 LS, 2 LSPs/LS])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add ls1
@@ -8551,7 +8516,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 4 HV, 1 LS, 1 LR, packet test with HA distributed router gateway port])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 net_add n1
@@ -8778,7 +8742,6 @@  OVN_CLEANUP([hv1],[gw1],[ext1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 4 HV, 3 LS, 2 LR, packet test with HA distributed router gateway port])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 net_add n1
@@ -8997,7 +8960,6 @@  OVN_CLEANUP([hv1],[gw1],[gw2],[ext1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 1 LR with distributed router gateway port])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -9325,7 +9287,6 @@  OVN_CLEANUP([hv1],[hv2],[hv3])
 AT_CLEANUP
 
 AT_SETUP([ovn -- send gratuitous arp for NAT rules on distributed router])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 # Create logical switches
 ovn-nbctl ls-add ls0
@@ -9467,7 +9428,6 @@  AT_CLEANUP
 # gateway port should use vlans(i.e input network vlan tag) across hypervisors
 # instead of tunneling.
 AT_SETUP([ovn -- vlan traffic for external network with distributed router gateway port])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -9786,7 +9746,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- IPv6 ND Router Solicitation responder])
 AT_KEYWORDS([ovn-nd_ra])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # In this test case we create 1 lswitch with 3 VIF ports attached,
@@ -10034,7 +9993,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- /32 router IP address])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -10132,7 +10090,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 2 HVs, 1 lport/HV, localport ports])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add ls1
@@ -10254,7 +10211,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- 1 LR with HA distributed router gateway port])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 net_add n1
@@ -10809,7 +10765,6 @@  OVN_CLEANUP([gw1],[gw2],[hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- send gratuitous ARP for NAT rules on HA distributed router])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 ovn-nbctl ls-add ls0
 ovn-nbctl ls-add ls1
@@ -10980,7 +10935,6 @@  OVN_CLEANUP([hv1],[hv2],[hv3])
 AT_CLEANUP
 
 AT_SETUP([ovn -- ensure one gw controller restart in HA doesn't bounce the master])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 net_add n1
@@ -11077,7 +11031,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- IPv6 Neighbor Solicitation for unknown MAC])
 AT_KEYWORDS([ovn-nd_ns for unknown mac])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add sw0_ip6
@@ -11540,7 +11493,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- ACL reject rule test])
 AT_KEYWORDS([acl-reject])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_DST IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM
@@ -11682,7 +11634,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- Port Groups])
 AT_KEYWORDS([ovnpg])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -11908,7 +11859,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- ACLs on Port Groups])
 AT_KEYWORDS([ovnpg_acl])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -12394,7 +12344,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- TTL exceeded])
 AT_KEYWORDS([ttl-exceeded])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_DST IPV4_ROUTER IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM
@@ -12491,7 +12440,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- router port unreachable])
 AT_KEYWORDS([router-port-unreachable])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # test_ip_packet INPORT HV ETH_SRC ETH_DST IPV4_SRC IPV4_ROUTER L4_PROTCOL IP_CHKSUM EXP_IP_CHKSUM EXP_ICMP_CHKSUM EXP_ICMP_CODE
@@ -12640,7 +12588,6 @@  OVN_CLEANUP([hv1], [hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- ovn-controller exit])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 # Logical network:
 # One Logical Router: ro, with two logical switches sw1 and sw2.
@@ -12731,7 +12678,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- external logical port])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 net_add n1
@@ -13467,7 +13413,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- Address Set Incremental Processing])
 AT_KEYWORDS([ovn_as_inc])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 net_add n1
@@ -13541,7 +13486,6 @@  OVN_CLEANUP([hv1])
 AT_CLEANUP
 
 AT_SETUP([ovn -- ovn-controller restart])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -13694,7 +13638,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- router - check packet length - icmp defrag])
 AT_KEYWORDS([check packet length])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ovn-nbctl ls-add sw0
@@ -13869,7 +13812,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- IP packet buffering])
 AT_KEYWORDS([ip-buffering])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -14014,7 +13956,6 @@  OVN_CLEANUP([hv1],[hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- neighbor update on same HV])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -14524,7 +14465,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- virtual ports])
 AT_KEYWORDS([virtual ports])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 send_garp() {
@@ -14949,7 +14889,6 @@  OVN_CLEANUP([hv1], [hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- IGMP snoop/querier/relay])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 # Logical network:
@@ -16129,7 +16068,6 @@  AT_CLEANUP
 
 AT_SETUP([ovn -- ARP lookup before learning])
 AT_KEYWORDS([virtual ports])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 send_garp() {
@@ -16846,7 +16784,6 @@  OVN_CLEANUP([hv1], [hv2])
 AT_CLEANUP
 
 AT_SETUP([ovn -- ARP/ND request broadcast limiting])
-AT_SKIP_IF([test $HAVE_PYTHON = no])
 ovn_start
 
 ip_to_hex() {
diff --git a/tests/ovsdb-macros.at b/tests/ovsdb-macros.at
index 83e3df750..7664a53cd 100644
--- a/tests/ovsdb-macros.at
+++ b/tests/ovsdb-macros.at
@@ -38,7 +38,6 @@  m4_define([OVSDB_CHECK_POSITIVE],
 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
 m4_define([OVSDB_CHECK_POSITIVE_PY],
   [AT_SETUP([$1])
-   AT_SKIP_IF([test $HAVE_PYTHON2 = no])
    $6
    AT_KEYWORDS([ovsdb positive Python $4])
    AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [0], [$3
@@ -57,7 +56,6 @@  m4_define([OVSDB_CHECK_POSITIVE_PY],
 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
 m4_define([OVSDB_CHECK_POSITIVE_PY3],
   [AT_SETUP([$1])
-   AT_SKIP_IF([test $HAVE_PYTHON3 = no])
    $6
    AT_KEYWORDS([ovsdb positive Python $4])
    AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [0], [$3
@@ -100,7 +98,6 @@  m4_define([OVSDB_CHECK_NEGATIVE],
 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
 m4_define([OVSDB_CHECK_NEGATIVE_PY],
   [AT_SETUP([$1])
-   AT_SKIP_IF([test $HAVE_PYTHON2 = no])
    AT_KEYWORDS([ovsdb negative $4])
    AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
    m4_assert(m4_len([$3]))
@@ -121,7 +118,6 @@  m4_define([OVSDB_CHECK_NEGATIVE_PY],
 # TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
 m4_define([OVSDB_CHECK_NEGATIVE_PY],
   [AT_SETUP([$1])
-   AT_SKIP_IF([test $HAVE_PYTHON3 = no])
    AT_KEYWORDS([ovsdb negative $4])
    AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
    m4_assert(m4_len([$3]))
diff --git a/tests/system-kmod-macros.at b/tests/system-kmod-macros.at
index 48e94642b..f494af5f5 100644
--- a/tests/system-kmod-macros.at
+++ b/tests/system-kmod-macros.at
@@ -59,7 +59,6 @@  m4_define([CONFIGURE_VETH_OFFLOADS],
 # kernel conntrack tables when the test is finished.
 #
 m4_define([CHECK_CONNTRACK],
-    [AT_SKIP_IF([test $HAVE_PYTHON = no])
      m4_foreach([mod], [[nf_conntrack_ipv4], [nf_conntrack_ipv6], [nf_nat_ftp],
                         [nf_nat_tftp]],
                 [modprobe mod || echo "Module mod not loaded."
diff --git a/tests/system-userspace-macros.at b/tests/system-userspace-macros.at
index 89735bf16..d8cc686c2 100644
--- a/tests/system-userspace-macros.at
+++ b/tests/system-userspace-macros.at
@@ -63,7 +63,6 @@  m4_define([CONFIGURE_VETH_OFFLOADS],
 # Perform requirements checks for running conntrack tests.
 #
 m4_define([CHECK_CONNTRACK],
-    [AT_SKIP_IF([test $HAVE_PYTHON = no])]
 )
 
 # CHECK_CONNTRACK_ALG()
diff --git a/tutorial/ovs-sandbox b/tutorial/ovs-sandbox
index 510651add..36cdb6b68 100755
--- a/tutorial/ovs-sandbox
+++ b/tutorial/ovs-sandbox
@@ -376,6 +376,7 @@  OVN_RUNDIR=$sandbox; export OVN_RUNDIR
 OVS_LOGDIR=$sandbox; export OVS_LOGDIR
 OVS_DBDIR=$sandbox; export OVS_DBDIR
 OVS_SYSCONFDIR=$sandbox; export OVS_SYSCONFDIR
+PYTHONPATH=$ovssrcdir/python:$PYTHONPATH; export PYTHONPATH
 
 if $built; then
     # Easy access to OVS manpages.
diff --git a/utilities/bugtool/automake.mk b/utilities/bugtool/automake.mk
index b8c52d339..69b29e600 100644
--- a/utilities/bugtool/automake.mk
+++ b/utilities/bugtool/automake.mk
@@ -1,4 +1,3 @@ 
-if HAVE_PYTHON2
 bugtool_plugins = \
 	utilities/bugtool/plugins/network-status/ovn.xml
 
@@ -35,7 +34,6 @@  bugtool-uninstall-local:
 	    rm -rf "$(DESTDIR)$(bugtoolpluginsdir)/$$dir"; \
 	  fi \
 	done; exit 0
-endif
 
 EXTRA_DIST += \
 	$(bugtool_plugins) \
diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py
index f8fa00e30..981a433be 100755
--- a/utilities/checkpatch.py
+++ b/utilities/checkpatch.py
@@ -1,4 +1,4 @@ 
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright (c) 2016, 2017 Red Hat, Inc.
 # Copyright (c) 2018 Nicira, Inc.
 #
@@ -13,7 +13,6 @@ 
 # 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 __future__ import print_function
 
 import email
 import getopt
diff --git a/utilities/ovn-detrace.in b/utilities/ovn-detrace.in
index 52f6f4f92..3bfb72067 100755
--- a/utilities/ovn-detrace.in
+++ b/utilities/ovn-detrace.in
@@ -1,4 +1,4 @@ 
-#! @PYTHON@
+#! @PYTHON3@
 #
 # Copyright (c) 2017 eBay Inc.
 #
@@ -14,8 +14,6 @@ 
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import print_function
-
 import functools
 import getopt
 import os
@@ -236,7 +234,7 @@  def main():
         options, args = getopt.gnu_getopt(sys.argv[1:], 'hV',
                                           ['help', 'version', 'ovs',
                                            'ovnsb=', 'ovnnb=', 'ovsdb='])
-    except getopt.GetoptError, geo:
+    except (getopt.GetoptError, geo):
         sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
         sys.exit(1)
 
diff --git a/utilities/ovn-docker-overlay-driver.in b/utilities/ovn-docker-overlay-driver.in
index 65edfcd9d..f408bbdd8 100755
--- a/utilities/ovn-docker-overlay-driver.in
+++ b/utilities/ovn-docker-overlay-driver.in
@@ -1,4 +1,4 @@ 
-#! @PYTHON@
+#! @PYTHON3@
 # Copyright (C) 2015 Nicira, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/utilities/ovn-docker-underlay-driver.in b/utilities/ovn-docker-underlay-driver.in
index d91ce9fca..229418500 100755
--- a/utilities/ovn-docker-underlay-driver.in
+++ b/utilities/ovn-docker-underlay-driver.in
@@ -1,4 +1,4 @@ 
-#! @PYTHON@
+#! @PYTHON3@
 # Copyright (C) 2015 Nicira, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");