[CRIU] [PATCH 1/2] python: futurize

Kir Kolyshkin kolyshkin at gmail.com
Fri May 3 18:28:36 MSK 2019


Make python code work with both python2 and python3.
Initially I tried to do that manually but later I found
this wonderful tool called futurize.

This patch is a result of running `futurize --stage1 -w`
and `futurize --stage2 -w`.

As a result, I can run it with either python2 or python3.

Signed-off-by: Kir Kolyshkin <kolyshkin at gmail.com>
---
 coredump/criu_coredump/__init__.py |  5 +-
 coredump/criu_coredump/coredump.py | 30 +++++++-----
 coredump/criu_coredump/elf.py      |  4 +-
 lib/py/cli.py                      |  5 +-
 lib/py/criu.py                     |  6 ++-
 lib/py/images/images.py            | 20 ++++----
 lib/py/images/pb2dict.py           |  4 +-
 scripts/magic-gen.py               |  2 +
 soccr/test/run.py                  |  5 +-
 test/check_actions.py              |  1 +
 test/crit-recode.py                |  1 +
 test/exhaustive/pipe.py            |  4 +-
 test/exhaustive/unix.py            | 22 +++++----
 test/inhfd/pipe.py                 |  1 +
 test/inhfd/tty.py                  |  1 +
 test/others/ext-tty/run.py         |  2 +
 test/others/mounts/mounts.py       |  2 +
 test/others/rpc/config_file.py     |  1 +
 test/others/rpc/errno.py           |  5 +-
 test/others/rpc/ps_test.py         |  1 +
 test/others/rpc/restore-loop.py    |  1 +
 test/others/rpc/test.py            |  1 +
 test/others/rpc/version.py         |  1 +
 test/others/shell-job/run.py       |  4 +-
 test/zdtm.py                       | 77 ++++++++++++++----------------
 25 files changed, 122 insertions(+), 84 deletions(-)

diff --git a/coredump/criu_coredump/__init__.py b/coredump/criu_coredump/__init__.py
index 213af42ec..fb992462b 100644
--- a/coredump/criu_coredump/__init__.py
+++ b/coredump/criu_coredump/__init__.py
@@ -1,2 +1,3 @@
-from coredump import *
-import elf
+from __future__ import absolute_import
+from .coredump import *
+from . import elf
diff --git a/coredump/criu_coredump/coredump.py b/coredump/criu_coredump/coredump.py
index 963e8c61b..ecafd62c6 100644
--- a/coredump/criu_coredump/coredump.py
+++ b/coredump/criu_coredump/coredump.py
@@ -1,3 +1,9 @@
+from __future__ import absolute_import
+from __future__ import division
+from builtins import str
+from builtins import range
+from past.utils import old_div
+from builtins import object
 # Functions and classes for creating core dump from criu images.
 # Code is inspired by outdated google coredumper(RIP) [1] and
 # fs/binfmt_elf.h from Linux kernel [2].
@@ -29,7 +35,7 @@
 #	4) VMAs contents;
 #
 import io
-import elf
+from . import elf
 import ctypes
 from pycriu import images
 
@@ -60,13 +66,13 @@ prot = {
 	"PROT_EXEC"	: 0x4
 }
 
-class elf_note:
+class elf_note(object):
 	nhdr	= None	# Elf_Nhdr;
 	owner	= None	# i.e. CORE or LINUX;
 	data	= None	# Ctypes structure with note data;
 
 
-class coredump:
+class coredump(object):
 	"""
 	A class to keep elf core dump components inside and
 	functions to properly write them to file.
@@ -117,7 +123,7 @@ class coredump:
 		f.write(buf.read())
 
 
-class coredump_generator:
+class coredump_generator(object):
 	"""
 	Generate core dump from criu images.
 	"""
@@ -476,7 +482,7 @@ class coredump_generator:
 		Generate NT_AUXV note for thread tid of process pid.
 		"""
 		mm = self.mms[pid]
-		num_auxv = len(mm["mm_saved_auxv"])/2
+		num_auxv = old_div(len(mm["mm_saved_auxv"]),2)
 
 		class elf_auxv(ctypes.Structure):
 			_fields_ = [("auxv", elf.Elf64_auxv_t*num_auxv)]
@@ -504,7 +510,7 @@ class coredump_generator:
 		"""
 		mm = self.mms[pid]
 
-		class mmaped_file_info:
+		class mmaped_file_info(object):
 			start		= None
 			end		= None
 			file_ofs	= None
@@ -518,10 +524,10 @@ class coredump_generator:
 
 			shmid	= vma["shmid"]
 			size	= vma["end"] - vma["start"]
-			off	= vma["pgoff"]/PAGESIZE
+			off	= old_div(vma["pgoff"],PAGESIZE)
 
 			files	= self.reg_files
-			fname	= filter(lambda x: x["id"] == shmid, files)[0]["name"]
+			fname	= [x for x in files if x["id"] == shmid][0]["name"]
 
 			info = mmaped_file_info()
 			info.start	= vma["start"]
@@ -669,7 +675,7 @@ class coredump_generator:
 			off	= vma["pgoff"]
 
 			files	= self.reg_files
-			fname	= filter(lambda x: x["id"] == shmid, files)[0]["name"]
+			fname	= [x for x in files if x["id"] == shmid][0]["name"]
 
 			f = open(fname)
 			f.seek(off)
@@ -693,8 +699,8 @@ class coredump_generator:
 		# a file, and changed ones -- from pages.img.
 		# Finally, if no page is found neither in pages.img nor
 		# in file, hole in inserted -- a page filled with zeroes.
-		start_page	= start/PAGESIZE
-		end_page	= end/PAGESIZE
+		start_page	= old_div(start,PAGESIZE)
+		end_page	= old_div(end,PAGESIZE)
 
 		buf = ""
 		for page_no in range(start_page, end_page+1):
@@ -804,7 +810,7 @@ class coredump_generator:
 		"""
 		mm = self.mms[pid]
 
-		class vma_class:
+		class vma_class(object):
 			data	= None
 			filesz	= None
 			memsz	= None
diff --git a/coredump/criu_coredump/elf.py b/coredump/criu_coredump/elf.py
index 1da06a6fd..de085ddad 100644
--- a/coredump/criu_coredump/elf.py
+++ b/coredump/criu_coredump/elf.py
@@ -1,3 +1,5 @@
+from __future__ import division
+from past.utils import old_div
 # Define structures and constants for generating elf file.
 import ctypes
 
@@ -266,7 +268,7 @@ elf_fpregset_t = user_fpregs_struct
 # siginfo_t related constants.
 
 _SI_MAX_SIZE	= 128
-_SI_PAD_SIZE	= (_SI_MAX_SIZE/ctypes.sizeof(ctypes.c_int)) - 4
+_SI_PAD_SIZE	= (old_div(_SI_MAX_SIZE,ctypes.sizeof(ctypes.c_int))) - 4
 
 					#          /* kill().  */
 class _siginfo_t_U_kill(ctypes.Structure):	#         struct
diff --git a/lib/py/cli.py b/lib/py/cli.py
index abaf0720c..29b21ec8f 100755
--- a/lib/py/cli.py
+++ b/lib/py/cli.py
@@ -1,4 +1,5 @@
 from __future__ import print_function
+from builtins import object
 import argparse
 import sys
 import json
@@ -55,7 +56,7 @@ def get_task_id(p, val):
 # Explorers
 #
 
-class ps_item:
+class ps_item(object):
 	def __init__(self, p, core):
 		self.pid = get_task_id(p, 'pid')
 		self.ppid = p['ppid']
@@ -178,7 +179,7 @@ def explore_fds(opts):
 		print("\t%7s: %s" % ('root', get_file_str(opts, {'type': 'REG', 'id': fdi['root_id']})))
 
 
-class vma_id:
+class vma_id(object):
 	def __init__(self):
 		self.__ids = {}
 		self.__last = 1
diff --git a/lib/py/criu.py b/lib/py/criu.py
index de1a214a3..eb1961964 100644
--- a/lib/py/criu.py
+++ b/lib/py/criu.py
@@ -1,3 +1,5 @@
+from builtins import str
+from builtins import object
 # Same as libcriu for C.
 
 import socket
@@ -8,7 +10,7 @@ import struct
 
 import pycriu.rpc_pb2 as rpc
 
-class _criu_comm:
+class _criu_comm(object):
 	"""
 	Base class for communication classes.
 	"""
@@ -183,7 +185,7 @@ class CRIUExceptionExternal(CRIUException):
 		return s
 
 
-class criu:
+class criu(object):
 	"""
 	Call criu through RPC.
 	"""
diff --git a/lib/py/images/images.py b/lib/py/images/images.py
index 7a9b9da6e..ffebfee74 100644
--- a/lib/py/images/images.py
+++ b/lib/py/images/images.py
@@ -1,3 +1,5 @@
+from builtins import range
+from builtins import object
 # This file contains methods to deal with criu images.
 #
 # According to http://criu.org/Images, criu images can be described
@@ -67,7 +69,7 @@ class MagicException(Exception):
 
 # Generic class to handle loading/dumping criu images entries from/to bin
 # format to/from dict(json).
-class entry_handler:
+class entry_handler(object):
 	"""
 	Generic class to handle loading/dumping criu images
 	entries from/to bin format to/from dict(json).
@@ -175,7 +177,7 @@ class entry_handler:
 		return entries
 
 # Special handler for pagemap.img
-class pagemap_handler:
+class pagemap_handler(object):
 	"""
 	Special entry handler for pagemap.img, which is unique in a way
 	that it has a header of pagemap_head type followed by entries
@@ -221,7 +223,7 @@ class pagemap_handler:
 		return entry_handler(None).count(f) - 1
 
 # Special handler for ghost-file.img
-class ghost_file_handler:
+class ghost_file_handler(object):
 	def load(self, f, pretty = False, no_payload = False):
 		entries = []
 
@@ -292,7 +294,7 @@ class ghost_file_handler:
 # it doesn't really matter, because our images
 # do not store big amounts of binary data. They
 # are negligible comparing to pages size.
-class pipes_data_extra_handler:
+class pipes_data_extra_handler(object):
 	def load(self, f, pload):
 		size = pload.bytes
 		data = f.read(size)
@@ -306,7 +308,7 @@ class pipes_data_extra_handler:
 		f.seek(pload.bytes, os.SEEK_CUR)
 		return pload.bytes
 
-class sk_queues_extra_handler:
+class sk_queues_extra_handler(object):
 	def load(self, f, pload):
 		size = pload.length
 		data = f.read(size)
@@ -321,7 +323,7 @@ class sk_queues_extra_handler:
 		return pload.length
 
 
-class tcp_stream_extra_handler:
+class tcp_stream_extra_handler(object):
 	def load(self, f, pbuff):
 		d = {}
 
@@ -344,7 +346,7 @@ class tcp_stream_extra_handler:
 		f.seek(0, os.SEEK_END)
 		return pbuff.inq_len + pbuff.outq_len
 
-class ipc_sem_set_handler:
+class ipc_sem_set_handler(object):
 	def load(self, f, pbuff):
 		entry = pb2dict.pb2dict(pbuff)
 		size = sizeof_u16 * entry['nsems']
@@ -375,7 +377,7 @@ class ipc_sem_set_handler:
 		f.seek(round_up(size, sizeof_u64), os.SEEK_CUR)
 		return size
 
-class ipc_msg_queue_handler:
+class ipc_msg_queue_handler(object):
 	def load(self, f, pbuff):
 		entry = pb2dict.pb2dict(pbuff)
 		messages = []
@@ -423,7 +425,7 @@ class ipc_msg_queue_handler:
 
 		return pl_len
 
-class ipc_shm_handler:
+class ipc_shm_handler(object):
 	def load(self, f, pbuff):
 		entry = pb2dict.pb2dict(pbuff)
 		size = entry['size']
diff --git a/lib/py/images/pb2dict.py b/lib/py/images/pb2dict.py
index 18d4c68eb..8952e755d 100644
--- a/lib/py/images/pb2dict.py
+++ b/lib/py/images/pb2dict.py
@@ -1,5 +1,7 @@
+from __future__ import absolute_import
+from builtins import str
 from google.protobuf.descriptor import FieldDescriptor as FD
-import opts_pb2
+from . import opts_pb2
 from ipaddress import IPv4Address, ip_address
 from ipaddress import IPv6Address
 import socket
diff --git a/scripts/magic-gen.py b/scripts/magic-gen.py
index 7088f634d..1aa7dd2ba 100755
--- a/scripts/magic-gen.py
+++ b/scripts/magic-gen.py
@@ -1,4 +1,6 @@
 #!/bin/env python2
+from __future__ import print_function
+from builtins import str
 import sys
 
 # This program parses criu magic.h file and produces
diff --git a/soccr/test/run.py b/soccr/test/run.py
index a25c29263..6faf3491f 100644
--- a/soccr/test/run.py
+++ b/soccr/test/run.py
@@ -1,5 +1,6 @@
 #!/usr/bin/env python2
 
+from __future__ import print_function
 import sys, os
 import hashlib
 from subprocess import Popen, PIPE
@@ -41,7 +42,7 @@ m.update(str2)
 str2 = m.hexdigest()
 
 if str2 != eval(s):
-    print("FAIL", repr(str2), repr(s))
+    print(("FAIL", repr(str2), repr(s)))
     sys.exit(5);
 
 s = p1.stdout.read()
@@ -51,7 +52,7 @@ str1 = m.hexdigest()
 
 s = p2.stdout.read()
 if str1 != eval(s):
-    print("FAIL", repr(str1), s)
+    print(("FAIL", repr(str1), s))
     sys.exit(5);
 
 if p1.wait():
diff --git a/test/check_actions.py b/test/check_actions.py
index 0e3daf178..7c1b41d6b 100755
--- a/test/check_actions.py
+++ b/test/check_actions.py
@@ -1,5 +1,6 @@
 #!/usr/bin/env python2
 
+from __future__ import print_function
 import sys
 import os
 
diff --git a/test/crit-recode.py b/test/crit-recode.py
index 441f7757e..b2904acb3 100755
--- a/test/crit-recode.py
+++ b/test/crit-recode.py
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 # vim: noet ts=8 sw=8 sts=8
 
+from __future__ import print_function
 import pycriu
 import sys
 import os
diff --git a/test/exhaustive/pipe.py b/test/exhaustive/pipe.py
index 17e065800..2756e8fa6 100755
--- a/test/exhaustive/pipe.py
+++ b/test/exhaustive/pipe.py
@@ -1,5 +1,7 @@
 #!/usr/bin/env python
 
+from __future__ import print_function
+from builtins import range
 import argparse
 import os
 import signal
@@ -76,7 +78,7 @@ def check_pipe_y(pid, fd, rw, inos):
 	ino = get_pipe_ino(pid, fd)
 	if ino == None:
 		return 'missing '
-	if not inos.has_key(fd):
+	if fd not in inos:
 		inos[fd] = ino
 	elif inos[fd] != ino:
 		return 'wrong '
diff --git a/test/exhaustive/unix.py b/test/exhaustive/unix.py
index 41053bd0d..05c2bd87a 100755
--- a/test/exhaustive/unix.py
+++ b/test/exhaustive/unix.py
@@ -1,5 +1,7 @@
 #!/usr/bin/env python
 
+from __future__ import print_function
+from builtins import object
 import sys
 import os
 import socket
@@ -31,7 +33,7 @@ def mk_socket(st, typ):
 	st.add_socket(sk)
 	return sk
 
-class act_socket:
+class act_socket(object):
 	def __init__(self, typ):
 		self.typ = typ
 
@@ -47,7 +49,7 @@ class act_socket:
 		return 'socket(%s) = %d' % (sk_type_s[self.typ], self.sk_id)
 
 
-class act_close:
+class act_close(object):
 	def __init__(self, sk_id):
 		self.sk_id = sk_id
 
@@ -66,7 +68,7 @@ class act_close:
 		return 'close(%d)' % self.sk_id
 
 
-class act_listen:
+class act_listen(object):
 	def __init__(self, sk_id):
 		self.sk_id = sk_id
 
@@ -82,7 +84,7 @@ class act_listen:
 		return 'listen(%d)' % self.sk_id
 
 
-class act_bind:
+class act_bind(object):
 	def __init__(self, sk_id, name_id):
 		self.sk_id = sk_id
 		self.name_id = name_id
@@ -99,7 +101,7 @@ class act_bind:
 		return 'bind(%d, $name-%d)' % (self.sk_id, self.name_id)
 
 
-class act_connect:
+class act_connect(object):
 	def __init__(self, sk_id, listen_sk_id):
 		self.sk_id = sk_id
 		self.lsk_id = listen_sk_id
@@ -128,7 +130,7 @@ class act_connect:
 		return 'connect(%d, $name-%d)' % (self.sk_id, self.lsk_id)
 
 
-class act_accept:
+class act_accept(object):
 	def __init__(self, sk_id):
 		self.sk_id = sk_id
 
@@ -150,7 +152,7 @@ class act_accept:
 		return 'accept(%d) = %d' % (self.sk_id, self.nsk_id)
 
 
-class act_sendmsg:
+class act_sendmsg(object):
 	def __init__(self, sk_id, to_id):
 		self.sk_id = sk_id
 		self.to_id = to_id
@@ -183,7 +185,7 @@ class act_sendmsg:
 #
 # Description of a socket
 #
-class sock:
+class sock(object):
 	def __init__(self, sk_id, sock_type):
 		# ID of a socket. Since states and sockets are cloned
 		# while we scan the tree of states the only valid way
@@ -363,7 +365,7 @@ class sock:
 		return dsc
 
 
-class state:
+class state(object):
 	def __init__(self, max_sockets, sk_type):
 		self.sockets = []
 		self.sk_id = 0
@@ -602,7 +604,7 @@ def chk_state(st, opts):
 		sys.exit(ret)
 
 	signal_sk.close()
-	for rsk in st.real_sockets.values():
+	for rsk in list(st.real_sockets.values()):
 		rsk.close()
 
 	print("`- dump")
diff --git a/test/inhfd/pipe.py b/test/inhfd/pipe.py
index 318dc862d..2b0971631 100755
--- a/test/inhfd/pipe.py
+++ b/test/inhfd/pipe.py
@@ -1,3 +1,4 @@
+from builtins import range
 import os
 
 
diff --git a/test/inhfd/tty.py b/test/inhfd/tty.py
index ae76a96d4..5ab33f24b 100755
--- a/test/inhfd/tty.py
+++ b/test/inhfd/tty.py
@@ -1,3 +1,4 @@
+from builtins import range
 # vim: noet ts=8 sw=8 sts=8
 import fcntl
 import os
diff --git a/test/others/ext-tty/run.py b/test/others/ext-tty/run.py
index f44b1d946..eed698d6c 100755
--- a/test/others/ext-tty/run.py
+++ b/test/others/ext-tty/run.py
@@ -1,4 +1,6 @@
 #!/usr/bin/env python2
+from __future__ import print_function
+from builtins import str
 import subprocess
 import os, sys, time, signal, pty
 
diff --git a/test/others/mounts/mounts.py b/test/others/mounts/mounts.py
index dc65ba45c..8cab81273 100755
--- a/test/others/mounts/mounts.py
+++ b/test/others/mounts/mounts.py
@@ -1,3 +1,5 @@
+from __future__ import print_function
+from builtins import range
 import os
 import tempfile, random
 
diff --git a/test/others/rpc/config_file.py b/test/others/rpc/config_file.py
index 23a06615f..1fd860998 100755
--- a/test/others/rpc/config_file.py
+++ b/test/others/rpc/config_file.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python2
 
+from __future__ import print_function
 import os
 import socket
 import sys
diff --git a/test/others/rpc/errno.py b/test/others/rpc/errno.py
index ee9e90d8c..89600c9ac 100755
--- a/test/others/rpc/errno.py
+++ b/test/others/rpc/errno.py
@@ -1,6 +1,9 @@
 #!/usr/bin/python2
 # Test criu errno
 
+from __future__ import print_function
+from builtins import str
+from builtins import object
 import socket, os, errno
 import rpc_pb2 as rpc
 import argparse
@@ -12,7 +15,7 @@ parser.add_argument('dir', type = str, help = "Directory where CRIU images shoul
 args = vars(parser.parse_args())
 
 # Prepare dir for images
-class test:
+class test(object):
 	def __init__(self):
 		self.imgs_fd = os.open(args['dir'], os.O_DIRECTORY)
 		self.s = -1
diff --git a/test/others/rpc/ps_test.py b/test/others/rpc/ps_test.py
index 1872120fc..ba6d8e11a 100755
--- a/test/others/rpc/ps_test.py
+++ b/test/others/rpc/ps_test.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python2
 
+from __future__ import print_function
 import socket, os, sys, errno
 import rpc_pb2 as rpc
 import argparse
diff --git a/test/others/rpc/restore-loop.py b/test/others/rpc/restore-loop.py
index ce5786a56..0238e4078 100755
--- a/test/others/rpc/restore-loop.py
+++ b/test/others/rpc/restore-loop.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python2
 
+from __future__ import print_function
 import socket, os, sys
 import rpc_pb2 as rpc
 import argparse
diff --git a/test/others/rpc/test.py b/test/others/rpc/test.py
index 0addbaedc..af60507ab 100755
--- a/test/others/rpc/test.py
+++ b/test/others/rpc/test.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python2
 
+from __future__ import print_function
 import socket, os, sys
 import rpc_pb2 as rpc
 import argparse
diff --git a/test/others/rpc/version.py b/test/others/rpc/version.py
index 247bc466d..b296fc4bc 100755
--- a/test/others/rpc/version.py
+++ b/test/others/rpc/version.py
@@ -1,5 +1,6 @@
 #!/usr/bin/python2
 
+from __future__ import print_function
 import socket
 import sys
 import rpc_pb2 as rpc
diff --git a/test/others/shell-job/run.py b/test/others/shell-job/run.py
index 4f4dfadef..07d65afd3 100755
--- a/test/others/shell-job/run.py
+++ b/test/others/shell-job/run.py
@@ -1,4 +1,6 @@
 #!/usr/bin/env python2
+from __future__ import print_function
+from builtins import str
 import os, pty, sys, subprocess
 import termios, fcntl, time
 
@@ -11,7 +13,7 @@ def create_pty():
         return (os.fdopen(fd1, "w+"), os.fdopen(fd2, "w+"))
 
 if not os.access("work", os.X_OK):
-    os.mkdir("work", 0755)
+    os.mkdir("work", 0o755)
 
 open("running", "w").close()
 m,s = create_pty()
diff --git a/test/zdtm.py b/test/zdtm.py
index e6325d5f5..3e87b2d08 100755
--- a/test/zdtm.py
+++ b/test/zdtm.py
@@ -1,6 +1,12 @@
 #!/usr/bin/env python
 # vim: noet ts=8 sw=8 sts=8
 from __future__ import absolute_import, division, print_function, unicode_literals
+from builtins import zip
+from builtins import input
+from builtins import oct
+from builtins import str
+from builtins import range
+from builtins import object
 from builtins import (str, open, range, zip, int, input)
 
 import argparse
@@ -145,7 +151,7 @@ arch = os.uname()[4]
 #
 
 
-class host_flavor:
+class host_flavor(object):
 	def __init__(self, opts):
 		self.name = "host"
 		self.ns = False
@@ -162,7 +168,7 @@ class host_flavor:
 		pass
 
 
-class ns_flavor:
+class ns_flavor(object):
 	__root_dirs = ["/bin", "/sbin", "/etc", "/lib", "/lib64", "/dev", "/dev/pts", "/dev/net", "/tmp", "/usr", "/proc", "/run"]
 
 	def __init__(self, opts):
@@ -192,11 +198,7 @@ class ns_flavor:
 
 		# This Mayakovsky-style code gets list of libraries a binary
 		# needs minus vdso and gate .so-s
-		libs = map(lambda x: x[1] == '=>' and x[2] or x[0],
-				map(lambda x: str(x).split(),
-					filter(lambda x: not xl.match(x),
-						map(lambda x: str(x).strip(),
-							filter(lambda x: str(x).startswith('\t'), ldd.stdout.read().decode('ascii').splitlines())))))
+		libs = [x[1] == '=>' and x[2] or x[0] for x in [str(x).split() for x in [x for x in [str(x).strip() for x in [x for x in ldd.stdout.read().decode('ascii').splitlines() if str(x).startswith('\t')]] if not xl.match(x)]]]
 
 		ldd.wait()
 
@@ -291,7 +293,7 @@ class userns_flavor(ns_flavor):
 
 
 flavors = {'h': host_flavor, 'ns': ns_flavor, 'uns': userns_flavor}
-flavors_codes = dict(zip(range(len(flavors)), sorted(flavors.keys())))
+flavors_codes = dict(list(zip(list(range(len(flavors))), sorted(flavors.keys()))))
 
 #
 # Helpers
@@ -365,7 +367,7 @@ class test_fail_expected_exc(Exception):
 #
 
 
-class zdtm_test:
+class zdtm_test(object):
 	def __init__(self, name, desc, flavor, freezer):
 		self.__name = name
 		self.__desc = desc
@@ -497,7 +499,7 @@ class zdtm_test:
 		self.kill(signal.SIGTERM)
 
 		res = tail(self.__name + '.out')
-		if 'PASS' not in list(map(lambda s: s.strip(), res.split())):
+		if 'PASS' not in list([s.strip() for s in res.split()]):
 			if os.access(self.__name + '.out.inprogress', os.F_OK):
 				print_sep(self.__name + '.out.inprogress')
 				with open(self.__name + '.out.inprogress') as fd:
@@ -586,7 +588,7 @@ def load_module_from_file(name, path):
 	return mod
 
 
-class inhfd_test:
+class inhfd_test(object):
 	def __init__(self, name, desc, flavor, freezer):
 		self.__name = os.path.basename(name)
 		print("Load %s" % name)
@@ -736,7 +738,7 @@ class groups_test(zdtm_test):
 		if flavor.ns:
 			self.__real_name = name
 			with open(name) as fd:
-				self.__subs = map(lambda x: x.strip(), fd.readlines())
+				self.__subs = [x.strip() for x in fd.readlines()]
 			print("Subs:\n%s" % '\n'.join(self.__subs))
 		else:
 			self.__real_name = ''
@@ -789,7 +791,7 @@ test_classes = {'zdtm': zdtm_test, 'inhfd': inhfd_test, 'groups': groups_test}
 join_ns_file = '/run/netns/zdtm_netns'
 
 
-class criu_cli:
+class criu_cli(object):
 	@staticmethod
 	def run(action, args, criu_bin, fault = None, strace = [], preexec = None, nowait = False):
 		env = dict(os.environ, ASAN_OPTIONS = "log_path=asan.log:disable_coredump=0:detect_leaks=0")
@@ -805,7 +807,7 @@ class criu_cli:
 		return cr.wait()
 
 
-class criu_rpc_process:
+class criu_rpc_process(object):
 	def wait(self):
 		return self.criu.wait_pid(self.pid)
 
@@ -813,7 +815,7 @@ class criu_rpc_process:
 		os.kill(self.pid, signal.SIGTERM)
 
 
-class criu_rpc:
+class criu_rpc(object):
 	@staticmethod
 	def __set_opts(criu, args, ctx):
 		while len(args) != 0:
@@ -934,7 +936,7 @@ class criu_rpc:
 		return ret
 
 
-class criu:
+class criu(object):
 	def __init__(self, opts):
 		self.__test = None
 		self.__dump_path = None
@@ -1287,7 +1289,7 @@ def init_sbs():
 
 def sbs(what):
 	if do_sbs:
-		input("Pause at %s. Press Enter to continue." % what)
+		eval(input("Pause at %s. Press Enter to continue." % what))
 
 
 #
@@ -1295,7 +1297,7 @@ def sbs(what):
 #
 def iter_parm(opt, dflt):
 	x = ((opt or str(dflt)) + ":0").split(':')
-	return (range(0, int(x[0])), float(x[1]))
+	return (list(range(0, int(x[0]))), float(x[1]))
 
 
 def cr(cr_api, test, opts):
@@ -1352,7 +1354,7 @@ def get_visible_state(test):
 		return ({}, {}, {})
 
 	r = re.compile('^[0-9]+$')
-	pids = filter(lambda p: r.match(p), os.listdir("/proc/%s/root/proc/" % test.getpid()))
+	pids = [p for p in os.listdir("/proc/%s/root/proc/" % test.getpid()) if r.match(p)]
 	for pid in pids:
 		files[pid] = set(os.listdir("/proc/%s/root/proc/%s/fd" % (test.getpid(), pid)))
 
@@ -1360,7 +1362,7 @@ def get_visible_state(test):
 		last = 0
 		mapsfd = open("/proc/%s/root/proc/%s/maps" % (test.getpid(), pid))
 		for mp in mapsfd:
-			m = list(map(lambda x: int('0x' + x, 0), mp.split()[0].split('-')))
+			m = list([int('0x' + x, 0) for x in mp.split()[0].split('-')])
 
 			m.append(mp.split()[1])
 
@@ -1376,7 +1378,7 @@ def get_visible_state(test):
 				last += 1
 		mapsfd.close()
 
-		maps[pid] = set(map(lambda x: '%x-%x %s' % (x[0], x[1], " ".join(x[2:])), cmaps))
+		maps[pid] = set(['%x-%x %s' % (x[0], x[1], " ".join(x[2:])) for x in cmaps])
 
 		cmounts = []
 		try:
@@ -1394,7 +1396,7 @@ def get_visible_state(test):
 def check_visible_state(test, state, opts):
 	new = get_visible_state(test)
 
-	for pid in state[0].keys():
+	for pid in list(state[0].keys()):
 		fnew = new[0][pid]
 		fold = state[0][pid]
 		if fnew != fold:
@@ -1436,7 +1438,7 @@ def check_visible_state(test, state, opts):
 			raise test_fail_exc("link remaps left")
 
 
-class noop_freezer:
+class noop_freezer(object):
 	def __init__(self):
 		self.kernel = False
 
@@ -1456,7 +1458,7 @@ class noop_freezer:
 		return []
 
 
-class cg_freezer:
+class cg_freezer(object):
 	def __init__(self, path, state):
 		self.__path = '/sys/fs/cgroup/freezer/' + path
 		self.__state = state
@@ -1632,7 +1634,7 @@ def do_run_test(tname, tdesc, flavs, opts):
 			print_sep("Test %s PASS" % tname)
 
 
-class Launcher:
+class Launcher(object):
 	def __init__(self, opts, nr_tests):
 		self.__opts = opts
 		self.__total = nr_tests
@@ -1847,13 +1849,10 @@ def all_tests(opts):
 			if stat.S_IFMT(st.st_mode) in [stat.S_IFLNK, stat.S_IFSOCK]:
 				continue
 			files.append(fp)
-	excl = list(map(lambda x: os.path.join(desc['dir'], x), desc['exclude']))
-	tlist = filter(lambda x:
-			not x.endswith('.checkskip') and
+	excl = list([os.path.join(desc['dir'], x) for x in desc['exclude']])
+	tlist = [x for x in [x.strip() for x in files] if not x.endswith('.checkskip') and
 			not x.endswith('.hook') and
-			x not in excl,
-			map(lambda x: x.strip(), files)
-			)
+			x not in excl]
 	return tlist
 
 
@@ -1934,7 +1933,7 @@ def run_tests(opts):
 		run_all = True
 	elif opts['tests']:
 		r = re.compile(opts['tests'])
-		torun = filter(lambda x: r.match(x), all_tests(opts))
+		torun = [x for x in all_tests(opts) if r.match(x)]
 		run_all = True
 	elif opts['test']:
 		torun = opts['test']
@@ -1945,7 +1944,7 @@ def run_tests(opts):
 			return
 
 		with open(opts['from']) as fd:
-			torun = map(lambda x: x.strip(), fd)
+			torun = [x.strip() for x in fd]
 		opts['keep_going'] = False
 		run_all = True
 	else:
@@ -2086,11 +2085,11 @@ def list_tests(opts):
 	tlist = all_tests(opts)
 	if opts['info']:
 		print(sti_fmt % ('Name', 'Flavors', 'Flags'))
-		tlist = map(lambda x: show_test_info(x), tlist)
+		tlist = [show_test_info(x) for x in tlist]
 	print('\n'.join(tlist))
 
 
-class group:
+class group(object):
 	def __init__(self, tname, tdesc):
 		self.__tests = [tname]
 		self.__desc = tdesc
@@ -2124,9 +2123,7 @@ class group:
 	# common method to write a "meta" auxiliary script (hook/checkskip)
 	# which will call all tests' scripts in turn
 	def __dump_meta(self, fname, ext):
-		scripts = filter(lambda names: os.access(names[1], os.X_OK),
-				map(lambda test: (test, test + ext),
-				self.__tests))
+		scripts = [names for names in [(test, test + ext) for test in self.__tests] if os.access(names[1], os.X_OK)]
 		if scripts:
 			f = open(fname + ext, "w")
 			f.write("#!/bin/sh -e\n")
@@ -2311,10 +2308,10 @@ if opts['debug']:
 
 if opts['action'] == 'run':
 	criu.available()
-for tst in test_classes.values():
+for tst in list(test_classes.values()):
 	tst.available()
 
 opts['action'](opts)
 
-for tst in test_classes.values():
+for tst in list(test_classes.values()):
 	tst.cleanup()
-- 
2.17.1



More information about the CRIU mailing list