diff mbox series

[ovs-dev] Revert "Test the Python C JSON extension"

Message ID 20181015164436.20588-1-i.maximets@samsung.com
State Accepted
Headers show
Series [ovs-dev] Revert "Test the Python C JSON extension" | expand

Commit Message

Ilya Maximets Oct. 15, 2018, 4:44 p.m. UTC
This reverts commit a7be68a4d77791bbe02c37f7ad8ae60b02e5679e
and a subsequent commit 4617d1f6bd24c543f533f6485b42ebca6b0a8371.
There are too many issues with these patches. It's better to revert
them for now and make a separate fixed versions later if needed.

List of issues (maybe not full):

1. 'make clean' removes entire 'python' directory.

2. Fully broken Travis-CI testsuite build:
    building 'ovs._json' extension
    creating build/temp.linux-x86_64-2.7
    error: could not create 'build/temp.linux-x86_64-2.7': \
           Permission denied
    https://travis-ci.org/openvswitch/ovs/jobs/440693765

3. Broken local testsuite build on Ubuntu 18.04:
    running build_ext
    building 'ovs._json' extension
    creating build/temp.linux-x86_64-3.6
    creating build/temp.linux-x86_64-3.6/ovs
    <...>
    /usr/bin/ld: .libs/libopenvswitch.a(util.o): \
        relocation R_X86_64_TPOFF32 against `var.7749' can not be \
        used when making a shared object; recompile with -fPIC
    <...>
    collect2: error: ld returned 1 exit status

4. Fedora build failure because of 'setuptools' ('distutils')
   hard dependency on 'redhat-rpm-config' package:
    building 'ovs._json' extension
    <...>
    gcc: error: <...>/redhat-hardened-cc1: No such file or directory

5. Looks like 'setuptools' also could download and install
   unwanted python modules during package build.

Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
---
 python/automake.mk    |  11 ----
 python/ovs/json.py    |  10 ++-
 python/ovs/jsonrpc.py |   9 +--
 tests/atlocal.in      |   4 +-
 tests/json.at         |  35 ++++------
 tests/ovsdb-idl.at    | 149 +++++++++++++-----------------------------
 tests/ovsdb.at        |  36 ++++------
 tests/test-json.py    |  14 +---
 tests/test-ovsdb.py   |  22 +------
 9 files changed, 84 insertions(+), 206 deletions(-)

Comments

Ben Pfaff Oct. 15, 2018, 6:16 p.m. UTC | #1
On Mon, Oct 15, 2018 at 07:44:36PM +0300, Ilya Maximets wrote:
> This reverts commit a7be68a4d77791bbe02c37f7ad8ae60b02e5679e
> and a subsequent commit 4617d1f6bd24c543f533f6485b42ebca6b0a8371.
> There are too many issues with these patches. It's better to revert
> them for now and make a separate fixed versions later if needed.
> 
> List of issues (maybe not full):
> 
> 1. 'make clean' removes entire 'python' directory.
> 
> 2. Fully broken Travis-CI testsuite build:
>     building 'ovs._json' extension
>     creating build/temp.linux-x86_64-2.7
>     error: could not create 'build/temp.linux-x86_64-2.7': \
>            Permission denied
>     https://travis-ci.org/openvswitch/ovs/jobs/440693765
> 
> 3. Broken local testsuite build on Ubuntu 18.04:
>     running build_ext
>     building 'ovs._json' extension
>     creating build/temp.linux-x86_64-3.6
>     creating build/temp.linux-x86_64-3.6/ovs
>     <...>
>     /usr/bin/ld: .libs/libopenvswitch.a(util.o): \
>         relocation R_X86_64_TPOFF32 against `var.7749' can not be \
>         used when making a shared object; recompile with -fPIC
>     <...>
>     collect2: error: ld returned 1 exit status
> 
> 4. Fedora build failure because of 'setuptools' ('distutils')
>    hard dependency on 'redhat-rpm-config' package:
>     building 'ovs._json' extension
>     <...>
>     gcc: error: <...>/redhat-hardened-cc1: No such file or directory
> 
> 5. Looks like 'setuptools' also could download and install
>    unwanted python modules during package build.
> 
> Signed-off-by: Ilya Maximets <i.maximets@samsung.com>

You make a lot of good points.  I applied the revert.  Thanks!  I hope
that we can work to get some tests for this working reliably.
Lam, Tiago Oct. 16, 2018, 8:16 a.m. UTC | #2
On 15/10/2018 17:44, Ilya Maximets wrote:
> This reverts commit a7be68a4d77791bbe02c37f7ad8ae60b02e5679e
> and a subsequent commit 4617d1f6bd24c543f533f6485b42ebca6b0a8371.
> There are too many issues with these patches. It's better to revert
> them for now and make a separate fixed versions later if needed.
> 
> List of issues (maybe not full):
> 
> 1. 'make clean' removes entire 'python' directory.
> 
> 2. Fully broken Travis-CI testsuite build:
>     building 'ovs._json' extension
>     creating build/temp.linux-x86_64-2.7
>     error: could not create 'build/temp.linux-x86_64-2.7': \
>            Permission denied
>     https://travis-ci.org/openvswitch/ovs/jobs/440693765
> 
> 3. Broken local testsuite build on Ubuntu 18.04:
>     running build_ext
>     building 'ovs._json' extension
>     creating build/temp.linux-x86_64-3.6
>     creating build/temp.linux-x86_64-3.6/ovs
>     <...>
>     /usr/bin/ld: .libs/libopenvswitch.a(util.o): \
>         relocation R_X86_64_TPOFF32 against `var.7749' can not be \
>         used when making a shared object; recompile with -fPIC
>     <...>
>     collect2: error: ld returned 1 exit status
> 
> 4. Fedora build failure because of 'setuptools' ('distutils')
>    hard dependency on 'redhat-rpm-config' package:
>     building 'ovs._json' extension
>     <...>
>     gcc: error: <...>/redhat-hardened-cc1: No such file or directory
> 
> 5. Looks like 'setuptools' also could download and install
>    unwanted python modules during package build.
> 
> Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
> ---

(I'm CC'ing the author of the patch since I don't see him in the address
list for this patch).

Thanks, Ilya. I hadn't seen this patch before submitting mine.

The problem I was seeing with 3. is that beginning with commit a7be68a
the build now tries to build the Python JSON C extension by default
(shared), and tries to link to libopenvswitch, which most likely hasn't
been built with a "-fPIC" flag, producing several `ld` errors and "***"
warnings. So, instead of trying to build the C extension and using the
Python lib as an alternative if the former fails, which ends up
polluting the build system, I think we could try to detect which JSON
extension to use before proceeding. Perhaps detecting for
"--enable-shared" could be sufficient here, and only try to build the
extension if one builds a shared version of libopenvswitch.

But I agree that this needs to be rethought.

Tiago.
Terry Wilson Dec. 13, 2018, 7:03 p.m. UTC | #3
Sorry I missed this...thanks for the in-depth analysis!

On Tue, Oct 16, 2018 at 3:16 AM Lam, Tiago <tiago.lam@intel.com> wrote:
>
> On 15/10/2018 17:44, Ilya Maximets wrote:
> > This reverts commit a7be68a4d77791bbe02c37f7ad8ae60b02e5679e
> > and a subsequent commit 4617d1f6bd24c543f533f6485b42ebca6b0a8371.
> > There are too many issues with these patches. It's better to revert
> > them for now and make a separate fixed versions later if needed.
> >
> > List of issues (maybe not full):
> >
> > 1. 'make clean' removes entire 'python' directory.

Doh. Using a build dir instead of building in-tree hid this from me.
just changing it to delete $builddir/python/ovs/*.so fixes

> > 2. Fully broken Travis-CI testsuite build:
> >     building 'ovs._json' extension
> >     creating build/temp.linux-x86_64-2.7
> >     error: could not create 'build/temp.linux-x86_64-2.7': \
> >            Permission denied
> >     https://travis-ci.org/openvswitch/ovs/jobs/440693765

Is this a problem with the patch? It looks more like an issue with the
testing infrastructure. Why wouldn't we have permission to write to a
builddir? If not, does anyone have any idea what needs to be done to
work around this restriction? It's handy being able to use python
setup.py to build the extensions as opposed to having to maintain
build instructions that match what it would do. Using
autoconf/automake with python projects is such a pita...especially in
this chicken-and-egg-prone situation where we are building C
extensions that require libovs to link to. I get how it is really
handy to be able to test that the Python IDL code does exactly what
the C does, but not being able to use the Python-style testing and
build processes in a Python project makes it really hard to do things
"right".

As an aside, the autoconf based tests for the json parser are kind of
brittle. They end up requiring sorted output of keys, etc. since they
do blind string-matching on the outputs even though other output would
be perfectly acceptable JSON. There's no need to match on whitespace,
key order, etc. If both implementations can take in json text and
compare json, we could test that parsed(test_correct_output) ==
parsed(input) maybe?

> > 3. Broken local testsuite build on Ubuntu 18.04:
> >     running build_ext
> >     building 'ovs._json' extension
> >     creating build/temp.linux-x86_64-3.6
> >     creating build/temp.linux-x86_64-3.6/ovs
> >     <...>
> >     /usr/bin/ld: .libs/libopenvswitch.a(util.o): \
> >         relocation R_X86_64_TPOFF32 against `var.7749' can not be \
> >         used when making a shared object; recompile with -fPIC
> >     <...>
> >     collect2: error: ld returned 1 exit status

This just looks scary as python setup.py build_ext is configured to
try to build the extension and if it fails, falls back to building the
package w/o speedups and exits 0, so the build actually completes.
I'll see if I can only do this if --enable-shared to avoid the scary
output.

> > 4. Fedora build failure because of 'setuptools' ('distutils')
> >    hard dependency on 'redhat-rpm-config' package:
> >     building 'ovs._json' extension
> >     <...>
> >     gcc: error: <...>/redhat-hardened-cc1: No such file or directory

This is like above in that the extension just isn't built, but the
build completes. This sounds like a packaging issue if
redhat-rpm-config is required, but isn't listed as a dependency of
python-setuptools? How would you recommend proceeding on this?

> > 5. Looks like 'setuptools' also could download and install
> >    unwanted python modules during package build.

It's a Python project. Setuptools is a pretty standard requirement for
those. I fail to see the issue with this one.

> (I'm CC'ing the author of the patch since I don't see him in the address
> list for this patch).
>
> Thanks, Ilya. I hadn't seen this patch before submitting mine.
>
> The problem I was seeing with 3. is that beginning with commit a7be68a
> the build now tries to build the Python JSON C extension by default
> (shared), and tries to link to libopenvswitch, which most likely hasn't
> been built with a "-fPIC" flag, producing several `ld` errors and "***"
> warnings. So, instead of trying to build the C extension and using the
> Python lib as an alternative if the former fails, which ends up
> polluting the build system, I think we could try to detect which JSON
> extension to use before proceeding. Perhaps detecting for
> "--enable-shared" could be sufficient here, and only try to build the
> extension if one builds a shared version of libopenvswitch.
>
> But I agree that this needs to be rethought.
>
> Tiago.
diff mbox series

Patch

diff --git a/python/automake.mk b/python/automake.mk
index 21547f7ba..5a1e1da8a 100644
--- a/python/automake.mk
+++ b/python/automake.mk
@@ -92,17 +92,6 @@  python-sdist: $(srcdir)/python/ovs/version.py $(ovs_pyfiles) python/ovs/dirs.py
 
 pypi-upload: $(srcdir)/python/ovs/version.py $(ovs_pyfiles) python/ovs/dirs.py
 	(cd python/ && $(PYTHON) setup.py sdist upload)
-
-ALL_LOCAL += python-build
-python-build:$(lib_LTLIBRARIES)
-	(cd $(srcdir)/python/ && $(PYTHON) setup.py build_py -d $(abs_top_builddir)/python && $(PYTHON) setup.py build_ext -b $(abs_top_builddir)/python -I$(abs_top_srcdir)/include:$(abs_top_builddir)/include -L$(abs_top_builddir)/lib/.libs)
-if HAVE_PYTHON3
-	(cd $(srcdir)/python/ && $(PYTHON3) setup.py build_py -d $(abs_top_builddir)/python && $(PYTHON3) setup.py build_ext -b $(abs_top_builddir)/python -I$(abs_top_srcdir)/include:$(abs_top_builddir)/include  -L$(abs_top_builddir)/lib/.libs)
-
-CLEAN_LOCAL += python-clean
-python-clean:
-	rm -rf $(abs_top_builddir)/python
-endif
 else
 ovs-install-data-local:
 	@:
diff --git a/python/ovs/json.py b/python/ovs/json.py
index f06204e44..e84063fc2 100644
--- a/python/ovs/json.py
+++ b/python/ovs/json.py
@@ -21,13 +21,10 @@  import sys
 
 import six
 
-PARSER_C = 'C'
-PARSER_PY = 'PYTHON'
 try:
     import ovs._json
-    PARSER = PARSER_C
 except ImportError:
-    PARSER = PARSER_PY
+    pass
 
 __pychecker__ = 'no-stringiter'
 
@@ -94,9 +91,10 @@  class Parser(object):
     MAX_HEIGHT = 1000
 
     def __new__(cls, *args, **kwargs):
-        if PARSER == PARSER_C:
+        try:
             return ovs._json.Parser(*args, **kwargs)
-        return super(Parser, cls).__new__(cls)
+        except NameError:
+            return super(Parser, cls).__new__(cls)
 
     def __init__(self, check_trailer=False):
         self.check_trailer = check_trailer
diff --git a/python/ovs/jsonrpc.py b/python/ovs/jsonrpc.py
index 1323ba757..4873cff98 100644
--- a/python/ovs/jsonrpc.py
+++ b/python/ovs/jsonrpc.py
@@ -272,8 +272,7 @@  class Connection(object):
                 # data, so we convert it here as soon as possible.
                 if data and not error:
                     try:
-                        if six.PY3 or ovs.json.PARSER == ovs.json.PARSER_PY:
-                            data = decoder.decode(data)
+                        data = decoder.decode(data)
                     except UnicodeError:
                         error = errno.EILSEQ
                 if error:
@@ -299,11 +298,7 @@  class Connection(object):
             else:
                 if self.parser is None:
                     self.parser = ovs.json.Parser()
-                if six.PY3 and ovs.json.PARSER == ovs.json.PARSER_C:
-                    self.input = self.input.encode('utf-8')[
-                        self.parser.feed(self.input):].decode()
-                else:
-                    self.input = self.input[self.parser.feed(self.input):]
+                self.input = self.input[self.parser.feed(self.input):]
                 if self.parser.is_done():
                     msg = self.__process_msg()
                     if msg:
diff --git a/tests/atlocal.in b/tests/atlocal.in
index 3b3af84ee..abfc1acf3 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -22,10 +22,8 @@  if test x"$PYTHON3" = x; then
     export PYTHONCOERCECLOCALE
 fi
 
-PYTHONPATH=$abs_top_builddir/python:$abs_top_builddir/tests:$PYTHONPATH
+PYTHONPATH=$abs_top_srcdir/python:$abs_top_builddir/tests:$PYTHONPATH
 export PYTHONPATH
-LD_LIBRARY_PATH=$abs_top_builddir/lib/.libs
-export LD_LIBRARY_PATH
 
 PYTHONIOENCODING=utf_8
 export PYTHONIOENCODING
diff --git a/tests/json.at b/tests/json.at
index 32a55f7b6..bfe0f1967 100644
--- a/tests/json.at
+++ b/tests/json.at
@@ -9,16 +9,15 @@  m4_define([JSON_CHECK_POSITIVE_C],
    AT_CLEANUP])
 
 # JSON_CHECK_POSITIVE_PY(TITLE, INPUT, OUTPUT, TEST-JSON-ARGS,
-#                        PYTHON-CHCEK, PYTHON-BIN, JSON-PARSER = python)
+#                        PYTHON-CHCEK, PYTHON-BIN)
 #
 m4_define([JSON_CHECK_POSITIVE_PY],
   [AT_SETUP([$1])
    AT_KEYWORDS([json positive Python])
    AT_SKIP_IF([test $5 = no])
-   AT_SKIP_IF([test $7 = C && ! $6 -c "import ovs._json" 2>/dev/null])
    AT_CHECK([printf %s "AS_ESCAPE([$2])" > input])
    AT_CAPTURE_FILE([input])
-   AT_CHECK([$6 $srcdir/test-json.py -j m4_default([$7], python) $4 input], [0], [stdout], [])
+   AT_CHECK([$6 $srcdir/test-json.py $4 input], [0], [stdout], [])
    AT_CHECK([cat stdout], [0], [$3
 ])
    AT_CLEANUP])
@@ -38,17 +37,16 @@  m4_define([JSON_CHECK_POSITIVE_UCS4PY],
 
 m4_define([JSON_CHECK_POSITIVE],
   [JSON_CHECK_POSITIVE_C([$1 - C], [$2], [$3], [$4])
-   JSON_CHECK_POSITIVE_PY23([$1], [$2], [$3], [$4])])
+   JSON_CHECK_POSITIVE_PY([$1 - Python2], [$2], [$3], [$4],
+                          [$HAVE_PYTHON2], [$PYTHON2])
+   JSON_CHECK_POSITIVE_PY([$1 - Python3], [$2], [$3], [$4],
+                          [$HAVE_PYTHON3], [$PYTHON3])])
 
 m4_define([JSON_CHECK_POSITIVE_PY23],
-  [JSON_CHECK_POSITIVE_PY([$1 - Python2(pyjson)], [$2], [$3], [$4],
+  [JSON_CHECK_POSITIVE_PY([$1 - Python2], [$2], [$3], [$4],
                           [$HAVE_PYTHON2], [$PYTHON2])
-   JSON_CHECK_POSITIVE_PY([$1 - Python2(cjson)], [$2], [$3], [$4],
-                          [$HAVE_PYTHON2], [$PYTHON2], C)
-   JSON_CHECK_POSITIVE_PY([$1 - Python3(pyjson)], [$2], [$3], [$4],
-                          [$HAVE_PYTHON3], [$PYTHON3])
-   JSON_CHECK_POSITIVE_PY([$1 - Python3(cjson)], [$2], [$3], [$4],
-                          [$HAVE_PYTHON3], [$PYTHON3], C)])
+   JSON_CHECK_POSITIVE_PY([$1 - Python3], [$2], [$3], [$4],
+                          [$HAVE_PYTHON3], [$PYTHON3])])
 
 m4_define([JSON_CHECK_NEGATIVE_C],
   [AT_SETUP([$1])
@@ -61,30 +59,25 @@  m4_define([JSON_CHECK_NEGATIVE_C],
    AT_CLEANUP])
 
 # JSON_CHECK_NEGATIVE_PY(TITLE, INPUT, OUTPUT, TEST-JSON-ARGS,
-#                        PYTHON-CHCEK, PYTHON-BIN, JSON_PARSER = python)
+#                        PYTHON-CHCEK, PYTHON-BIN)
 #
 m4_define([JSON_CHECK_NEGATIVE_PY], 
   [AT_SETUP([$1])
    AT_KEYWORDS([json negative Python])
    AT_SKIP_IF([test $5 = no])
-   AT_SKIP_IF([test $7 = C && ! $6 -c "import ovs._json" 2>/dev/null])
    AT_CHECK([printf %s "AS_ESCAPE([$2])" > input])
    AT_CAPTURE_FILE([input])
-   AT_CHECK([$6 $srcdir/test-json.py -j m4_default([$7], python) $4 input], [1], [stdout], [])
+   AT_CHECK([$6 $srcdir/test-json.py $4 input], [1], [stdout], [])
    AT_CHECK([[sed 's/^error: [^:]*:/error:/' < stdout]], [0], [$3
 ])
    AT_CLEANUP])
 
 m4_define([JSON_CHECK_NEGATIVE],
   [JSON_CHECK_NEGATIVE_C([$1 - C], [$2], [$3], [$4])
-   JSON_CHECK_NEGATIVE_PY([$1 - Python2(pyjson)], [$2], [$3], [$4],
+   JSON_CHECK_NEGATIVE_PY([$1 - Python2], [$2], [$3], [$4],
                           [$HAVE_PYTHON2], [$PYTHON2])
-   JSON_CHECK_NEGATIVE_PY([$1 - Python2(cjson)], [$2], [$3], [$4],
-                          [$HAVE_PYTHON2], [$PYTHON2], C)
-   JSON_CHECK_NEGATIVE_PY([$1 - Python3(pyjson)], [$2], [$3], [$4],
-                          [$HAVE_PYTHON3], [$PYTHON3])
-   JSON_CHECK_NEGATIVE_PY([$1 - Python3(cjson)], [$2], [$3], [$4],
-                          [$HAVE_PYTHON3], [$PYTHON3], C)])
+   JSON_CHECK_NEGATIVE_PY([$1 - Python3], [$2], [$3], [$4],
+                          [$HAVE_PYTHON3], [$PYTHON3])])
 
 AT_BANNER([JSON -- arrays])
 
diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at
index 663822ee9..142eee794 100644
--- a/tests/ovsdb-idl.at
+++ b/tests/ovsdb-idl.at
@@ -46,12 +46,11 @@  m4_define([OVSDB_CHECK_IDL_C],
 m4_define([OVSDB_CHECK_IDL_PYN],
   [AT_SETUP([$1])
    AT_SKIP_IF([test $7 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python $5])
    AT_CHECK([ovsdb_start_idltest])
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema unix:socket $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema unix:socket $3],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
             [0], [$4])
@@ -59,24 +58,19 @@  m4_define([OVSDB_CHECK_IDL_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_PY],
-   [OVSDB_CHECK_IDL_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_PYN([$1 - Python2], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON2], [$PYTHON2])
-    OVSDB_CHECK_IDL_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON2], [$PYTHON2], C)
-    OVSDB_CHECK_IDL_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_PYN([$1 - Python3], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 m4_define([OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN],
   [AT_SETUP([$1 - register_columns])
    AT_SKIP_IF([test $7 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python register_columns $5])
    AT_CHECK([ovsdb_start_idltest])
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema unix:socket ?simple:b,ba,i,ia,r,ra,s,sa,u,ua?link1:i,k,ka,l2?link2:i,l1?singleton:name $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema unix:socket ?simple:b,ba,i,ia,r,ra,s,sa,u,ua?link1:i,k,ka,l2?link2:i,l1?singleton:name $3],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
             [0], [$4])
@@ -84,27 +78,22 @@  m4_define([OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_REGISTER_COLUMNS_PY],
-   [OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN([$1 - Python2], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON2], [$PYTHON2])
-    OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON2], [$PYTHON2], C)
-    OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_REGISTER_COLUMNS_PYN([$1 - Python3], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with tcp
 m4_define([OVSDB_CHECK_IDL_TCP_PYN],
   [AT_SETUP([$1 - tcp])
    AT_SKIP_IF([test $7 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python with tcp socket $5])
    AT_CHECK([ovsdb_start_idltest "ptcp:0:127.0.0.1"])
    PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
 
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema tcp:127.0.0.1:$TCP_PORT $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema tcp:127.0.0.1:$TCP_PORT $3],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
             [0], [$4])
@@ -112,21 +101,16 @@  m4_define([OVSDB_CHECK_IDL_TCP_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_TCP_PY],
-   [OVSDB_CHECK_IDL_TCP_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_TCP_PYN([$1 - Python2], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON2], [$PYTHON2])
-    OVSDB_CHECK_IDL_TCP_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON2], [$PYTHON2], C)
-    OVSDB_CHECK_IDL_TCP_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_TCP_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_TCP_PYN([$1 - Python3], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with tcp
 # with multiple remotes with only one remote reachable
 m4_define([OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN],
   [AT_SETUP([$1 - tcp])
    AT_SKIP_IF([test $7 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python with tcp socket $5])
    AT_CHECK([ovsdb_start_idltest "ptcp:0:127.0.0.1"])
    PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
@@ -135,7 +119,7 @@  m4_define([OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN],
    remote=tcp:127.0.0.1:$WRONG_PORT_1,tcp:127.0.0.1:$TCP_PORT,tcp:127.0.0.1:$WRONG_PORT_2
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema $remote $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema $remote $3],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
             [0], [$4])
@@ -143,14 +127,10 @@  m4_define([OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PY],
-   [OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN([$1 - Python2 (pyjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN([$1 - Python2 (multiple remotes)], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON], [$PYTHON])
-    OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN([$1 - Python2 (cjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON], [$PYTHON], C)
-    OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN([$1 - Python3 (pyjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN([$1 - Python3 (cjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_TCP_MULTIPLE_REMOTES_PYN([$1 - Python3 (multiple remotes)], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with tcp6
 m4_define([OVSDB_CHECK_IDL_TCP6_PYN],
@@ -158,7 +138,6 @@  m4_define([OVSDB_CHECK_IDL_TCP6_PYN],
    AT_SKIP_IF([test $7 = no])
    AT_SKIP_IF([test "$IS_WIN32" = "yes"])
    AT_SKIP_IF([test $HAVE_IPV6 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python with tcp6 socket $5])
    AT_CHECK([ovsdb_start_idltest "ptcp:0:[[::1]]"])
    PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
@@ -166,7 +145,7 @@  m4_define([OVSDB_CHECK_IDL_TCP6_PYN],
 
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact "tcp:[[::1]]:$TCP_PORT" $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema tcp:[[::1]]:$TCP_PORT $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema tcp:[[::1]]:$TCP_PORT $3],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
             [0], [$4])
@@ -174,21 +153,16 @@  m4_define([OVSDB_CHECK_IDL_TCP6_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_TCP6_PY],
-   [OVSDB_CHECK_IDL_TCP6_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_TCP6_PYN([$1 - Python2], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON2], [$PYTHON2])
-    OVSDB_CHECK_IDL_TCP6_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON2], [$PYTHON2], C)
-    OVSDB_CHECK_IDL_TCP6_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_TCP6_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_TCP6_PYN([$1 - Python3], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 m4_define([OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN],
   [AT_SETUP([$1 - tcp6])
    AT_SKIP_IF([test $7 = no])
    AT_SKIP_IF([test "$IS_WIN32" = "yes"])
    AT_SKIP_IF([test $HAVE_IPV6 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python with tcp6 socket $5])
    AT_CHECK([ovsdb_start_idltest "ptcp:0:[[::1]]"])
    PARSE_LISTENING_PORT([ovsdb-server.log], [TCP_PORT])
@@ -197,7 +171,7 @@  m4_define([OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN],
    remote="tcp:[[::1]]:$WRONG_PORT_1,tcp:[[::1]]:$TCP_PORT,tcp:[[::1]]:$WRONG_PORT_2"
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact "tcp:[[::1]]:$TCP_PORT" $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema $remote $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema $remote $3],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
             [0], [$4])
@@ -205,14 +179,10 @@  m4_define([OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PY],
-   [OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN([$1 - Python2 (pyjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN([$1 - Python2 (multiple remotes)], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON], [$PYTHON])
-    OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN([$1 - Python2 (cjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON], [$PYTHON], C)
-    OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN([$1 - Python3 (pyjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN([$1 - Python3 (cjson multiple remotes)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_TCP6_MULTIPLE_REMOTES_PYN([$1 - Python3 (multiple remotes)], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 # same as OVSDB_CHECK_IDL but uses the Python IDL implementation with SSL
 m4_define([OVSDB_CHECK_IDL_SSL_PYN],
@@ -222,7 +192,6 @@  m4_define([OVSDB_CHECK_IDL_SSL_PYN],
    $8 -c "import OpenSSL.SSL"
    SSL_PRESENT=$?
    AT_SKIP_IF([test $SSL_PRESENT != 0])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python with ssl socket $5])
    AT_CHECK([ovsdb-tool create db $abs_srcdir/idltest.ovsschema],
              [0], [stdout], [ignore])
@@ -241,7 +210,7 @@  m4_define([OVSDB_CHECK_IDL_SSL_PYN],
                 --certificate=$PKIDIR/testpki-cert2.pem \
                 --ca-cert=$PKIDIR/testpki-cacert.pem \
                 transact "ssl:127.0.0.1:$TCP_PORT" $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema \
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema \
              ssl:127.0.0.1:$TCP_PORT $PKIDIR/testpki-privkey.pem \
              $PKIDIR/testpki-cert.pem $PKIDIR/testpki-cacert.pem $3],
             [0], [stdout], [ignore])
@@ -251,14 +220,10 @@  m4_define([OVSDB_CHECK_IDL_SSL_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_SSL_PY],
-   [OVSDB_CHECK_IDL_SSL_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_SSL_PYN([$1 - Python2], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON], [$PYTHON])
-    OVSDB_CHECK_IDL_SSL_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON], [$PYTHON], C)
-    OVSDB_CHECK_IDL_SSL_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_SSL_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_SSL_PYN([$1 - Python3], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 m4_define([OVSDB_CHECK_IDL],
   [OVSDB_CHECK_IDL_C($@)
@@ -274,7 +239,6 @@  m4_define([OVSDB_CHECK_IDL],
 m4_define([OVSDB_CHECK_IDL_PASSIVE_TCP_PYN],
   [AT_SETUP([$1 ptcp])
    AT_SKIP_IF([test $7 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python with tcp socket $5])
    # find free TCP port
    AT_CHECK([ovsdb_start_idltest "ptcp:0:127.0.0.1"])
@@ -284,7 +248,7 @@  m4_define([OVSDB_CHECK_IDL_PASSIVE_TCP_PYN],
 
    # start OVSDB server in passive mode
    AT_CHECK([ovsdb_start_idltest "tcp:127.0.0.1:$TCP_PORT"])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl_passive $srcdir/idltest.ovsschema ptcp:127.0.0.1:$TCP_PORT $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py -t10 idl_passive $srcdir/idltest.ovsschema ptcp:127.0.0.1:$TCP_PORT $3],
       [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
             [0], [$4])
@@ -293,14 +257,10 @@  m4_define([OVSDB_CHECK_IDL_PASSIVE_TCP_PYN],
    ])
 
 m4_define([OVSDB_CHECK_IDL_PASSIVE_TCP_PY],
-    [OVSDB_CHECK_IDL_PASSIVE_TCP_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6],
+    [OVSDB_CHECK_IDL_PASSIVE_TCP_PYN([$1 - Python2], [$2], [$3], [$4], [$5], [$6],
                         [$HAVE_PYTHON2], [$PYTHON2])
-     OVSDB_CHECK_IDL_PASSIVE_TCP_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON2], [$PYTHON2], C)
-     OVSDB_CHECK_IDL_PASSIVE_TCP_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-     OVSDB_CHECK_IDL_PASSIVE_TCP_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_PASSIVE_TCP_PYN([$1 - Python3], [$2], [$3], [$4], [$5], [$6],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 OVSDB_CHECK_IDL_PASSIVE_TCP_PY([simple passive idl, initially empty, select empty],
   [],
@@ -473,12 +433,11 @@  OVSDB_CHECK_IDL([simple idl, writing via IDL with unicode],
 m4_define([OVSDB_CHECK_IDL_PYN_WITH_EXPOUT],
   [AT_SETUP([$1])
    AT_SKIP_IF([test $7 = no])
-   AT_SKIP_IF([test $9 = C && ! $8 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python $5])
    AT_CHECK([ovsdb_start_idltest])
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
-   AT_CHECK([$8 $srcdir/test-ovsdb.py -j m4_default([$9], python) -t10 idl $srcdir/idltest.ovsschema unix:socket $3],
+   AT_CHECK([$8 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema unix:socket $3],
             [0], [stdout], [ignore])
    echo "$4" > expout
    AT_CHECK([sort stdout | uuidfilt]m4_if([$6],,, [[| $6]]),
@@ -487,14 +446,10 @@  m4_define([OVSDB_CHECK_IDL_PYN_WITH_EXPOUT],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_PY_WITH_EXPOUT],
-   [OVSDB_CHECK_IDL_PYN_WITH_EXPOUT([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6],
+   [OVSDB_CHECK_IDL_PYN_WITH_EXPOUT([$1 - Python2], [$2], [$3], [$4], [$5], [$6],
                                     [$HAVE_PYTHON2], [$PYTHON2])
-    OVSDB_CHECK_IDL_PYN_WITH_EXPOUT([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6],
-                                    [$HAVE_PYTHON2], [$PYTHON2], C)
-    OVSDB_CHECK_IDL_PYN_WITH_EXPOUT([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6],
-                                    [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_PYN_WITH_EXPOUT([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6],
-                                    [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_PYN_WITH_EXPOUT([$1 - Python3], [$2], [$3], [$4], [$5], [$6],
+                                    [$HAVE_PYTHON3], [$PYTHON3])])
 
 OVSDB_CHECK_IDL_PY_WITH_EXPOUT([simple idl, writing large data via IDL with unicode],
   [['["idltest",
@@ -1013,12 +968,11 @@  AT_CLEANUP
 m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN],
   [AT_SETUP([$1 fetch])
    AT_SKIP_IF([test $8 = no])
-   AT_SKIP_IF([test $10 = C && ! $9 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl positive Python increment fetch $6])
    AT_CHECK([ovsdb_start_idltest])
    m4_if([$2], [], [],
      [AT_CHECK([ovsdb-client transact unix:socket $2], [0], [ignore], [ignore])])
-   AT_CHECK([$9 $srcdir/test-ovsdb.py -j m4_default([$10], python) -t10 idl $srcdir/idltest.ovsschema unix:socket [$3] $4],
+   AT_CHECK([$9 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema unix:socket [$3] $4],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$7],,, [[| $7]]),
             [0], [$5])
@@ -1026,14 +980,10 @@  m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS_PY],
-    [OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6], [$7],
+    [OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN([$1 - Python2], [$2], [$3], [$4], [$5], [$6], [$7],
                         [$HAVE_PYTHON2], [$PYTHON2])
-     OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6], [$7],
-                        [$HAVE_PYTHON2], [$PYTHON2], C)
-    OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$6], [$7],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$6], [$7],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_FETCH_COLUMNS_PYN([$1 - Python3], [$2], [$3], [$4], [$5], [$6], [$7],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 m4_define([OVSDB_CHECK_IDL_FETCH_COLUMNS],
    [OVSDB_CHECK_IDL_FETCH_COLUMNS_PY($@)])
@@ -1069,11 +1019,10 @@  OVSDB_CHECK_IDL_FETCH_COLUMNS([simple idl, initially populated],
 m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN],
   [AT_SETUP([$1])
    AT_SKIP_IF([test $6 = no])
-   AT_SKIP_IF([test $8 = C && ! $7 -c "import ovs._json" 2>/dev/null])
    AT_KEYWORDS([ovsdb server idl Python monitor $4])
    AT_CHECK([ovsdb_start_idltest])
    AT_CHECK([ovs-appctl -t ovsdb-server ovsdb-server/disable-monitor-cond])
-   AT_CHECK([$7 $srcdir/test-ovsdb.py -j m4_default([$8], python) -t10 idl $srcdir/idltest.ovsschema unix:socket $2],
+   AT_CHECK([$7 $srcdir/test-ovsdb.py  -t10 idl $srcdir/idltest.ovsschema unix:socket $2],
             [0], [stdout], [ignore])
    AT_CHECK([sort stdout | uuidfilt]m4_if([$5],,, [[| $5]]),
             [0], [$3])
@@ -1081,14 +1030,10 @@  m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN],
    AT_CLEANUP])
 
 m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND_PY],
-    [OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5],
+    [OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN([$1 - Python2], [$2], [$3], [$4], [$5],
                         [$HAVE_PYTHON2], [$PYTHON2])
-     OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN([$1 - Python2(cjson)], [$2], [$3], [$4], [$5],
-                        [$HAVE_PYTHON2], [$PYTHON2], C)
-    OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5],
-                        [$HAVE_PYTHON3], [$PYTHON3])
-    OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN([$1 - Python3(cjson)], [$2], [$3], [$4], [$5],
-                        [$HAVE_PYTHON3], [$PYTHON3], C)])
+    OVSDB_CHECK_IDL_WO_MONITOR_COND_PYN([$1 - Python3], [$2], [$3], [$4], [$5],
+                        [$HAVE_PYTHON3], [$PYTHON3])])
 
 
 m4_define([OVSDB_CHECK_IDL_WO_MONITOR_COND],
@@ -1411,8 +1356,7 @@  OVSDB_CHECK_IDL_PY([partial-set idl],
 ]])
 
 m4_define([OVSDB_CHECK_IDL_NOTIFY_PYN],
-  [OVSDB_CHECK_IDL_PYN([$1(pyjson)], [], [$2], [$3], [notify $4], [$5], [$6], [$7])
-   OVSDB_CHECK_IDL_PYN([$1(cjson)], [], [$2], [$3], [notify $4], [$5], [$6], [$7], C)])
+  [OVSDB_CHECK_IDL_PYN([$1], [], [$2], [$3], [notify $4], [$5], [$6], [$7])])
 
 m4_define([OVSDB_CHECK_IDL_NOTIFY_PY],
     [OVSDB_CHECK_IDL_NOTIFY_PYN([$1 - Python2], [$2], [$3], [$4], [$5],
@@ -1422,8 +1366,7 @@  m4_define([OVSDB_CHECK_IDL_NOTIFY_PY],
 
 # This test uses the Python IDL implementation with ssl
 m4_define([OVSDB_CHECK_IDL_NOTIFY_SSL_PYN],
-  [OVSDB_CHECK_IDL_SSL_PYN([$1(pyjson)], [], [$2], [$3], [notify $4], [$5], [$6], [$7])
-   OVSDB_CHECK_IDL_SSL_PYN([$1(cjson)], [], [$2], [$3], [notify $4], [$5], [$6], [$7], C)])
+  [OVSDB_CHECK_IDL_SSL_PYN([$1], [], [$2], [$3], [notify $4], [$5], [$6], [$7])])
 
 m4_define([OVSDB_CHECK_IDL_NOTIFY_SSL_PY],
     [OVSDB_CHECK_IDL_NOTIFY_SSL_PYN([$1 - Python2], [$2], [$3], [$4], [$5],
diff --git a/tests/ovsdb.at b/tests/ovsdb.at
index fab79def4..0c9856d01 100644
--- a/tests/ovsdb.at
+++ b/tests/ovsdb.at
@@ -12,7 +12,7 @@  m4_define([OVSDB_CHECK_POSITIVE],
    AT_CLEANUP])
 
 # OVSDB_CHECK_POSITIVE_PY(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ],
-#                         [PY-CHECK] [JSON-PARSER = python])
+#                         [PY-CHECK])
 #
 # Runs "test-ovsdb.py TEST-OVSDB-ARGS" and checks that it exits with
 # status 0 and prints OUTPUT on stdout.
@@ -24,15 +24,14 @@  m4_define([OVSDB_CHECK_POSITIVE],
 m4_define([OVSDB_CHECK_POSITIVE_PY], 
   [AT_SETUP([$1])
    AT_SKIP_IF([test $HAVE_PYTHON2 = no])
-   AT_SKIP_IF([test $7 = C && ! $PYTHON2 -c "import ovs._json" 2>/dev/null])
    $6
    AT_KEYWORDS([ovsdb positive Python $4])
-   AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py -j m4_default([$7], python) $2], [0], [$3
+   AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [0], [$3
 ], [])
    AT_CLEANUP])
 
 # OVSDB_CHECK_POSITIVE_PY3(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ],
-#                          [PY-CHECK] [PY3-CHECK] [JSON-PARSER = python])
+#                          [PY-CHECK])
 #
 # Runs "test-ovsdb.py TEST-OVSDB-ARGS" and checks that it exits with
 # status 0 and prints OUTPUT on stdout.
@@ -44,10 +43,9 @@  m4_define([OVSDB_CHECK_POSITIVE_PY],
 m4_define([OVSDB_CHECK_POSITIVE_PY3],
   [AT_SETUP([$1])
    AT_SKIP_IF([test $HAVE_PYTHON3 = no])
-   AT_SKIP_IF([test $8 = C && ! $PYTHON3 -c "import ovs._json" 2>/dev/null])
    $6
    AT_KEYWORDS([ovsdb positive Python $4])
-   AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -j m4_default([$8], python) $2], [0], [$3
+   AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [0], [$3
 ], [])
    AT_CLEANUP])
 
@@ -57,10 +55,8 @@  m4_define([OVSDB_CHECK_POSITIVE_PY3],
 # Runs identical C and Python tests, as specified.
 m4_define([OVSDB_CHECK_POSITIVE_CPY],
   [OVSDB_CHECK_POSITIVE([$1 - C], [$2], [$3], [$4], [$5])
-   OVSDB_CHECK_POSITIVE_PY([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5], [$6])
-   OVSDB_CHECK_POSITIVE_PY([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], [$6], C)
-   OVSDB_CHECK_POSITIVE_PY3([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5], [$7])
-   OVSDB_CHECK_POSITIVE_PY3([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], [$7], C)])
+   OVSDB_CHECK_POSITIVE_PY([$1 - Python2], [$2], [$3], [$4], [$5], [$6])
+   OVSDB_CHECK_POSITIVE_PY3([$1 - Python3], [$2], [$3], [$4], [$5], [$7])])
 
 # OVSDB_CHECK_NEGATIVE(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ])
 #
@@ -82,7 +78,7 @@  m4_define([OVSDB_CHECK_NEGATIVE],
             [0], [ignore], [ignore])
    AT_CLEANUP])
 
-# OVSDB_CHECK_NEGATIVE_PY(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ] [JSON-PARSER = python])
+# OVSDB_CHECK_NEGATIVE_PY(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ])
 #
 # Runs "test-ovsdb TEST-OVSDB-ARGS" and checks that it exits with
 # status 1 and that its output on stdout contains substring OUTPUT.
@@ -90,9 +86,8 @@  m4_define([OVSDB_CHECK_NEGATIVE],
 m4_define([OVSDB_CHECK_NEGATIVE_PY],
   [AT_SETUP([$1])
    AT_SKIP_IF([test $HAVE_PYTHON2 = no])
-   AT_SKIP_IF([test $6 = C && ! $PYTHON2 -c "import ovs._json" 2>/dev/null])
-   AT_KEYWORDS([ovsdb negative Python $4])
-   AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py -j m4_default([$6], python) $2], [1], [], [stderr])
+   AT_KEYWORDS([ovsdb negative $4])
+   AT_CHECK([$PYTHON2 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
    m4_assert(m4_len([$3]))
    AT_CHECK(
      [if grep -F -e "AS_ESCAPE([$3])" stderr
@@ -104,7 +99,7 @@  m4_define([OVSDB_CHECK_NEGATIVE_PY],
             [0], [ignore], [ignore])
    AT_CLEANUP])
 
-# OVSDB_CHECK_NEGATIVE_PY3(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ], [JSON-PARSER = python])
+# OVSDB_CHECK_NEGATIVE_PY3(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ])
 #
 # Runs "test-ovsdb TEST-OVSDB-ARGS" and checks that it exits with
 # status 1 and that its output on stdout contains substring OUTPUT.
@@ -112,9 +107,8 @@  m4_define([OVSDB_CHECK_NEGATIVE_PY],
 m4_define([OVSDB_CHECK_NEGATIVE_PY],
   [AT_SETUP([$1])
    AT_SKIP_IF([test $HAVE_PYTHON3 = no])
-   AT_SKIP_IF([test $6 = C && ! $PYTHON3 -c "import ovs._json" 2>/dev/null])
-   AT_KEYWORDS([ovsdb negative Python $4])
-   AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py -j m4_default([$6], python) $2], [1], [], [stderr])
+   AT_KEYWORDS([ovsdb negative $4])
+   AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
    m4_assert(m4_len([$3]))
    AT_CHECK(
      [if grep -F -e "AS_ESCAPE([$3])" stderr
@@ -132,10 +126,8 @@  m4_define([OVSDB_CHECK_NEGATIVE_PY],
 # Runs identical C and Python tests, as specified.
 m4_define([OVSDB_CHECK_NEGATIVE_CPY],
   [OVSDB_CHECK_NEGATIVE([$1 - C], [$2], [$3], [$4], [$5])
-   OVSDB_CHECK_NEGATIVE_PY([$1 - Python2(pyjson)], [$2], [$3], [$4], [$5])
-   OVSDB_CHECK_NEGATIVE_PY([$1 - Python2(cjson)], [$2], [$3], [$4], [$5], C)
-   OVSDB_CHECK_NEGATIVE_PY3([$1 - Python3(pyjson)], [$2], [$3], [$4], [$5])
-   OVSDB_CHECK_NEGATIVE_PY3([$1 - Python3(cjson)], [$2], [$3], [$4], [$5], C)])
+   OVSDB_CHECK_NEGATIVE_PY([$1 - Python2], [$2], [$3], [$4], [$5])
+   OVSDB_CHECK_NEGATIVE_PY3([$1 - Python3], [$2], [$3], [$4], [$5])])
 
 OVS_START_SHELL_HELPERS
 ovsdb_client_wait() {
diff --git a/tests/test-json.py b/tests/test-json.py
index d0db43331..582aa720a 100644
--- a/tests/test-json.py
+++ b/tests/test-json.py
@@ -18,7 +18,6 @@  import codecs
 import getopt
 import sys
 
-from ovs.db import error
 import ovs.json
 
 import six
@@ -67,26 +66,15 @@  def main(argv):
         sys.stderr = codecs.getwriter("utf-8")(sys.stderr)
 
     try:
-        options, args = getopt.gnu_getopt(argv[1:], 'j:',
-                                          ['multiple', 'json-parser'])
+        options, args = getopt.gnu_getopt(argv[1:], '', ['multiple'])
     except getopt.GetoptError as geo:
         sys.stderr.write("%s: %s\n" % (argv0, geo.msg))
         sys.exit(1)
 
     multiple = False
-    ORIG_PARSER = ovs.json.PARSER
-    ovs.json.PARSER = ovs.json.PARSER_PY
     for key, value in options:
         if key == '--multiple':
             multiple = True
-        elif key in ('-j', '--json-parser'):
-            if value == "python":
-                ovs.json.PARSER = ovs.json.PARSER_PY
-            elif value in ('C', 'c'):
-                if ORIG_PARSER != ovs.json.PARSER_C:
-                    raise error.Error("C parser selected, but not compiled")
-                else:
-                    ovs.json.PARSER = ovs.json.PARSER_C
         else:
             sys.stderr.write("%s: unhandled option %s\n" % (argv0, key))
             sys.exit(1)
diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py
index b99109dc2..14491a2e9 100644
--- a/tests/test-ovsdb.py
+++ b/tests/test-ovsdb.py
@@ -23,7 +23,6 @@  import uuid
 import ovs.db.idl
 import ovs.db.schema
 import ovs.db.types
-import ovs.json
 import ovs.ovsuuid
 import ovs.poller
 import ovs.stream
@@ -816,20 +815,14 @@  The following options are also available:
 
 def main(argv):
     try:
-        options, args = getopt.gnu_getopt(argv[1:], 't:h:j:',
+        options, args = getopt.gnu_getopt(argv[1:], 't:h',
                                           ['timeout',
-                                           'help', 'json-parser'])
+                                           'help'])
     except getopt.GetoptError as geo:
         sys.stderr.write("%s: %s\n" % (ovs.util.PROGRAM_NAME, geo.msg))
         sys.exit(1)
 
     timeout = None
-    # Save the old version to detect whether we support the C Parser
-    # but then override to the Python parser because it is always available
-    # and is the historical default
-    ORIG_PARSER = ovs.json.PARSER
-    ovs.json.PARSER = ovs.json.PARSER_PY
-
     for key, value in options:
         if key in ['-h', '--help']:
             usage()
@@ -841,17 +834,6 @@  def main(argv):
             except TypeError:
                 raise error.Error("value %s on -t or --timeout is not at "
                                   "least 1" % value)
-        elif key in ['-j', '--json-parser']:
-            if value == "python":
-                ovs.json.PARSER = ovs.json.PARSER_PY
-            elif value in ('C', 'c'):
-                if ORIG_PARSER != ovs.json.PARSER_C:
-                    raise error.Error("C parser selected, but not compiled")
-                else:
-                    ovs.json.PARSER = ovs.json.PARSER_C
-            else:
-                raise error.Error(
-                    "invalid option: %s, json-parser must be 'C' or json")
         else:
             sys.exit(0)