From: "Marek Marczykowski-Górecki" <marmarek@invisiblethingslab.com>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Xen-devel <xen-devel@lists.xenproject.org>, Wei Liu <wl@xen.org>,
Ian Jackson <Ian.Jackson@citrix.com>
Subject: Re: [Xen-devel] [PATCH] tools/python: Python 3 compatibility
Date: Wed, 18 Dec 2019 23:26:52 +0100 [thread overview]
Message-ID: <20191218222652.GA4238@mail-itl> (raw)
In-Reply-To: <20191218150522.8697-1-andrew.cooper3@citrix.com>
[-- Attachment #1.1: Type: text/plain, Size: 11161 bytes --]
On Wed, Dec 18, 2019 at 03:05:22PM +0000, Andrew Cooper wrote:
> convert-legacy-stream is only used for incomming migration from pre Xen 4.7,
> and verify-stream-v2 appears to only be used by me during migration
> development - it is little surprise that they missed the main converstion
> effort in Xen 4.13.
>
> Fix it all up.
>
> Move open_file_or_fd() into a new util.py to avoid duplication, making it a
> more generic wrapper around open() or fdopen().
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
> ---
> CC: Ian Jackson <Ian.Jackson@citrix.com>
> CC: Wei Liu <wl@xen.org>
>
> This needs backporting to 4.13 ASAP
> ---
> tools/python/scripts/convert-legacy-stream | 49 +++++++-----------------------
> tools/python/scripts/verify-stream-v2 | 43 +++++---------------------
> tools/python/xen/migration/libxc.py | 2 +-
> tools/python/xen/migration/libxl.py | 2 +-
> tools/python/xen/migration/verify.py | 4 +--
> tools/python/xen/util.py | 23 ++++++++++++++
> 6 files changed, 46 insertions(+), 77 deletions(-)
> create mode 100644 tools/python/xen/util.py
>
> diff --git a/tools/python/scripts/convert-legacy-stream b/tools/python/scripts/convert-legacy-stream
> index 5f80f13654..b0d81aa92e 100755
> --- a/tools/python/scripts/convert-legacy-stream
> +++ b/tools/python/scripts/convert-legacy-stream
> @@ -5,6 +5,8 @@
> Convert a legacy migration stream to a v2 stream.
> """
>
> +from __future__ import print_function
> +
> import sys
> import os, os.path
> import syslog
> @@ -12,6 +14,7 @@ import traceback
>
> from struct import calcsize, unpack, pack
>
> +from xen.util import open_file_or_fd as open_file_or_fd
> from xen.migration import legacy, public, libxc, libxl, xl
>
> __version__ = 1
> @@ -39,16 +42,16 @@ def info(msg):
> for line in msg.split("\n"):
> syslog.syslog(syslog.LOG_INFO, line)
> else:
> - print msg
> + print(msg)
>
> def err(msg):
> """Error message, routed to appropriate destination"""
> if log_to_syslog:
> for line in msg.split("\n"):
> syslog.syslog(syslog.LOG_ERR, line)
> - print >> sys.stderr, msg
> + print(msg, file = sys.stderr)
>
> -class StreamError(StandardError):
> +class StreamError(Exception):
> """Error with the incoming migration stream"""
> pass
>
> @@ -70,7 +73,7 @@ class VM(object):
>
> # libxl
> self.libxl = fmt == "libxl"
> - self.emu_xenstore = "" # NUL terminated key&val pairs from "toolstack" records
> + self.emu_xenstore = b"" # NUL terminated key&val pairs from "toolstack" records
>
> def write_libxc_ihdr():
> stream_write(pack(libxc.IHDR_FORMAT,
You also need to update write_record (string constants).
And few calls to it with string constants (write_libxl_end,
write_libxl_libxc_context, read_pv_tail, read_hvm_tail).
And blkid == ... in read_pv_extended_info().
> @@ -336,7 +339,7 @@ def read_libxl_toolstack(vm, data):
> if twidth == 64:
> name = name[:-4]
>
> - if name[-1] != '\x00':
> + if name[-1] != b'\x00':
> raise StreamError("physmap name not NUL terminated")
>
> root = "physmap/%x" % (phys,)
> @@ -347,7 +350,7 @@ def read_libxl_toolstack(vm, data):
> for key, val in zip(kv[0::2], kv[1::2]):
> info(" '%s' = '%s'" % (key, val))
>
> - vm.emu_xenstore += '\x00'.join(kv) + '\x00'
> + vm.emu_xenstore += b'\x00'.join(kv) + b'\x00'
>
>
> def read_chunks(vm):
> @@ -534,7 +537,7 @@ def read_qemu(vm):
> sig, = unpack("21s", rawsig)
> info("Qemu signature: %s" % (sig, ))
>
> - if sig == "DeviceModelRecord0002":
> + if sig == b"DeviceModelRecord0002":
> rawsz = rdexact(4)
> sz, = unpack("I", rawsz)
> qdata = rdexact(sz)
> @@ -617,36 +620,6 @@ def read_legacy_stream(vm):
> return 2
> return 0
>
> -def open_file_or_fd(val, mode):
> - """
> - If 'val' looks like a decimal integer, open it as an fd. If not, try to
> - open it as a regular file.
> - """
> -
> - fd = -1
> - try:
> - # Does it look like an integer?
> - try:
> - fd = int(val, 10)
> - except ValueError:
> - pass
> -
> - # Try to open it...
> - if fd != -1:
> - return os.fdopen(fd, mode, 0)
> - else:
> - return open(val, mode, 0)
> -
> - except StandardError, e:
> - if fd != -1:
> - err("Unable to open fd %d: %s: %s" %
> - (fd, e.__class__.__name__, e))
> - else:
> - err("Unable to open file '%s': %s: %s" %
> - (val, e.__class__.__name__, e))
> -
> - raise SystemExit(1)
> -
>
> def main():
> from optparse import OptionParser
> @@ -723,7 +696,7 @@ def main():
> if __name__ == "__main__":
> try:
> sys.exit(main())
> - except SystemExit, e:
> + except SystemExit as e:
> sys.exit(e.code)
> except KeyboardInterrupt:
> sys.exit(1)
> diff --git a/tools/python/scripts/verify-stream-v2 b/tools/python/scripts/verify-stream-v2
> index 3daf25791e..8355c2d206 100755
> --- a/tools/python/scripts/verify-stream-v2
> +++ b/tools/python/scripts/verify-stream-v2
> @@ -3,12 +3,15 @@
>
> """ Verify a v2 format migration stream """
>
> +from __future__ import print_function
> +
> import sys
> import struct
> import os, os.path
> import syslog
> import traceback
>
> +from xen.util import open_file_or_fd as open_file_or_fd
> from xen.migration.verify import StreamError, RecordError
> from xen.migration.libxc import VerifyLibxc
> from xen.migration.libxl import VerifyLibxl
> @@ -25,7 +28,7 @@ def info(msg):
> for line in msg.split("\n"):
> syslog.syslog(syslog.LOG_INFO, line)
> else:
> - print msg
> + print(msg)
>
> def err(msg):
> """Error message, routed to appropriate destination"""
> @@ -33,7 +36,7 @@ def err(msg):
> if log_to_syslog:
> for line in msg.split("\n"):
> syslog.syslog(syslog.LOG_ERR, line)
> - print >> sys.stderr, msg
> + print(msg, file = sys.stderr)
>
> def stream_read(_ = None):
> """Read from input"""
> @@ -56,7 +59,7 @@ def skip_xl_header():
> """Skip over an xl header in the stream"""
>
> hdr = rdexact(32)
> - if hdr != "Xen saved domain, xl format\n \0 \r":
> + if hdr != b"Xen saved domain, xl format\n \0 \r":
> raise StreamError("No xl header")
>
> _, mflags, _, optlen = unpack_exact("=IIII")
> @@ -86,7 +89,7 @@ def read_stream(fmt):
> err(traceback.format_exc())
> return 1
>
> - except StandardError:
> + except Exception:
> err("Script Error:")
> err(traceback.format_exc())
> err("Please fix me")
> @@ -94,36 +97,6 @@ def read_stream(fmt):
>
> return 0
>
> -def open_file_or_fd(val, mode, buffering):
> - """
> - If 'val' looks like a decimal integer, open it as an fd. If not, try to
> - open it as a regular file.
> - """
> -
> - fd = -1
> - try:
> - # Does it look like an integer?
> - try:
> - fd = int(val, 10)
> - except ValueError:
> - pass
> -
> - # Try to open it...
> - if fd != -1:
> - return os.fdopen(fd, mode, buffering)
> - else:
> - return open(val, mode, buffering)
> -
> - except StandardError, e:
> - if fd != -1:
> - err("Unable to open fd %d: %s: %s" %
> - (fd, e.__class__.__name__, e))
> - else:
> - err("Unable to open file '%s': %s: %s" %
> - (val, e.__class__.__name__, e))
> -
> - raise SystemExit(2)
> -
> def main():
> """ main """
> from optparse import OptionParser
> @@ -168,7 +141,7 @@ def main():
> if __name__ == "__main__":
> try:
> sys.exit(main())
> - except SystemExit, e:
> + except SystemExit as e:
> sys.exit(e.code)
> except KeyboardInterrupt:
> sys.exit(2)
> diff --git a/tools/python/xen/migration/libxc.py b/tools/python/xen/migration/libxc.py
> index f24448a9ef..cbffd1975e 100644
> --- a/tools/python/xen/migration/libxc.py
> +++ b/tools/python/xen/migration/libxc.py
> @@ -223,7 +223,7 @@ def verify_record(self):
> self.squashed_pagedata_records += 1
>
> padding = content[length:]
> - if padding != "\x00" * len(padding):
> + if padding != b"\x00" * len(padding):
> raise StreamError("Padding containing non0 bytes found")
>
> if rtype not in record_verifiers:
> diff --git a/tools/python/xen/migration/libxl.py b/tools/python/xen/migration/libxl.py
> index d5f54dc489..79f4024e72 100644
> --- a/tools/python/xen/migration/libxl.py
> +++ b/tools/python/xen/migration/libxl.py
> @@ -128,7 +128,7 @@ def verify_record(self):
> content = self.rdexact(contentsz)
>
> padding = content[length:]
> - if padding != "\x00" * len(padding):
> + if padding != b"\x00" * len(padding):
> raise StreamError("Padding containing non0 bytes found")
>
> if rtype not in record_verifiers:
> diff --git a/tools/python/xen/migration/verify.py b/tools/python/xen/migration/verify.py
> index 7a42dbfc58..1e38f4a3c0 100644
> --- a/tools/python/xen/migration/verify.py
> +++ b/tools/python/xen/migration/verify.py
> @@ -7,11 +7,11 @@
>
> from struct import calcsize, unpack
>
> -class StreamError(StandardError):
> +class StreamError(Exception):
> """Error with the stream"""
> pass
>
> -class RecordError(StandardError):
> +class RecordError(Exception):
> """Error with a record in the stream"""
> pass
>
> diff --git a/tools/python/xen/util.py b/tools/python/xen/util.py
> new file mode 100644
> index 0000000000..a11358eefa
> --- /dev/null
> +++ b/tools/python/xen/util.py
> @@ -0,0 +1,23 @@
> +#!/usr/bin/env python
> +# -*- coding: utf-8 -*-
> +
> +import os
> +
> +def open_file_or_fd(val, *argl, **kwargs):
> + """
> + If 'val' looks like a decimal integer, open it as an fd. If not, try to
> + open it as a regular file.
> + """
> +
> + fd = -1
> + try:
> + # Does it look like an integer?
> + fd = int(val, 10)
> + except ValueError:
> + pass
> +
> + # Try to open it...
> + if fd != -1:
> + return os.fdopen(fd, *argl, **kwargs)
> + else:
> + return open(val, *argl, **kwargs)
--
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
[-- Attachment #2: Type: text/plain, Size: 157 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2019-12-18 22:27 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-18 15:05 [Xen-devel] [PATCH] tools/python: Python 3 compatibility Andrew Cooper
2019-12-18 22:26 ` Marek Marczykowski-Górecki [this message]
2019-12-18 22:32 ` Andrew Cooper
2019-12-18 22:46 ` Marek Marczykowski-Górecki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191218222652.GA4238@mail-itl \
--to=marmarek@invisiblethingslab.com \
--cc=Ian.Jackson@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.