diff --git a/ironic/api/controllers/v1/allocation.py b/ironic/api/controllers/v1/allocation.py index 8022a077a3..0e305dc3d7 100644 --- a/ironic/api/controllers/v1/allocation.py +++ b/ironic/api/controllers/v1/allocation.py @@ -11,11 +11,11 @@ # under the License. import datetime +from http import client as http_client from ironic_lib import metrics_utils from oslo_utils import uuidutils import pecan -from six.moves import http_client from webob import exc as webob_exc import wsme from wsme import types as wtypes diff --git a/ironic/api/controllers/v1/chassis.py b/ironic/api/controllers/v1/chassis.py index b446d815e7..91c776e8e2 100644 --- a/ironic/api/controllers/v1/chassis.py +++ b/ironic/api/controllers/v1/chassis.py @@ -14,11 +14,11 @@ # under the License. import datetime +from http import client as http_client from ironic_lib import metrics_utils from oslo_utils import uuidutils from pecan import rest -from six.moves import http_client import wsme from wsme import types as wtypes diff --git a/ironic/api/controllers/v1/deploy_template.py b/ironic/api/controllers/v1/deploy_template.py index bc713d97c9..ccd0b74b3c 100644 --- a/ironic/api/controllers/v1/deploy_template.py +++ b/ironic/api/controllers/v1/deploy_template.py @@ -12,6 +12,7 @@ import collections import datetime +from http import client as http_client from ironic_lib import metrics_utils from oslo_log import log @@ -19,7 +20,6 @@ from oslo_utils import strutils from oslo_utils import uuidutils import pecan from pecan import rest -from six.moves import http_client from webob import exc as webob_exc import wsme from wsme import types as wtypes diff --git a/ironic/api/controllers/v1/driver.py b/ironic/api/controllers/v1/driver.py index 9a6672cd7f..c4e4c936db 100644 --- a/ironic/api/controllers/v1/driver.py +++ b/ironic/api/controllers/v1/driver.py @@ -13,9 +13,10 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client + from ironic_lib import metrics_utils from pecan import rest -from six.moves import http_client import wsme from wsme import types as wtypes diff --git a/ironic/api/controllers/v1/event.py b/ironic/api/controllers/v1/event.py index 5a133f2dd2..477c57b90a 100644 --- a/ironic/api/controllers/v1/event.py +++ b/ironic/api/controllers/v1/event.py @@ -10,10 +10,11 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client + from ironic_lib import metrics_utils from oslo_log import log import pecan -from six.moves import http_client from ironic import api from ironic.api.controllers.v1 import collection diff --git a/ironic/api/controllers/v1/node.py b/ironic/api/controllers/v1/node.py index 3c168a6d10..305b88a22b 100644 --- a/ironic/api/controllers/v1/node.py +++ b/ironic/api/controllers/v1/node.py @@ -14,6 +14,7 @@ # under the License. import datetime +from http import client as http_client from ironic_lib import metrics_utils import jsonschema @@ -22,7 +23,6 @@ from oslo_utils import strutils from oslo_utils import uuidutils import pecan from pecan import rest -from six.moves import http_client import wsme from wsme import types as wtypes diff --git a/ironic/api/controllers/v1/port.py b/ironic/api/controllers/v1/port.py index e824be8b14..982ac6572e 100644 --- a/ironic/api/controllers/v1/port.py +++ b/ironic/api/controllers/v1/port.py @@ -14,12 +14,12 @@ # under the License. import datetime +from http import client as http_client from ironic_lib import metrics_utils from oslo_log import log from oslo_utils import uuidutils from pecan import rest -from six.moves import http_client import wsme from wsme import types as wtypes diff --git a/ironic/api/controllers/v1/portgroup.py b/ironic/api/controllers/v1/portgroup.py index 27a21e089b..6fa1dec442 100644 --- a/ironic/api/controllers/v1/portgroup.py +++ b/ironic/api/controllers/v1/portgroup.py @@ -11,11 +11,11 @@ # under the License. import datetime +from http import client as http_client from ironic_lib import metrics_utils from oslo_utils import uuidutils import pecan -from six.moves import http_client import wsme from wsme import types as wtypes diff --git a/ironic/api/controllers/v1/ramdisk.py b/ironic/api/controllers/v1/ramdisk.py index cab6ef28cb..56c182e8b2 100644 --- a/ironic/api/controllers/v1/ramdisk.py +++ b/ironic/api/controllers/v1/ramdisk.py @@ -12,10 +12,11 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client + from oslo_config import cfg from oslo_log import log from pecan import rest -from six.moves import http_client from wsme import types as wtypes from ironic import api diff --git a/ironic/api/controllers/v1/types.py b/ironic/api/controllers/v1/types.py index c478c28172..d7cf999fe1 100644 --- a/ironic/api/controllers/v1/types.py +++ b/ironic/api/controllers/v1/types.py @@ -21,7 +21,6 @@ import json from oslo_log import log from oslo_utils import strutils from oslo_utils import uuidutils -import six import wsme from wsme import types as wtypes @@ -121,7 +120,7 @@ class BooleanType(wtypes.UserType): return strutils.bool_from_string(value, strict=True) except ValueError as e: # raise Invalid to return 400 (BadRequest) in the API - raise exception.Invalid(six.text_type(e)) + raise exception.Invalid(str(e)) @staticmethod def frombasetype(value): @@ -138,7 +137,7 @@ class JsonType(wtypes.UserType): def __str__(self): # These are the json serializable native types - return ' | '.join(map(str, (wtypes.text, six.integer_types, float, + return ' | '.join(map(str, (wtypes.text, int, float, BooleanType, list, dict, None))) @staticmethod @@ -170,7 +169,7 @@ class ListType(wtypes.UserType): same order """ items = [] - for v in six.text_type(value).split(','): + for v in str(value).split(','): v_norm = v.strip().lower() if v_norm and v_norm not in items: items.append(v_norm) diff --git a/ironic/api/controllers/v1/utils.py b/ironic/api/controllers/v1/utils.py index cb8156db8d..158468423f 100644 --- a/ironic/api/controllers/v1/utils.py +++ b/ironic/api/controllers/v1/utils.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client import inspect import re @@ -23,8 +24,6 @@ import os_traits from oslo_config import cfg from oslo_utils import uuidutils from pecan import rest -import six -from six.moves import http_client from webob import static import wsme @@ -103,7 +102,7 @@ def validate_trait(trait, error_prefix=_('Invalid trait')): 'A custom trait must start with the prefix CUSTOM_ and use ' 'the following characters: A-Z, 0-9 and _') % {'error_prefix': error_prefix}) - if not isinstance(trait, six.string_types): + if not isinstance(trait, str): raise error if len(trait) > 255 or len(trait) < 1: @@ -422,7 +421,7 @@ def vendor_passthru(ident, method, topic, data=None, driver_passthru=False): # Attach the return value to the response object if response.get('attach'): - if isinstance(return_value, six.text_type): + if isinstance(return_value, str): # If unicode, convert to bytes return_value = return_value.encode('utf-8') file_ = wsme.types.File(content=return_value) diff --git a/ironic/api/controllers/v1/volume.py b/ironic/api/controllers/v1/volume.py index 4e9f6aef29..50843066a3 100644 --- a/ironic/api/controllers/v1/volume.py +++ b/ironic/api/controllers/v1/volume.py @@ -12,9 +12,10 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client + import pecan from pecan import rest -from six.moves import http_client import wsme from ironic import api diff --git a/ironic/api/controllers/v1/volume_connector.py b/ironic/api/controllers/v1/volume_connector.py index 8dcb36619c..af19f1922a 100644 --- a/ironic/api/controllers/v1/volume_connector.py +++ b/ironic/api/controllers/v1/volume_connector.py @@ -13,12 +13,11 @@ # under the License. import datetime +from http import client as http_client from ironic_lib import metrics_utils from oslo_utils import uuidutils from pecan import rest -import six -from six.moves import http_client import wsme from wsme import types as wtypes @@ -417,7 +416,7 @@ class VolumeConnectorsController(rest.RestController): for value in values: if not uuidutils.is_uuid_like(value): message = _("Expected a UUID for node_uuid, but received " - "%(uuid)s.") % {'uuid': six.text_type(value)} + "%(uuid)s.") % {'uuid': str(value)} raise exception.InvalidUUID(message=message) rpc_connector = objects.VolumeConnector.get_by_uuid(context, diff --git a/ironic/api/controllers/v1/volume_target.py b/ironic/api/controllers/v1/volume_target.py index 63afd35af7..b4c2f89f6d 100644 --- a/ironic/api/controllers/v1/volume_target.py +++ b/ironic/api/controllers/v1/volume_target.py @@ -13,12 +13,11 @@ # under the License. import datetime +from http import client as http_client from ironic_lib import metrics_utils from oslo_utils import uuidutils from pecan import rest -import six -from six.moves import http_client import wsme from wsme import types as wtypes @@ -429,7 +428,7 @@ class VolumeTargetsController(rest.RestController): for value in values: if not uuidutils.is_uuid_like(value): message = _("Expected a UUID for node_uuid, but received " - "%(uuid)s.") % {'uuid': six.text_type(value)} + "%(uuid)s.") % {'uuid': str(value)} raise exception.InvalidUUID(message=message) rpc_target = objects.VolumeTarget.get_by_uuid(context, target_uuid) diff --git a/ironic/api/hooks.py b/ironic/api/hooks.py index 9ce7b0f797..2e7cc9e7ad 100644 --- a/ironic/api/hooks.py +++ b/ironic/api/hooks.py @@ -14,13 +14,12 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client import re from oslo_config import cfg from oslo_log import log from pecan import hooks -import six -from six.moves import http_client from ironic.common import context from ironic.common import policy @@ -48,7 +47,7 @@ def policy_deprecation_check(): } policy_rules = enforcer.file_rules.values() for rule in policy_rules: - str_rule = six.text_type(rule) + str_rule = str(rule) for deprecated, replacement in substitution_dict.items(): if re.search(r'\b%s\b' % deprecated, str_rule): LOG.warning( diff --git a/ironic/api/middleware/parsable_error.py b/ironic/api/middleware/parsable_error.py index 88208aa631..cc02ab4646 100644 --- a/ironic/api/middleware/parsable_error.py +++ b/ironic/api/middleware/parsable_error.py @@ -23,7 +23,6 @@ Based on pecan.middleware.errordocument import json from oslo_log import log -import six from ironic.common.i18n import _ @@ -69,11 +68,9 @@ class ParsableErrorMiddleware(object): app_iter = self.app(environ, replacement_start_response) if (state['status_code'] // 100) not in (2, 3): - if six.PY3: - app_iter = [i.decode('utf-8') for i in app_iter] + app_iter = [i.decode('utf-8') for i in app_iter] body = [json.dumps({'error_message': '\n'.join(app_iter)})] - if six.PY3: - body = [item.encode('utf-8') for item in body] + body = [item.encode('utf-8') for item in body] state['headers'].append(('Content-Type', 'application/json')) state['headers'].append(('Content-Length', str(len(body[0])))) else: diff --git a/ironic/common/exception.py b/ironic/common/exception.py index b03e4a87fc..1d100f8329 100644 --- a/ironic/common/exception.py +++ b/ironic/common/exception.py @@ -16,9 +16,10 @@ """Ironic specific exceptions list.""" +from http import client as http_client + from ironic_lib.exception import IronicException from oslo_log import log as logging -from six.moves import http_client from ironic.common.i18n import _ diff --git a/ironic/common/fsm.py b/ironic/common/fsm.py index 7f1e193bd0..7dcc30ab86 100644 --- a/ironic/common/fsm.py +++ b/ironic/common/fsm.py @@ -12,9 +12,10 @@ # License for the specific language governing permissions and limitations # under the License. +import functools + from automaton import exceptions as automaton_exceptions from automaton import machines -import six """State machine modelling. @@ -31,7 +32,7 @@ from ironic.common.i18n import _ def _translate_excp(func): """Decorator to translate automaton exceptions into ironic exceptions.""" - @six.wraps(func) + @functools.wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) @@ -39,9 +40,9 @@ def _translate_excp(func): automaton_exceptions.NotInitialized, automaton_exceptions.FrozenMachine, automaton_exceptions.NotFound) as e: - raise excp.InvalidState(six.text_type(e)) + raise excp.InvalidState(str(e)) except automaton_exceptions.Duplicate as e: - raise excp.Duplicate(six.text_type(e)) + raise excp.Duplicate(str(e)) return wrapper diff --git a/ironic/common/glance_service/image_service.py b/ironic/common/glance_service/image_service.py index e3d74d38cf..e1a9bbf87e 100644 --- a/ironic/common/glance_service/image_service.py +++ b/ironic/common/glance_service/image_service.py @@ -14,18 +14,18 @@ # under the License. import collections +import functools import os import re import sys import time +from urllib import parse as urlparse from glanceclient import client from glanceclient import exc as glance_exc from oslo_log import log from oslo_utils import uuidutils import sendfile -import six -from six.moves.urllib import parse as urlparse from swiftclient import utils as swift_utils from ironic.common import exception @@ -56,7 +56,7 @@ def _translate_image_exception(image_id, exc_value): def check_image_service(func): """Creates a glance client if doesn't exists and calls the function.""" - @six.wraps(func) + @functools.wraps(func) def wrapper(self, *args, **kwargs): """Wrapper around methods calls. @@ -153,7 +153,7 @@ class GlanceImageService(object): exc_type, exc_value, exc_trace = sys.exc_info() new_exc = _translate_image_exception( args[0], exc_value) - six.reraise(type(new_exc), new_exc, exc_trace) + raise type(new_exc)(new_exc).with_traceback(exc_trace) @check_image_service def show(self, image_href): diff --git a/ironic/common/glance_service/service_utils.py b/ironic/common/glance_service/service_utils.py index 601895e015..d7a7022858 100644 --- a/ironic/common/glance_service/service_utils.py +++ b/ironic/common/glance_service/service_utils.py @@ -19,7 +19,6 @@ import copy from oslo_serialization import jsonutils from oslo_utils import timeutils from oslo_utils import uuidutils -import six from ironic.common import exception @@ -70,7 +69,7 @@ def _convert(metadata): for attr in _CONVERT_PROPS: if attr in properties: prop = properties[attr] - if isinstance(prop, six.string_types): + if isinstance(prop, str): properties[attr] = jsonutils.loads(prop) return metadata @@ -83,7 +82,7 @@ def parse_image_id(image_href): :raises InvalidImageRef: when input image href is invalid """ - image_href = six.text_type(image_href) + image_href = str(image_href) if uuidutils.is_uuid_like(image_href): image_id = image_href elif image_href.startswith('glance://'): @@ -130,7 +129,7 @@ def is_image_active(image): def is_glance_image(image_href): - if not isinstance(image_href, six.string_types): + if not isinstance(image_href, str): return False return (image_href.startswith('glance://') or uuidutils.is_uuid_like(image_href)) diff --git a/ironic/common/image_service.py b/ironic/common/image_service.py index bde9173d00..c9c7026afd 100644 --- a/ironic/common/image_service.py +++ b/ironic/common/image_service.py @@ -17,16 +17,15 @@ import abc import datetime +from http import client as http_client import os import shutil +from urllib import parse as urlparse from oslo_log import log from oslo_utils import uuidutils import requests import sendfile -import six -from six.moves import http_client -import six.moves.urllib.parse as urlparse from ironic.common import exception from ironic.common.glance_service import image_service @@ -45,8 +44,7 @@ LOG = log.getLogger(__name__) GlanceImageService = image_service.GlanceImageService -@six.add_metaclass(abc.ABCMeta) -class BaseImageService(object): +class BaseImageService(object, metaclass=abc.ABCMeta): """Provides retrieval of disk images.""" @abc.abstractmethod @@ -103,7 +101,7 @@ class HttpImageService(BaseImageService): "HEAD request.") % response.status_code) except requests.RequestException as e: raise exception.ImageRefValidationFailed(image_href=output_url, - reason=six.text_type(e)) + reason=str(e)) return response def download(self, image_href, image_file): @@ -128,7 +126,7 @@ class HttpImageService(BaseImageService): shutil.copyfileobj(input_img, image_file, IMAGE_CHUNK_SIZE) except (requests.RequestException, IOError) as e: raise exception.ImageDownloadFailed(image_href=image_href, - reason=six.text_type(e)) + reason=str(e)) def show(self, image_href): """Get dictionary of image properties. @@ -228,7 +226,7 @@ class FileImageService(BaseImageService): offset += nbytes_out except Exception as e: raise exception.ImageDownloadFailed(image_href=image_href, - reason=six.text_type(e)) + reason=str(e)) def show(self, image_href): """Get dictionary of image properties. @@ -272,7 +270,7 @@ def get_image_service(image_href, client=None, context=None): scheme = urlparse.urlparse(image_href).scheme.lower() if not scheme: - if uuidutils.is_uuid_like(six.text_type(image_href)): + if uuidutils.is_uuid_like(str(image_href)): cls = GlanceImageService else: raise exception.ImageRefValidationFailed( diff --git a/ironic/common/keystone.py b/ironic/common/keystone.py index 90645e168c..233533b552 100644 --- a/ironic/common/keystone.py +++ b/ironic/common/keystone.py @@ -14,12 +14,13 @@ """Central place for handling Keystone authorization and service lookup.""" +import functools + from keystoneauth1 import exceptions as kaexception from keystoneauth1 import loading as kaloading from keystoneauth1 import service_token from keystoneauth1 import token_endpoint from oslo_log import log as logging -import six from ironic.common import exception from ironic.conf import CONF @@ -30,7 +31,7 @@ LOG = logging.getLogger(__name__) def ks_exceptions(f): """Wraps keystoneclient functions and centralizes exception handling.""" - @six.wraps(f) + @functools.wraps(f) def wrapper(*args, **kwargs): try: return f(*args, **kwargs) @@ -43,11 +44,11 @@ def ks_exceptions(f): raise exception.KeystoneUnauthorized() except (kaexception.NoMatchingPlugin, kaexception.MissingRequiredOptions) as e: - raise exception.ConfigInvalid(six.text_type(e)) + raise exception.ConfigInvalid(str(e)) except Exception as e: LOG.exception('Keystone request failed: %(msg)s', - {'msg': six.text_type(e)}) - raise exception.KeystoneFailure(six.text_type(e)) + {'msg': str(e)}) + raise exception.KeystoneFailure(str(e)) return wrapper diff --git a/ironic/common/swift.py b/ironic/common/swift.py index b1f5dec34b..7340912d6e 100644 --- a/ironic/common/swift.py +++ b/ironic/common/swift.py @@ -14,9 +14,9 @@ # License for the specific language governing permissions and limitations # under the License. -import six -from six.moves import http_client -from six.moves.urllib import parse +from http import client as http_client +from urllib import parse as urlparse + from swiftclient import client as swift_client from swiftclient import exceptions as swift_exceptions from swiftclient import utils as swift_utils @@ -69,7 +69,7 @@ class SwiftAPI(object): params['timeout'] = session.timeout if session.verify is False: params['insecure'] = True - elif isinstance(session.verify, six.string_types): + elif isinstance(session.verify, str): params['cacert'] = session.verify if session.cert: # NOTE(pas-ha) although setting cert as path to single file @@ -129,17 +129,14 @@ class SwiftAPI(object): raise exception.SwiftOperationError(operation=operation, error=e) - parse_result = parse.urlparse(self.connection.url) + parse_result = urlparse.urlparse(self.connection.url) swift_object_path = '/'.join((parse_result.path, container, obj)) temp_url_key = account_info['x-account-meta-temp-url-key'] url_path = swift_utils.generate_temp_url(swift_object_path, timeout, temp_url_key, 'GET') - return parse.urlunparse((parse_result.scheme, - parse_result.netloc, - url_path, - None, - None, - None)) + return urlparse.urlunparse( + (parse_result.scheme, parse_result.netloc, url_path, + None, None, None)) def delete_object(self, container, obj): """Deletes the given Swift object. diff --git a/ironic/common/utils.py b/ironic/common/utils.py index f170dabdf8..16453d74e7 100644 --- a/ironic/common/utils.py +++ b/ironic/common/utils.py @@ -35,7 +35,6 @@ from oslo_utils import fileutils from oslo_utils import netutils from oslo_utils import timeutils import pytz -import six from ironic.common import exception from ironic.common.i18n import _ @@ -92,7 +91,7 @@ def is_valid_datapath_id(datapath_id): """ m = "^[0-9a-f]{16}$" - return (isinstance(datapath_id, six.string_types) + return (isinstance(datapath_id, str) and re.match(m, datapath_id.lower())) @@ -114,7 +113,7 @@ def is_valid_logical_name(hostname): ALPHA / DIGIT / "-" / "." / "_" / "~" """ - if not isinstance(hostname, six.string_types) or len(hostname) > 255: + if not isinstance(hostname, str) or len(hostname) > 255: return False return _is_valid_logical_name_re.match(hostname) is not None @@ -136,7 +135,7 @@ def is_hostname_safe(hostname): :param hostname: The hostname to be validated. :returns: True if valid. False if not. """ - if not isinstance(hostname, six.string_types) or len(hostname) > 255: + if not isinstance(hostname, str) or len(hostname) > 255: return False return _is_hostname_safe_re.match(hostname) is not None @@ -153,7 +152,7 @@ def is_valid_no_proxy(no_proxy): (with optional :port). :returns: True if no_proxy is valid, False otherwise. """ - if not isinstance(no_proxy, six.string_types): + if not isinstance(no_proxy, str): return False hostname_re = re.compile('(?!-)[A-Z\\d-]{1,63}(? end_time) or (num_tries == 0) or not err_list): diff --git a/ironic/drivers/modules/irmc/boot.py b/ironic/drivers/modules/irmc/boot.py index 677f56048d..76c1d00a25 100644 --- a/ironic/drivers/modules/irmc/boot.py +++ b/ironic/drivers/modules/irmc/boot.py @@ -19,12 +19,12 @@ iRMC Boot Driver import os import shutil import tempfile +from urllib import parse as urlparse from ironic_lib import metrics_utils from ironic_lib import utils as ironic_utils from oslo_log import log as logging from oslo_utils import importutils -import six.moves.urllib.parse as urlparse from ironic.common import boot_devices from ironic.common import exception diff --git a/ironic/drivers/modules/irmc/common.py b/ironic/drivers/modules/irmc/common.py index 9f04d74e1e..8f81f8cec0 100644 --- a/ironic/drivers/modules/irmc/common.py +++ b/ironic/drivers/modules/irmc/common.py @@ -17,7 +17,6 @@ Common functionalities shared between different iRMC modules. """ from oslo_log import log as logging from oslo_utils import importutils -import six from ironic.common import exception from ironic.common.i18n import _ @@ -113,13 +112,13 @@ def parse_driver_info(node): d_info['irmc_snmp_port']) if (d_info['irmc_snmp_version'].lower() in ('v1', 'v2c') and d_info['irmc_snmp_community'] - and not isinstance(d_info['irmc_snmp_community'], six.string_types)): + and not isinstance(d_info['irmc_snmp_community'], str)): error_msgs.append( _("Value '%s' is not a string for 'irmc_snmp_community'") % d_info['irmc_snmp_community']) if d_info['irmc_snmp_version'].lower() == 'v3': if d_info['irmc_snmp_security']: - if not isinstance(d_info['irmc_snmp_security'], six.string_types): + if not isinstance(d_info['irmc_snmp_security'], str): error_msgs.append( _("Value '%s' is not a string for " "'irmc_snmp_security'") % d_info['irmc_snmp_security']) diff --git a/ironic/drivers/modules/irmc/raid.py b/ironic/drivers/modules/irmc/raid.py index e366732a37..9016956322 100644 --- a/ironic/drivers/modules/irmc/raid.py +++ b/ironic/drivers/modules/irmc/raid.py @@ -19,7 +19,6 @@ from futurist import periodics from ironic_lib import metrics_utils from oslo_log import log as logging from oslo_utils import importutils -import six from ironic.common import exception from ironic.common import raid as raid_common @@ -392,7 +391,7 @@ class IRMCRAID(base.RAIDInterface): logical_disks = target_raid_config['logical_disks'] for log_disk in logical_disks: if log_disk.get('raid_level'): - log_disk['raid_level'] = six.text_type( + log_disk['raid_level'] = str( log_disk['raid_level']).replace('+', '') # Validate physical disks on Fujitsu BM Server diff --git a/ironic/drivers/modules/iscsi_deploy.py b/ironic/drivers/modules/iscsi_deploy.py index 692b16d200..89603a8e6b 100644 --- a/ironic/drivers/modules/iscsi_deploy.py +++ b/ironic/drivers/modules/iscsi_deploy.py @@ -13,12 +13,13 @@ # License for the specific language governing permissions and limitations # under the License. +from urllib import parse as urlparse + from ironic_lib import disk_utils from ironic_lib import metrics_utils from ironic_lib import utils as il_utils from oslo_log import log as logging from oslo_utils import excutils -from six.moves.urllib import parse from ironic.common import dhcp_factory from ironic.common import exception @@ -284,7 +285,7 @@ def do_agent_iscsi_deploy(task, agent_client): deploy_utils.set_failed_state(task, msg) raise exception.InstanceDeployFailure(reason=msg) - address = parse.urlparse(node.driver_internal_info['agent_url']) + address = urlparse.urlparse(node.driver_internal_info['agent_url']) address = address.hostname uuid_dict_returned = continue_deploy(task, iqn=iqn, address=address, diff --git a/ironic/drivers/modules/redfish/boot.py b/ironic/drivers/modules/redfish/boot.py index 2ae75b6aab..f3538b6ebd 100644 --- a/ironic/drivers/modules/redfish/boot.py +++ b/ironic/drivers/modules/redfish/boot.py @@ -16,11 +16,11 @@ import os import shutil import tempfile +from urllib import parse as urlparse from ironic_lib import utils as ironic_utils from oslo_log import log from oslo_utils import importutils -from six.moves.urllib import parse as urlparse from ironic.common import boot_devices from ironic.common import exception diff --git a/ironic/drivers/modules/redfish/utils.py b/ironic/drivers/modules/redfish/utils.py index 69be609188..fbf0a3b559 100644 --- a/ironic/drivers/modules/redfish/utils.py +++ b/ironic/drivers/modules/redfish/utils.py @@ -15,6 +15,7 @@ import collections import os +from urllib import parse as urlparse from oslo_log import log from oslo_utils import excutils @@ -22,8 +23,6 @@ from oslo_utils import importutils from oslo_utils import strutils import retrying import rfc3986 -import six -from six.moves import urllib from ironic.common import exception from ironic.common.i18n import _ @@ -111,7 +110,7 @@ def parse_driver_info(node): {'address': address, 'node': node.uuid}) try: - system_id = urllib.parse.quote(driver_info['redfish_system_id']) + system_id = urlparse.quote(driver_info['redfish_system_id']) except (TypeError, AttributeError): raise exception.InvalidParameterValue( _('Invalid value "%(value)s" set in ' @@ -123,7 +122,7 @@ def parse_driver_info(node): # Check if verify_ca is a Boolean or a file/directory in the file-system verify_ca = driver_info.get('redfish_verify_ca', True) - if isinstance(verify_ca, six.string_types): + if isinstance(verify_ca, str): if os.path.isdir(verify_ca) or os.path.isfile(verify_ca): pass else: diff --git a/ironic/drivers/modules/snmp.py b/ironic/drivers/modules/snmp.py index cd444305b4..2a21550505 100644 --- a/ironic/drivers/modules/snmp.py +++ b/ironic/drivers/modules/snmp.py @@ -29,7 +29,6 @@ import time from oslo_log import log as logging from oslo_service import loopingcall from oslo_utils import importutils -import six from ironic.common import exception from ironic.common.i18n import _ @@ -430,8 +429,7 @@ def retry_on_outdated_cache(f): return wrapper -@six.add_metaclass(abc.ABCMeta) -class SNMPDriverBase(object): +class SNMPDriverBase(object, metaclass=abc.ABCMeta): """SNMP power driver base class. The SNMPDriver class hierarchy implements manufacturer-specific MIB actions diff --git a/ironic/drivers/utils.py b/ironic/drivers/utils.py index e0c69aa81b..99b2a76657 100644 --- a/ironic/drivers/utils.py +++ b/ironic/drivers/utils.py @@ -20,7 +20,6 @@ from oslo_log import log as logging from oslo_serialization import base64 from oslo_utils import strutils from oslo_utils import timeutils -import six from ironic.common import exception from ironic.common.i18n import _ @@ -239,7 +238,7 @@ def capabilities_to_dict(capabilities): """ capabilities_dict = {} if capabilities: - if not isinstance(capabilities, six.string_types): + if not isinstance(capabilities, str): raise exception.InvalidParameterValue( _("Value of 'capabilities' must be string. Got %s") % type(capabilities)) diff --git a/ironic/objects/fields.py b/ironic/objects/fields.py index fad3ac74df..528e998b26 100644 --- a/ironic/objects/fields.py +++ b/ironic/objects/fields.py @@ -18,7 +18,6 @@ import hashlib import inspect from oslo_versionedobjects import fields as object_fields -import six from ironic.common import utils @@ -89,7 +88,7 @@ class ListOfObjectsField(object_fields.ListOfObjectsField): class FlexibleDict(object_fields.FieldType): @staticmethod def coerce(obj, attr, value): - if isinstance(value, six.string_types): + if isinstance(value, str): value = ast.literal_eval(value) return dict(value) diff --git a/ironic/objects/node.py b/ironic/objects/node.py index 9c4b49c2a4..c3d6e0104b 100644 --- a/ironic/objects/node.py +++ b/ironic/objects/node.py @@ -18,7 +18,6 @@ from oslo_utils import strutils from oslo_utils import uuidutils from oslo_utils import versionutils from oslo_versionedobjects import base as object_base -import six from ironic.common import exception from ironic.common.i18n import _ @@ -424,7 +423,7 @@ class Node(base.IronicObject, object_base.VersionedObjectDictCompat): for attr_name in ('last_error', 'maintenance_reason'): attr_value = getattr(self, attr_name, '') - if (attr_value and isinstance(attr_value, six.string_types) and + if (attr_value and isinstance(attr_value, str) and len(attr_value) > CONF.log_in_db_max_size): LOG.info('Truncating too long %s to %s characters for node %s', attr_name, CONF.log_in_db_max_size, self.uuid) diff --git a/ironic/tests/unit/api/base.py b/ironic/tests/unit/api/base.py index ed907f67d6..d26308e825 100644 --- a/ironic/tests/unit/api/base.py +++ b/ironic/tests/unit/api/base.py @@ -20,11 +20,12 @@ # ceilometer/tests/api/__init__.py). This should be oslo'ified: # https://bugs.launchpad.net/ironic/+bug/1255115. +from urllib import parse as urlparse + import mock from oslo_config import cfg import pecan import pecan.testing -from six.moves.urllib import parse as urlparse from ironic.tests.unit.db import base as db_base diff --git a/ironic/tests/unit/api/controllers/test_base.py b/ironic/tests/unit/api/controllers/test_base.py index 237076de6f..423eaffa52 100644 --- a/ironic/tests/unit/api/controllers/test_base.py +++ b/ironic/tests/unit/api/controllers/test_base.py @@ -13,8 +13,9 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client + import mock -from six.moves import http_client from webob import exc from ironic.api.controllers import base as cbase diff --git a/ironic/tests/unit/api/controllers/v1/test_allocation.py b/ironic/tests/unit/api/controllers/v1/test_allocation.py index faa7cf528b..f0a3fbd211 100644 --- a/ironic/tests/unit/api/controllers/v1/test_allocation.py +++ b/ironic/tests/unit/api/controllers/v1/test_allocation.py @@ -14,15 +14,14 @@ Tests for the API /allocations/ methods. """ import datetime +from http import client as http_client +from urllib import parse as urlparse import fixtures import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from wsme import types as wtypes from ironic.api.controllers import base as api_base @@ -175,7 +174,7 @@ class TestListAllocations(test_api_base.BaseApiTest): self.assertEqual(len(allocations), len(data['allocations'])) uuids = [n['uuid'] for n in data['allocations']] - six.assertCountEqual(self, allocations, uuids) + self.assertCountEqual(allocations, uuids) def test_links(self): uuid = uuidutils.generate_uuid() diff --git a/ironic/tests/unit/api/controllers/v1/test_chassis.py b/ironic/tests/unit/api/controllers/v1/test_chassis.py index a46c3e48a5..f2e11d9f43 100644 --- a/ironic/tests/unit/api/controllers/v1/test_chassis.py +++ b/ironic/tests/unit/api/controllers/v1/test_chassis.py @@ -16,14 +16,13 @@ Tests for the API /chassis/ methods. """ import datetime +from http import client as http_client +from urllib import parse as urlparse import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from wsme import types as wtypes from ironic.api.controllers import base as api_base @@ -181,7 +180,7 @@ class TestListChassis(test_api_base.BaseApiTest): data = self.get_json('/chassis') self.assertEqual(len(ch_list), len(data['chassis'])) uuids = [n['uuid'] for n in data['chassis']] - six.assertCountEqual(self, ch_list, uuids) + self.assertCountEqual(ch_list, uuids) def _test_links(self, public_url=None): cfg.CONF.set_override('public_endpoint', public_url, 'api') diff --git a/ironic/tests/unit/api/controllers/v1/test_conductor.py b/ironic/tests/unit/api/controllers/v1/test_conductor.py index 1a5905320f..8a96a2faff 100644 --- a/ironic/tests/unit/api/controllers/v1/test_conductor.py +++ b/ironic/tests/unit/api/controllers/v1/test_conductor.py @@ -14,12 +14,12 @@ Tests for the API /conductors/ methods. """ import datetime +from http import client as http_client import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -from six.moves import http_client from ironic.api.controllers import base as api_base from ironic.api.controllers import v1 as api_v1 diff --git a/ironic/tests/unit/api/controllers/v1/test_deploy_template.py b/ironic/tests/unit/api/controllers/v1/test_deploy_template.py index 049a21f7bc..96fd16cedf 100644 --- a/ironic/tests/unit/api/controllers/v1/test_deploy_template.py +++ b/ironic/tests/unit/api/controllers/v1/test_deploy_template.py @@ -14,14 +14,13 @@ Tests for the API /deploy_templates/ methods. """ import datetime +from http import client as http_client +from urllib import parse as urlparse import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from ironic.api.controllers import base as api_base from ironic.api.controllers import v1 as api_v1 @@ -207,7 +206,7 @@ class TestListDeployTemplates(BaseDeployTemplatesAPITest): self.assertEqual(len(templates), len(data['deploy_templates'])) uuids = [n['uuid'] for n in data['deploy_templates']] - six.assertCountEqual(self, templates, uuids) + self.assertCountEqual(templates, uuids) def test_links(self): uuid = uuidutils.generate_uuid() diff --git a/ironic/tests/unit/api/controllers/v1/test_driver.py b/ironic/tests/unit/api/controllers/v1/test_driver.py index 601fde7d8f..965c390f0c 100644 --- a/ironic/tests/unit/api/controllers/v1/test_driver.py +++ b/ironic/tests/unit/api/controllers/v1/test_driver.py @@ -13,11 +13,11 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client import json import mock from oslo_config import cfg -from six.moves import http_client from testtools import matchers from ironic.api.controllers import base as api_base diff --git a/ironic/tests/unit/api/controllers/v1/test_event.py b/ironic/tests/unit/api/controllers/v1/test_event.py index 939e198215..082c74493e 100644 --- a/ironic/tests/unit/api/controllers/v1/test_event.py +++ b/ironic/tests/unit/api/controllers/v1/test_event.py @@ -13,8 +13,9 @@ Tests for the API /events methods. """ +from http import client as http_client + import mock -from six.moves import http_client from ironic.api.controllers import base as api_base from ironic.api.controllers.v1 import types diff --git a/ironic/tests/unit/api/controllers/v1/test_node.py b/ironic/tests/unit/api/controllers/v1/test_node.py index 4415ca5088..b8f55464fb 100644 --- a/ironic/tests/unit/api/controllers/v1/test_node.py +++ b/ironic/tests/unit/api/controllers/v1/test_node.py @@ -14,16 +14,15 @@ Tests for the API /nodes/ methods. """ import datetime +from http import client as http_client import json +from urllib import parse as urlparse import fixtures import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from testtools import matchers from wsme import types as wtypes @@ -3476,8 +3475,7 @@ class TestPost(test_api_base.BaseApiTest): is_async=True): expected_status = http_client.ACCEPTED if is_async else http_client.OK expected_return_value = json.dumps(return_value) - if six.PY3: - expected_return_value = expected_return_value.encode('utf-8') + expected_return_value = expected_return_value.encode('utf-8') node = obj_utils.create_test_node(self.context) info = {'foo': 'bar'} @@ -3495,8 +3493,7 @@ class TestPost(test_api_base.BaseApiTest): is_async=True): expected_status = http_client.ACCEPTED if is_async else http_client.OK expected_return_value = json.dumps(return_value) - if six.PY3: - expected_return_value = expected_return_value.encode('utf-8') + expected_return_value = expected_return_value.encode('utf-8') node = obj_utils.create_test_node(self.context, name='node-109') info = {'foo': 'bar'} diff --git a/ironic/tests/unit/api/controllers/v1/test_port.py b/ironic/tests/unit/api/controllers/v1/test_port.py index 630f66b9a9..51a84209bc 100644 --- a/ironic/tests/unit/api/controllers/v1/test_port.py +++ b/ironic/tests/unit/api/controllers/v1/test_port.py @@ -14,15 +14,14 @@ Tests for the API /ports/ methods. """ import datetime +from http import client as http_client import types +from urllib import parse as urlparse import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from testtools import matchers from wsme import types as wtypes @@ -580,7 +579,7 @@ class TestListPorts(test_api_base.BaseApiTest): self.assertEqual(len(ports), len(data['ports'])) uuids = [n['uuid'] for n in data['ports']] - six.assertCountEqual(self, ports, uuids) + self.assertCountEqual(ports, uuids) def _test_links(self, public_url=None): cfg.CONF.set_override('public_endpoint', public_url, 'api') diff --git a/ironic/tests/unit/api/controllers/v1/test_portgroup.py b/ironic/tests/unit/api/controllers/v1/test_portgroup.py index de2c13e6f0..d0bcd62d0c 100644 --- a/ironic/tests/unit/api/controllers/v1/test_portgroup.py +++ b/ironic/tests/unit/api/controllers/v1/test_portgroup.py @@ -14,14 +14,13 @@ Tests for the API /portgroups/ methods. """ import datetime +from http import client as http_client +from urllib import parse as urlparse import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from testtools.matchers import HasLength from wsme import types as wtypes @@ -277,7 +276,7 @@ class TestListPortgroups(test_api_base.BaseApiTest): self.assertEqual(len(portgroups), len(data['portgroups'])) uuids = [n['uuid'] for n in data['portgroups']] - six.assertCountEqual(self, portgroups, uuids) + self.assertCountEqual(portgroups, uuids) def test_links(self): uuid = uuidutils.generate_uuid() diff --git a/ironic/tests/unit/api/controllers/v1/test_ramdisk.py b/ironic/tests/unit/api/controllers/v1/test_ramdisk.py index 0bdd9dfbeb..086c3edf42 100644 --- a/ironic/tests/unit/api/controllers/v1/test_ramdisk.py +++ b/ironic/tests/unit/api/controllers/v1/test_ramdisk.py @@ -15,11 +15,12 @@ Tests for the API /lookup/ methods. """ +from http import client as http_client + import fixtures import mock from oslo_config import cfg from oslo_utils import uuidutils -from six.moves import http_client from ironic.api.controllers import base as api_base from ironic.api.controllers import v1 as api_v1 diff --git a/ironic/tests/unit/api/controllers/v1/test_types.py b/ironic/tests/unit/api/controllers/v1/test_types.py index 9dccb2bb36..a16dd40a4b 100644 --- a/ironic/tests/unit/api/controllers/v1/test_types.py +++ b/ironic/tests/unit/api/controllers/v1/test_types.py @@ -14,11 +14,11 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. + +from http import client as http_client import platform import mock -import six -from six.moves import http_client import webtest import wsme from wsme import types as wtypes @@ -264,8 +264,7 @@ class TestJsonType(base.TestCase): def test_apimultitype_tostring(self): vts = str(types.jsontype) self.assertIn(str(wtypes.text), vts) - for int_type in six.integer_types: - self.assertIn(str(int_type), vts) + self.assertIn(str(int), vts) self.assertIn(str(float), vts) self.assertIn(str(types.BooleanType), vts) self.assertIn(str(list), vts) diff --git a/ironic/tests/unit/api/controllers/v1/test_utils.py b/ironic/tests/unit/api/controllers/v1/test_utils.py index dd45bba7ef..6495e26a93 100644 --- a/ironic/tests/unit/api/controllers/v1/test_utils.py +++ b/ironic/tests/unit/api/controllers/v1/test_utils.py @@ -14,11 +14,12 @@ # License for the specific language governing permissions and limitations # under the License. +from http import client as http_client + import mock import os_traits from oslo_config import cfg from oslo_utils import uuidutils -from six.moves import http_client from webob import static import wsme diff --git a/ironic/tests/unit/api/controllers/v1/test_volume.py b/ironic/tests/unit/api/controllers/v1/test_volume.py index 13f17ac27c..9bc50d52a5 100644 --- a/ironic/tests/unit/api/controllers/v1/test_volume.py +++ b/ironic/tests/unit/api/controllers/v1/test_volume.py @@ -13,7 +13,7 @@ Tests for the API /volume/ methods. """ -from six.moves import http_client +from http import client as http_client from ironic.api.controllers import base as api_base from ironic.api.controllers import v1 as api_v1 diff --git a/ironic/tests/unit/api/controllers/v1/test_volume_connector.py b/ironic/tests/unit/api/controllers/v1/test_volume_connector.py index 3f58fae418..f168978cfa 100644 --- a/ironic/tests/unit/api/controllers/v1/test_volume_connector.py +++ b/ironic/tests/unit/api/controllers/v1/test_volume_connector.py @@ -16,14 +16,13 @@ Tests for the API /volume connectors/ methods. """ import datetime +from http import client as http_client +from urllib import parse as urlparse import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from wsme import types as wtypes from ironic.api.controllers import base as api_base @@ -222,7 +221,7 @@ class TestListVolumeConnectors(test_api_base.BaseApiTest): self.assertEqual(len(connectors), len(data['connectors'])) uuids = [n['uuid'] for n in data['connectors']] - six.assertCountEqual(self, connectors, uuids) + self.assertCountEqual(connectors, uuids) def test_links(self): uuid = uuidutils.generate_uuid() diff --git a/ironic/tests/unit/api/controllers/v1/test_volume_target.py b/ironic/tests/unit/api/controllers/v1/test_volume_target.py index cdd014af2d..868627b617 100644 --- a/ironic/tests/unit/api/controllers/v1/test_volume_target.py +++ b/ironic/tests/unit/api/controllers/v1/test_volume_target.py @@ -16,14 +16,13 @@ Tests for the API /volume targets/ methods. """ import datetime +from http import client as http_client +from urllib import parse as urlparse import mock from oslo_config import cfg from oslo_utils import timeutils from oslo_utils import uuidutils -import six -from six.moves import http_client -from six.moves.urllib import parse as urlparse from wsme import types as wtypes from ironic.api.controllers import base as api_base @@ -212,7 +211,7 @@ class TestListVolumeTargets(test_api_base.BaseApiTest): self.assertEqual(len(targets), len(data['targets'])) uuids = [n['uuid'] for n in data['targets']] - six.assertCountEqual(self, targets, uuids) + self.assertCountEqual(targets, uuids) def test_links(self): uuid = uuidutils.generate_uuid() diff --git a/ironic/tests/unit/api/test_acl.py b/ironic/tests/unit/api/test_acl.py index fb11250099..c358f5a15b 100644 --- a/ironic/tests/unit/api/test_acl.py +++ b/ironic/tests/unit/api/test_acl.py @@ -16,9 +16,10 @@ Tests for ACL. Checks whether certain kinds of requests are blocked or allowed to be processed. """ +from http import client as http_client + import mock from oslo_config import cfg -from six.moves import http_client from ironic.tests.unit.api import base from ironic.tests.unit.api import utils diff --git a/ironic/tests/unit/api/test_hooks.py b/ironic/tests/unit/api/test_hooks.py index 08cdda30a0..095d08a36b 100644 --- a/ironic/tests/unit/api/test_hooks.py +++ b/ironic/tests/unit/api/test_hooks.py @@ -14,13 +14,12 @@ """Tests for the Pecan API hooks.""" +from http import client as http_client import json import mock from oslo_config import cfg import oslo_messaging as messaging -import six -from six.moves import http_client from ironic.api.controllers import root from ironic.api import hooks @@ -130,7 +129,7 @@ class TestNoExceptionTracebackHook(base.BaseApiTest): # we don't care about this garbage. expected_msg = ("Remote error: %s %s" % (test_exc_type, self.MSG_WITHOUT_TRACE) - + ("\n[u'" if six.PY2 else "\n['")) + + "\n['") actual_msg = json.loads(response.json['error_message'])['faultstring'] self.assertEqual(expected_msg, actual_msg) diff --git a/ironic/tests/unit/api/test_middleware.py b/ironic/tests/unit/api/test_middleware.py index 495284a422..dfc7ed991a 100644 --- a/ironic/tests/unit/api/test_middleware.py +++ b/ironic/tests/unit/api/test_middleware.py @@ -15,9 +15,10 @@ Tests to assert that various incorporated middleware works as expected. """ +from http import client as http_client + from oslo_config import cfg import oslo_middleware.cors as cors_middleware -from six.moves import http_client from ironic.tests.unit.api import base diff --git a/ironic/tests/unit/api/test_root.py b/ironic/tests/unit/api/test_root.py index b0828f3752..9a512d7ada 100644 --- a/ironic/tests/unit/api/test_root.py +++ b/ironic/tests/unit/api/test_root.py @@ -13,7 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. -from six.moves import http_client +from http import client as http_client from ironic.api.controllers.v1 import versions from ironic.tests.unit.api import base diff --git a/ironic/tests/unit/common/test_cinder.py b/ironic/tests/unit/common/test_cinder.py index f289a0d828..db5a96fbb3 100644 --- a/ironic/tests/unit/common/test_cinder.py +++ b/ironic/tests/unit/common/test_cinder.py @@ -12,13 +12,13 @@ # under the License. import datetime +from http import client as http_client import json from cinderclient import exceptions as cinder_exceptions import cinderclient.v3 as cinderclient import mock from oslo_utils import uuidutils -from six.moves import http_client from ironic.common import cinder from ironic.common import context diff --git a/ironic/tests/unit/common/test_image_service.py b/ironic/tests/unit/common/test_image_service.py index 243d4d90d7..bc0d391b68 100644 --- a/ironic/tests/unit/common/test_image_service.py +++ b/ironic/tests/unit/common/test_image_service.py @@ -10,7 +10,10 @@ # License for the specific language governing permissions and limitations # under the License. +import builtins import datetime +from http import client as http_client +import io import os import shutil @@ -18,19 +21,12 @@ import mock from oslo_utils import uuidutils import requests import sendfile -import six -import six.moves.builtins as __builtin__ -from six.moves import http_client from ironic.common import exception from ironic.common.glance_service import image_service as glance_v2_service from ironic.common import image_service from ironic.tests import base -if six.PY3: - import io - file = io.BytesIO - class HttpImageServiceTestCase(base.TestCase): def setUp(self): @@ -74,8 +70,8 @@ class HttpImageServiceTestCase(base.TestCase): self.service.validate_href, self.href, True) - self.assertIn('secreturl', six.text_type(e)) - self.assertNotIn(self.href, six.text_type(e)) + self.assertIn('secreturl', str(e)) + self.assertNotIn(self.href, str(e)) head_mock.assert_called_once_with(self.href) @mock.patch.object(requests, 'head', autospec=True) @@ -115,8 +111,8 @@ class HttpImageServiceTestCase(base.TestCase): def test_download_success(self, req_get_mock, shutil_mock): response_mock = req_get_mock.return_value response_mock.status_code = http_client.OK - response_mock.raw = mock.MagicMock(spec=file) - file_mock = mock.Mock(spec=file) + response_mock.raw = mock.MagicMock(spec=io.BytesIO) + file_mock = mock.Mock(spec=io.BytesIO) self.service.download(self.href, file_mock) shutil_mock.assert_called_once_with( response_mock.raw.__enter__(), file_mock, @@ -127,7 +123,7 @@ class HttpImageServiceTestCase(base.TestCase): @mock.patch.object(requests, 'get', autospec=True) def test_download_fail_connerror(self, req_get_mock): req_get_mock.side_effect = requests.ConnectionError() - file_mock = mock.Mock(spec=file) + file_mock = mock.Mock(spec=io.BytesIO) self.assertRaises(exception.ImageDownloadFailed, self.service.download, self.href, file_mock) @@ -136,8 +132,8 @@ class HttpImageServiceTestCase(base.TestCase): def test_download_fail_ioerror(self, req_get_mock, shutil_mock): response_mock = req_get_mock.return_value response_mock.status_code = http_client.OK - response_mock.raw = mock.MagicMock(spec=file) - file_mock = mock.Mock(spec=file) + response_mock.raw = mock.MagicMock(spec=io.BytesIO) + file_mock = mock.Mock(spec=io.BytesIO) shutil_mock.side_effect = IOError self.assertRaises(exception.ImageDownloadFailed, self.service.download, self.href, file_mock) @@ -188,7 +184,7 @@ class FileImageServiceTestCase(base.TestCase): remove_mock, link_mock): _validate_mock.return_value = self.href_path stat_mock.return_value.st_dev = 'dev1' - file_mock = mock.Mock(spec=file) + file_mock = mock.Mock(spec=io.BytesIO) file_mock.name = 'file' self.service.download(self.href, file_mock) _validate_mock.assert_called_once_with(mock.ANY, self.href) @@ -199,7 +195,7 @@ class FileImageServiceTestCase(base.TestCase): @mock.patch.object(sendfile, 'sendfile', return_value=42, autospec=True) @mock.patch.object(os.path, 'getsize', return_value=42, autospec=True) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) @mock.patch.object(os, 'access', return_value=False, autospec=True) @mock.patch.object(os, 'stat', autospec=True) @mock.patch.object(image_service.FileImageService, 'validate_href', @@ -208,9 +204,9 @@ class FileImageServiceTestCase(base.TestCase): open_mock, size_mock, copy_mock): _validate_mock.return_value = self.href_path stat_mock.return_value.st_dev = 'dev1' - file_mock = mock.MagicMock(spec=file) + file_mock = mock.MagicMock(spec=io.BytesIO) file_mock.name = 'file' - input_mock = mock.MagicMock(spec=file) + input_mock = mock.MagicMock(spec=io.BytesIO) open_mock.return_value = input_mock self.service.download(self.href, file_mock) _validate_mock.assert_called_once_with(mock.ANY, self.href) @@ -222,7 +218,7 @@ class FileImageServiceTestCase(base.TestCase): @mock.patch.object(sendfile, 'sendfile', autospec=True) @mock.patch.object(os.path, 'getsize', return_value=42, autospec=True) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) @mock.patch.object(os, 'access', return_value=False, autospec=True) @mock.patch.object(os, 'stat', autospec=True) @mock.patch.object(image_service.FileImageService, 'validate_href', @@ -236,9 +232,9 @@ class FileImageServiceTestCase(base.TestCase): fake_chunk_seq = [chunk_size, chunk_size, chunk_size, 1024] _validate_mock.return_value = self.href_path stat_mock.return_value.st_dev = 'dev1' - file_mock = mock.MagicMock(spec=file) + file_mock = mock.MagicMock(spec=io.BytesIO) file_mock.name = 'file' - input_mock = mock.MagicMock(spec=file) + input_mock = mock.MagicMock(spec=io.BytesIO) open_mock.return_value = input_mock size_mock.return_value = fake_image_size copy_mock.side_effect = fake_chunk_seq @@ -262,7 +258,7 @@ class FileImageServiceTestCase(base.TestCase): access_mock, remove_mock): _validate_mock.return_value = self.href_path stat_mock.return_value.st_dev = 'dev1' - file_mock = mock.MagicMock(spec=file) + file_mock = mock.MagicMock(spec=io.BytesIO) file_mock.name = 'file' self.assertRaises(exception.ImageDownloadFailed, self.service.download, self.href, file_mock) @@ -273,7 +269,7 @@ class FileImageServiceTestCase(base.TestCase): @mock.patch.object(sendfile, 'sendfile', side_effect=OSError, autospec=True) @mock.patch.object(os.path, 'getsize', return_value=42, autospec=True) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) @mock.patch.object(os, 'access', return_value=False, autospec=True) @mock.patch.object(os, 'stat', autospec=True) @mock.patch.object(image_service.FileImageService, 'validate_href', @@ -282,9 +278,9 @@ class FileImageServiceTestCase(base.TestCase): open_mock, size_mock, copy_mock): _validate_mock.return_value = self.href_path stat_mock.return_value.st_dev = 'dev1' - file_mock = mock.MagicMock(spec=file) + file_mock = mock.MagicMock(spec=io.BytesIO) file_mock.name = 'file' - input_mock = mock.MagicMock(spec=file) + input_mock = mock.MagicMock(spec=io.BytesIO) open_mock.return_value = input_mock self.assertRaises(exception.ImageDownloadFailed, self.service.download, self.href, file_mock) diff --git a/ironic/tests/unit/common/test_images.py b/ironic/tests/unit/common/test_images.py index 86143fc96a..78514d1ea4 100644 --- a/ironic/tests/unit/common/test_images.py +++ b/ironic/tests/unit/common/test_images.py @@ -15,6 +15,8 @@ # License for the specific language governing permissions and limitations # under the License. +import builtins +import io import os import shutil @@ -23,8 +25,6 @@ from ironic_lib import utils as ironic_utils import mock from oslo_concurrency import processutils from oslo_config import cfg -import six -import six.moves.builtins as __builtin__ from ironic.common import exception from ironic.common.glance_service import service_utils as glance_utils @@ -33,10 +33,6 @@ from ironic.common import images from ironic.common import utils from ironic.tests import base -if six.PY3: - import io - file = io.BytesIO - CONF = cfg.CONF @@ -46,9 +42,9 @@ class IronicImagesTestCase(base.TestCase): pass @mock.patch.object(image_service, 'get_image_service', autospec=True) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) def test_fetch_image_service(self, open_mock, image_service_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'file' open_mock.return_value = mock_file_handle @@ -62,10 +58,10 @@ class IronicImagesTestCase(base.TestCase): @mock.patch.object(image_service, 'get_image_service', autospec=True) @mock.patch.object(images, 'image_to_raw', autospec=True) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) def test_fetch_image_service_force_raw(self, open_mock, image_to_raw_mock, image_service_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'file' open_mock.return_value = mock_file_handle @@ -294,7 +290,7 @@ class FsImageTestCase(base.TestCase): self, mkfs_mock, mount_mock, umount_mock, dd_mock, write_mock, tempdir_mock, create_root_fs_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tempdir' tempdir_mock.return_value = mock_file_handle @@ -329,7 +325,7 @@ class FsImageTestCase(base.TestCase): self, mkfs_mock, mount_mock, umount_mock, dd_mock, tempdir_mock, create_root_fs_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tempdir' tempdir_mock.return_value = mock_file_handle files_info = {'a': 'b'} @@ -353,7 +349,7 @@ class FsImageTestCase(base.TestCase): def test_create_vfat_image_mkfs_fails(self, mkfs_mock, dd_mock, tempdir_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tempdir' tempdir_mock.return_value = mock_file_handle @@ -371,7 +367,7 @@ class FsImageTestCase(base.TestCase): self, mkfs_mock, mount_mock, umount_mock, dd_mock, tempdir_mock, create_root_fs_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tempdir' tempdir_mock.return_value = mock_file_handle umount_mock.side_effect = processutils.ProcessExecutionError @@ -513,9 +509,9 @@ class FsImageTestCase(base.TestCase): 'path/to/grub': 'relpath/to/grub.cfg'} grub_rel_path = 'relpath/to/grub.cfg' e_img_rel_path = 'path/to/efiboot.img' - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' - mock_file_handle1 = mock.MagicMock(spec=file) + mock_file_handle1 = mock.MagicMock(spec=io.BytesIO) mock_file_handle1.__enter__.return_value = 'mountdir' tempdir_mock.side_effect = mock_file_handle, mock_file_handle1 mount_mock.return_value = (uefi_path_info, @@ -561,9 +557,9 @@ class FsImageTestCase(base.TestCase): grub_options = {'linux': '/vmlinuz', 'initrd': '/initrd'} - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' - mock_file_handle1 = mock.MagicMock(spec=file) + mock_file_handle1 = mock.MagicMock(spec=io.BytesIO) mock_file_handle1.__enter__.return_value = 'mountdir' tempdir_mock.side_effect = mock_file_handle, mock_file_handle1 mountdir_grub_cfg_path = 'tmpdir' + grub_cfg_file @@ -590,7 +586,7 @@ class FsImageTestCase(base.TestCase): self, gen_cfg_mock, execute_mock, tempdir_mock, write_to_file_mock, create_root_fs_mock, ldlinux_path=None): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle @@ -653,9 +649,9 @@ class FsImageTestCase(base.TestCase): create_root_fs_mock, umount_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' - mock_file_handle1 = mock.MagicMock(spec=file) + mock_file_handle1 = mock.MagicMock(spec=io.BytesIO) mock_file_handle1.__enter__.return_value = 'mountdir' tempdir_mock.side_effect = mock_file_handle, mock_file_handle1 create_root_fs_mock.side_effect = IOError @@ -698,9 +694,9 @@ class FsImageTestCase(base.TestCase): write_to_file_mock, create_root_fs_mock, umount_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' - mock_file_handle1 = mock.MagicMock(spec=file) + mock_file_handle1 = mock.MagicMock(spec=io.BytesIO) mock_file_handle1.__enter__.return_value = 'mountdir' tempdir_mock.side_effect = mock_file_handle, mock_file_handle1 mount_mock.return_value = ({'a': 'a'}, 'b', 'c') @@ -725,7 +721,7 @@ class FsImageTestCase(base.TestCase): tempdir_mock, write_to_file_mock, create_root_fs_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle utils_mock.side_effect = processutils.ProcessExecutionError @@ -740,7 +736,7 @@ class FsImageTestCase(base.TestCase): @mock.patch.object(utils, 'tempdir', autospec=True) def test_create_boot_iso_for_uefi_deploy_iso( self, tempdir_mock, fetch_images_mock, create_isolinux_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle @@ -768,7 +764,7 @@ class FsImageTestCase(base.TestCase): @mock.patch.object(utils, 'tempdir', autospec=True) def test_create_boot_iso_for_uefi_esp_image( self, tempdir_mock, fetch_images_mock, create_isolinux_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle @@ -796,7 +792,7 @@ class FsImageTestCase(base.TestCase): @mock.patch.object(utils, 'tempdir', autospec=True) def test_create_boot_iso_for_uefi_deploy_iso_for_hrefs( self, tempdir_mock, fetch_images_mock, create_isolinux_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle @@ -824,7 +820,7 @@ class FsImageTestCase(base.TestCase): @mock.patch.object(utils, 'tempdir', autospec=True) def test_create_boot_iso_for_uefi_esp_image_for_hrefs( self, tempdir_mock, fetch_images_mock, create_isolinux_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle @@ -852,7 +848,7 @@ class FsImageTestCase(base.TestCase): @mock.patch.object(utils, 'tempdir', autospec=True) def test_create_boot_iso_for_bios( self, tempdir_mock, fetch_images_mock, create_isolinux_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle @@ -884,7 +880,7 @@ class FsImageTestCase(base.TestCase): def test_create_boot_iso_for_bios_with_no_boot_mode(self, tempdir_mock, fetch_images_mock, create_isolinux_mock): - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'tmpdir' tempdir_mock.return_value = mock_file_handle diff --git a/ironic/tests/unit/common/test_pxe_utils.py b/ironic/tests/unit/common/test_pxe_utils.py index 778792d7c5..851f14b0a2 100644 --- a/ironic/tests/unit/common/test_pxe_utils.py +++ b/ironic/tests/unit/common/test_pxe_utils.py @@ -22,7 +22,6 @@ import mock from oslo_config import cfg from oslo_utils import fileutils from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.common.glance_service import image_service @@ -122,7 +121,7 @@ class TestPXEUtils(db_base.DbTestCase): with open('ironic/tests/unit/drivers/pxe_config.template') as f: expected_template = f.read().rstrip() - self.assertEqual(six.text_type(expected_template), rendered_template) + self.assertEqual(str(expected_template), rendered_template) def test_default_ipxe_boot_script(self): rendered_template = utils.render_template( @@ -132,7 +131,7 @@ class TestPXEUtils(db_base.DbTestCase): with open('ironic/tests/unit/drivers/boot.ipxe') as f: expected_template = f.read().rstrip() - self.assertEqual(six.text_type(expected_template), rendered_template) + self.assertEqual(str(expected_template), rendered_template) def test_default_ipxe_config(self): # NOTE(lucasagomes): iPXE is just an extension of the PXE driver, @@ -154,7 +153,7 @@ class TestPXEUtils(db_base.DbTestCase): with open(templ_file) as f: expected_template = f.read().rstrip() - self.assertEqual(six.text_type(expected_template), rendered_template) + self.assertEqual(str(expected_template), rendered_template) def test_default_ipxe_timeout_config(self): # NOTE(lucasagomes): iPXE is just an extension of the PXE driver, @@ -176,7 +175,7 @@ class TestPXEUtils(db_base.DbTestCase): with open(templ_file) as f: expected_template = f.read().rstrip() - self.assertEqual(six.text_type(expected_template), rendered_template) + self.assertEqual(str(expected_template), rendered_template) def test_default_ipxe_boot_from_volume_config(self): self.config( @@ -195,7 +194,7 @@ class TestPXEUtils(db_base.DbTestCase): with open(templ_file) as f: expected_template = f.read().rstrip() - self.assertEqual(six.text_type(expected_template), rendered_template) + self.assertEqual(str(expected_template), rendered_template) def test_default_ipxe_boot_from_volume_config_no_extra_volumes(self): self.config( @@ -217,7 +216,7 @@ class TestPXEUtils(db_base.DbTestCase): 'ipxe_config_boot_from_volume_no_extra_volumes.template' with open(templ_file) as f: expected_template = f.read().rstrip() - self.assertEqual(six.text_type(expected_template), rendered_template) + self.assertEqual(str(expected_template), rendered_template) def test_default_grub_config(self): pxe_opts = self.pxe_options @@ -233,7 +232,7 @@ class TestPXEUtils(db_base.DbTestCase): with open(templ_file) as f: expected_template = f.read().rstrip() - self.assertEqual(six.text_type(expected_template), rendered_template) + self.assertEqual(str(expected_template), rendered_template) @mock.patch('ironic.common.utils.create_link_without_raise', autospec=True) @mock.patch('ironic_lib.utils.unlink_without_raise', autospec=True) diff --git a/ironic/tests/unit/common/test_release_mappings.py b/ironic/tests/unit/common/test_release_mappings.py index 19b52fe230..db3f18f857 100644 --- a/ironic/tests/unit/common/test_release_mappings.py +++ b/ironic/tests/unit/common/test_release_mappings.py @@ -14,7 +14,6 @@ import mock from oslo_utils import versionutils -import six from ironic.api.controllers.v1 import versions as api_versions from ironic.common import release_mappings @@ -50,16 +49,16 @@ class ReleaseMappingsTestCase(base.TestCase): for value in release_mappings.RELEASE_MAPPING.values(): self.assertIsInstance(value, dict) self.assertEqual({'api', 'rpc', 'objects'}, set(value)) - self.assertIsInstance(value['api'], six.string_types) + self.assertIsInstance(value['api'], str) (major, minor) = value['api'].split('.') self.assertEqual(1, int(major)) self.assertLessEqual(int(minor), api_versions.MINOR_MAX_VERSION) - self.assertIsInstance(value['rpc'], six.string_types) + self.assertIsInstance(value['rpc'], str) self.assertIsInstance(value['objects'], dict) for obj_value in value['objects'].values(): self.assertIsInstance(obj_value, list) for ver in obj_value: - self.assertIsInstance(ver, six.string_types) + self.assertIsInstance(ver, str) tuple_ver = versionutils.convert_version_to_tuple(ver) self.assertEqual(2, len(tuple_ver)) diff --git a/ironic/tests/unit/common/test_states.py b/ironic/tests/unit/common/test_states.py index d841ac3bbe..1688b000c0 100644 --- a/ironic/tests/unit/common/test_states.py +++ b/ironic/tests/unit/common/test_states.py @@ -12,8 +12,6 @@ # License for the specific language governing permissions and limitations # under the License. -import six - from ironic.common import states from ironic.tests import base @@ -31,7 +29,7 @@ class StatesTest(base.TestCase): for key, value in states.__dict__.items(): # Assumption: A state variable name is all UPPERCASE and contents # are a string. - if key.upper() == key and isinstance(value, six.string_types): + if key.upper() == key and isinstance(value, str): self.assertLessEqual( len(value), 15, "Value for state: {} is greater than 15 characters".format( diff --git a/ironic/tests/unit/common/test_swift.py b/ironic/tests/unit/common/test_swift.py index a4b6c89fad..cb53d16ba4 100644 --- a/ironic/tests/unit/common/test_swift.py +++ b/ironic/tests/unit/common/test_swift.py @@ -12,11 +12,12 @@ # License for the specific language governing permissions and limitations # under the License. +import builtins +from http import client as http_client +import io + import mock from oslo_config import cfg -import six -from six.moves import builtins as __builtin__ -from six.moves import http_client from swiftclient import client as swift_client from swiftclient import exceptions as swift_exception from swiftclient import utils as swift_utils @@ -27,10 +28,6 @@ from ironic.tests import base CONF = cfg.CONF -if six.PY3: - import io - file = io.BytesIO - @mock.patch.object(swift, 'get_swift_session', autospec=True, return_value=mock.Mock(verify=False, cert=('spam', 'ham'), @@ -57,11 +54,11 @@ class SwiftTestCase(base.TestCase): os_options={'object_storage_url': 'http://example.com/objects'} ) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) def test_create_object(self, open_mock, connection_mock, keystone_mock): swiftapi = swift.SwiftAPI() connection_obj_mock = connection_mock.return_value - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'file-object' open_mock.return_value = mock_file_handle @@ -75,7 +72,7 @@ class SwiftTestCase(base.TestCase): 'container', 'object', 'file-object', headers=None) self.assertEqual('object-uuid', object_uuid) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) def test_create_object_create_container_fails(self, open_mock, connection_mock, keystone_mock): @@ -88,11 +85,11 @@ class SwiftTestCase(base.TestCase): connection_obj_mock.put_container.assert_called_once_with('container') self.assertFalse(connection_obj_mock.put_object.called) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) def test_create_object_put_object_fails(self, open_mock, connection_mock, keystone_mock): swiftapi = swift.SwiftAPI() - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = 'file-object' open_mock.return_value = mock_file_handle connection_obj_mock = connection_mock.return_value diff --git a/ironic/tests/unit/conductor/test_manager.py b/ironic/tests/unit/conductor/test_manager.py index b3564ad9ef..301610b82c 100644 --- a/ironic/tests/unit/conductor/test_manager.py +++ b/ironic/tests/unit/conductor/test_manager.py @@ -20,6 +20,7 @@ from collections import namedtuple import datetime +import queue import re import eventlet @@ -31,8 +32,6 @@ import oslo_messaging as messaging from oslo_utils import uuidutils from oslo_versionedobjects import base as ovo_base from oslo_versionedobjects import fields -import six -from six.moves import queue from ironic.common import boot_devices from ironic.common import driver_factory @@ -5881,12 +5880,6 @@ class SensorsTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase): self.assertEqual(5, validate_mock.call_count) self.assertEqual(5, get_sensors_data_mock.call_count) self.assertEqual(5, notifier_mock.call_count) - if six.PY2: - # bail out if python2 as matching fails to match the - # data structure becasue it requires the order to be consistent - # but the mock also records the call dictionary contents in - # random order changing with every invocation. :\ - return n_call = mock.call(mock.ANY, mock.ANY, 'hardware.fake.metrics', {'event_type': 'hardware.fake.metrics.update', 'node_name': 'fake_node', 'timestamp': mock.ANY, @@ -6505,7 +6498,7 @@ class RaidHardwareTypeTestCases(RaidTestCases): self.node.refresh() self.assertEqual({}, self.node.target_raid_config) self.assertEqual(exception.UnsupportedDriverExtension, exc.exc_info[0]) - self.assertIn('manual-management', six.text_type(exc.exc_info[1])) + self.assertIn('manual-management', str(exc.exc_info[1])) @mock.patch.object(conductor_utils, 'node_power_action') diff --git a/ironic/tests/unit/db/test_chassis.py b/ironic/tests/unit/db/test_chassis.py index db298c7c6b..1c67154de5 100644 --- a/ironic/tests/unit/db/test_chassis.py +++ b/ironic/tests/unit/db/test_chassis.py @@ -16,7 +16,6 @@ """Tests for manipulating Chassis via the DB API""" from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.tests.unit.db import base @@ -33,10 +32,10 @@ class DbChassisTestCase(base.DbTestCase): uuids = [self.chassis.uuid] for i in range(1, 6): ch = utils.create_test_chassis(uuid=uuidutils.generate_uuid()) - uuids.append(six.text_type(ch.uuid)) + uuids.append(str(ch.uuid)) res = self.dbapi.get_chassis_list() res_uuids = [r.uuid for r in res] - six.assertCountEqual(self, uuids, res_uuids) + self.assertCountEqual(uuids, res_uuids) def test_get_chassis_by_id(self): chassis = self.dbapi.get_chassis_by_id(self.chassis.id) diff --git a/ironic/tests/unit/db/test_deploy_templates.py b/ironic/tests/unit/db/test_deploy_templates.py index 921fe65915..d3bdb4b113 100644 --- a/ironic/tests/unit/db/test_deploy_templates.py +++ b/ironic/tests/unit/db/test_deploy_templates.py @@ -14,7 +14,6 @@ from oslo_db import exception as db_exc from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.tests.unit.db import base @@ -173,19 +172,19 @@ class DbDeployTemplateTestCase(base.DbTestCase): self.dbapi.get_deploy_template_by_name, 'bogus') def _template_list_preparation(self): - uuids = [six.text_type(self.template.uuid)] + uuids = [str(self.template.uuid)] for i in range(1, 3): template = db_utils.create_test_deploy_template( uuid=uuidutils.generate_uuid(), name='CUSTOM_DT%d' % (i + 1)) - uuids.append(six.text_type(template.uuid)) + uuids.append(str(template.uuid)) return uuids def test_get_deploy_template_list(self): uuids = self._template_list_preparation() res = self.dbapi.get_deploy_template_list() res_uuids = [r.uuid for r in res] - six.assertCountEqual(self, uuids, res_uuids) + self.assertCountEqual(uuids, res_uuids) def test_get_deploy_template_list_sorted(self): uuids = self._template_list_preparation() @@ -201,7 +200,7 @@ class DbDeployTemplateTestCase(base.DbTestCase): names = ['CUSTOM_DT2', 'CUSTOM_DT3'] res = self.dbapi.get_deploy_template_list_by_names(names=names) res_names = [r.name for r in res] - six.assertCountEqual(self, names, res_names) + self.assertCountEqual(names, res_names) def test_get_deploy_template_list_by_names_no_match(self): self._template_list_preparation() diff --git a/ironic/tests/unit/db/test_nodes.py b/ironic/tests/unit/db/test_nodes.py index e61302be74..07401a27dc 100644 --- a/ironic/tests/unit/db/test_nodes.py +++ b/ironic/tests/unit/db/test_nodes.py @@ -20,7 +20,6 @@ import datetime import mock from oslo_utils import timeutils from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.common import states @@ -295,10 +294,10 @@ class DbNodeTestCase(base.DbTestCase): uuids = [] for i in range(1, 6): node = utils.create_test_node(uuid=uuidutils.generate_uuid()) - uuids.append(six.text_type(node['uuid'])) + uuids.append(str(node['uuid'])) res = self.dbapi.get_node_list() res_uuids = [r.uuid for r in res] - six.assertCountEqual(self, uuids, res_uuids) + self.assertCountEqual(uuids, res_uuids) for r in res: self.assertEqual([], r.tags) self.assertEqual([], r.traits) diff --git a/ironic/tests/unit/db/test_portgroups.py b/ironic/tests/unit/db/test_portgroups.py index 97803d3f28..fa04020942 100644 --- a/ironic/tests/unit/db/test_portgroups.py +++ b/ironic/tests/unit/db/test_portgroups.py @@ -13,7 +13,6 @@ """Tests for manipulating portgroups via the DB API""" from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.tests.unit.db import base @@ -45,7 +44,7 @@ class DbportgroupTestCase(base.DbTestCase): uuid=uuidutils.generate_uuid(), name='portgroup' + str(i), address='52:54:00:cf:2d:4%s' % i) - uuids.append(six.text_type(portgroup.uuid)) + uuids.append(str(portgroup.uuid)) return uuids @@ -87,16 +86,16 @@ class DbportgroupTestCase(base.DbTestCase): uuids = self._create_test_portgroup_range(6) # Also add the uuid for the portgroup created in setUp() - uuids.append(six.text_type(self.portgroup.uuid)) + uuids.append(str(self.portgroup.uuid)) res = self.dbapi.get_portgroup_list() res_uuids = [r.uuid for r in res] - six.assertCountEqual(self, uuids, res_uuids) + self.assertCountEqual(uuids, res_uuids) def test_get_portgroup_list_sorted(self): uuids = self._create_test_portgroup_range(6) # Also add the uuid for the portgroup created in setUp() - uuids.append(six.text_type(self.portgroup.uuid)) + uuids.append(str(self.portgroup.uuid)) res = self.dbapi.get_portgroup_list(sort_key='uuid') res_uuids = [r.uuid for r in res] self.assertEqual(sorted(uuids), res_uuids) diff --git a/ironic/tests/unit/db/test_ports.py b/ironic/tests/unit/db/test_ports.py index 003bc5e637..fa12c4c257 100644 --- a/ironic/tests/unit/db/test_ports.py +++ b/ironic/tests/unit/db/test_ports.py @@ -16,7 +16,6 @@ """Tests for manipulating Ports via the DB API""" from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.tests.unit.db import base @@ -51,21 +50,21 @@ class DbPortTestCase(base.DbTestCase): for i in range(1, 6): port = db_utils.create_test_port(uuid=uuidutils.generate_uuid(), address='52:54:00:cf:2d:4%s' % i) - uuids.append(six.text_type(port.uuid)) + uuids.append(str(port.uuid)) # Also add the uuid for the port created in setUp() - uuids.append(six.text_type(self.port.uuid)) + uuids.append(str(self.port.uuid)) res = self.dbapi.get_port_list() res_uuids = [r.uuid for r in res] - six.assertCountEqual(self, uuids, res_uuids) + self.assertCountEqual(uuids, res_uuids) def test_get_port_list_sorted(self): uuids = [] for i in range(1, 6): port = db_utils.create_test_port(uuid=uuidutils.generate_uuid(), address='52:54:00:cf:2d:4%s' % i) - uuids.append(six.text_type(port.uuid)) + uuids.append(str(port.uuid)) # Also add the uuid for the port created in setUp() - uuids.append(six.text_type(self.port.uuid)) + uuids.append(str(self.port.uuid)) res = self.dbapi.get_port_list(sort_key='uuid') res_uuids = [r.uuid for r in res] self.assertEqual(sorted(uuids), res_uuids) diff --git a/ironic/tests/unit/db/test_volume_connectors.py b/ironic/tests/unit/db/test_volume_connectors.py index 461d24bdc1..b15e032757 100644 --- a/ironic/tests/unit/db/test_volume_connectors.py +++ b/ironic/tests/unit/db/test_volume_connectors.py @@ -15,7 +15,6 @@ """Tests for manipulating VolumeConnectors via the DB API""" from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.tests.unit.db import base @@ -65,20 +64,20 @@ class DbVolumeConnectorTestCase(base.DbTestCase): -1) def _connector_list_preparation(self): - uuids = [six.text_type(self.connector.uuid)] + uuids = [str(self.connector.uuid)] for i in range(1, 6): volume_connector = db_utils.create_test_volume_connector( uuid=uuidutils.generate_uuid(), type='iqn', connector_id='iqn.test-%s' % i) - uuids.append(six.text_type(volume_connector.uuid)) + uuids.append(str(volume_connector.uuid)) return uuids def test_get_volume_connector_list(self): uuids = self._connector_list_preparation() res = self.dbapi.get_volume_connector_list() res_uuids = [r.uuid for r in res] - six.assertCountEqual(self, uuids, res_uuids) + self.assertCountEqual(uuids, res_uuids) def test_get_volume_connector_list_sorted(self): uuids = self._connector_list_preparation() diff --git a/ironic/tests/unit/db/test_volume_targets.py b/ironic/tests/unit/db/test_volume_targets.py index 4dd4a3af78..62db5353fd 100644 --- a/ironic/tests/unit/db/test_volume_targets.py +++ b/ironic/tests/unit/db/test_volume_targets.py @@ -15,7 +15,6 @@ """Tests for manipulating VolumeTargets via the DB API""" from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.tests.unit.db import base @@ -79,20 +78,20 @@ class DbVolumeTargetTestCase(base.DbTestCase): '11111111-2222-3333-4444-555555555555') def _create_list_of_volume_targets(self, num): - uuids = [six.text_type(self.target.uuid)] + uuids = [str(self.target.uuid)] for i in range(1, num): volume_target = db_utils.create_test_volume_target( uuid=uuidutils.generate_uuid(), properties={"target_iqn": "iqn.test-%s" % i}, boot_index=i) - uuids.append(six.text_type(volume_target.uuid)) + uuids.append(str(volume_target.uuid)) return uuids def test_get_volume_target_list(self): uuids = self._create_list_of_volume_targets(6) res = self.dbapi.get_volume_target_list() res_uuids = [r.uuid for r in res] - six.assertCountEqual(self, uuids, res_uuids) + self.assertCountEqual(uuids, res_uuids) def test_get_volume_target_list_sorted(self): uuids = self._create_list_of_volume_targets(5) diff --git a/ironic/tests/unit/dhcp/test_factory.py b/ironic/tests/unit/dhcp/test_factory.py index c6b30535ab..bda6bed0ec 100644 --- a/ironic/tests/unit/dhcp/test_factory.py +++ b/ironic/tests/unit/dhcp/test_factory.py @@ -16,7 +16,6 @@ import inspect import mock -import six import stevedore from ironic.common import dhcp_factory @@ -84,7 +83,7 @@ class TestDHCPFactory(base.TestCase): class CompareBasetoModules(base.TestCase): def test_drivers_match_dhcp_base(self): - signature_method = inspect.getargspec if six.PY2 else inspect.signature + signature_method = inspect.signature def _get_public_apis(inst): methods = {} diff --git a/ironic/tests/unit/drivers/modules/ansible/test_deploy.py b/ironic/tests/unit/drivers/modules/ansible/test_deploy.py index 9978338766..9cf759af45 100644 --- a/ironic/tests/unit/drivers/modules/ansible/test_deploy.py +++ b/ironic/tests/unit/drivers/modules/ansible/test_deploy.py @@ -15,7 +15,6 @@ import json from ironic_lib import utils as irlib_utils import mock from oslo_concurrency import processutils -import six from ironic.common import exception from ironic.common import states @@ -235,7 +234,7 @@ class TestAnsibleMethods(AnsibleDeployTestCaseBase): ansible_deploy._run_playbook, self.node, 'deploy', extra_vars, '/path/to/key') - self.assertIn('VIKINGS!', six.text_type(exc)) + self.assertIn('VIKINGS!', str(exc)) execute_mock.assert_called_once_with( 'env', 'ANSIBLE_CONFIG=/path/to/config', 'ansible-playbook', '/path/to/playbooks/deploy', '-i', @@ -374,8 +373,8 @@ class TestAnsibleMethods(AnsibleDeployTestCaseBase): exception.InvalidParameterValue, ansible_deploy._parse_root_device_hints, task.node) for key, value in expected.items(): - self.assertIn(six.text_type(key), six.text_type(exc)) - self.assertIn(six.text_type(value), six.text_type(exc)) + self.assertIn(str(key), str(exc)) + self.assertIn(str(value), str(exc)) def test__prepare_variables(self): i_info = self.node.instance_info @@ -486,9 +485,9 @@ class TestAnsibleMethods(AnsibleDeployTestCaseBase): exc = self.assertRaises(exception.NodeCleaningFailure, ansible_deploy._validate_clean_steps, steps, self.node.uuid) - self.assertIn("name foo, field ham.value", six.text_type(exc)) - self.assertIn("name bar, field interface", six.text_type(exc)) - self.assertIn("name undefined, field name", six.text_type(exc)) + self.assertIn("name foo, field ham.value", str(exc)) + self.assertIn("name bar, field interface", str(exc)) + self.assertIn("name undefined, field name", str(exc)) def test__validate_clean_steps_names_not_unique(self): steps = [{"name": "foo", @@ -498,7 +497,7 @@ class TestAnsibleMethods(AnsibleDeployTestCaseBase): exc = self.assertRaises(exception.NodeCleaningFailure, ansible_deploy._validate_clean_steps, steps, self.node.uuid) - self.assertIn("unique names", six.text_type(exc)) + self.assertIn("unique names", str(exc)) @mock.patch.object(ansible_deploy.yaml, 'safe_load', autospec=True) def test__get_clean_steps(self, load_mock): diff --git a/ironic/tests/unit/drivers/modules/ilo/test_boot.py b/ironic/tests/unit/drivers/modules/ilo/test_boot.py index 384f5f43f2..8ff57b09af 100644 --- a/ironic/tests/unit/drivers/modules/ilo/test_boot.py +++ b/ironic/tests/unit/drivers/modules/ilo/test_boot.py @@ -15,12 +15,12 @@ """Test class for boot methods used by iLO modules.""" +import io import tempfile from ironic_lib import utils as ironic_utils import mock from oslo_config import cfg -import six from ironic.common import boot_devices from ironic.common import exception @@ -43,10 +43,6 @@ from ironic.drivers import utils as driver_utils from ironic.tests.unit.drivers.modules.ilo import test_common -if six.PY3: - import io - file = io.BytesIO - CONF = cfg.CONF @@ -183,9 +179,9 @@ class IloBootPrivateMethodsTestCase(test_common.BaseIloTest): CONF.pxe.pxe_append_params = 'kernel-params' swift_obj_mock = swift_api_mock.return_value - fileobj_mock = mock.MagicMock(spec=file) + fileobj_mock = mock.MagicMock(spec=io.BytesIO) fileobj_mock.name = 'tmpfile' - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = fileobj_mock tempfile_mock.return_value = mock_file_handle @@ -241,9 +237,9 @@ class IloBootPrivateMethodsTestCase(test_common.BaseIloTest): CONF.deploy.http_root = "/httpboot" CONF.pxe.pxe_append_params = 'kernel-params' - fileobj_mock = mock.MagicMock(spec=file) + fileobj_mock = mock.MagicMock(spec=io.BytesIO) fileobj_mock.name = 'tmpfile' - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = fileobj_mock tempfile_mock.return_value = mock_file_handle @@ -307,9 +303,9 @@ class IloBootPrivateMethodsTestCase(test_common.BaseIloTest): CONF.deploy.http_root = "/httpboot" CONF.pxe.pxe_append_params = 'kernel-params' - fileobj_mock = mock.MagicMock(spec=file) + fileobj_mock = mock.MagicMock(spec=io.BytesIO) fileobj_mock.name = 'tmpfile' - mock_file_handle = mock.MagicMock(spec=file) + mock_file_handle = mock.MagicMock(spec=io.BytesIO) mock_file_handle.__enter__.return_value = fileobj_mock tempfile_mock.return_value = mock_file_handle diff --git a/ironic/tests/unit/drivers/modules/ilo/test_common.py b/ironic/tests/unit/drivers/modules/ilo/test_common.py index 64a270ad2d..466f35a0c3 100644 --- a/ironic/tests/unit/drivers/modules/ilo/test_common.py +++ b/ironic/tests/unit/drivers/modules/ilo/test_common.py @@ -15,7 +15,9 @@ """Test class for common methods used by iLO modules.""" +import builtins import hashlib +import io import os import shutil import tempfile @@ -25,8 +27,6 @@ import mock from oslo_config import cfg from oslo_utils import importutils from oslo_utils import uuidutils -import six -import six.moves.builtins as __builtin__ from ironic.common import boot_devices from ironic.common import exception @@ -45,11 +45,6 @@ INFO_DICT = db_utils.get_test_ilo_info() ilo_client = importutils.try_import('proliantutils.ilo.client') ilo_error = importutils.try_import('proliantutils.exception') -if six.PY3: - import io - file = io.BytesIO - - CONF = cfg.CONF @@ -315,8 +310,8 @@ class IloCommonMethodsTestCase(BaseIloTest): autospec=True) def test__prepare_floppy_image(self, tempfile_mock, fatimage_mock, swift_api_mock): - mock_image_file_handle = mock.MagicMock(spec=file) - mock_image_file_obj = mock.MagicMock(spec=file) + mock_image_file_handle = mock.MagicMock(spec=io.BytesIO) + mock_image_file_obj = mock.MagicMock(spec=io.BytesIO) mock_image_file_obj.name = 'image-tmp-file' mock_image_file_handle.__enter__.return_value = mock_image_file_obj @@ -355,8 +350,8 @@ class IloCommonMethodsTestCase(BaseIloTest): def test__prepare_floppy_image_use_webserver(self, tempfile_mock, fatimage_mock, copy_mock): - mock_image_file_handle = mock.MagicMock(spec=file) - mock_image_file_obj = mock.MagicMock(spec=file) + mock_image_file_handle = mock.MagicMock(spec=io.BytesIO) + mock_image_file_obj = mock.MagicMock(spec=io.BytesIO) mock_image_file_obj.name = 'image-tmp-file' mock_image_file_handle.__enter__.return_value = mock_image_file_obj @@ -1038,11 +1033,11 @@ class IloCommonMethodsTestCase(BaseIloTest): # | THEN | unlink_mock.assert_called_once_with('/any_path1/any_file') - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) def test_verify_image_checksum(self, open_mock): # | GIVEN | data = b'Yankee Doodle went to town riding on a pony;' - file_like_object = six.BytesIO(data) + file_like_object = io.BytesIO(data) open_mock().__enter__.return_value = file_like_object actual_hash = hashlib.md5(data).hexdigest() # | WHEN | @@ -1058,12 +1053,12 @@ class IloCommonMethodsTestCase(BaseIloTest): ilo_common.verify_image_checksum, invalid_file_path, 'hash_xxx') - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) def test_verify_image_checksum_throws_for_failed_validation(self, open_mock): # | GIVEN | data = b'Yankee Doodle went to town riding on a pony;' - file_like_object = six.BytesIO(data) + file_like_object = io.BytesIO(data) open_mock().__enter__.return_value = file_like_object invalid_hash = 'invalid_hash_value' # | WHEN | & | THEN | diff --git a/ironic/tests/unit/drivers/modules/ilo/test_console.py b/ironic/tests/unit/drivers/modules/ilo/test_console.py index 6f885952e9..2db07c0b2c 100644 --- a/ironic/tests/unit/drivers/modules/ilo/test_console.py +++ b/ironic/tests/unit/drivers/modules/ilo/test_console.py @@ -16,7 +16,6 @@ """Test class for common methods used by iLO modules.""" import mock -import six from ironic.common import exception from ironic.conductor import task_manager @@ -25,11 +24,6 @@ from ironic.drivers.modules import ipmitool from ironic.tests.unit.drivers.modules.ilo import test_common -if six.PY3: - import io - file = io.BytesIO - - class IloConsoleInterfaceTestCase(test_common.BaseIloTest): boot_interface = 'ilo-virtual-media' diff --git a/ironic/tests/unit/drivers/modules/ilo/test_firmware_processor.py b/ironic/tests/unit/drivers/modules/ilo/test_firmware_processor.py index ea0b147901..89aa96f9f4 100644 --- a/ironic/tests/unit/drivers/modules/ilo/test_firmware_processor.py +++ b/ironic/tests/unit/drivers/modules/ilo/test_firmware_processor.py @@ -13,12 +13,13 @@ # under the License. """Test class for Firmware Processor used by iLO management interface.""" + +import builtins import io +from urllib import parse as urlparse import mock from oslo_utils import importutils -from six.moves import builtins as __builtin__ -import six.moves.urllib.parse as urlparse from ironic.common import exception from ironic.drivers.modules.ilo import common as ilo_common @@ -42,8 +43,8 @@ class FirmwareProcessorTestCase(base.TestCase): firmware_update_args = {'firmware_update_mode': 'invalid_mode', 'firmware_images': None} # Note(deray): Need to set __name__ attribute explicitly to keep - # ``six.wraps`` happy. Passing this to the `name` argument at the time - # creation of Mock doesn't help. + # ``functools.wraps`` happy. Passing this to the `name` argument at + # the time creation of Mock doesn't help. update_firmware_mock.__name__ = 'update_firmware_mock' wrapped_func = (ilo_fw_processor. verify_firmware_update_args(update_firmware_mock)) @@ -370,7 +371,7 @@ class FirmwareProcessorTestCase(base.TestCase): shutil_mock.rmtree.assert_called_once_with( tempfile_mock.mkdtemp(), ignore_errors=True) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) @mock.patch.object( ilo_fw_processor.image_service, 'FileImageService', autospec=True) def test__download_file_based_fw_to_copies_file_to_target( @@ -390,7 +391,7 @@ class FirmwareProcessorTestCase(base.TestCase): file_image_service_mock.return_value.download.assert_called_once_with( firmware_file_path, fd_mock) - @mock.patch.object(__builtin__, 'open', autospec=True) + @mock.patch.object(builtins, 'open', autospec=True) @mock.patch.object(ilo_fw_processor, 'image_service', autospec=True) def test__download_http_based_fw_to_downloads_the_fw_file( self, image_service_mock, open_mock): diff --git a/ironic/tests/unit/drivers/modules/ilo/test_inspect.py b/ironic/tests/unit/drivers/modules/ilo/test_inspect.py index 3dde5ca59d..deb3f2e2df 100644 --- a/ironic/tests/unit/drivers/modules/ilo/test_inspect.py +++ b/ironic/tests/unit/drivers/modules/ilo/test_inspect.py @@ -16,7 +16,6 @@ """Test class for Management Interface used by iLO modules.""" import mock -import six from ironic.common import exception from ironic.common import states @@ -365,7 +364,7 @@ class TestInspectPrivateMethods(test_common.BaseIloTest): self.node, ilo_mock) self.assertEqual( - six.text_type(result), + str(result), ("Failed to inspect hardware. Reason: Server didn't return the " "key(s): cpu_arch")) diff --git a/ironic/tests/unit/drivers/modules/irmc/test_boot.py b/ironic/tests/unit/drivers/modules/irmc/test_boot.py index 3dd1001335..68ba242974 100644 --- a/ironic/tests/unit/drivers/modules/irmc/test_boot.py +++ b/ironic/tests/unit/drivers/modules/irmc/test_boot.py @@ -16,6 +16,7 @@ Test class for iRMC Boot Driver """ +import io import os import shutil import tempfile @@ -24,7 +25,6 @@ from ironic_lib import utils as ironic_utils import mock from oslo_config import cfg from oslo_utils import uuidutils -import six from ironic.common import boot_devices from ironic.common import exception @@ -47,10 +47,6 @@ from ironic.tests.unit.drivers.modules import test_pxe from ironic.tests.unit.drivers import third_party_driver_mock_specs \ as mock_specs from ironic.tests.unit.objects import utils as obj_utils -if six.PY3: - import io - file = io.BytesIO - INFO_DICT = db_utils.get_test_irmc_info() CONF = cfg.CONF @@ -519,7 +515,7 @@ class IRMCDeployPrivateMethodsTestCase(test_common.BaseIRMCTest): tempfile_mock, create_vfat_image_mock, copyfile_mock): - mock_image_file_handle = mock.MagicMock(spec=file) + mock_image_file_handle = mock.MagicMock(spec=io.BytesIO) mock_image_file_obj = mock.MagicMock() mock_image_file_obj.name = 'image-tmp-file' mock_image_file_handle.__enter__.return_value = mock_image_file_obj @@ -546,7 +542,7 @@ class IRMCDeployPrivateMethodsTestCase(test_common.BaseIRMCTest): tempfile_mock, create_vfat_image_mock, copyfile_mock): - mock_image_file_handle = mock.MagicMock(spec=file) + mock_image_file_handle = mock.MagicMock(spec=io.BytesIO) mock_image_file_obj = mock.MagicMock() mock_image_file_obj.name = 'image-tmp-file' mock_image_file_handle.__enter__.return_value = mock_image_file_obj diff --git a/ironic/tests/unit/drivers/modules/test_agent_client.py b/ironic/tests/unit/drivers/modules/test_agent_client.py index 4a5d6f89f3..9d1af12013 100644 --- a/ironic/tests/unit/drivers/modules/test_agent_client.py +++ b/ironic/tests/unit/drivers/modules/test_agent_client.py @@ -12,13 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +from http import client as http_client import json import mock import requests import retrying -import six -from six.moves import http_client from ironic.common import exception from ironic import conf @@ -31,7 +30,7 @@ CONF = conf.CONF class MockResponse(object): def __init__(self, text, status_code=http_client.OK): - assert isinstance(text, six.string_types) + assert isinstance(text, str) self.text = text self.status_code = status_code diff --git a/ironic/tests/unit/drivers/modules/test_image_cache.py b/ironic/tests/unit/drivers/modules/test_image_cache.py index 37ae008ecf..bd57332fb2 100644 --- a/ironic/tests/unit/drivers/modules/test_image_cache.py +++ b/ironic/tests/unit/drivers/modules/test_image_cache.py @@ -24,7 +24,6 @@ import uuid import mock from oslo_utils import uuidutils -import six from ironic.common import exception from ironic.common import image_service @@ -168,8 +167,7 @@ class TestImageCacheFetch(base.TestCase): autospec=True) def test_fetch_image_not_uuid(self, mock_download, mock_clean_up): href = u'http://abc.com/ubuntu.qcow2' - href_encoded = href.encode('utf-8') if six.PY2 else href - href_converted = str(uuid.uuid5(uuid.NAMESPACE_URL, href_encoded)) + href_converted = str(uuid.uuid5(uuid.NAMESPACE_URL, href)) master_path = ''.join([os.path.join(self.master_dir, href_converted), '.converted']) self.cache.fetch_image(href, self.dest_path) @@ -184,8 +182,7 @@ class TestImageCacheFetch(base.TestCase): def test_fetch_image_not_uuid_no_force_raw(self, mock_download, mock_clean_up): href = u'http://abc.com/ubuntu.qcow2' - href_encoded = href.encode('utf-8') if six.PY2 else href - href_converted = str(uuid.uuid5(uuid.NAMESPACE_URL, href_encoded)) + href_converted = str(uuid.uuid5(uuid.NAMESPACE_URL, href)) master_path = os.path.join(self.master_dir, href_converted) self.cache.fetch_image(href, self.dest_path, force_raw=False) mock_download.assert_called_once_with( diff --git a/ironic/tests/unit/drivers/modules/test_ipmitool.py b/ironic/tests/unit/drivers/modules/test_ipmitool.py index c27e070a3d..7404f7a378 100644 --- a/ironic/tests/unit/drivers/modules/test_ipmitool.py +++ b/ironic/tests/unit/drivers/modules/test_ipmitool.py @@ -34,7 +34,6 @@ from ironic_lib import utils as ironic_utils import mock from oslo_concurrency import processutils from oslo_utils import uuidutils -import six from ironic.common import boot_devices from ironic.common import exception @@ -474,8 +473,9 @@ class Base(db_base.DbTestCase): self.vendor = ipmi.VendorPassthru() -@six.add_metaclass(IPMIToolPrivateMethodTestCaseMeta) -class IPMIToolPrivateMethodTestCase(Base): +class IPMIToolPrivateMethodTestCase( + Base, + metaclass=IPMIToolPrivateMethodTestCaseMeta): def setUp(self): super(IPMIToolPrivateMethodTestCase, self).setUp() @@ -529,7 +529,7 @@ class IPMIToolPrivateMethodTestCase(Base): ValueError, self._test__make_password_file, 12345, ValueError('we should fail')) - self.assertEqual('we should fail', six.text_type(result)) + self.assertEqual('we should fail', str(result)) @mock.patch.object(tempfile, 'NamedTemporaryFile', new=mock.MagicMock(side_effect=OSError('Test Error'))) @@ -548,7 +548,7 @@ class IPMIToolPrivateMethodTestCase(Base): result = self.assertRaises( OverflowError, self._test__make_password_file, 12345) - self.assertEqual('Test Error', six.text_type(result)) + self.assertEqual('Test Error', str(result)) def test__make_password_file_write_exception(self): # Test exception in _make_password_file for write() @@ -761,8 +761,8 @@ class IPMIToolPrivateMethodTestCase(Base): info['ipmi_password'] = 12345678 node = obj_utils.get_test_node(self.context, driver_info=info) ret = ipmi._parse_driver_info(node) - self.assertEqual(six.u('12345678'), ret['password']) - self.assertIsInstance(ret['password'], six.text_type) + self.assertEqual(u'12345678', ret['password']) + self.assertIsInstance(ret['password'], str) def test__parse_driver_info_ipmi_prot_version_1_5(self): info = dict(INFO_DICT) diff --git a/ironic/tests/unit/drivers/modules/xclarity/test_management.py b/ironic/tests/unit/drivers/modules/xclarity/test_management.py index 754e50a612..d66da9b8fd 100644 --- a/ironic/tests/unit/drivers/modules/xclarity/test_management.py +++ b/ironic/tests/unit/drivers/modules/xclarity/test_management.py @@ -13,11 +13,11 @@ # License for the specific language governing permissions and limitations # under the License. +import importlib import sys import mock from oslo_utils import importutils -import six from ironic.common import boot_devices from ironic.common import exception @@ -75,7 +75,7 @@ class XClarityManagementDriverTestCase(db_base.DbTestCase): sys.modules['xclarity_client.exceptions'] = ( xclarity_client_exceptions) if 'ironic.drivers.modules.xclarity' in sys.modules: - six.moves.reload_module( + importlib.reload( sys.modules['ironic.drivers.modules.xclarity']) ex = exception.XClarityError('E') mock_get_xc_client.return_value.set_node_boot_info.side_effect = ex @@ -110,7 +110,7 @@ class XClarityManagementDriverTestCase(db_base.DbTestCase): sys.modules['xclarity_client.exceptions'] = ( xclarity_client_exceptions) if 'ironic.drivers.modules.xclarity' in sys.modules: - six.moves.reload_module( + importlib.reload( sys.modules['ironic.drivers.modules.xclarity']) ex = exception.XClarityError('E') mock_xc_client.return_value.get_node_all_boot_info.side_effect = ex diff --git a/ironic/tests/unit/drivers/modules/xclarity/test_power.py b/ironic/tests/unit/drivers/modules/xclarity/test_power.py index d259a6b287..86f1e3318f 100644 --- a/ironic/tests/unit/drivers/modules/xclarity/test_power.py +++ b/ironic/tests/unit/drivers/modules/xclarity/test_power.py @@ -13,11 +13,11 @@ # License for the specific language governing permissions and limitations # under the License. +import importlib import sys import mock from oslo_utils import importutils -import six from ironic.common import exception from ironic.common import states @@ -80,7 +80,7 @@ class XClarityPowerDriverTestCase(db_base.DbTestCase): sys.modules['xclarity_client.exceptions'] = ( xclarity_client_exceptions) if 'ironic.drivers.modules.xclarity' in sys.modules: - six.moves.reload_module( + importlib.reload( sys.modules['ironic.drivers.modules.xclarity']) ex = exception.XClarityError('E') mock_xc_client.return_value.get_node_power_status.side_effect = ex @@ -118,7 +118,7 @@ class XClarityPowerDriverTestCase(db_base.DbTestCase): sys.modules['xclarity_client.exceptions'] = ( xclarity_client_exceptions) if 'ironic.drivers.modules.xclarity' in sys.modules: - six.moves.reload_module( + importlib.reload( sys.modules['ironic.drivers.modules.xclarity']) ex = exception.XClarityError('E') mock_xc_client.return_value.set_node_power_status.side_effect = ex diff --git a/ironic/tests/unit/drivers/third_party_driver_mocks.py b/ironic/tests/unit/drivers/third_party_driver_mocks.py index 960846189e..3f3346a3dc 100644 --- a/ironic/tests/unit/drivers/third_party_driver_mocks.py +++ b/ironic/tests/unit/drivers/third_party_driver_mocks.py @@ -29,11 +29,11 @@ Current list of mocked libraries: - python-ibmcclient """ +import importlib import sys import mock from oslo_utils import importutils -import six from ironic.drivers.modules import ipmitool from ironic.tests.unit.drivers import third_party_driver_mock_specs \ @@ -68,7 +68,7 @@ if not proliantutils: proliantutils.exception.ImageExtractionFailed = type( 'ImageExtractionFailed', (Exception,), {}) if 'ironic.drivers.ilo' in sys.modules: - six.moves.reload_module(sys.modules['ironic.drivers.ilo']) + importlib.reload(sys.modules['ironic.drivers.ilo']) redfish = importutils.try_import('redfish') if not redfish: @@ -76,7 +76,7 @@ if not redfish: sys.modules['redfish'] = redfish if 'ironic.drivers.redfish' in sys.modules: - six.moves.reload_module(sys.modules['ironic.drivers.modules.redfish']) + importlib.reload(sys.modules['ironic.drivers.modules.redfish']) # attempt to load the external 'python-dracclient' library, which is required # by the optional drivers.modules.drac module @@ -109,7 +109,7 @@ if not dracclient: # Now that the external library has been mocked, if anything had already # loaded any of the drivers, reload them. if 'ironic.drivers.modules.drac' in sys.modules: - six.moves.reload_module(sys.modules['ironic.drivers.modules.drac']) + importlib.reload(sys.modules['ironic.drivers.modules.drac']) # attempt to load the external 'pysnmp' library, which is required by @@ -128,7 +128,7 @@ if not pysnmp: # if anything has loaded the snmp driver yet, reload it now that the # external library has been mocked if 'ironic.drivers.modules.snmp' in sys.modules: - six.moves.reload_module(sys.modules['ironic.drivers.modules.snmp']) + importlib.reload(sys.modules['ironic.drivers.modules.snmp']) # attempt to load the external 'scciclient' library, which is required by @@ -154,7 +154,7 @@ if not scciclient: # if anything has loaded the iRMC driver yet, reload it now that the # external library has been mocked if 'ironic.drivers.modules.irmc' in sys.modules: - six.moves.reload_module(sys.modules['ironic.drivers.modules.irmc']) + importlib.reload(sys.modules['ironic.drivers.modules.irmc']) # install mock object to prevent the irmc-virtual-media boot interface from @@ -227,8 +227,7 @@ if not sushy: sys.modules['sushy.auth'] = sushy.auth if 'ironic.drivers.modules.redfish' in sys.modules: - six.moves.reload_module( - sys.modules['ironic.drivers.modules.redfish']) + importlib.reload(sys.modules['ironic.drivers.modules.redfish']) xclarity_client = importutils.try_import('xclarity_client') if not xclarity_client: @@ -287,5 +286,4 @@ if not ibmc_client: sys.modules['ibmc_client.constants'] = constants if 'ironic.drivers.modules.ibmc' in sys.modules: - six.moves.reload_module( - sys.modules['ironic.drivers.modules.ibmc']) + importlib.reload(sys.modules['ironic.drivers.modules.ibmc']) diff --git a/ironic/tests/unit/objects/test_objects.py b/ironic/tests/unit/objects/test_objects.py index 993a1eb9cc..33ae36d6d8 100644 --- a/ironic/tests/unit/objects/test_objects.py +++ b/ironic/tests/unit/objects/test_objects.py @@ -22,7 +22,6 @@ from oslo_utils import timeutils from oslo_versionedobjects import base as object_base from oslo_versionedobjects import exception as object_exception from oslo_versionedobjects import fixture as object_fixture -import six from ironic.common import context from ironic.common import release_mappings @@ -629,7 +628,7 @@ class _TestObject(object): try: obj['bar'] = 'value' except TypeError as e: - err_message = six.text_type(e) + err_message = str(e) finally: self.assertIn("'TestObj' object does not support item assignment", err_message) diff --git a/ironic/tests/unit/objects/utils.py b/ironic/tests/unit/objects/utils.py index ccc8006073..26c3a22e78 100644 --- a/ironic/tests/unit/objects/utils.py +++ b/ironic/tests/unit/objects/utils.py @@ -13,9 +13,9 @@ # License for the specific language governing permissions and limitations # under the License. """Ironic object test utilities.""" -import inspect -import six +import functools +import inspect from ironic.common import exception from ironic.common.i18n import _ @@ -25,7 +25,7 @@ from ironic.tests.unit.db import utils as db_utils def check_keyword_arguments(func): - @six.wraps(func) + @functools.wraps(func) def wrapper(**kw): obj_type = kw.pop('object_type') result = func(**kw) diff --git a/lower-constraints.txt b/lower-constraints.txt index ef8bc5889a..d7f7decad0 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -58,7 +58,6 @@ requests==2.14.2 requestsexceptions==1.4.0 retrying==1.2.3 rfc3986==0.3.1 -six==1.10.0 Sphinx==1.6.2 sphinxcontrib-httpdomain==1.6.1 sphinxcontrib-pecanwsme==0.10.0 diff --git a/requirements.txt b/requirements.txt index d337ce44d8..fff36d71ba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,7 +35,6 @@ os-traits>=0.4.0 # Apache-2.0 pecan!=1.0.2,!=1.0.3,!=1.0.4,!=1.2,>=1.0.0 # BSD requests>=2.14.2 # Apache-2.0 rfc3986>=0.3.1 # Apache-2.0 -six>=1.10.0 # MIT jsonpatch!=1.20,>=1.16 # BSD WSME>=0.9.3 # MIT Jinja2>=2.10 # BSD License (3 clause)