From 587edb5852a7fafffa468f952ef13efd5958bcb8 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 9 Mar 2018 12:15:44 +0000 Subject: [PATCH] RHEL 7: -o rhv-upload: Use Python 2 instead of Python 3. --- v2v/output_rhv_upload.ml | 23 +++++++++++------------ v2v/rhv-upload-createvm.py | 20 ++++++++++++++++---- v2v/rhv-upload-plugin.py | 35 ++++++++++++++++++++++++----------- v2v/rhv-upload-precheck.py | 22 +++++++++++++++++----- v2v/test-v2v-python-syntax.sh | 2 +- 5 files changed, 69 insertions(+), 33 deletions(-) diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml index 32c2f8f64..9f87244ae 100644 --- a/v2v/output_rhv_upload.ml +++ b/v2v/output_rhv_upload.ml @@ -78,7 +78,6 @@ let parse_output_options options = { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer } -let python3 = "python3" (* Defined by PEP 394 *) let pidfile_timeout = 30 let finalization_timeout = 5*60 @@ -120,15 +119,15 @@ class output_rhv_upload output_alloc output_conn (* Check that the Python binary is available. *) let error_unless_python_binary_on_path () = - try ignore (which python3) + try ignore (which "python") with Executable_not_found _ -> error (f_"no python binary called ‘%s’ can be found on the $PATH") - python3 + "python" in (* Check that the 'ovirtsdk4' Python module is available. *) let error_unless_ovirtsdk4_module_available () = - let res = run_command [ python3; "-c"; "import ovirtsdk4" ] in + let res = run_command [ "python"; "-c"; "import ovirtsdk4" ] in if res <> 0 then error (f_"the Python module ‘ovirtsdk4’ could not be loaded, is it installed? See previous messages for problems.") in @@ -150,14 +149,14 @@ class output_rhv_upload output_alloc output_conn error (f_"nbdkit is not new enough, you need to upgrade to nbdkit ≥ 1.1.16") in - (* Check that the python3 plugin is installed and working + (* Check that the python plugin is installed and working * and can load the plugin script. *) - let error_unless_nbdkit_python3_working () = + let error_unless_nbdkit_python_working () = let cmd = sprintf "nbdkit %s %s --dump-plugin >/dev/null" - python3 (quote plugin) in + "python" (quote plugin) in if Sys.command cmd <> 0 then - error (f_"nbdkit Python 3 plugin is not installed or not working. It is required if you want to use ‘-o rhv-upload’. + error (f_"nbdkit Python plugin is not installed or not working. It is required if you want to use ‘-o rhv-upload’. See also \"OUTPUT TO RHV\" in the virt-v2v(1) manual.") in @@ -214,7 +213,7 @@ See also \"OUTPUT TO RHV\" in the virt-v2v(1) manual.") "--newstyle"; (* use newstyle NBD protocol *) "--exportname"; "/"; - "python3"; (* use the nbdkit Python 3 plugin *) + "python"; (* use the nbdkit Python plugin *) plugin; (* Python plugin script *) ] in let args = if verbose () then args @ ["--verbose"] else args in @@ -232,7 +231,7 @@ object error_unless_python_binary_on_path (); error_unless_ovirtsdk4_module_available (); error_unless_nbdkit_working (); - error_unless_nbdkit_python3_working (); + error_unless_nbdkit_python_working (); if have_selinux then error_unless_nbdkit_compiled_with_selinux () @@ -261,7 +260,7 @@ object with_open_out json_param_file (fun chan -> output_string chan (JSON.string_of_doc json_params)); - if run_command [ python3; precheck; json_param_file ] <> 0 then + if run_command [ "python"; precheck; json_param_file ] <> 0 then error (f_"failed server prechecks, see earlier errors"); (* Create an nbdkit instance for each disk and set the @@ -410,7 +409,7 @@ If the messages above are not sufficient to diagnose the problem then add the let ovf_file = tmpdir // "vm.ovf" in with_open_out ovf_file (fun chan -> output_string chan ovf); - if run_command [ python3; createvm; json_param_file; ovf_file ] <> 0 then + if run_command [ "python"; createvm; json_param_file; ovf_file ] <> 0 then error (f_"failed to create virtual machine, see earlier errors") end diff --git a/v2v/rhv-upload-createvm.py b/v2v/rhv-upload-createvm.py index 1d0e8c95d..3f2fae4c6 100644 --- a/v2v/rhv-upload-createvm.py +++ b/v2v/rhv-upload-createvm.py @@ -1,5 +1,6 @@ # -*- python -*- -# oVirt or RHV upload create VM used by ‘virt-v2v -o rhv-upload’ +# coding: utf-8 +# oVirt or RHV upload create VM used by 'virt-v2v -o rhv-upload' # Copyright (C) 2018 Red Hat Inc. # # This program is free software; you can redistribute it and/or modify @@ -21,8 +22,8 @@ import logging import sys import time -from http.client import HTTPSConnection -from urllib.parse import urlparse +from httplib import HTTPSConnection +from urlparse import urlparse import ovirtsdk4 as sdk import ovirtsdk4.types as types @@ -37,8 +38,19 @@ if len(sys.argv) != 3: raise RuntimeError("incorrect number of parameters") # Parameters are passed in via a JSON document. +# https://stackoverflow.com/a/13105359 +def byteify(input): + if isinstance(input, dict): + return {byteify(key): byteify(value) + for key, value in input.iteritems()} + elif isinstance(input, list): + return [byteify(element) for element in input] + elif isinstance(input, unicode): + return input.encode('utf-8') + else: + return input with open(sys.argv[1], 'r') as fp: - params = json.load(fp) + params = byteify(json.load(fp)) # What is passed in is a password file, read the actual password. with open(params['output_password'], 'r') as fp: diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py index 41cb29992..3d4ed1270 100644 --- a/v2v/rhv-upload-plugin.py +++ b/v2v/rhv-upload-plugin.py @@ -1,5 +1,6 @@ # -*- python -*- -# oVirt or RHV upload nbdkit plugin used by ‘virt-v2v -o rhv-upload’ +# coding: utf-8 +# oVirt or RHV upload nbdkit plugin used by 'virt-v2v -o rhv-upload' # Copyright (C) 2018 Red Hat Inc. # # This program is free software; you can redistribute it and/or modify @@ -16,7 +17,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -import builtins +from __builtin__ import open as builtin_open import json import logging import socket @@ -24,8 +25,8 @@ import ssl import sys import time -from http.client import HTTPSConnection, HTTPConnection -from urllib.parse import urlparse +from httplib import HTTPSConnection, HTTPConnection +from urlparse import urlparse import ovirtsdk4 as sdk import ovirtsdk4.types as types @@ -37,14 +38,25 @@ timeout = 5*60 # Parameters are passed in via a JSON doc from the OCaml code. # Because this Python code ships embedded inside virt-v2v there # is no formal API here. +# https://stackoverflow.com/a/13105359 +def byteify(input): + if isinstance(input, dict): + return {byteify(key): byteify(value) + for key, value in input.iteritems()} + elif isinstance(input, list): + return [byteify(element) for element in input] + elif isinstance(input, unicode): + return input.encode('utf-8') + else: + return input params = None def config(key, value): global params if key == "params": - with builtins.open(value, 'r') as fp: - params = json.load(fp) + with builtin_open(value, 'r') as fp: + params = byteify(json.load(fp)) else: raise RuntimeError("unknown configuration key '%s'" % key) @@ -54,13 +66,14 @@ def config_complete(): def debug(s): if params['verbose']: - print(s, file=sys.stderr) + sys.stderr.write(s) + sys.stderr.write("\n") sys.stderr.flush() def find_host(connection): """Return the current host object or None.""" try: - with builtins.open("/etc/vdsm/vdsm.id") as f: + with builtin_open("/etc/vdsm/vdsm.id") as f: vdsm_id = f.readline().strip() except Exception as e: # This is most likely not an oVirt host. @@ -110,7 +123,7 @@ def open(readonly): username = parsed.username or "admin@internal" # Read the password from file. - with builtins.open(params['output_password'], 'r') as fp: + with builtin_open(params['output_password'], 'r') as fp: password = fp.read() password = password.rstrip() @@ -232,7 +245,7 @@ def open(readonly): # New imageio never needs authentication. needs_auth = False - j = json.loads(data) + j = byteify(json.loads(data)) can_flush = "flush" in j['features'] can_trim = "trim" in j['features'] can_zero = "zero" in j['features'] @@ -514,7 +527,7 @@ def close(h): pass # Write the disk ID file. Only do this on successful completion. - with builtins.open(params['diskid_file'], 'w') as fp: + with builtin_open(params['diskid_file'], 'w') as fp: fp.write(disk.id) except: diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py index 2798a29dd..5b650899f 100644 --- a/v2v/rhv-upload-precheck.py +++ b/v2v/rhv-upload-precheck.py @@ -1,5 +1,6 @@ # -*- python -*- -# oVirt or RHV pre-upload checks used by ‘virt-v2v -o rhv-upload’ +# coding: utf-8 +# oVirt or RHV pre-upload checks used by 'virt-v2v -o rhv-upload' # Copyright (C) 2018 Red Hat Inc. # # This program is free software; you can redistribute it and/or modify @@ -21,8 +22,8 @@ import logging import sys import time -from http.client import HTTPSConnection -from urllib.parse import urlparse +from httplib import HTTPSConnection +from urlparse import urlparse import ovirtsdk4 as sdk import ovirtsdk4.types as types @@ -36,8 +37,19 @@ if len(sys.argv) != 2: raise RuntimeError("incorrect number of parameters") # Parameters are passed in via a JSON document. +# https://stackoverflow.com/a/13105359 +def byteify(input): + if isinstance(input, dict): + return {byteify(key): byteify(value) + for key, value in input.iteritems()} + elif isinstance(input, list): + return [byteify(element) for element in input] + elif isinstance(input, unicode): + return input.encode('utf-8') + else: + return input with open(sys.argv[1], 'r') as fp: - params = json.load(fp) + params = byteify(json.load(fp)) # What is passed in is a password file, read the actual password. with open(params['output_password'], 'r') as fp: @@ -67,7 +79,7 @@ vms = vms_service.list( ) if len(vms) > 0: vm = vms[0] - raise RuntimeError("VM already exists with name ‘%s’, id ‘%s’" % + raise RuntimeError("VM already exists with name '%s', id '%s'" % (params['output_name'], vm.id)) # Otherwise everything is OK, exit with no error. diff --git a/v2v/test-v2v-python-syntax.sh b/v2v/test-v2v-python-syntax.sh index b167f4610..8d5924e3c 100755 --- a/v2v/test-v2v-python-syntax.sh +++ b/v2v/test-v2v-python-syntax.sh @@ -25,7 +25,7 @@ skip_if_skipped files="rhv-upload-createvm.py rhv-upload-plugin.py rhv-upload-precheck.py" # Base version of Python. -python=python3 +python=python # Checks the files are syntactically correct, but not very much else. for f in $files; do -- 2.17.2