From 0880fb6eb50a9e3e9ad7d1a91ebf9800133d36e7 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Mon, 10 Feb 2025 22:11:46 +0900 Subject: [PATCH] Run pyupgrade to clean up Python 2 syntaxes Update all .py source files by $ pyupgrade --py3-only $(git ls-files | grep ".py$") to modernize the code according to Python 3 syntaxes. pep8 errors are fixed by $ autopep8 --select=E127,E128,E501 --max-line-length 79 -r \ --in-place oslo_vmware Also add the pyupgrade hook to pre-commit to avoid merging additional Python 2 syntaxes. Change-Id: I1b34f8026d69db4485b2eec03767e54331e7817c --- .pre-commit-config.yaml | 5 ++++ doc/source/conf.py | 1 - oslo_vmware/api.py | 4 +-- oslo_vmware/common/loopingcall.py | 2 +- oslo_vmware/exceptions.py | 20 +++++++------- oslo_vmware/hacking/checks.py | 8 +++--- oslo_vmware/image_transfer.py | 4 +-- oslo_vmware/image_util.py | 4 +-- oslo_vmware/objects/datacenter.py | 2 +- oslo_vmware/objects/datastore.py | 17 ++++++------ oslo_vmware/pbm.py | 8 +++--- oslo_vmware/rw_handles.py | 29 ++++++++++----------- oslo_vmware/service.py | 12 ++++----- oslo_vmware/tests/base.py | 2 +- oslo_vmware/tests/objects/test_datastore.py | 26 +++++++++--------- oslo_vmware/tests/test_api.py | 13 +++++---- oslo_vmware/tests/test_hacking.py | 4 +-- oslo_vmware/tests/test_rw_handles.py | 8 +++--- oslo_vmware/tests/test_service.py | 6 ++--- oslo_vmware/tests/test_vim.py | 6 ++--- oslo_vmware/vim.py | 6 ++--- oslo_vmware/vim_util.py | 11 ++++---- releasenotes/source/conf.py | 1 - 23 files changed, 100 insertions(+), 99 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 85377edb..2399c1d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,3 +28,8 @@ repos: hooks: - id: bandit args: ['-x', 'tests'] + - repo: https://github.com/asottile/pyupgrade + rev: v3.18.0 + hooks: + - id: pyupgrade + args: [--py3-only] diff --git a/doc/source/conf.py b/doc/source/conf.py index f187096f..38c5b7a2 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2020 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/oslo_vmware/api.py b/oslo_vmware/api.py index b286c71b..2af9b40e 100644 --- a/oslo_vmware/api.py +++ b/oslo_vmware/api.py @@ -46,7 +46,7 @@ def _trunc_id(session_id): # TODO(vbala) Move this class to excutils.py. -class RetryDecorator(object): +class RetryDecorator: """Decorator for retrying a function upon suggested exceptions. The decorated function is retried for the given number of times, and the @@ -124,7 +124,7 @@ class RetryDecorator(object): return func -class VMwareAPISession(object): +class VMwareAPISession: """Setup a session with the server and handles all calls made to it. Example: diff --git a/oslo_vmware/common/loopingcall.py b/oslo_vmware/common/loopingcall.py index 0cc9ed51..0b852542 100644 --- a/oslo_vmware/common/loopingcall.py +++ b/oslo_vmware/common/loopingcall.py @@ -43,7 +43,7 @@ class LoopingCallDone(Exception): self.retvalue = retvalue -class LoopingCallBase(object): +class LoopingCallBase: def __init__(self, f=None, *args, **kw): self.args = args self.kw = kw diff --git a/oslo_vmware/exceptions.py b/oslo_vmware/exceptions.py index 96b6c56e..4b9a0367 100644 --- a/oslo_vmware/exceptions.py +++ b/oslo_vmware/exceptions.py @@ -82,7 +82,7 @@ class VMwareDriverException(Exception): message = self.msg_fmt self.message = message - super(VMwareDriverException, self).__init__(message) + super().__init__(message) @property def msg(self): @@ -103,7 +103,7 @@ class VimException(VMwareDriverException): """The base exception class for all VIM related exceptions.""" def __init__(self, message=None, cause=None, details=None, **kwargs): - super(VimException, self).__init__(message, details, **kwargs) + super().__init__(message, details, **kwargs) self.cause = cause @@ -111,7 +111,7 @@ class VimSessionOverLoadException(VMwareDriverException): """Thrown when there is an API call overload at the VMware server.""" def __init__(self, message, cause=None): - super(VimSessionOverLoadException, self).__init__(message) + super().__init__(message) self.cause = cause @@ -119,7 +119,7 @@ class VimConnectionException(VMwareDriverException): """Thrown when there is a connection problem.""" def __init__(self, message, cause=None): - super(VimConnectionException, self).__init__(message) + super().__init__(message) self.cause = cause @@ -127,7 +127,7 @@ class VimAttributeException(VMwareDriverException): """Thrown when a particular attribute cannot be found.""" def __init__(self, message, cause=None): - super(VimAttributeException, self).__init__(message) + super().__init__(message) self.cause = cause @@ -135,7 +135,7 @@ class VimFaultException(VimException): """Exception thrown when there are unrecognized VIM faults.""" def __init__(self, fault_list, message, cause=None, details=None): - super(VimFaultException, self).__init__(message, cause, details) + super().__init__(message, cause, details) if not isinstance(fault_list, list): raise ValueError(_("fault_list must be a list")) self.fault_list = fault_list @@ -148,7 +148,7 @@ class VimFaultException(VimException): descr += '\nFaults: ' + str(self.fault_list) if self.details: # details may contain non-ASCII values - details = '{%s}' % ', '.join(["'%s': '%s'" % (k, v) for k, v in + details = '{%s}' % ', '.join(["'{}': '{}'".format(k, v) for k, v in self.details.items()]) descr += '\nDetails: ' + details return descr @@ -158,7 +158,7 @@ class ImageTransferException(VMwareDriverException): """Thrown when there is an error during image transfer.""" def __init__(self, message, cause=None): - super(ImageTransferException, self).__init__(message) + super().__init__(message) self.cause = cause @@ -173,7 +173,7 @@ class VMwareDriverConfigurationException(VMwareDriverException): msg_fmt = _("VMware Driver configuration fault.") def __init__(self, message=None, details=None, **kwargs): - super(VMwareDriverConfigurationException, self).__init__( + super().__init__( message, details, **kwargs) _print_deprecation_warning(self.__class__) @@ -186,7 +186,7 @@ class MissingParameter(VMwareDriverException): msg_fmt = _("Missing parameter : %(param)s") def __init__(self, message=None, details=None, **kwargs): - super(MissingParameter, self).__init__(message, details, **kwargs) + super().__init__(message, details, **kwargs) _print_deprecation_warning(self.__class__) diff --git a/oslo_vmware/hacking/checks.py b/oslo_vmware/hacking/checks.py index 9c0caddc..dfd3b462 100644 --- a/oslo_vmware/hacking/checks.py +++ b/oslo_vmware/hacking/checks.py @@ -24,10 +24,10 @@ _all_log_levels = {'critical', 'error', 'exception', 'info', _all_hints = {'_'} _log_translation_hint = re.compile( - r".*LOG\.(%(levels)s)\(\s*(%(hints)s)\(" % { - 'levels': '|'.join(_all_log_levels), - 'hints': '|'.join(_all_hints), - }) + r".*LOG\.({levels})\(\s*({hints})\(".format( + levels='|'.join(_all_log_levels), + hints='|'.join(_all_hints), + )) @core.flake8ext diff --git a/oslo_vmware/image_transfer.py b/oslo_vmware/image_transfer.py index 6f41b06a..cf17b1b2 100644 --- a/oslo_vmware/image_transfer.py +++ b/oslo_vmware/image_transfer.py @@ -106,8 +106,8 @@ def download_image(image, image_meta, session, datastore, rel_path, conn = ds_url.connect(method, image_size, cookie) else: ds_url = datastore.build_url(session._scheme, session._host, rel_path) - cookie = '%s=%s' % (constants.SOAP_COOKIE_KEY, - session.vim.get_http_cookie().strip("\"")) + cookie = '{}={}'.format(constants.SOAP_COOKIE_KEY, + session.vim.get_http_cookie().strip("\"")) conn = ds_url.connect(method, image_size, cookie) conn.write = conn.send diff --git a/oslo_vmware/image_util.py b/oslo_vmware/image_util.py index 3585a468..0c0fcafc 100644 --- a/oslo_vmware/image_util.py +++ b/oslo_vmware/image_util.py @@ -19,10 +19,10 @@ from defusedxml.lxml import parse def _get_vmdk_name_from_ovf(root): ns_ovf = "{{{0}}}".format(root.nsmap["ovf"]) disk = root.find("./{0}DiskSection/{0}Disk".format(ns_ovf)) - file_id = disk.get("{0}fileRef".format(ns_ovf)) + file_id = disk.get("{}fileRef".format(ns_ovf)) f = root.find('./{0}References/{0}File[@{0}id="{1}"]'.format(ns_ovf, file_id)) - return f.get("{0}href".format(ns_ovf)) + return f.get("{}href".format(ns_ovf)) def get_vmdk_name_from_ovf(ovf_handle): diff --git a/oslo_vmware/objects/datacenter.py b/oslo_vmware/objects/datacenter.py index 76570422..155a99bc 100644 --- a/oslo_vmware/objects/datacenter.py +++ b/oslo_vmware/objects/datacenter.py @@ -15,7 +15,7 @@ from oslo_vmware._i18n import _ -class Datacenter(object): +class Datacenter: def __init__(self, ref, name): """Datacenter object holds ref and name together for convenience.""" diff --git a/oslo_vmware/objects/datastore.py b/oslo_vmware/objects/datastore.py index e2d34550..900d451c 100644 --- a/oslo_vmware/objects/datastore.py +++ b/oslo_vmware/objects/datastore.py @@ -149,7 +149,7 @@ def sdrs_enabled(session, dsc_ref): return pod_sdrs_entry.storageDrsConfig.podConfig.enabled -class Datastore(object): +class Datastore: def __init__(self, ref, name, capacity=None, freespace=None, uncommitted=None, type=None, datacenter=None): @@ -276,7 +276,7 @@ class Datastore(object): return hosts[i] -class DatastorePath(object): +class DatastorePath: """Class for representing a directory or file path in a vSphere datatore. @@ -312,7 +312,7 @@ class DatastorePath(object): def __str__(self): """Full datastore path to the file or directory.""" if self._rel_path != '': - return "[%s] %s" % (self._datastore_name, self.rel_path) + return "[{}] {}".format(self._datastore_name, self.rel_path) return "[%s]" % self._datastore_name @property @@ -372,7 +372,7 @@ class DatastorePath(object): return cls(datastore_name, path.strip()) -class DatastoreURL(object): +class DatastoreURL: """Class for representing a URL to HTTP access a file in a datastore. @@ -420,8 +420,8 @@ class DatastoreURL(object): return self._datastore_name def __str__(self): - return '%s://%s/folder/%s?%s' % (self._scheme, self._server, - self.path, self._query) + return '{}://{}/folder/{}?{}'.format(self._scheme, self._server, + self.path, self._query) def connect(self, method, content_length, cookie): try: @@ -434,7 +434,8 @@ class DatastoreURL(object): excep_msg = _("Invalid scheme: %s.") % self._scheme LOG.error(excep_msg) raise ValueError(excep_msg) - conn.putrequest(method, '/folder/%s?%s' % (self.path, self._query)) + conn.putrequest( + method, '/folder/{}?{}'.format(self.path, self._query)) conn.putheader('User-Agent', constants.USER_AGENT) conn.putheader('Content-Length', content_length) conn.putheader('Cookie', cookie) @@ -458,4 +459,4 @@ class DatastoreURL(object): 'AcquireGenericServiceTicket', session.vim.service_content.sessionManager, spec=spec) - return '%s="%s"' % (constants.CGI_COOKIE_KEY, ticket.id) + return '{}="{}"'.format(constants.CGI_COOKIE_KEY, ticket.id) diff --git a/oslo_vmware/pbm.py b/oslo_vmware/pbm.py index 84c6d3a5..587810c7 100644 --- a/oslo_vmware/pbm.py +++ b/oslo_vmware/pbm.py @@ -59,9 +59,9 @@ class Pbm(service.Service): """ base_url = service.Service.build_base_url(protocol, host, port) soap_url = base_url + '/pbm' - super(Pbm, self).__init__(wsdl_url, soap_url, cacert, insecure, - pool_maxsize, connection_timeout, - op_id_prefix) + super().__init__(wsdl_url, soap_url, cacert, insecure, + pool_maxsize, connection_timeout, + op_id_prefix) def set_soap_cookie(self, cookie): """Set the specified vCenter session cookie in the SOAP header @@ -193,7 +193,7 @@ def get_pbm_wsdl_location(vc_version): ver = vc_version.split('.') major_minor = ver[0] if len(ver) >= 2: - major_minor = '%s.%s' % (major_minor, ver[1]) + major_minor = '{}.{}'.format(major_minor, ver[1]) curr_dir = os.path.abspath(os.path.dirname(__file__)) pbm_service_wsdl = os.path.join(curr_dir, 'wsdl', major_minor, 'pbmService.wsdl') diff --git a/oslo_vmware/rw_handles.py b/oslo_vmware/rw_handles.py index e988f2f6..951789bc 100644 --- a/oslo_vmware/rw_handles.py +++ b/oslo_vmware/rw_handles.py @@ -44,7 +44,7 @@ READ_CHUNKSIZE = 65536 USER_AGENT = 'OpenStack-ESX-Adapter' -class FileHandle(object): +class FileHandle: """Base class for VMware server file (including VMDK) access over HTTP. This class wraps a backing file handle and provides utility methods @@ -184,7 +184,7 @@ class FileHandle(object): """returns the integer file descriptor by default this is not supported and raises IOError """ - raise IOError() + raise OSError() def seek(self, offset): """sets the file's current position at the offset @@ -243,7 +243,7 @@ class FileWriteHandle(FileHandle): else: soap_url = self._get_soap_url(scheme, host_or_url, port) param_list = {'dcPath': data_center_name, 'dsName': datastore_name} - self._url = '%s/folder/%s' % (soap_url, file_path) + self._url = '{}/folder/{}'.format(soap_url, file_path) self._url = self._url + '?' + urlparse.urlencode(param_list) self._conn = self._create_write_connection('PUT', @@ -284,7 +284,7 @@ class FileWriteHandle(FileHandle): except Exception: LOG.warning("Error occurred while reading the HTTP response.", exc_info=True) - super(FileWriteHandle, self).close() + super().close() def __str__(self): return "File write handle for %s" % self._url @@ -319,7 +319,7 @@ class FileReadHandle(FileHandle): else: soap_url = self._get_soap_url(scheme, host_or_url, port) param_list = {'dcPath': data_center_name, 'dsName': datastore_name} - self._url = '%s/folder/%s' % (soap_url, file_path) + self._url = '{}/folder/{}'.format(soap_url, file_path) self._url = self._url + '?' + urlparse.urlencode(param_list) self._conn = self._create_read_connection(self._url, @@ -353,7 +353,7 @@ class FileReadHandle(FileHandle): """Closes the connection. """ self._conn.close() - super(FileReadHandle, self).close() + super().close() LOG.debug("Closed File read handle for %s.", self._url) def get_size(self): @@ -373,7 +373,7 @@ class VmdkHandle(FileHandle): self._last_logged_progress = 0 self._last_progress_udpate = 0 - super(VmdkHandle, self).__init__(file_handle) + super().__init__(file_handle) def _log_progress(self, progress): """Log data transfer progress.""" @@ -586,7 +586,7 @@ class VmdkWriteHandle(VmdkHandle): overwrite=overwrite, content_type=content_type, ssl_thumbprint=thumbprint) - super(VmdkWriteHandle, self).__init__(session, lease, url, self._conn) + super().__init__(session, lease, url, self._conn) def get_imported_vm(self): """"Get managed object reference of the VM created for import. @@ -642,7 +642,7 @@ class VmdkWriteHandle(VmdkHandle): "for %s.", self._url, exc_info=True) - super(VmdkWriteHandle, self).close() + super().close() LOG.debug("Closed VMDK write handle for %s.", self._url) def _get_progress(self): @@ -685,8 +685,8 @@ class VmdkReadHandle(VmdkHandle): self._conn = self._create_read_connection(url, cookies=cookies, ssl_thumbprint=thumbprint) - super(VmdkReadHandle, self).__init__(session, lease, url, - self._conn.getresponse()) + super().__init__(session, lease, url, + self._conn.getresponse()) def read(self, chunk_size=READ_CHUNKSIZE): """Read a chunk of data from the VMDK file. @@ -731,7 +731,7 @@ class VmdkReadHandle(VmdkHandle): exc_info=True) raise finally: - super(VmdkReadHandle, self).close() + super().close() LOG.debug("Closed VMDK read handle for %s.", self._url) def _get_progress(self): @@ -741,7 +741,7 @@ class VmdkReadHandle(VmdkHandle): return "VMDK read handle for %s" % self._url -class ImageReadHandle(object): +class ImageReadHandle: """Read handle for glance images.""" def __init__(self, glance_read_iter): @@ -767,8 +767,7 @@ class ImageReadHandle(object): def get_next(self): """Get the next item from the image iterator.""" - for data in self._glance_read_iter: - yield data + yield from self._glance_read_iter def close(self): """Close the read handle. diff --git a/oslo_vmware/service.py b/oslo_vmware/service.py index 5e03ab5a..0c93cdae 100644 --- a/oslo_vmware/service.py +++ b/oslo_vmware/service.py @@ -138,8 +138,8 @@ class LocalFileAdapter(requests.adapters.HTTPAdapter): See http://stackoverflow.com/a/22989322 """ def __init__(self, pool_maxsize=10): - super(LocalFileAdapter, self).__init__(pool_connections=pool_maxsize, - pool_maxsize=pool_maxsize) + super().__init__(pool_connections=pool_maxsize, + pool_maxsize=pool_maxsize) def _build_response_from_file(self, request): file_path = request.url[7:] @@ -216,7 +216,7 @@ class CompatibilitySudsClient(client.Client): underlying transport. """ def __init__(self, *args, **kwargs): - super(CompatibilitySudsClient, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) @property def cookiejar(self): @@ -228,7 +228,7 @@ class CompatibilitySudsClient(client.Client): self.options.transport.cookiejar = cookies -class Service(object): +class Service: """Base class containing common functionality for invoking vSphere services """ @@ -366,8 +366,8 @@ class Service(object): if not skip_op_id: # Generate opID. It will appear in vCenter and ESX logs for # this particular remote call. - op_id = '%s-%s' % (self.op_id_prefix, - uuidutils.generate_uuid()) + op_id = '{}-{}'.format(self.op_id_prefix, + uuidutils.generate_uuid()) LOG.debug('Invoking %s.%s with opID=%s', vim_util.get_moref_type(managed_object), attr_name, diff --git a/oslo_vmware/tests/base.py b/oslo_vmware/tests/base.py index 69e6a802..7b2a5325 100644 --- a/oslo_vmware/tests/base.py +++ b/oslo_vmware/tests/base.py @@ -30,7 +30,7 @@ class TestCase(testtools.TestCase): def setUp(self): """Run before each test method to initialize test environment.""" - super(TestCase, self).setUp() + super().setUp() test_timeout = os.environ.get('OS_TEST_TIMEOUT', 0) try: test_timeout = int(test_timeout) diff --git a/oslo_vmware/tests/objects/test_datastore.py b/oslo_vmware/tests/objects/test_datastore.py index 991c7466..150884f2 100644 --- a/oslo_vmware/tests/objects/test_datastore.py +++ b/oslo_vmware/tests/objects/test_datastore.py @@ -23,14 +23,14 @@ from oslo_vmware.tests import base from oslo_vmware import vim_util -class HostMount(object): +class HostMount: def __init__(self, key, mountInfo): self.key = key self.mountInfo = mountInfo -class MountInfo(object): +class MountInfo: def __init__(self, accessMode, mounted, accessible): self.accessMode = accessMode @@ -111,21 +111,21 @@ class DatastoreTestCase(base.TestCase): m4 = HostMount("m4", MountInfo('readWrite', True, False)) ds.get_summary.assert_called_once_with(session) - class Prop(object): + class Prop: DatastoreHostMount = [m1, m2, m3, m4] - class HostRuntime(object): + class HostRuntime: inMaintenanceMode = in_maintenance_mode - class HostProp(object): + class HostProp: name = 'runtime' val = HostRuntime() - class Object(object): + class Object: obj = "m1" propSet = [HostProp()] - class Runtime(object): + class Runtime: objects = [Object()] session.invoke_api = mock.Mock(side_effect=[Prop(), Runtime()]) @@ -366,7 +366,7 @@ class DatastoreURLTestCase(base.TestCase): params = {'dcPath': dc_path, 'dsName': ds_name} query = urlparse.urlencode(params) url = datastore.DatastoreURL(scheme, server, path, dc_path, ds_name) - expected_url = '%s://%s/folder/%s?%s' % ( + expected_url = '{}://{}/folder/{}?{}'.format( scheme, server, path, query) self.assertEqual(expected_url, str(url)) @@ -379,7 +379,7 @@ class DatastoreURLTestCase(base.TestCase): params = {'dcPath': dc_path, 'dsName': ds_name} query = urlparse.urlencode(params) url = datastore.DatastoreURL(scheme, server, path, dc_path, ds_name) - expected_url = '%s://%s/folder/%s?%s' % ( + expected_url = '{}://{}/folder/{}?{}'.format( scheme, server, path.lstrip('/'), query) self.assertEqual(expected_url, str(url)) @@ -392,7 +392,7 @@ class DatastoreURLTestCase(base.TestCase): params = {'dcPath': dc_path, 'dsName': ds_name} query = urlparse.urlencode(params) url = datastore.DatastoreURL(scheme, server, path, dc_path, ds_name) - expected_url = '%s://%s/folder/%s?%s' % ( + expected_url = '{}://{}/folder/{}?{}'.format( scheme, server, path.rstrip('/'), query) self.assertEqual(expected_url, str(url)) @@ -429,7 +429,7 @@ class DatastoreURLTestCase(base.TestCase): params = {'dcPath': dc_path, 'dsName': ds_name} path = 'images/aa.vmdk' query = urlparse.urlencode(params) - url = 'https://13.37.73.31/folder/%s?%s' % (path, query) + url = 'https://13.37.73.31/folder/{}?{}'.format(path, query) ds_url = datastore.DatastoreURL.urlparse(url) self.assertEqual(path, ds_url.path) @@ -454,12 +454,12 @@ class DatastoreURLTestCase(base.TestCase): session = mock.Mock() session.invoke_api = mock.Mock() - class Ticket(object): + class Ticket: id = 'fake_id' session.invoke_api.return_value = Ticket() ds_url = datastore.DatastoreURL.urlparse(url) ticket = ds_url.get_transfer_ticket(session, 'PUT') - self.assertEqual('%s="%s"' % (constants.CGI_COOKIE_KEY, 'fake_id'), + self.assertEqual('{}="{}"'.format(constants.CGI_COOKIE_KEY, 'fake_id'), ticket) def test_get_datastore_by_ref(self): diff --git a/oslo_vmware/tests/test_api.py b/oslo_vmware/tests/test_api.py index af2a42d6..3a42358c 100644 --- a/oslo_vmware/tests/test_api.py +++ b/oslo_vmware/tests/test_api.py @@ -1,4 +1,3 @@ -# coding=utf-8 # Copyright (c) 2014 VMware, Inc. # All Rights Reserved. # @@ -105,7 +104,7 @@ class VMwareAPISessionTest(base.TestCase): POOL_SIZE = 15 def setUp(self): - super(VMwareAPISessionTest, self).setUp() + super().setUp() patcher = mock.patch('oslo_vmware.vim.Vim') self.addCleanup(patcher.stop) self.VimMock = patcher.start() @@ -318,7 +317,7 @@ class VMwareAPISessionTest(base.TestCase): api_session = self._create_api_session(True) fault_string = 'Invalid property.' fault_list = [exceptions.INVALID_PROPERTY] - details = {u'name': suds.sax.text.Text(u'фира')} + details = {'name': suds.sax.text.Text('фира')} module = mock.Mock() module.api.side_effect = exceptions.VimFaultException(fault_list, @@ -328,10 +327,10 @@ class VMwareAPISessionTest(base.TestCase): api_session.invoke_api, module, 'api') - details_str = u"{'name': 'фира'}" - expected_str = "%s\nFaults: %s\nDetails: %s" % (fault_string, - fault_list, - details_str) + details_str = "{'name': 'фира'}" + expected_str = "{}\nFaults: {}\nDetails: {}".format(fault_string, + fault_list, + details_str) self.assertEqual(expected_str, str(e)) self.assertEqual(details, e.details) diff --git a/oslo_vmware/tests/test_hacking.py b/oslo_vmware/tests/test_hacking.py index 9f5599da..57dbd38e 100644 --- a/oslo_vmware/tests/test_hacking.py +++ b/oslo_vmware/tests/test_hacking.py @@ -22,8 +22,8 @@ class HackingTestCase(base.TestCase): def test_no_log_translations(self): for log, hint in itertools.product(checks._all_log_levels, checks._all_hints): - bad = 'LOG.%s(%s("Bad"))' % (log, hint) + bad = 'LOG.{}({}("Bad"))'.format(log, hint) self.assertEqual(1, len(list(checks.no_translate_logs(bad, 'f')))) # Catch abuses when used with a variable and not a literal - bad = 'LOG.%s(%s(msg))' % (log, hint) + bad = 'LOG.{}({}(msg))'.format(log, hint) self.assertEqual(1, len(list(checks.no_translate_logs(bad, 'f')))) diff --git a/oslo_vmware/tests/test_rw_handles.py b/oslo_vmware/tests/test_rw_handles.py index 6f7d4c10..ed0b140a 100644 --- a/oslo_vmware/tests/test_rw_handles.py +++ b/oslo_vmware/tests/test_rw_handles.py @@ -97,7 +97,7 @@ class FileWriteHandleTest(base.TestCase): """Tests for FileWriteHandle.""" def setUp(self): - super(FileWriteHandleTest, self).setUp() + super().setUp() vim_cookie = mock.Mock() vim_cookie.name = 'name' @@ -188,7 +188,7 @@ class VmdkWriteHandleTest(base.TestCase): """Tests for VmdkWriteHandle.""" def setUp(self): - super(VmdkWriteHandleTest, self).setUp() + super().setUp() self._conn = mock.Mock() patcher = mock.patch( 'urllib3.connection.HTTPConnection') @@ -308,7 +308,7 @@ class VmdkReadHandleTest(base.TestCase): """Tests for VmdkReadHandle.""" def setUp(self): - super(VmdkReadHandleTest, self).setUp() + super().setUp() def _mock_connection(self, read_data='fake-data'): self._resp = mock.Mock() @@ -436,7 +436,7 @@ class ImageReadHandleTest(base.TestCase): max_items = 10 item = [1] * 10 - class ImageReadIterator(object): + class ImageReadIterator: def __init__(self): self.num_items = 0 diff --git a/oslo_vmware/tests/test_service.py b/oslo_vmware/tests/test_service.py index 29f72865..d3bcf2e0 100644 --- a/oslo_vmware/tests/test_service.py +++ b/oslo_vmware/tests/test_service.py @@ -32,7 +32,7 @@ class ServiceMessagePluginTest(base.TestCase): """Test class for ServiceMessagePlugin.""" def setUp(self): - super(ServiceMessagePluginTest, self).setUp() + super().setUp() self.plugin = service.ServiceMessagePlugin() @ddt.data(('value', 'foo', 'string'), ('removeKey', '1', 'int'), @@ -59,7 +59,7 @@ class ServiceMessagePluginTest(base.TestCase): class ServiceTest(base.TestCase): def setUp(self): - super(ServiceTest, self).setUp() + super().setUp() patcher = mock.patch('oslo_vmware.service.CompatibilitySudsClient') self.addCleanup(patcher.stop) self.SudsClientMock = patcher.start() @@ -536,7 +536,7 @@ class SudsLogFilterTest(base.TestCase): """Tests for SudsLogFilter.""" def setUp(self): - super(SudsLogFilterTest, self).setUp() + super().setUp() self.log_filter = service.SudsLogFilter() self.login = mock.Mock(spec=suds.sax.element.Element) diff --git a/oslo_vmware/tests/test_vim.py b/oslo_vmware/tests/test_vim.py index ca0fb9e6..dada52aa 100644 --- a/oslo_vmware/tests/test_vim.py +++ b/oslo_vmware/tests/test_vim.py @@ -30,7 +30,7 @@ class VimTest(base.TestCase): """Test class for Vim.""" def setUp(self): - super(VimTest, self).setUp() + super().setUp() patcher = mock.patch('oslo_vmware.service.CompatibilitySudsClient') self.addCleanup(patcher.stop) self.SudsClientMock = patcher.start() @@ -78,7 +78,7 @@ class VimTest(base.TestCase): class VMwareSudsTest(base.TestCase): def setUp(self): - super(VMwareSudsTest, self).setUp() + super().setUp() def new_client_init(self, url, **kwargs): return @@ -89,7 +89,7 @@ class VMwareSudsTest(base.TestCase): self.vim = self._vim_create() def _mock_getattr(self, attr_name): - class fake_service_content(object): + class fake_service_content: def __init__(self): self.ServiceContent = {} self.ServiceContent.fake = 'fake' diff --git a/oslo_vmware/vim.py b/oslo_vmware/vim.py index a97ffc2c..0d4be2f7 100644 --- a/oslo_vmware/vim.py +++ b/oslo_vmware/vim.py @@ -44,9 +44,9 @@ class Vim(service.Service): soap_url = base_url + '/sdk' if wsdl_url is None: wsdl_url = soap_url + '/vimService.wsdl' - super(Vim, self).__init__(wsdl_url, soap_url, cacert, insecure, - pool_maxsize, connection_timeout, - op_id_prefix) + super().__init__(wsdl_url, soap_url, cacert, insecure, + pool_maxsize, connection_timeout, + op_id_prefix) def retrieve_service_content(self): return self.RetrieveServiceContent(service.SERVICE_INSTANCE) diff --git a/oslo_vmware/vim_util.py b/oslo_vmware/vim_util.py index 945c98a0..c81b715f 100644 --- a/oslo_vmware/vim_util.py +++ b/oslo_vmware/vim_util.py @@ -433,7 +433,7 @@ def continue_retrieval(vim, retrieve_result): return vim.ContinueRetrievePropertiesEx(collector, token=token) -class WithRetrieval(object): +class WithRetrieval: """Context to retrieve results. This context provides an iterator to retrieve results and cancel (when @@ -447,7 +447,7 @@ class WithRetrieval(object): """ def __init__(self, vim, retrieve_result): - super(WithRetrieval, self).__init__() + super().__init__() self.vim = vim self.retrieve_result = retrieve_result @@ -460,8 +460,7 @@ class WithRetrieval(object): def __iter__(self): while self.retrieve_result: - for obj in self.retrieve_result.objects: - yield obj + yield from self.retrieve_result.objects self.retrieve_result = continue_retrieval( self.vim, self.retrieve_result) @@ -577,13 +576,13 @@ def get_inventory_path(vim, entity_ref, max_objects=100): if len(propSet) >= 1 and not entity_name: entity_name = propSet[0].val elif len(propSet) >= 1: - path = '%s/%s' % (propSet[0].val, path) + path = '{}/{}'.format(propSet[0].val, path) # NOTE(arnaud): slice to exclude the root folder from the result. if propSet is not None and len(propSet) > 0: path = path[len(propSet[0].val):] if entity_name is None: entity_name = "" - return '%s%s' % (path, entity_name) + return '{}{}'.format(path, entity_name) def get_http_service_request_spec(client_factory, method, uri): diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py index ef0dec4a..83065b7f 100644 --- a/releasenotes/source/conf.py +++ b/releasenotes/source/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright (C) 2020 Red Hat, Inc. # # Licensed under the Apache License, Version 2.0 (the "License");