diff options
author | Petr Viktorin <pviktori@redhat.com> | 2015-09-14 12:52:29 +0200 |
---|---|---|
committer | Jan Cholasta <jcholast@redhat.com> | 2015-10-07 10:27:20 +0200 |
commit | 70b37a956c0b7dad52bf14fdb5fed421c01c8f77 (patch) | |
tree | 76768609fdbca12ccc93b092e14c4fc4ae06459a | |
parent | 7f1204a42c0fd13602768e24da7af8814cbf97d2 (diff) | |
download | freeipa-70b37a956c0b7dad52bf14fdb5fed421c01c8f77.tar.gz freeipa-70b37a956c0b7dad52bf14fdb5fed421c01c8f77.tar.xz freeipa-70b37a956c0b7dad52bf14fdb5fed421c01c8f77.zip |
Use six.moves.urllib instead of urllib/urllib2/urlparse
In Python 3, these modules are reorganized.
Reviewed-By: David Kupka <dkupka@redhat.com>
Reviewed-By: Jan Cholasta <jcholast@redhat.com>
Reviewed-By: Martin Basti <mbasti@redhat.com>
-rwxr-xr-x | install/tools/ipa-replica-manage | 5 | ||||
-rwxr-xr-x | ipa-client/ipa-install/ipa-client-automount | 4 | ||||
-rwxr-xr-x | ipa-client/ipa-install/ipa-client-install | 16 | ||||
-rw-r--r-- | ipa-client/ipaclient/ipa_certupdate.py | 5 | ||||
-rw-r--r-- | ipalib/config.py | 6 | ||||
-rw-r--r-- | ipalib/plugins/otptoken.py | 24 | ||||
-rw-r--r-- | ipalib/rpc.py | 13 | ||||
-rw-r--r-- | ipalib/session.py | 5 | ||||
-rw-r--r-- | ipaplatform/redhat/tasks.py | 14 | ||||
-rw-r--r-- | ipapython/config.py | 4 | ||||
-rw-r--r-- | ipapython/cookie.py | 6 | ||||
-rw-r--r-- | ipapython/dogtag.py | 2 | ||||
-rw-r--r-- | ipapython/ipautil.py | 4 | ||||
-rw-r--r-- | ipaserver/install/cainstance.py | 7 | ||||
-rw-r--r-- | ipaserver/plugins/dogtag.py | 12 | ||||
-rw-r--r-- | ipaserver/rpcserver.py | 12 | ||||
-rw-r--r-- | ipatests/test_ipaserver/httptest.py | 7 | ||||
-rw-r--r-- | ipatests/test_webui/ui_driver.py | 2 |
18 files changed, 77 insertions, 71 deletions
diff --git a/install/tools/ipa-replica-manage b/install/tools/ipa-replica-manage index e92561f85..b09f4d3fc 100755 --- a/install/tools/ipa-replica-manage +++ b/install/tools/ipa-replica-manage @@ -25,11 +25,12 @@ import os import re import traceback -from urllib2 import urlparse import ldap import socket import time +from six.moves.urllib.parse import urlparse + from ipapython import ipautil from ipaserver.install import replication, dsinstance, installutils from ipaserver.install import bindinstance, cainstance, certs @@ -376,7 +377,7 @@ def get_ruv(realm, host, dirman_passwd, nolookup=False): data = re.match('\{replica (\d+) (ldap://.*:\d+)\}(\s+\w+\s+\w*){0,1}', ruv) if data: rid = data.group(1) - (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(data.group(2)) + (scheme, netloc, path, params, query, fragment) = urlparse(data.group(2)) servers.append((netloc, rid)) else: print("unable to decode: %s" % ruv) diff --git a/ipa-client/ipa-install/ipa-client-automount b/ipa-client/ipa-install/ipa-client-automount index 5e4ab1396..4b93ea321 100755 --- a/ipa-client/ipa-install/ipa-client-automount +++ b/ipa-client/ipa-install/ipa-client-automount @@ -25,12 +25,12 @@ from __future__ import print_function import sys import os -import urlparse import time import tempfile import gssapi import SSSDConfig +from six.moves.urllib.parse import urlsplit from optparse import OptionParser from ipalib import api, errors @@ -396,7 +396,7 @@ def main(): root_logger.debug('Executing DNS discovery') if ret == ipadiscovery.NO_LDAP_SERVER: root_logger.debug('Autodiscovery did not find LDAP server') - s = urlparse.urlsplit(api.env.xmlrpc_uri) + s = urlsplit(api.env.xmlrpc_uri) server = [s.netloc] root_logger.debug('Setting server to %s' % s.netloc) else: diff --git a/ipa-client/ipa-install/ipa-client-install b/ipa-client/ipa-install/ipa-client-install index ff44fbb9b..fb47c8a9c 100755 --- a/ipa-client/ipa-install/ipa-client-install +++ b/ipa-client/ipa-install/ipa-client-install @@ -27,7 +27,6 @@ try: import os import time import socket - import urlparse import tempfile import getpass from ConfigParser import RawConfigParser @@ -38,6 +37,7 @@ try: import nss.nss as nss import SSSDConfig + from six.moves.urllib.parse import urlparse, urlunparse from ipapython.ipa_log_manager import standard_logging_setup, root_logger from ipaclient import ipadiscovery @@ -1877,7 +1877,7 @@ def get_ca_certs_from_file(url): ''' try: - parsed = urlparse.urlparse(url, 'file') + parsed = urlparse(url, 'file') except Exception: raise errors.FileError(reason="unable to parse file url '%s'" % url) @@ -2014,16 +2014,16 @@ def get_ca_certs(fstore, options, server, basedn, realm): ca_file = CACERT + ".new" def ldap_url(): - return urlparse.urlunparse(('ldap', ipautil.format_netloc(server), - '', '', '', '')) + return urlunparse(('ldap', ipautil.format_netloc(server), + '', '', '', '')) def file_url(): - return urlparse.urlunparse(('file', '', options.ca_cert_file, - '', '', '')) + return urlunparse(('file', '', options.ca_cert_file, + '', '', '')) def http_url(): - return urlparse.urlunparse(('http', ipautil.format_netloc(server), - '/ipa/config/ca.crt', '', '', '')) + return urlunparse(('http', ipautil.format_netloc(server), + '/ipa/config/ca.crt', '', '', '')) interactive = not options.unattended diff --git a/ipa-client/ipaclient/ipa_certupdate.py b/ipa-client/ipaclient/ipa_certupdate.py index 720bd9a87..dcd9a1fb2 100644 --- a/ipa-client/ipaclient/ipa_certupdate.py +++ b/ipa-client/ipaclient/ipa_certupdate.py @@ -20,7 +20,8 @@ import os import tempfile import shutil -import urlparse + +from six.moves.urllib.parse import urlsplit from ipapython import (admintool, ipautil, ipaldap, sysrestore, dogtag, certmonger, certdb) @@ -51,7 +52,7 @@ class CertUpdate(admintool.AdminTool): api.bootstrap(context='cli_installer') api.finalize() - server = urlparse.urlsplit(api.env.jsonrpc_uri).hostname + server = urlsplit(api.env.jsonrpc_uri).hostname ldap = ipaldap.IPAdmin(server) tmpdir = tempfile.mkdtemp(prefix="tmp-") diff --git a/ipalib/config.py b/ipalib/config.py index eb823d851..27084577e 100644 --- a/ipalib/config.py +++ b/ipalib/config.py @@ -29,7 +29,6 @@ of the process. For the per-request thread-local information, see `ipalib.request`. """ -import urlparse from ConfigParser import RawConfigParser, ParsingError from types import NoneType import os @@ -37,6 +36,7 @@ from os import path import sys import six +from six.moves.urllib.parse import urlparse, urlunparse from ipapython.dn import DN from ipalib.base import check_name @@ -559,9 +559,9 @@ class Env(object): xmlrpc_uri = defaults.get('xmlrpc_uri') if xmlrpc_uri: (scheme, netloc, uripath, params, query, fragment - ) = urlparse.urlparse(xmlrpc_uri) + ) = urlparse(xmlrpc_uri) uripath = uripath.replace('/xml', '/json', 1) - self.jsonrpc_uri = urlparse.urlunparse(( + self.jsonrpc_uri = urlunparse(( scheme, netloc, uripath, params, query, fragment)) self._merge(**defaults) diff --git a/ipalib/plugins/otptoken.py b/ipalib/plugins/otptoken.py index 651a3ab94..846155dfb 100644 --- a/ipalib/plugins/otptoken.py +++ b/ipalib/plugins/otptoken.py @@ -31,14 +31,11 @@ from ipapython.nsslib import NSSConnection import base64 import uuid -import urllib -import urllib2 -import httplib -import urlparse import qrcode import os import six +from six.moves import urllib if six.PY3: unicode = str @@ -339,8 +336,8 @@ class otptoken_add(LDAPCreate): args['counter'] = entry_attrs['ipatokenhotpcounter'] # Build the URI - label = urllib.quote(entry_attrs['ipatokenuniqueid']) - parameters = urllib.urlencode(args) + label = urllib.parse.quote(entry_attrs['ipatokenuniqueid']) + parameters = urllib.parse.urlencode(args) uri = u'otpauth://%s/%s:%s?%s' % (options['type'], issuer, label, parameters) setattr(context, 'uri', uri) @@ -479,14 +476,14 @@ class otptoken_remove_managedby(LDAPRemoveMember): member_attributes = ['managedby'] -class HTTPSHandler(urllib2.HTTPSHandler): +class HTTPSHandler(urllib.request.HTTPSHandler): "Opens SSL HTTPS connections that perform hostname validation." def __init__(self, **kwargs): self.__kwargs = kwargs # Can't use super() because the parent is an old-style class. - urllib2.HTTPSHandler.__init__(self) + urllib.request.HTTPSHandler.__init__(self) def __inner(self, host, **kwargs): tmp = self.__kwargs.copy() @@ -496,6 +493,7 @@ class HTTPSHandler(urllib2.HTTPSHandler): return NSSConnection(host, **tmp) def https_open(self, req): + # pylint: disable=no-member return self.do_open(self.__inner, req) @register() @@ -519,10 +517,12 @@ class otptoken_sync(Local): status = {'result': {self.header: 'unknown'}} # Get the sync URI. - segments = list(urlparse.urlparse(self.api.env.xmlrpc_uri)) + segments = list(urllib.parse.urlparse(self.api.env.xmlrpc_uri)) assert segments[0] == 'https' # Ensure encryption. segments[2] = segments[2].replace('/xml', '/session/sync_token') - sync_uri = urlparse.urlunparse(segments) + # urlunparse *can* take one argument + # pylint: disable=too-many-function-args + sync_uri = urllib.parse.urlunparse(segments) # Prepare the query. query = {k: v for k, v in kwargs.items() @@ -531,14 +531,14 @@ class otptoken_sync(Local): obj = self.api.Object.otptoken query['token'] = DN((obj.primary_key.name, args[0]), obj.container_dn, self.api.env.basedn) - query = urllib.urlencode(query) + query = urllib.parse.urlencode(query) # Sync the token. # pylint: disable=E1101 handler = HTTPSHandler(dbdir=paths.IPA_NSSDB_DIR, tls_version_min=api.env.tls_version_min, tls_version_max=api.env.tls_version_max) - rsp = urllib2.build_opener(handler).open(sync_uri, query) + rsp = urllib.request.build_opener(handler).open(sync_uri, query) if rsp.getcode() == 200: status['result'][self.header] = rsp.info().get(self.header, 'unknown') rsp.close() diff --git a/ipalib/rpc.py b/ipalib/rpc.py index 3700d44e5..2cf2200d9 100644 --- a/ipalib/rpc.py +++ b/ipalib/rpc.py @@ -37,10 +37,8 @@ import datetime import os import locale import base64 -import urllib import json import socket -from urllib2 import urlparse from xmlrpclib import (Binary, Fault, DateTime, dumps, loads, ServerProxy, Transport, ProtocolError, MININT, MAXINT) @@ -49,6 +47,7 @@ from dns import resolver, rdatatype from dns.exception import DNSException from nss.error import NSPRError import six +from six.moves import urllib from ipalib.backend import Connectible from ipalib.constants import LDAP_GENERALIZED_TIME_FORMAT @@ -720,7 +719,7 @@ class RPCClient(Connectible): """ # the configured URL defines what we use for the discovered servers (scheme, netloc, path, params, query, fragment - ) = urlparse.urlparse(rpc_uri) + ) = urllib.parse.urlparse(rpc_uri) servers = [] name = '_ldap._tcp.%s.' % self.env.domain @@ -828,9 +827,11 @@ class RPCClient(Connectible): setattr(context, 'session_cookie', session_cookie.http_cookie()) # Form the session URL by substituting the session path into the original URL - scheme, netloc, path, params, query, fragment = urlparse.urlparse(original_url) + scheme, netloc, path, params, query, fragment = urllib.parse.urlparse(original_url) path = self.session_path - session_url = urlparse.urlunparse((scheme, netloc, path, params, query, fragment)) + # urlencode *can* take one argument + # pylint: disable=too-many-function-args + session_url = urllib.parse.urlunparse((scheme, netloc, path, params, query, fragment)) return session_url @@ -1019,7 +1020,7 @@ class xmlclient(RPCClient): class JSONServerProxy(object): def __init__(self, uri, transport, encoding, verbose, allow_none): - split_uri = urllib.urlsplit(uri) + split_uri = urllib.parse.urlsplit(uri) if split_uri.scheme not in ("http", "https"): raise IOError("unsupported XML-RPC protocol") self.__host = split_uri.netloc diff --git a/ipalib/session.py b/ipalib/session.py index 3e3c58529..8815268c5 100644 --- a/ipalib/session.py +++ b/ipalib/session.py @@ -21,7 +21,8 @@ import random import os import re import time -from urllib2 import urlparse + +from six.moves.urllib.parse import urlparse from ipalib import errors from ipalib.text import _ @@ -1085,7 +1086,7 @@ class MemcacheSessionManager(SessionManager): expiration = None; cookie = Cookie(self.session_cookie_name, session_id, - domain=urlparse.urlparse(api.env.xmlrpc_uri).netloc, + domain=urlparse(api.env.xmlrpc_uri).netloc, path=url_path, httponly=True, secure=True, expires=expiration) if add_header: diff --git a/ipaplatform/redhat/tasks.py b/ipaplatform/redhat/tasks.py index dd614c906..446e2886e 100644 --- a/ipaplatform/redhat/tasks.py +++ b/ipaplatform/redhat/tasks.py @@ -29,12 +29,12 @@ import os import stat import socket import sys -import urllib import base64 from subprocess import CalledProcessError from nss.error import NSPRError from pyasn1.error import PyAsn1Error +from six.moves import urllib from ipapython.ipa_log_manager import root_logger, log_mgr from ipapython import ipautil @@ -215,11 +215,11 @@ class RedHatTaskNamespace(BaseTaskNamespace): "Failed to decode certificate \"%s\": %s", nickname, e) continue - label = urllib.quote(nickname) - subject = urllib.quote(subject) - issuer = urllib.quote(issuer) - serial_number = urllib.quote(serial_number) - public_key_info = urllib.quote(public_key_info) + label = urllib.parse.quote(nickname) + subject = urllib.parse.quote(subject) + issuer = urllib.parse.quote(issuer) + serial_number = urllib.parse.quote(serial_number) + public_key_info = urllib.parse.quote(public_key_info) cert = base64.b64encode(cert) cert = x509.make_pem(cert) @@ -255,7 +255,7 @@ class RedHatTaskNamespace(BaseTaskNamespace): "Failed to encode extended key usage for \"%s\": %s", nickname, e) continue - value = urllib.quote(ext_key_usage) + value = urllib.parse.quote(ext_key_usage) obj = ("[p11-kit-object-v1]\n" "class: x-certificate-extension\n" "label: \"ExtendedKeyUsage for %(label)s\"\n" diff --git a/ipapython/config.py b/ipapython/config.py index 76168f29e..996e761f2 100644 --- a/ipapython/config.py +++ b/ipapython/config.py @@ -25,10 +25,10 @@ from dns.exception import DNSException from ipapython.dn import DN from ipaplatform.paths import paths import dns.name +from six.moves.urllib.parse import urlsplit import socket import re -import urlparse class IPAConfigError(Exception): def __init__(self, msg=''): @@ -163,7 +163,7 @@ def __parse_config(discover_server = True): if discover_server: try: s = p.get("global", "xmlrpc_uri") - server = urlparse.urlsplit(s) + server = urlsplit(s) config.default_server.append(server.netloc) except: pass diff --git a/ipapython/cookie.py b/ipapython/cookie.py index ee54efd7b..84de94c9c 100644 --- a/ipapython/cookie.py +++ b/ipapython/cookie.py @@ -21,10 +21,10 @@ import re import time import datetime import email.utils -from urllib2 import urlparse from calendar import timegm import six +from six.moves.urllib.parse import urlparse from ipapython.ipa_log_manager import log_mgr @@ -540,7 +540,7 @@ class Cookie(object): received from. ''' - scheme, domain, path, params, query, fragment = urlparse.urlparse(url) + scheme, domain, path, params, query, fragment = urlparse(url) if self.domain is None: self.domain = domain.lower() @@ -642,7 +642,7 @@ class Cookie(object): cookie_name = self.key - url_scheme, url_domain, url_path, url_params, url_query, url_fragment = urlparse.urlparse(url) + url_scheme, url_domain, url_path, url_params, url_query, url_fragment = urlparse(url) cookie_expiration = self.get_expiration() if cookie_expiration is not None: diff --git a/ipapython/dogtag.py b/ipapython/dogtag.py index 305e10a71..398ee0fc4 100644 --- a/ipapython/dogtag.py +++ b/ipapython/dogtag.py @@ -22,10 +22,10 @@ import os import httplib import xml.dom.minidom import ConfigParser -from urllib import urlencode import nss.nss as nss import six +from six.moves.urllib.parse import urlencode from ipalib import api, errors from ipalib.errors import NetworkError diff --git a/ipapython/ipautil.py b/ipapython/ipautil.py index 573e6040c..9e710f955 100644 --- a/ipapython/ipautil.py +++ b/ipapython/ipautil.py @@ -27,7 +27,6 @@ import os, sys, traceback import copy import stat import shutil -import urllib2 import socket import struct from types import * @@ -45,6 +44,7 @@ from dns import resolver, rdatatype from dns.exception import DNSException import six from six.moves import input +from six.moves import urllib from ipapython.ipa_log_manager import * from ipapython import ipavalidate @@ -391,7 +391,7 @@ def nolog_replace(string, nolog): if not isinstance(value, six.string_types): continue - quoted = urllib2.quote(value) + quoted = urllib.parse.quote(value) shquoted = shell_quote(value) for nolog_value in (shquoted, value, quoted): string = string.replace(nolog_value, 'XXXXXXXX') diff --git a/ipaserver/install/cainstance.py b/ipaserver/install/cainstance.py index c4788816a..7a3d46fd5 100644 --- a/ipaserver/install/cainstance.py +++ b/ipaserver/install/cainstance.py @@ -38,11 +38,12 @@ import sys import syslog import time import tempfile -import urllib import xml.dom.minidom import shlex import pipes +from six.moves import urllib + from ipalib import api from ipalib import pkcs10, x509 from ipalib import errors @@ -846,7 +847,7 @@ class CAInstance(DogtagInstance): params['op'] = 'approve' params['submit'] = 'submit' params['requestNotes'] = '' - params = urllib.urlencode(params) + params = urllib.parse.urlencode(params) # Now issue the RA certificate. args = [ @@ -1074,7 +1075,7 @@ class CAInstance(DogtagInstance): # Send the request to the CA conn = httplib.HTTPConnection( self.fqdn, self.dogtag_constants.UNSECURE_PORT) - params = urllib.urlencode({'profileId': 'caServerCert', + params = urllib.parse.urlencode({'profileId': 'caServerCert', 'cert_request_type': 'pkcs10', 'requestor_name': 'IPA Installer', 'cert_request': csr, diff --git a/ipaserver/plugins/dogtag.py b/ipaserver/plugins/dogtag.py index 1a4bf2eab..6758b9077 100644 --- a/ipaserver/plugins/dogtag.py +++ b/ipaserver/plugins/dogtag.py @@ -244,13 +244,13 @@ from lxml import etree import os import tempfile import time -import urllib2 import pki from pki.client import PKIConnection import pki.crypto as cryptoutil from pki.kra import KRAClient import six +from six.moves import urllib from ipalib import Backend from ipapython.dn import DN @@ -1843,21 +1843,21 @@ class ra(rabase.rabase): url = 'http://%s/ca/rest/certs/search?size=%d' % (ipautil.format_netloc(self.ca_host, ipapython.dogtag.configured_constants().UNSECURE_PORT), options.get('sizelimit', 100)) - opener = urllib2.build_opener() + opener = urllib.request.build_opener() opener.addheaders = [('Accept-Encoding', 'gzip, deflate'), ('User-Agent', 'IPA')] - req = urllib2.Request(url=url, data=payload, headers={'Content-Type': 'application/xml'}) + req = urllib.request.Request(url=url, data=payload, headers={'Content-Type': 'application/xml'}) try: response = opener.open(req) - except urllib2.HTTPError, e: + except urllib.error.HTTPError as e: self.debug('HTTP Response code: %d' % e.getcode()) if e.getcode() == 501: self.raise_certificate_operation_error('find', detail=_('find not supported on CAs upgraded from 9 to 10')) self.raise_certificate_operation_error('find', detail=e.msg) - except urllib2.URLError, e: + except urllib.error.URLError as e: self.raise_certificate_operation_error('find', detail=e.reason) @@ -1866,7 +1866,7 @@ class ra(rabase.rabase): parser = etree.XMLParser() try: doc = etree.fromstring(data[0], parser) - except etree.XMLSyntaxError, e: + except etree.XMLSyntaxError as e: self.raise_certificate_operation_error('find', detail=e.msg) diff --git a/ipaserver/rpcserver.py b/ipaserver/rpcserver.py index 554f4f506..72c481df3 100644 --- a/ipaserver/rpcserver.py +++ b/ipaserver/rpcserver.py @@ -27,7 +27,6 @@ from xml.sax.saxutils import escape from xmlrpclib import Fault import os import datetime -import urlparse import json import traceback import gssapi @@ -37,6 +36,7 @@ import ldap.controls from pyasn1.type import univ, namedtype from pyasn1.codec.ber import encoder import six +from six.moves.urllib.parse import parse_qs from ipalib import plugable, errors from ipalib.capabilities import VERSION_WITHOUT_CAPABILITIES @@ -225,9 +225,7 @@ def extract_query(environ): elif environ['REQUEST_METHOD'] == 'GET': qstr = environ['QUERY_STRING'] if qstr: - query = dict(nicify_query( - urlparse.parse_qs(qstr)#, keep_blank_values=True) - )) + query = dict(nicify_query(parse_qs(qstr))) # keep_blank_values=True) else: query = {} environ['wsgi.query'] = query @@ -892,7 +890,7 @@ class login_password(Backend, KerberosSession, HTTP_Status): return self.bad_request(environ, start_response, "HTTP request method must be POST") try: - query_dict = urlparse.parse_qs(query_string) + query_dict = parse_qs(query_string) except Exception as e: return self.bad_request(environ, start_response, "cannot parse query data") @@ -1013,7 +1011,7 @@ class change_password(Backend, HTTP_Status): return self.bad_request(environ, start_response, "HTTP request method must be POST") try: - query_dict = urlparse.parse_qs(query_string) + query_dict = parse_qs(query_string) except Exception as e: return self.bad_request(environ, start_response, "cannot parse query data") @@ -1115,7 +1113,7 @@ class sync_token(Backend, HTTP_Status): # Parse the query string to a dictionary. try: - query_dict = urlparse.parse_qs(query_string) + query_dict = parse_qs(query_string) except Exception as e: return self.bad_request(environ, start_response, "cannot parse query data") data = {} diff --git a/ipatests/test_ipaserver/httptest.py b/ipatests/test_ipaserver/httptest.py index 7f1b5b136..891364c06 100644 --- a/ipatests/test_ipaserver/httptest.py +++ b/ipatests/test_ipaserver/httptest.py @@ -20,9 +20,10 @@ Base class for HTTP request tests """ -import urllib import httplib +from six.moves import urllib + from ipalib import api class Unauthorized_HTTP_test(object): @@ -41,7 +42,9 @@ class Unauthorized_HTTP_test(object): :param key When not None, overrides default app_uri """ if params is not None: - params = urllib.urlencode(params, True) + # urlencode *can* take two arguments + # pylint: disable=too-many-function-args + params = urllib.parse.urlencode(params, True) url = 'https://' + self.host + self.app_uri headers = {'Content-Type' : self.content_type, diff --git a/ipatests/test_webui/ui_driver.py b/ipatests/test_webui/ui_driver.py index 6f2013c4a..fc22f8612 100644 --- a/ipatests/test_webui/ui_driver.py +++ b/ipatests/test_webui/ui_driver.py @@ -53,7 +53,7 @@ try: NO_YAML = False except ImportError: NO_YAML = True -from urllib2 import URLError +from six.moves.urllib.error import URLError from ipaplatform.paths import paths ENV_MAP = { |