Merge "Raise hacking to latest 2.0.0 release"

This commit is contained in:
Zuul 2020-03-30 14:50:31 +00:00 committed by Gerrit Code Review
commit 2143060833
33 changed files with 94 additions and 60 deletions

View File

@ -242,7 +242,7 @@ def upload_data_to_store(req, image_meta, image_data, store, notifier):
request=req, request=req,
content_type='text/plain') content_type='text/plain')
except exception.ImageSizeLimitExceeded as e: except exception.ImageSizeLimitExceeded:
msg = (_("Denying attempt to upload image larger than %d bytes.") msg = (_("Denying attempt to upload image larger than %d bytes.")
% CONF.image_size_cap) % CONF.image_size_cap)
LOG.warn(msg) LOG.warn(msg)
@ -273,7 +273,7 @@ def upload_data_to_store(req, image_meta, image_data, store, notifier):
LOG.exception(msg) LOG.exception(msg)
safe_kill(req, image_id, 'saving') safe_kill(req, image_id, 'saving')
except (ValueError, IOError) as e: except (ValueError, IOError):
msg = _("Client disconnected before sending all data to backend") msg = _("Client disconnected before sending all data to backend")
LOG.warn(msg) LOG.warn(msg)
safe_kill(req, image_id, 'saving') safe_kill(req, image_id, 'saving')
@ -281,7 +281,7 @@ def upload_data_to_store(req, image_meta, image_data, store, notifier):
content_type="text/plain", content_type="text/plain",
request=req) request=req)
except Exception as e: except Exception:
msg = _("Failed to upload image %s") % image_id msg = _("Failed to upload image %s") % image_id
LOG.exception(msg) LOG.exception(msg)
safe_kill(req, image_id, 'saving') safe_kill(req, image_id, 'saving')

View File

@ -234,7 +234,7 @@ class ImageDataController(object):
LOG.exception(msg) LOG.exception(msg)
raise webob.exc.HTTPConflict(explanation=e.msg, request=req) raise webob.exc.HTTPConflict(explanation=e.msg, request=req)
except exception.Forbidden as e: except exception.Forbidden:
msg = ("Not allowed to upload image data for image %s" % msg = ("Not allowed to upload image data for image %s" %
image_id) image_id)
LOG.debug(msg) LOG.debug(msg)
@ -283,16 +283,16 @@ class ImageDataController(object):
self._delete(image_repo, image) self._delete(image_repo, image)
raise webob.exc.HTTPBadRequest(explanation=msg) raise webob.exc.HTTPBadRequest(explanation=msg)
except webob.exc.HTTPGone as e: except webob.exc.HTTPGone:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
LOG.error(_LE("Failed to upload image data due to HTTP error")) LOG.error(_LE("Failed to upload image data due to HTTP error"))
except webob.exc.HTTPError as e: except webob.exc.HTTPError:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
LOG.error(_LE("Failed to upload image data due to HTTP error")) LOG.error(_LE("Failed to upload image data due to HTTP error"))
self._restore(image_repo, image) self._restore(image_repo, image)
except Exception as e: except Exception:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
LOG.error(_LE("Failed to upload image data due to " LOG.error(_LE("Failed to upload image data due to "
"internal error")) "internal error"))
@ -346,7 +346,7 @@ class ImageDataController(object):
staging_store.add( staging_store.add(
image_id, utils.LimitingReader( image_id, utils.LimitingReader(
utils.CooperativeReader(data), CONF.image_size_cap), 0) utils.CooperativeReader(data), CONF.image_size_cap), 0)
except glance_store.Duplicate as e: except glance_store.Duplicate:
msg = _("The image %s has data on staging") % image_id msg = _("The image %s has data on staging") % image_id
raise webob.exc.HTTPConflict(explanation=msg) raise webob.exc.HTTPConflict(explanation=msg)
@ -390,7 +390,7 @@ class ImageDataController(object):
LOG.debug(msg) LOG.debug(msg)
raise webob.exc.HTTPConflict(explanation=e.msg, request=req) raise webob.exc.HTTPConflict(explanation=e.msg, request=req)
except Exception as e: except Exception:
with excutils.save_and_reraise_exception(): with excutils.save_and_reraise_exception():
LOG.exception(_LE("Failed to stage image data due to " LOG.exception(_LE("Failed to stage image data due to "
"internal error")) "internal error"))

View File

@ -182,12 +182,10 @@ class ImagesController(object):
'backend': stores} 'backend': stores}
if (import_method == 'web-download' and if (import_method == 'web-download' and
not utils.validate_import_uri(uri)): not utils.validate_import_uri(uri)):
LOG.debug("URI for web-download does not pass filtering: %s", LOG.debug("URI for web-download does not pass filtering: %s", uri)
uri) msg = (_("URI for web-download does not pass filtering: %s") % uri)
msg = (_("URI for web-download does not pass filtering: %s") % raise webob.exc.HTTPBadRequest(explanation=msg)
uri)
raise webob.exc.HTTPBadRequest(explanation=msg)
try: try:
import_task = task_factory.new_task(task_type='api_image_import', import_task = task_factory.new_task(task_type='api_image_import',
@ -506,7 +504,7 @@ class ImagesController(object):
except (glance_store.Forbidden, exception.Forbidden) as e: except (glance_store.Forbidden, exception.Forbidden) as e:
LOG.debug("User not permitted to delete image '%s'", image_id) LOG.debug("User not permitted to delete image '%s'", image_id)
raise webob.exc.HTTPForbidden(explanation=e.msg) raise webob.exc.HTTPForbidden(explanation=e.msg)
except (glance_store.NotFound, exception.NotFound) as e: except (glance_store.NotFound, exception.NotFound):
msg = (_("Failed to find image %(image_id)s to delete") % msg = (_("Failed to find image %(image_id)s to delete") %
{'image_id': image_id}) {'image_id': image_id})
LOG.warn(msg) LOG.warn(msg)
@ -1176,8 +1174,8 @@ class ResponseSerializer(wsgi.JSONResponseSerializer):
locations = _get_image_locations(image) locations = _get_image_locations(image)
if locations: if locations:
# Choose best location configured strategy # Choose best location configured strategy
l = location_strategy.choose_best_location(locations) loc = location_strategy.choose_best_location(locations)
image_view['direct_url'] = l['url'] image_view['direct_url'] = loc['url']
else: else:
LOG.debug("The 'locations' list of image %s is empty, " LOG.debug("The 'locations' list of image %s is empty, "
"not including 'direct_url' in response", "not including 'direct_url' in response",

View File

@ -128,7 +128,7 @@ class ResourceTypeController(object):
LOG.debug("User not permitted to delete metadata resource type " LOG.debug("User not permitted to delete metadata resource type "
"'%s' within '%s' namespace", resource_type, namespace) "'%s' within '%s' namespace", resource_type, namespace)
raise webob.exc.HTTPForbidden(explanation=e.msg) raise webob.exc.HTTPForbidden(explanation=e.msg)
except exception.NotFound as e: except exception.NotFound:
msg = (_("Failed to find resource type %(resourcetype)s to " msg = (_("Failed to find resource type %(resourcetype)s to "
"delete") % {'resourcetype': resource_type}) "delete") % {'resourcetype': resource_type})
LOG.error(msg) LOG.error(msg)

View File

@ -524,5 +524,6 @@ def main():
except (RuntimeError, NotImplementedError) as e: except (RuntimeError, NotImplementedError) as e:
sys.exit("ERROR: %s" % e) sys.exit("ERROR: %s" % e)
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@ -757,7 +757,7 @@ def main():
config.parse_args() config.parse_args()
except RuntimeError as e: except RuntimeError as e:
sys.exit("ERROR: %s" % encodeutils.exception_to_unicode(e)) sys.exit("ERROR: %s" % encodeutils.exception_to_unicode(e))
except SystemExit as e: except SystemExit:
sys.exit("Please specify one command") sys.exit("Please specify one command")
# Setup logging # Setup logging

View File

@ -136,7 +136,7 @@ class SwiftParams(object):
reference['user'] = CONFIG.get(ref, 'user') reference['user'] = CONFIG.get(ref, 'user')
reference['key'] = CONFIG.get(ref, 'key') reference['key'] = CONFIG.get(ref, 'key')
account_params[ref] = reference account_params[ref] = reference
except (ValueError, SyntaxError, configparser.NoOptionError) as e: except (ValueError, SyntaxError, configparser.NoOptionError):
LOG.exception(_LE("Invalid format of swift store config " LOG.exception(_LE("Invalid format of swift store config "
"cfg")) "cfg"))
return account_params return account_params

View File

@ -76,6 +76,7 @@ def iso8601_from_timestamp(timestamp, microsecond=False):
"""Returns an iso8601 formatted date from timestamp.""" """Returns an iso8601 formatted date from timestamp."""
return isotime(datetime.datetime.utcfromtimestamp(timestamp), microsecond) return isotime(datetime.datetime.utcfromtimestamp(timestamp), microsecond)
utcnow.override_time = None utcnow.override_time = None

View File

@ -970,7 +970,7 @@ class APIMapper(routes.Mapper):
""" """
def routematch(self, url=None, environ=None): def routematch(self, url=None, environ=None):
if url is "": if url == "":
result = self._match("", environ) result = self._match("", environ)
return result[0], result[1] return result[0], result[1]
return routes.Mapper.routematch(self, url, environ) return routes.Mapper.routematch(self, url, environ)

View File

@ -19,6 +19,7 @@ import osprofiler.initializer
from glance.common import config from glance.common import config
from glance.common import store_utils from glance.common import store_utils
from glance.i18n import _
from glance import notifier from glance import notifier
CONF = cfg.CONF CONF = cfg.CONF

View File

@ -1056,8 +1056,11 @@ def _sort_tasks(tasks, sort_key, sort_dir):
reverse = False reverse = False
if tasks and not (sort_key in tasks[0]): if tasks and not (sort_key in tasks[0]):
raise exception.InvalidSortKey() raise exception.InvalidSortKey()
keyfn = lambda x: (x[sort_key] if x[sort_key] is not None else '',
x['created_at'], x['id']) def keyfn(x):
return (x[sort_key] if x[sort_key] is not None else '',
x['created_at'], x['id'])
reverse = sort_dir == 'desc' reverse = sort_dir == 'desc'
tasks.sort(key=keyfn, reverse=reverse) tasks.sort(key=keyfn, reverse=reverse)
return tasks return tasks

View File

@ -82,6 +82,7 @@ def run_migrations_online():
with context.begin_transaction(): with context.begin_transaction():
context.run_migrations() context.run_migrations()
if context.is_offline_mode(): if context.is_offline_mode():
run_migrations_offline() run_migrations_offline()
else: else:

View File

@ -182,7 +182,7 @@ def _get_all_by_resource_types(context, session, filters, marker=None,
for name, namespace_id in db_recs: for name, namespace_id in db_recs:
namespace_id_list.append(namespace_id) namespace_id_list.append(namespace_id)
if len(namespace_id_list) is 0: if len(namespace_id_list) == 0:
return [] return []
filters2 = filters filters2 = filters

View File

@ -26,32 +26,40 @@ from glance.i18n import _LI
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
String = lambda length: sqlalchemy.types.String( def String(length):
length=length, convert_unicode=False, return sqlalchemy.types.String(
unicode_error=None, _warn_on_bytestring=False) length=length, convert_unicode=False,
unicode_error=None, _warn_on_bytestring=False)
Text = lambda: sqlalchemy.types.Text( def Text():
length=None, convert_unicode=False, return sqlalchemy.types.Text(
unicode_error=None, _warn_on_bytestring=False) length=None, convert_unicode=False,
unicode_error=None, _warn_on_bytestring=False)
Boolean = lambda: sqlalchemy.types.Boolean(create_constraint=True, name=None) def Boolean():
return sqlalchemy.types.Boolean(create_constraint=True, name=None)
DateTime = lambda: sqlalchemy.types.DateTime(timezone=False) def DateTime():
return sqlalchemy.types.DateTime(timezone=False)
Integer = lambda: sqlalchemy.types.Integer() def Integer():
return sqlalchemy.types.Integer()
BigInteger = lambda: sqlalchemy.types.BigInteger() def BigInteger():
return sqlalchemy.types.BigInteger()
PickleType = lambda: sqlalchemy.types.PickleType() def PickleType():
return sqlalchemy.types.PickleType()
Numeric = lambda: sqlalchemy.types.Numeric() def Numeric():
return sqlalchemy.types.Numeric()
def from_migration_import(module_name, fromlist): def from_migration_import(module_name, fromlist):

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import Column, MetaData, Table, and_, select
from glance.db.sqlalchemy.migrate_repo.schema import ( from glance.db.sqlalchemy.migrate_repo.schema import (
Boolean, DateTime, Integer, String, Text, from_migration_import) # noqa Boolean, DateTime, Integer, String, Text, from_migration_import) # noqa

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import Column, MetaData, Table
from glance.db.sqlalchemy.migrate_repo.schema import ( from glance.db.sqlalchemy.migrate_repo.schema import (
Boolean, DateTime, Integer, String, Text, from_migration_import) # noqa Boolean, DateTime, Integer, String, Text, from_migration_import) # noqa

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import Column, MetaData, Table
from glance.db.sqlalchemy.migrate_repo.schema import ( from glance.db.sqlalchemy.migrate_repo.schema import (
Boolean, DateTime, BigInteger, Integer, String, Boolean, DateTime, BigInteger, Integer, String,

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import Index, MetaData
from glance.db.sqlalchemy.migrate_repo.schema import from_migration_import from glance.db.sqlalchemy.migrate_repo.schema import from_migration_import

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import Column, MetaData, Table
from glance.db.sqlalchemy.migrate_repo.schema import ( from glance.db.sqlalchemy.migrate_repo.schema import (
Boolean, DateTime, BigInteger, Integer, String, Boolean, DateTime, BigInteger, Integer, String,

View File

@ -13,7 +13,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import Column, ForeignKey, Index, MetaData, Table
from sqlalchemy import UniqueConstraint
from glance.db.sqlalchemy.migrate_repo.schema import ( from glance.db.sqlalchemy.migrate_repo.schema import (
Boolean, DateTime, Integer, String, create_tables, Boolean, DateTime, Integer, String, create_tables,

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import Column, MetaData, Table
from glance.db.sqlalchemy.migrate_repo.schema import ( from glance.db.sqlalchemy.migrate_repo.schema import (
Boolean, DateTime, Integer, String, Text) # noqa Boolean, DateTime, Integer, String, Text) # noqa

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from sqlalchemy import * # noqa from sqlalchemy import MetaData
from glance.db.sqlalchemy.migrate_repo.schema import from_migration_import from glance.db.sqlalchemy.migrate_repo.schema import from_migration_import

View File

@ -13,14 +13,28 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from oslo_i18n import * # noqa import oslo_i18n as i18n
_translators = TranslatorFactory(domain='glance') DOMAIN = 'glance'
_translators = i18n.TranslatorFactory(domain=DOMAIN)
# The primary translation function using the well-known name "_" # The primary translation function using the well-known name "_"
_ = _translators.primary _ = _translators.primary
def enable_lazy(enable=True):
return i18n.enable_lazy(enable)
def translate(value, user_locale=None):
return i18n.translate(value, user_locale)
def get_available_languages(domain=DOMAIN):
return i18n.get_available_languages(domain)
# i18n log translation functions are deprecated. While removing the invocations # i18n log translation functions are deprecated. While removing the invocations
# requires a lot of reviewing effort, we decide to make it as no-op functions. # requires a lot of reviewing effort, we decide to make it as no-op functions.
def _LI(msg): def _LI(msg):

View File

@ -1383,7 +1383,9 @@ class DriverTests(object):
return return
def _assertMemberListMatch(list1, list2): def _assertMemberListMatch(list1, list2):
_simple = lambda x: set([(o['member'], o['image_id']) for o in x]) def _simple(x):
return set([(o['member'], o['image_id']) for o in x])
self.assertEqual(_simple(list1), _simple(list2)) self.assertEqual(_simple(list1), _simple(list2))
# NOTE(flaper87): Update auth token, otherwise # NOTE(flaper87): Update auth token, otherwise

View File

@ -122,7 +122,7 @@ class ResourceTypeController(object):
raise exception.NotFound() raise exception.NotFound()
except exception.Forbidden as e: except exception.Forbidden as e:
raise webob.exc.HTTPForbidden(explanation=e.msg) raise webob.exc.HTTPForbidden(explanation=e.msg)
except exception.NotFound as e: except exception.NotFound:
msg = (_("Failed to find resource type %(resourcetype)s to " msg = (_("Failed to find resource type %(resourcetype)s to "
"delete") % {'resourcetype': resource_type}) "delete") % {'resourcetype': resource_type})
LOG.error(msg) LOG.error(msg)

View File

@ -394,9 +394,9 @@ class ResourceTest(test_utils.BaseTestCase):
def test_response_headers_encoded(self): def test_response_headers_encoded(self):
# prepare environment # prepare environment
for_openstack_comrades = \ for_openstack_comrades = (
u'\u0417\u0430 \u043e\u043f\u0435\u043d\u0441\u0442\u0435\u043a, ' \ u'\u0417\u0430 \u043e\u043f\u0435\u043d\u0441\u0442\u0435\u043a, '
u'\u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0438' u'\u0442\u043e\u0432\u0430\u0440\u0438\u0449\u0438')
class FakeController(object): class FakeController(object):
def index(self, shirt, pants=None): def index(self, shirt, pants=None):

View File

@ -61,6 +61,7 @@ class TestDbUtilities(test_utils.BaseTestCase):
import_module.assert_called_once_with('glance.db.sqlalchemy.api') import_module.assert_called_once_with('glance.db.sqlalchemy.api')
api.configure.assert_called_once_with() api.configure.assert_called_once_with()
UUID1 = 'c80a1a6c-bd1f-41c5-90ee-81afedb1d58d' UUID1 = 'c80a1a6c-bd1f-41c5-90ee-81afedb1d58d'
UUID2 = 'a85abd86-55b3-4d5b-b0b4-5d0a6e6042fc' UUID2 = 'a85abd86-55b3-4d5b-b0b4-5d0a6e6042fc'
UUID3 = '971ec09a-8067-4bc8-a91f-ae3557f1c4c7' UUID3 = '971ec09a-8067-4bc8-a91f-ae3557f1c4c7'

View File

@ -178,12 +178,11 @@ class ImagePager(object):
page_size = image_count page_size = image_count
self.image_batches = [] self.image_batches = []
start = 0 start = 0
l = len(images) while start < image_count:
while start < l:
self.image_batches.append(images[start: start + page_size]) self.image_batches.append(images[start: start + page_size])
start += page_size start += page_size
if (l - start) < page_size: if (image_count - start) < page_size:
page_size = l - start page_size = image_count - start
def __call__(self): def __call__(self):
if len(self.image_batches) == 0: if len(self.image_batches) == 0:

View File

@ -65,7 +65,7 @@ def sort_url_by_qs_keys(url):
def get_fake_request(path='', method='POST', is_admin=False, user=USER1, def get_fake_request(path='', method='POST', is_admin=False, user=USER1,
roles=None, tenant=TENANT1): roles=None, tenant=TENANT1):
if roles is None: if roles is None:
roles = ['member'] roles = ['member']
req = wsgi.Request.blank(path) req = wsgi.Request.blank(path)
req.method = method req.method = method

View File

@ -84,6 +84,7 @@ def _domain_fixture(task_id, **kwargs):
task = glance.domain.Task(**task_properties) task = glance.domain.Task(**task_properties)
return task return task
CONF = cfg.CONF CONF = cfg.CONF
CONF.import_opt('task_time_to_live', 'glance.common.config', group='task') CONF.import_opt('task_time_to_live', 'glance.common.config', group='task')

View File

@ -36,7 +36,7 @@ gitdb2==2.0.3
GitPython==2.1.8 GitPython==2.1.8
glance-store==1.0.0 glance-store==1.0.0
greenlet==0.4.13 greenlet==0.4.13
hacking==0.12.0 hacking==2.0.0
httplib2==0.9.1 httplib2==0.9.1
idna==2.6 idna==2.6
imagesize==1.0.0 imagesize==1.0.0

View File

@ -3,7 +3,7 @@
# process, which may cause wedges in the gate later. # process, which may cause wedges in the gate later.
# Hacking already pins down pep8, pyflakes and flake8 # Hacking already pins down pep8, pyflakes and flake8
hacking!=0.13.0,<0.14,>=0.12.0 # Apache-2.0 hacking>=2.0.0 # Apache-2.0
# For translations processing # For translations processing
Babel!=2.4.0,>=2.3.4 # BSD Babel!=2.4.0,>=2.3.4 # BSD

View File

@ -118,11 +118,14 @@ ignore-path = .venv,.git,.tox,*glance/locale*,*lib/python*,glance.egg*,api-ref/b
[flake8] [flake8]
# TODO(dmllr): Analyze or fix the warnings blacklisted below # TODO(dmllr): Analyze or fix the warnings blacklisted below
# E402 module level import not at top of file
# E711 comparison to None should be 'if cond is not None:' # E711 comparison to None should be 'if cond is not None:'
# E712 comparison to True should be 'if cond is True:' or 'if cond:' # E712 comparison to True should be 'if cond is True:' or 'if cond:'
# H404 multi line docstring should start with a summary # H404 multi line docstring should start with a summary
# H405 multi line docstring summary not separated with an empty line # H405 multi line docstring summary not separated with an empty line
ignore = E711,E712,H404,H405 # W503 line break before binary operator - conflicting guidance
# W504 line break after binary operator - conflicting guidance
ignore = E402,E711,E712,H404,H405,W503,W504
exclude = .venv,.git,.tox,dist,doc,etc,*glance/locale*,*lib/python*,*egg,build exclude = .venv,.git,.tox,dist,doc,etc,*glance/locale*,*lib/python*,*egg,build
[hacking] [hacking]