Python2 is going to die soon, convert to python3.
---
bin/virt-sandbox-service | 68 ++++++++++++++++++---------------
libvirt-sandbox/image/cli.py | 18 ++++-----
libvirt-sandbox/image/sources/docker.py | 41 ++++++++++----------
libvirt-sandbox/image/template.py | 8 ++--
4 files changed, 71 insertions(+), 64 deletions(-)
diff --git a/bin/virt-sandbox-service b/bin/virt-sandbox-service
index c34c6f3..e78defb 100755
--- a/bin/virt-sandbox-service
+++ b/bin/virt-sandbox-service
@@ -30,7 +30,6 @@ from gi.repository import GLib
import gi
import re
import os, sys, shutil, errno, stat
-import exceptions
import rpm
from subprocess import Popen, PIPE, STDOUT
import gettext
@@ -49,7 +48,6 @@ gettext.textdomain("libvirt-sandbox")
try:
gettext.install("libvirt-sandbox",
localedir="/usr/share/locale",
- unicode=False,
codeset = 'utf-8')
except IOError:
import __builtin__
@@ -235,7 +233,7 @@ class Container:
path = "%s%s" % (self.dest, f)
os.chown(path, s.st_uid, s.st_gid)
os.chmod(path, s.st_mode)
- except OSError, e:
+ except OSError as e:
if not e.errno == errno.ENOENT:
raise
@@ -253,7 +251,7 @@ class Container:
try:
path = "%s%s" % (self.dest, d)
os.makedirs(path)
- except OSError, e:
+ except OSError as e:
if not e.errno == errno.EEXIST:
raise
@@ -263,7 +261,7 @@ class Container:
path = "%s%s" % (self.dest, f)
fd=open(path, "w")
fd.close()
- except OSError, e:
+ except OSError as e:
if not e.errno == errno.EEXIST:
raise
@@ -404,10 +402,10 @@ class GenericContainer(Container):
def create(self):
try:
self.create_generic()
- except Exception, e:
+ except Exception as e:
try:
self.delete()
- except Exception, e2:
+ except Exception as e2:
pass
raise e
@@ -418,6 +416,18 @@ class GenericContainer(Container):
def is_template_unit(unit):
return '@' in unit
+# Python 2 / 3 compability helpers
+def get_next(obj):
+ if hasattr(obj, 'next'):
+ return obj.next()
+ else:
+ return next(obj)
+
+def string(obj):
+ if isinstance(obj, bytes):
+ return str(obj, encoding='utf-8')
+ return obj
+
class SystemdContainer(Container):
IGNORE_DIRS = [ "/var/run/", "/etc/logrotate.d/",
"/etc/pam.d" ]
DEFAULT_DIRS = [ "/etc", "/var" ]
@@ -581,8 +591,8 @@ WantedBy=multi-user.target
def get_rpm_for_unit(self, unitfile):
mi = self.ts.dbMatch(rpm.RPMTAG_BASENAMES, unitfile)
try:
- h = mi.next();
- except exceptions.StopIteration:
+ h = get_next(mi);
+ except StopIteration:
return None
return h['name']
@@ -590,8 +600,8 @@ WantedBy=multi-user.target
def extract_rpm(self, rpm_name):
mi = self.ts.dbMatch('name', rpm_name)
try:
- h = mi.next();
- except exceptions.StopIteration:
+ h = get_next(mi);
+ except StopIteration:
raise ValueError([_("Cannot find package named %s") % rpm_name])
for fentry in h.fiFromHeader():
@@ -602,16 +612,16 @@ WantedBy=multi-user.target
if os.path.isfile(fname):
self.add_file(fname)
- srcrpm = h[rpm.RPMTAG_SOURCERPM]
+ srcrpm = string(h[rpm.RPMTAG_SOURCERPM])
srcrpmbits = self.split_filename(srcrpm)
- if srcrpmbits[0] == h[rpm.RPMTAG_NAME]:
+ if srcrpmbits[0] == string(h[rpm.RPMTAG_NAME]):
return
mi = self.ts.dbMatch(rpm.RPMTAG_NAME, srcrpmbits[0])
try:
- h = mi.next();
- except exceptions.StopIteration:
+ h = get_next(mi);
+ except StopIteration:
raise ValueError([_("Cannot find base package %s") %
srcrpmbits[0]])
for fentry in h.fiFromHeader():
@@ -771,7 +781,7 @@ PrivateNetwork=false
fd.write("[Unit]\n")
fd.write("Description=Sandbox multi-user target\n")
fd.close()
- except OSError, e:
+ except OSError as e:
if not e.errno == errno.EEXIST:
raise
@@ -789,7 +799,7 @@ PrivateNetwork=false
jpath = "/var/log/journal/" + uuid
if os.path.lexists(jpath):
os.remove(jpath)
- except Exception, e:
+ except Exception as e:
sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
sys.stderr.flush()
@@ -825,10 +835,10 @@ PrivateNetwork=false
try:
self.create_systemd()
- except Exception, e:
+ except Exception as e:
try:
self.delete()
- except Exception, e2:
+ except Exception as e2:
sys.stderr.write("Cleanup failed: %s\n" % str(e2))
raise
@@ -923,10 +933,10 @@ def connect(args):
execute(args)
return
- print """\
+ print ("""\
Connected to %s.
Type 'Ctrl + ]' to detach from the console.
-""" % ( args.name )
+""" % ( args.name ))
os.execl("/usr/libexec/virt-sandbox-service-util",
"virt-sandbox-service-util",
"-c", args.uri,
@@ -1014,7 +1024,7 @@ def clone(args):
newcontainer.set_security(args.security)
newcontainer.set_security_label()
newcontainer.save_config()
- except Exception, e:
+ except Exception as e:
if newcontainer is not None:
newcontainer.delete()
raise
@@ -1296,23 +1306,21 @@ if __name__ == '__main__':
sys.exit(1)
args.func(args)
sys.exit(0)
- except KeyboardInterrupt, e:
+ except KeyboardInterrupt as e:
sys.exit(0)
- except ValueError, e:
- for line in e:
- for l in line:
- sys.stderr.write("%s: %s\n" % (sys.argv[0], l))
+ except ValueError as e:
+ sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
sys.stderr.flush()
sys.exit(1)
- except IOError, e:
+ except IOError as e:
sys.stderr.write("%s: %s: %s\n" % (sys.argv[0], e.filename,
e.strerror))
sys.stderr.flush()
sys.exit(1)
- except OSError, e:
+ except OSError as e:
sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
sys.stderr.flush()
sys.exit(1)
- except GLib.GError, e:
+ except GLib.GError as e:
sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
sys.stderr.flush()
sys.exit(1)
diff --git a/libvirt-sandbox/image/cli.py b/libvirt-sandbox/image/cli.py
index d5e624c..fa3cace 100644
--- a/libvirt-sandbox/image/cli.py
+++ b/libvirt-sandbox/image/cli.py
@@ -30,7 +30,6 @@ import os.path
import re
import shutil
import sys
-import urllib2
import subprocess
import random
import string
@@ -52,7 +51,6 @@ gettext.textdomain("libvirt-sandbox")
try:
gettext.install("libvirt-sandbox",
localedir="/usr/share/locale",
- unicode=False,
codeset = 'utf-8')
except IOError:
import __builtin__
@@ -149,7 +147,7 @@ def list_cached(args):
tmpls.extend(template.Template.get_all(source,
"%s/%s" %
(args.template_dir, source)))
for tmpl in tmpls:
- print tmpl
+ print (tmpl)
def requires_template(parser):
parser.add_argument("template",
@@ -265,20 +263,20 @@ def main():
try:
args.func(args)
sys.exit(0)
- except KeyboardInterrupt, e:
+ except KeyboardInterrupt as e:
sys.exit(0)
- except ValueError, e:
+ except ValueError as e:
sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
sys.stderr.flush()
sys.exit(1)
- except IOError, e:
- sys.stderr.write("%s: %s: %s\n" % (sys.argv[0], e.filename,
e.reason))
+ except IOError as e:
+ sys.stderr.write("%s: %s\n" % (sys.argv[0], e.filename))
sys.stderr.flush()
sys.exit(1)
- except OSError, e:
+ except OSError as e:
sys.stderr.write("%s: %s\n" % (sys.argv[0], e))
sys.stderr.flush()
sys.exit(1)
- except Exception, e:
- print e.message
+ except Exception as e:
+ print (e)
sys.exit(1)
diff --git a/libvirt-sandbox/image/sources/docker.py
b/libvirt-sandbox/image/sources/docker.py
index 6ca086c..e979054 100755
--- a/libvirt-sandbox/image/sources/docker.py
+++ b/libvirt-sandbox/image/sources/docker.py
@@ -21,14 +21,15 @@
# Author: Eren Yagdiran <erenyagdiran(a)gmail.com>
#
-import urllib2
import sys
import json
import traceback
import os
import subprocess
import shutil
-import urlparse
+import urllib.error
+import urllib.parse
+import urllib.request
import hashlib
from abc import ABCMeta, abstractmethod
import copy
@@ -133,7 +134,7 @@ class DockerAuthBasic(DockerAuth):
req.add_header("X-Docker-Token", "true")
def process_res(self, res):
- self.token = res.info().getheader('X-Docker-Token')
+ self.token = res.info().get('X-Docker-Token')
def process_err(self, err):
return False
@@ -194,10 +195,10 @@ class DockerAuthBearer(DockerAuth):
if params != "":
url = url + "?" + params
- req = urllib2.Request(url=url)
+ req = urllib.request.Request(url=url)
req.add_header("Accept", "application/json")
- res = urllib2.urlopen(req)
+ res = urllib.request.urlopen(req)
data = json.loads(res.read())
self.token = data["token"]
return True
@@ -207,7 +208,7 @@ class DockerRegistry():
def __init__(self, uri_base):
- self.uri_base = list(urlparse.urlparse(uri_base))
+ self.uri_base = list(urllib.parse.urlparse(uri_base))
self.auth_handler = DockerAuthNop()
def set_auth_handler(self, auth_handler):
@@ -216,8 +217,8 @@ class DockerRegistry():
def supports_v2(self):
try:
(data, res) = self.get_json("/v2/")
- ver = res.info().getheader("Docker-Distribution-Api-Version")
- except urllib2.HTTPError as e:
+ ver = res.info().get("Docker-Distribution-Api-Version")
+ except urllib.error.HTTPError as e:
ver = e.headers.get("Docker-Distribution-Api-Version", None)
if ver is None:
@@ -243,17 +244,17 @@ class DockerRegistry():
else:
server = "%s:%s" % (hostname, port)
- url = urlparse.urlunparse((protocol, server, "", None, None, None))
+ url = urllib.parse.urlunparse((protocol, server, "", None, None,
None))
return cls(url)
def get_url(self, path, headers=None):
url_bits = copy.copy(self.uri_base)
url_bits[2] = path
- url = urlparse.urlunparse(url_bits)
+ url = urllib.parse.urlunparse(url_bits)
debug("Fetching %s..." % url)
- req = urllib2.Request(url=url)
+ req = urllib.request.Request(url=url)
if headers is not None:
for h in headers.keys():
@@ -262,16 +263,16 @@ class DockerRegistry():
self.auth_handler.prepare_req(req)
try:
- res = urllib2.urlopen(req)
+ res = urllib.request.urlopen(req)
self.auth_handler.process_res(res)
return res
- except urllib2.HTTPError as e:
+ except urllib.error.HTTPError as e:
if e.code == 401:
retry = self.auth_handler.process_err(e)
if retry:
debug("Re-Fetching %s..." % url)
self.auth_handler.prepare_req(req)
- res = urllib2.urlopen(req)
+ res = urllib.request.urlopen(req)
self.auth_handler.process_res(res)
return res
else:
@@ -284,7 +285,7 @@ class DockerRegistry():
try:
res = self.get_url(path)
- datalen = res.info().getheader("Content-Length")
+ datalen = res.info().get("Content-Length")
if datalen is not None:
datalen = int(datalen)
@@ -296,7 +297,7 @@ class DockerRegistry():
patternIndex = 0
donelen = 0
- with open(dest, "w") as f:
+ with open(dest, "wb") as f:
while 1:
buf = res.read(1024*64)
if not buf:
@@ -321,7 +322,7 @@ class DockerRegistry():
raise IOError("Checksum '%s' for data does not match
'%s'" % (csumstr, checksum))
debug("OK\n")
return res
- except Exception, e:
+ except Exception as e:
debug("FAIL %s\n" % str(e))
raise
@@ -333,7 +334,7 @@ class DockerRegistry():
data = json.loads(res.read())
debug("OK\n")
return (data, res)
- except Exception, e:
+ except Exception as e:
debug("FAIL %s\n" % str(e))
raise
@@ -426,10 +427,10 @@ class DockerSource(base.Source):
(data, res) = registry.get_json("/v1/repositories/%s/%s/images" %
(
image.repo, image.name,
))
- except urllib2.HTTPError, e:
+ except urllib.error.HTTPError as e:
raise ValueError(["Image '%s' does not exist" % template])
- registryendpoint = res.info().getheader('X-Docker-Endpoints')
+ registryendpoint = res.info().get('X-Docker-Endpoints')
if basicauth.token is not None:
registry.set_auth_handler(DockerAuthToken(basicauth.token))
diff --git a/libvirt-sandbox/image/template.py b/libvirt-sandbox/image/template.py
index 79dc33d..ab2ea29 100644
--- a/libvirt-sandbox/image/template.py
+++ b/libvirt-sandbox/image/template.py
@@ -19,7 +19,7 @@
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
-import urlparse
+import urllib.parse
import importlib
import re
@@ -71,7 +71,7 @@ class Template(object):
classimpl = getattr(mod, classname)
return classimpl()
except Exception as e:
- print e
+ print (e)
raise Exception("Invalid source: '%s'" % source)
def get_source_impl(self):
@@ -101,12 +101,12 @@ class Template(object):
netloc = None
query = "&".join([key + "=" + self.params[key] for key in
self.params.keys()])
- ret = urlparse.urlunparse((scheme, netloc, self.path, None, query, None))
+ ret = urllib.parse.urlunparse((scheme, netloc, self.path, None, query, None))
return ret
@classmethod
def from_uri(klass, uri):
- o = urlparse.urlparse(uri)
+ o = urllib.parse.urlparse(uri)
idx = o.scheme.find("+")
if idx == -1:
--
2.15.1