Index: virt-manager-1.5.1/virt-install
===================================================================
--- virt-manager-1.5.1.orig/virt-install
+++ virt-manager-1.5.1/virt-install
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/python3
 #
 # Copyright 2005-2014 Red Hat, Inc.
 #
Index: virt-manager-1.5.1/virtinst/uri.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/uri.py
+++ virt-manager-1.5.1/virtinst/uri.py
@@ -19,7 +19,7 @@
 
 import logging
 import re
-import urllib
+import urllib.request, urllib.parse, urllib.error
 
 from .cli import parse_optstr_tuples
 
@@ -47,7 +47,7 @@ class URI(object):
     """
     def __init__(self, uri):
         self.uri = uri
-        unquoted_uri = urllib.unquote(uri)
+        unquoted_uri = urllib.parse.unquote(uri)
 
         (self.scheme, self.username, self.hostname,
          self.path, self.query, self.fragment) = self._split(unquoted_uri)
Index: virt-manager-1.5.1/virtinst/hostkeymap.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/hostkeymap.py
+++ virt-manager-1.5.1/virtinst/hostkeymap.py
@@ -20,6 +20,7 @@
 import logging
 import os
 import re
+import functools
 
 
 _ETC_VCONSOLE = "/etc/vconsole.conf"
@@ -202,7 +203,7 @@ def sanitize_keymap(kt):
         return len(b) - len(a)
 
     clean_kt = kt.replace("-", "").replace("_", "")
-    sorted_keys = sorted(keytable.keys(), len_cmp)
+    sorted_keys = sorted(list(keytable.keys()), key=functools.cmp_to_key(len_cmp))
 
     for key in sorted_keys:
         origkey = key
Index: virt-manager-1.5.1/virtinst/support.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/support.py
+++ virt-manager-1.5.1/virtinst/support.py
@@ -167,7 +167,7 @@ class _SupportCheck(object):
         self.hv_version = hv_version or {}
         self.hv_libvirt_version = hv_libvirt_version or {}
 
-        versions = ([self.version] + self.hv_libvirt_version.values())
+        versions = ([self.version] + list(self.hv_libvirt_version.values()))
         for vstr in versions:
             v = _version_str_to_int(vstr)
             if vstr is not None and v != 0 and v < 7009:
Index: virt-manager-1.5.1/virtinst/osdict.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/osdict.py
+++ virt-manager-1.5.1/virtinst/osdict.py
@@ -79,7 +79,7 @@ def _sort(tosort, sortpref=None, limit_p
     retlist = []
     sortpref = sortpref or []
 
-    for key, osinfo in tosort.items():
+    for key, osinfo in list(tosort.items()):
         # Libosinfo has some duplicate version numbers here, so append .1
         # if there's a collision
         sortby = osinfo.sortby
@@ -98,12 +98,12 @@ def _sort(tosort, sortpref=None, limit_p
     # debian5, debian4, fedora14, fedora13
     #   rather than
     # debian4, debian5, fedora13, fedora14
-    for distro_list in distro_mappings.values():
+    for distro_list in list(distro_mappings.values()):
         distro_list.sort()
         distro_list.reverse()
 
     # Move the sortpref values to the front of the list
-    sorted_distro_list = distro_mappings.keys()
+    sorted_distro_list = list(distro_mappings.keys())
     sorted_distro_list.sort()
     sortpref.reverse()
     for prefer in sortpref:
@@ -264,7 +264,7 @@ class _OSDB(object):
         """
         sortmap = {}
 
-        for name, osobj in self._all_variants.items():
+        for name, osobj in list(self._all_variants.items()):
             if typename and typename != osobj.get_typename():
                 continue
             if only_supported and not osobj.get_supported():
Index: virt-manager-1.5.1/virtinst/guest.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/guest.py
+++ virt-manager-1.5.1/virtinst/guest.py
@@ -434,7 +434,7 @@ class Guest(XMLBuilder):
                 domain.undefine()
             except Exception:
                 pass
-            raise exc_info[0], exc_info[1], exc_info[2]
+            raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
 
         if install_xml and install_xml != final_xml:
             domain = self.conn.defineXML(final_xml)
@@ -1099,7 +1099,7 @@ class Guest(XMLBuilder):
                                  (str(d), str(addresses[addrstr][addr.function])))
             addresses[addrstr][addr.function] = d
 
-        for devs in addresses.values():
+        for devs in list(addresses.values()):
             if len(devs) > 1 and 0 in devs:
                 devs[0].address.multifunction = True
 
Index: virt-manager-1.5.1/virtinst/distroinstaller.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/distroinstaller.py
+++ virt-manager-1.5.1/virtinst/distroinstaller.py
@@ -68,7 +68,7 @@ def _sanitize_url(url):
  MEDIA_LOCATION_URL,
  MEDIA_CDROM_PATH,
  MEDIA_CDROM_URL,
- MEDIA_CDROM_IMPLIED) = range(1, 7)
+ MEDIA_CDROM_IMPLIED) = list(range(1, 7))
 
 
 class DistroInstaller(Installer):
Index: virt-manager-1.5.1/virtinst/cli.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/cli.py
+++ virt-manager-1.5.1/virtinst/cli.py
@@ -19,7 +19,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA 02110-1301 USA.
 
-from __future__ import print_function
+
 
 import argparse
 import collections
@@ -294,7 +294,7 @@ def _do_creds_authname(creds):
 
         res = cred[retindex]
         if credtype == libvirt.VIR_CRED_AUTHNAME:
-            res = raw_input(prompt)
+            res = input(prompt)
         elif credtype == libvirt.VIR_CRED_PASSPHRASE:
             import getpass
             res = getpass.getpass(prompt)
@@ -1193,7 +1193,7 @@ class VirtCLIParser(object):
         passed an invalid argument such as --disk idontexist=foo
         """
         if optdict:
-            fail(_("Unknown options %s") % optdict.keys())
+            fail(_("Unknown options %s") % list(optdict.keys()))
 
     def _parse(self, inst):
         """
@@ -1681,7 +1681,7 @@ class ParserBoot(VirtCLIParser):
     def _parse(self, inst):
         # Build boot order
         boot_order = []
-        for cliname in self.optdict.keys():
+        for cliname in list(self.optdict.keys()):
             if cliname not in inst.os.BOOT_DEVICES:
                 continue
 
Index: virt-manager-1.5.1/virtinst/xmlbuilder.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/xmlbuilder.py
+++ virt-manager-1.5.1/virtinst/xmlbuilder.py
@@ -327,7 +327,7 @@ class XMLChildProperty(property):
 
     def _findpropname(self, xmlbuilder):
         if self._propname is None:
-            for key, val in xmlbuilder._all_child_props().items():
+            for key, val in list(xmlbuilder._all_child_props().items()):
                 if val is self:
                     self._propname = key
                     break
@@ -475,7 +475,7 @@ class XMLProperty(property):
         as in the XMLBuilder class. This is just for debug purposes.
         """
         if self._propname is None:
-            for key, val in xmlbuilder._all_xml_props().items():
+            for key, val in list(xmlbuilder._all_xml_props().items()):
                 if val is self:
                     self._propname = key
                     break
@@ -832,7 +832,7 @@ class XMLBuilder(object):
         self.conn = conn
 
         if self._XML_SANITIZE:
-            parsexml = parsexml.decode('ascii', 'ignore').encode('ascii')
+            #parsexml = parsexml.decode('ascii', 'ignore').encode('ascii')
             parsexml = "".join([c for c in parsexml if c in string.printable])
 
         self._propstore = {}
@@ -846,7 +846,7 @@ class XMLBuilder(object):
     def _initial_child_parse(self):
         # Walk the XML tree and hand of parsing to any registered
         # child classes
-        for xmlprop in self._all_child_props().values():
+        for xmlprop in list(self._all_child_props().values()):
             if xmlprop.is_single:
                 child_class = xmlprop.child_classes[0]
                 prop_path = xmlprop.get_prop_xpath(self, child_class)
@@ -888,7 +888,7 @@ class XMLBuilder(object):
 
         # XMLChildProperty stores a list in propstore, which dict shallow
         # copy won't fix for us.
-        for name, value in ret._propstore.items():
+        for name, value in list(ret._propstore.items()):
             if not isinstance(value, list):
                 continue
             ret._propstore[name] = [obj.copy() for obj in ret._propstore[name]]
@@ -929,8 +929,8 @@ class XMLBuilder(object):
             if leave_stub:
                 _top_node = _get_xpath_node(self._xmlstate.xml_ctx,
                                             self.get_root_xpath())
-            props = self._all_xml_props().values()
-            props += self._all_child_props().values()
+            props = list(self._all_xml_props().values())
+            props += list(self._all_child_props().values())
             for prop in props:
                 prop.clear(self)
         finally:
@@ -993,7 +993,7 @@ class XMLBuilder(object):
         if not hasattr(self.__class__, cachename):
             ret = {}
             for c in reversed(type.mro(self.__class__)[:-1]):
-                for key, val in c.__dict__.items():
+                for key, val in list(c.__dict__.items()):
                     if isinstance(val, checkclass):
                         ret[key] = val
             setattr(self.__class__, cachename, ret)
@@ -1028,7 +1028,7 @@ class XMLBuilder(object):
 
     def _find_child_prop(self, child_class, return_single=False):
         xmlprops = self._all_child_props()
-        for xmlprop in xmlprops.values():
+        for xmlprop in list(xmlprops.values()):
             if xmlprop.is_single and not return_single:
                 continue
             if child_class in xmlprop.child_classes:
@@ -1087,7 +1087,7 @@ class XMLBuilder(object):
         Return a list of all XML child objects with the passed class
         """
         ret = []
-        for prop in self._all_child_props().values():
+        for prop in list(self._all_child_props().values()):
             ret += [obj for obj in util.listify(prop._get(self))
                     if obj.__class__ == klass]
         return ret
@@ -1110,7 +1110,7 @@ class XMLBuilder(object):
         xpaths point at their particular element
         """
         typecount = {}
-        for propname, xmlprop in self._all_child_props().items():
+        for propname, xmlprop in list(self._all_child_props().items()):
             for obj in util.listify(getattr(self, propname)):
                 idxstr = ""
                 if not xmlprop.is_single:
@@ -1168,7 +1168,7 @@ class XMLBuilder(object):
         xmlprops = self._all_xml_props()
         childprops = self._all_child_props()
 
-        for prop in xmlprops.values():
+        for prop in list(xmlprops.values()):
             prop._set_default(self)
 
         # Set up preferred XML ordering
@@ -1183,7 +1183,7 @@ class XMLBuilder(object):
             elif key in childprops:
                 do_order.insert(0, key)
 
-        for key in childprops.keys():
+        for key in list(childprops.keys()):
             if key not in do_order:
                 do_order.append(key)
 
Index: virt-manager-1.5.1/virtinst/domcapabilities.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/domcapabilities.py
+++ virt-manager-1.5.1/virtinst/domcapabilities.py
@@ -166,7 +166,7 @@ class DomainCapabilities(XMLBuilder):
                 return _("BIOS")
             return _("None")
 
-        for arch, patterns in self._uefi_arch_patterns.items():
+        for arch, patterns in list(self._uefi_arch_patterns.items()):
             for pattern in patterns:
                 if re.match(pattern, path):
                     return (_("UEFI %(arch)s: %(path)s") %
@@ -178,7 +178,7 @@ class DomainCapabilities(XMLBuilder):
         """
         Return True if we know how to setup UEFI for the passed arch
         """
-        return self.arch in self._uefi_arch_patterns.keys()
+        return self.arch in list(self._uefi_arch_patterns.keys())
 
     def supports_uefi_xml(self):
         """
Index: virt-manager-1.5.1/virtinst/devicedisk.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/devicedisk.py
+++ virt-manager-1.5.1/virtinst/devicedisk.py
@@ -87,7 +87,7 @@ def _is_dir_searchable(uid, username, pa
         logging.debug("Cmd '%s' failed: %s", cmd, err)
         return False
 
-    return bool(re.search("user:%s:..x" % username, out))
+    return bool(re.search("user:%s:..x" % username, out.decode()))
 
 
 class _Host(XMLBuilder):
@@ -455,7 +455,7 @@ class VirtualDisk(VirtualDevice):
                 digit = 1
 
             seen_valid = True
-            gen_t += "%c" % (ord('a') + digit - 1)
+            gen_t += "%c" % int(ord('a') + digit - 1)
 
         return gen_t
 
@@ -1056,11 +1056,11 @@ class VirtualDisk(VirtualDevice):
         def get_target():
             first_found = None
 
-            ran = range(maxnode)
+            ran = list(range(maxnode))
             if pref_ctrl is not None:
                 # We assume narrow SCSI bus and libvirt assigning 7
                 # (1-7, 8-14, etc.) devices per controller
-                ran = range(pref_ctrl * 7, (pref_ctrl + 1) * 7)
+                ran = list(range(pref_ctrl * 7, (pref_ctrl + 1) * 7))
 
             for i in ran:
                 postfix = self.num_to_target(i + 1)
Index: virt-manager-1.5.1/virtinst/storage.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/storage.py
+++ virt-manager-1.5.1/virtinst/storage.py
@@ -130,7 +130,7 @@ class StoragePool(_StorageObject):
         """
         Return list of appropriate pool types
         """
-        return StoragePool._descs.keys()
+        return list(StoragePool._descs.keys())
 
     @staticmethod
     def get_pool_type_desc(pool_type):
Index: virt-manager-1.5.1/virtinst/devicegraphics.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/devicegraphics.py
+++ virt-manager-1.5.1/virtinst/devicegraphics.py
@@ -84,7 +84,7 @@ class VirtualGraphics(VirtualDevice):
         """
         from . import hostkeymap
 
-        orig_list = hostkeymap.keytable.values()
+        orig_list = list(hostkeymap.keytable.values())
         sort_list = []
 
         orig_list.sort()
Index: virt-manager-1.5.1/virtinst/util.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/util.py
+++ virt-manager-1.5.1/virtinst/util.py
@@ -147,7 +147,7 @@ def generate_name(base, collision_cb, su
         else:
             return collision_cb(tryname)
 
-    numrange = range(start_num, start_num + 100000)
+    numrange = list(range(start_num, start_num + 100000))
     if not force_num:
         numrange = [None] + numrange
 
Index: virt-manager-1.5.1/virtinst/urlfetcher.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/urlfetcher.py
+++ virt-manager-1.5.1/virtinst/urlfetcher.py
@@ -19,7 +19,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA 02110-1301 USA.
 
-import ConfigParser
+import configparser
 import ftplib
 import io
 import logging
@@ -27,8 +27,8 @@ import os
 import re
 import subprocess
 import tempfile
-import urllib2
-import urlparse
+import urllib.request, urllib.error, urllib.parse
+import urllib.parse
 
 import requests
 
@@ -220,7 +220,7 @@ class _FTPURLFetcher(_URLFetcher):
             return
 
         try:
-            parsed = urlparse.urlparse(self.location)
+            parsed = urllib.parse.urlparse(self.location)
             self._ftp = ftplib.FTP()
             self._ftp.connect(parsed.hostname, parsed.port or 0)
             self._ftp.login()
@@ -234,9 +234,9 @@ class _FTPURLFetcher(_URLFetcher):
         """
         Use urllib2 and ftplib to grab the file
         """
-        request = urllib2.Request(url)
-        urlobj = urllib2.urlopen(request)
-        size = self._ftp.size(urlparse.urlparse(url)[2])
+        request = urllib.request.Request(url)
+        urlobj = urllib.request.urlopen(request)
+        size = self._ftp.size(urllib.parse.urlparse(url)[2])
         return urlobj, size
 
 
@@ -252,7 +252,7 @@ class _FTPURLFetcher(_URLFetcher):
         self._ftp = None
 
     def _hasFile(self, url):
-        path = urlparse.urlparse(url)[2]
+        path = urllib.parse.urlparse(url)[2]
 
         try:
             try:
@@ -277,7 +277,7 @@ class _LocalURLFetcher(_URLFetcher):
         return os.path.exists(url)
 
     def _grabber(self, url):
-        urlobj = open(url, "r")
+        urlobj = open(url, "rb")
         size = os.path.getsize(url)
         return urlobj, size
 
@@ -395,14 +395,14 @@ def _grabTreeinfo(fetcher):
         return None
 
     try:
-        treeinfo = ConfigParser.SafeConfigParser()
+        treeinfo = configparser.SafeConfigParser()
         treeinfo.read(tmptreeinfo)
     finally:
         os.unlink(tmptreeinfo)
 
     try:
         treeinfo.get("general", "family")
-    except ConfigParser.NoSectionError:
+    except configparser.NoSectionError:
         logging.debug("Did not find 'family' section in treeinfo")
         return None
 
@@ -647,7 +647,7 @@ class Distro(object):
             try:
                 kernelpath = self._getTreeinfoMedia("kernel")
                 initrdpath = self._getTreeinfoMedia("initrd")
-            except ConfigParser.NoSectionError:
+            except configparser.NoSectionError:
                 pass
 
         if not kernelpath or not initrdpath:
@@ -783,15 +783,15 @@ class GenericDistro(Distro):
                     self._valid_kernel_path = (
                         self._getTreeinfoMedia("kernel"),
                         self._getTreeinfoMedia("initrd"))
-                except (ConfigParser.NoSectionError,
-                        ConfigParser.NoOptionError) as e:
+                except (configparser.NoSectionError,
+                        configparser.NoOptionError) as e:
                     logging.debug(e)
 
             if self.treeinfo.has_section(isoSection):
                 try:
                     self._valid_iso_path = self.treeinfo.get(isoSection,
                                                              "boot.iso")
-                except ConfigParser.NoOptionError as e:
+                except configparser.NoOptionError as e:
                     logging.debug(e)
 
         if self.type == "xen":
@@ -1482,7 +1482,7 @@ class ALTLinuxDistro(Distro):
 # Build list of all *Distro classes
 def _build_distro_list():
     allstores = []
-    for obj in globals().values():
+    for obj in list(globals().values()):
         if isinstance(obj, type) and issubclass(obj, Distro) and obj.name:
             allstores.append(obj)
 
Index: virt-manager-1.5.1/virtinst/diskbackend.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/diskbackend.py
+++ virt-manager-1.5.1/virtinst/diskbackend.py
@@ -404,7 +404,7 @@ class CloneStorageCreator(_StorageCreato
         else:
             vfs = os.statvfs(os.path.dirname(self._path))
             avail = vfs.f_frsize * vfs.f_bavail
-        need = long(self._size * 1024 * 1024 * 1024)
+        need = int(self._size * 1024 * 1024 * 1024)
         if need > avail:
             if self._sparse:
                 msg = _("The filesystem will not have enough free space"
@@ -424,7 +424,7 @@ class CloneStorageCreator(_StorageCreato
         text = (_("Cloning %(srcfile)s") %
                 {'srcfile': os.path.basename(self._input_path)})
 
-        size_bytes = long(self.get_size() * 1024 * 1024 * 1024)
+        size_bytes = int(self.get_size() * 1024 * 1024 * 1024)
         progresscb.start(filename=self._output_path, size=size_bytes,
                          text=text)
 
Index: virt-manager-1.5.1/virtinst/progress.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/progress.py
+++ virt-manager-1.5.1/virtinst/progress.py
@@ -482,7 +482,7 @@ def format_number(number, SI=0, space='
         depth  = depth + 1
         number = number / step
 
-    if isinstance(number, int) or isinstance(number, long):
+    if isinstance(number, int) or isinstance(number, int):
         # it's an int or a long, which means it didn't get divided,
         # which means it's already short enough
         fmt = '%i%s%s'
Index: virt-manager-1.5.1/virtinst/pollhelpers.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/pollhelpers.py
+++ virt-manager-1.5.1/virtinst/pollhelpers.py
@@ -50,7 +50,7 @@ def _new_poll_helper(origmap, typename,
             current[connkey] = origmap[connkey]
             del(origmap[connkey])
 
-    return (origmap.values(), new.values(), current.values())
+    return (list(origmap.values()), list(new.values()), list(current.values()))
 
 
 def _old_poll_helper(origmap, typename,
@@ -108,7 +108,7 @@ def _old_poll_helper(origmap, typename,
         except Exception:
             logging.exception("Couldn't fetch %s '%s'", typename, name)
 
-    return (origmap.values(), new.values(), current.values())
+    return (list(origmap.values()), list(new.values()), list(current.values()))
 
 
 def fetch_nets(backend, origmap, build_func):
@@ -143,7 +143,7 @@ def fetch_pools(backend, origmap, build_
         for obj in objs:
             try:
                 obj.refresh(0)
-            except Exception, e:
+            except Exception as e:
                 pass
 
         return _new_poll_helper(origmap, name,
@@ -222,7 +222,7 @@ def _old_fetch_vms(backend, origmap, bui
     new = {}
 
     # Build list of previous vms with proper id/name mappings
-    for vm in origmap.values():
+    for vm in list(origmap.values()):
         if vm.is_active():
             oldActiveIDs[vm.get_id()] = vm
         else:
@@ -285,7 +285,7 @@ def _old_fetch_vms(backend, origmap, bui
             except Exception:
                 logging.exception("Couldn't fetch domain '%s'", name)
 
-    return (origmap.values(), new.values(), current.values())
+    return (list(origmap.values()), list(new.values()), list(current.values()))
 
 
 def fetch_vms(backend, origmap, build_func):
