Refactoring Glance logging lowering levels

This change fixes translations to be using correct translation functions.
Contains few log level drops for too high logging levels.

This PS does not address logging changes for modules under glance/store/
due to the new repo request. After stores are moved to their own repo
new PS will be submitted for those.

This PS does not touch the test code.

Separate PS will be submitted for log lever raises withing codebase
as requested during the spec review.

Related to bp refactoring-glance-logging

Change-Id: I683c35face8d5b7056ef7fedcd75deb63dbbf8e2
This commit is contained in:
Erno Kuvaja 2014-07-14 14:08:19 +00:00
parent 36818b4a6e
commit e694ed04f6
24 changed files with 314 additions and 228 deletions

View File

@ -19,10 +19,14 @@ from oslo.config import cfg
from glance.common import exception
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
from glance.openstack.common import log as logging
from glance.openstack.common import units
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
_LW = gettextutils._LW
CONF = cfg.CONF
@ -46,16 +50,16 @@ def size_checked_iter(response, image_meta, expected_size, image_iter,
bytes_written += len(chunk)
except Exception as err:
with excutils.save_and_reraise_exception():
msg = (_("An error occurred reading from backend storage for "
"image %(image_id)s: %(err)s") % {'image_id': image_id,
'err': err})
msg = (_LE("An error occurred reading from backend storage for "
"image %(image_id)s: %(err)s") % {'image_id': image_id,
'err': err})
LOG.error(msg)
if expected_size != bytes_written:
msg = (_("Backend storage for image %(image_id)s "
"disconnected after writing only %(bytes_written)d "
"bytes") % {'image_id': image_id,
'bytes_written': bytes_written})
msg = (_LE("Backend storage for image %(image_id)s "
"disconnected after writing only %(bytes_written)d "
"bytes") % {'image_id': image_id,
'bytes_written': bytes_written})
LOG.error(msg)
raise exception.GlanceException(_("Corrupt image download for "
"image %(image_id)s") %
@ -83,8 +87,8 @@ def image_send_notification(bytes_written, expected_size, image_meta, request,
notify('image.send', payload)
except Exception as err:
msg = (_("An error occurred during image.send"
" notification: %(err)s") % {'err': err})
msg = (_LE("An error occurred during image.send"
" notification: %(err)s") % {'err': err})
LOG.error(msg)
@ -109,8 +113,8 @@ def get_remaining_quota(context, db_api, image_id=None):
match = pattern.match(users_quota)
if not match:
LOG.warn(_("Invalid value for option user_storage_quota: "
"%(users_quota)s")
LOG.warn(_LW("Invalid value for option user_storage_quota: "
"%(users_quota)s")
% {'users_quota': users_quota})
return None
@ -154,18 +158,18 @@ def check_quota(context, image_size, db_api, image_id=None):
# exception is when there is no room left at all, thus we know
# it will not fit
if remaining <= 0:
LOG.info(_("User %(user)s attempted to upload an image of"
" unknown size that will exceeed the quota."
" %(remaining)d bytes remaining.")
LOG.info(_LI("User %(user)s attempted to upload an image of"
" unknown size that will exceeed the quota."
" %(remaining)d bytes remaining.")
% {'user': user, 'remaining': remaining})
raise exception.StorageQuotaFull(image_size=image_size,
remaining=remaining)
return
if image_size > remaining:
LOG.info(_("User %(user)s attempted to upload an image of size"
" %(size)d that will exceeed the quota. %(remaining)d"
" bytes remaining.")
LOG.info(_LI("User %(user)s attempted to upload an image of size"
" %(size)d that will exceeed the quota. %(remaining)d"
" bytes remaining.")
% {'user': user, 'size': image_size, 'remaining': remaining})
raise exception.StorageQuotaFull(image_size=image_size,
remaining=remaining)

View File

@ -35,10 +35,14 @@ from glance.common import wsgi
import glance.db
from glance import image_cache
from glance import notifier
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
import glance.registry.client.v1.api as registry
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
_LE = gettextutils._LE
_LW = gettextutils._LW
PATTERNS = {
('v1', 'GET'): re.compile(r'^/v1/images/([^\/]+)$'),
@ -54,7 +58,7 @@ class CacheFilter(wsgi.Middleware):
self.cache = image_cache.ImageCache()
self.serializer = images.ImageSerializer()
self.policy = policy.Enforcer()
LOG.info(_("Initialized image cache middleware"))
LOG.info(_LI("Initialized image cache middleware"))
super(CacheFilter, self).__init__(app)
def _verify_metadata(self, image_meta):
@ -129,9 +133,9 @@ class CacheFilter(wsgi.Middleware):
try:
return method(request, image_id, image_iterator)
except exception.NotFound:
msg = _("Image cache contained image file for image '%s', "
"however the registry did not contain metadata for "
"that image!") % image_id
msg = _LE("Image cache contained image file for image '%s', "
"however the registry did not contain metadata for "
"that image!") % image_id
LOG.error(msg)
self.cache.delete_cached_image(image_id)
@ -227,7 +231,7 @@ class CacheFilter(wsgi.Middleware):
try:
process_response_method = getattr(self, method_str)
except AttributeError:
LOG.error(_('could not find %s') % method_str)
LOG.error(_LE('could not find %s') % method_str)
# Nothing to do here, move along
return resp
else:
@ -247,7 +251,7 @@ class CacheFilter(wsgi.Middleware):
image_checksum = resp.headers.get('x-image-meta-checksum')
if not image_checksum:
LOG.error(_("Checksum header is missing."))
LOG.error(_LE("Checksum header is missing."))
# NOTE(zhiyan): image_cache return a generator object and set to
# response.app_iter, it will be called by eventlet.wsgi later.

View File

@ -21,9 +21,11 @@ import routes
from glance.api import cached_images
from glance.common import wsgi
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
class CacheManageFilter(wsgi.Middleware):
@ -69,7 +71,7 @@ class CacheManageFilter(wsgi.Middleware):
self._mapper = mapper
self._resource = resource
LOG.info(_("Initialized image cache management middleware"))
LOG.info(_LI("Initialized image cache management middleware"))
super(CacheManageFilter, self).__init__(app)
def process_request(self, request):

View File

@ -20,9 +20,11 @@ Use gzip compression if the client accepts it.
import re
from glance.common import wsgi
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
class GzipMiddleware(wsgi.Middleware):
@ -30,7 +32,7 @@ class GzipMiddleware(wsgi.Middleware):
re_zip = re.compile(r'\bgzip\b')
def __init__(self, app):
LOG.info(_("Initialized gzip middleware"))
LOG.info(_LI("Initialized gzip middleware"))
super(GzipMiddleware, self).__init__(app)
def process_response(self, response):

View File

@ -42,6 +42,7 @@ from glance.common import utils
from glance.common import wsgi
from glance import notifier
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
from glance.openstack.common import strutils
import glance.registry.client.v1.api as registry
@ -54,6 +55,7 @@ from glance.store import get_store_from_scheme
from glance.store import validate_location
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
SUPPORTED_PARAMS = glance.api.v1.SUPPORTED_PARAMS
SUPPORTED_FILTERS = glance.api.v1.SUPPORTED_FILTERS
ACTIVE_IMMUTABLE = glance.api.v1.ACTIVE_IMMUTABLE
@ -696,7 +698,7 @@ class Controller(controller.BaseController):
image_meta)
image_meta = self._upload_and_activate(req, image_meta)
elif copy_from:
msg = _('Triggering asynchronous copy from external source')
msg = _LI('Triggering asynchronous copy from external source')
LOG.info(msg)
self.pool.spawn_n(self._upload_and_activate, req, image_meta)
else:
@ -1106,10 +1108,10 @@ class ImageDeserializer(wsgi.JSONRequestDeserializer):
elif image_size > CONF.image_size_cap:
max_image_size = CONF.image_size_cap
msg = _("Denying attempt to upload image larger than %d bytes.")
LOG.warn(msg % max_image_size)
raise HTTPBadRequest(explanation=msg % max_image_size,
request=request)
msg = (_("Denying attempt to upload image larger than %d"
" bytes.") % max_image_size)
LOG.warn(msg)
raise HTTPBadRequest(explanation=msg, request=request)
result['image_data'] = data
return result

View File

@ -21,6 +21,7 @@ from glance.common import store_utils
from glance.common import utils
import glance.db
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
import glance.registry.client.v1.api as registry
import glance.store as store_api
@ -28,6 +29,8 @@ import glance.store as store_api
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
def initiate_deletion(req, location_data, id):
@ -66,7 +69,7 @@ def safe_kill(req, image_id):
try:
_kill(req, image_id)
except Exception:
LOG.exception(_("Unable to kill image %(id)s: ") % {'id': image_id})
LOG.exception(_LE("Unable to kill image %(id)s: ") % {'id': image_id})
def upload_data_to_store(req, image_meta, image_data, store, notifier):
@ -106,8 +109,8 @@ def upload_data_to_store(req, image_meta, image_data, store, notifier):
req.context, size, db_api, image_id=image_id)
except exception.StorageQuotaFull:
with excutils.save_and_reraise_exception():
LOG.info(_('Cleaning up %s after exceeding '
'the quota') % image_id)
LOG.info(_LI('Cleaning up %s after exceeding '
'the quota') % image_id)
store_utils.safe_delete_from_backend(
req.context, image_meta['id'], location_data)
@ -147,8 +150,8 @@ def upload_data_to_store(req, image_meta, image_data, store, notifier):
update_data)
except exception.NotFound as e:
msg = _("Image %s could not be found after upload. The image may "
"have been deleted during the upload.") % image_id
msg = _LI("Image %s could not be found after upload. The image may"
" have been deleted during the upload.") % image_id
LOG.info(msg)
# NOTE(jculp): we need to clean up the datastore if an image
@ -226,7 +229,7 @@ def upload_data_to_store(req, image_meta, image_data, store, notifier):
# but something in the above function calls is affecting the
# exception context and we must explicitly re-raise the
# caught exception.
msg = _("Received HTTP error while uploading image %s") % image_id
msg = _LE("Received HTTP error while uploading image %s") % image_id
notifier.error('image.upload', msg)
with excutils.save_and_reraise_exception():
LOG.exception(msg)

View File

@ -23,10 +23,12 @@ import glance.db
import glance.gateway
import glance.notifier
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
import glance.store
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
class ImageDataController(object):
@ -54,8 +56,9 @@ class ImageDataController(object):
image.status = 'queued'
image_repo.save(image)
except Exception as e:
msg = _("Unable to restore image %(image_id)s: %(e)s") % \
{'image_id': image.image_id, 'e': utils.exception_to_str(e)}
msg = (_LE("Unable to restore image %(image_id)s: %(e)s") %
{'image_id': image.image_id,
'e': utils.exception_to_str(e)})
LOG.exception(msg)
@utils.mutating
@ -141,13 +144,13 @@ class ImageDataController(object):
except webob.exc.HTTPError as e:
with excutils.save_and_reraise_exception():
LOG.error(_("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)
except Exception as e:
with excutils.save_and_reraise_exception():
LOG.exception(_("Failed to upload image data due to "
"internal error"))
LOG.exception(_LE("Failed to upload image data due to "
"internal error"))
self._restore(image_repo, image)
def download(self, req, image_id):

View File

@ -28,6 +28,7 @@ from glance.common import wsgi
import glance.db
import glance.gateway
import glance.notifier
from glance.openstack.common import gettextutils
from glance.openstack.common import jsonutils as json
import glance.openstack.common.log as logging
from glance.openstack.common import timeutils
@ -35,6 +36,8 @@ import glance.schema
import glance.store
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
_LW = gettextutils._LW
CONF = cfg.CONF
CONF.import_opt('disk_formats', 'glance.common.config', group='image_format')
@ -130,8 +133,8 @@ class ImagesController(object):
except exception.InvalidParameterValue as e:
raise webob.exc.HTTPBadRequest(explanation=e.msg)
except exception.StorageQuotaFull as e:
msg = (_("Denying attempt to upload image because it exceeds the ."
"quota: %s") % utils.exception_to_str(e))
msg = (_LI("Denying attempt to upload image because it exceeds the"
" .quota: %s") % utils.exception_to_str(e))
LOG.info(msg)
raise webob.exc.HTTPRequestEntityTooLarge(
explanation=msg, request=req, content_type='text/plain')
@ -812,9 +815,9 @@ def load_custom_properties():
schema_data = schema_file.read()
return json.loads(schema_data)
else:
msg = _('Could not find schema properties file %s. Continuing '
'without custom properties')
LOG.warn(msg % filename)
msg = (_LW('Could not find schema properties file %s. Continuing '
'without custom properties') % filename)
LOG.warn(msg)
return {}

View File

@ -28,6 +28,7 @@ from glance.common import wsgi
import glance.db
import glance.gateway
import glance.notifier
from glance.openstack.common import gettextutils
import glance.openstack.common.jsonutils as json
import glance.openstack.common.log as logging
from glance.openstack.common import timeutils
@ -35,6 +36,7 @@ import glance.schema
import glance.store
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
CONF = cfg.CONF
CONF.import_opt('task_time_to_live', 'glance.common.config', group='task')
@ -63,7 +65,7 @@ class TasksController(object):
task_input=task['input'])
task_repo.add(new_task)
except exception.Forbidden as e:
msg = (_("Forbidden to create task. Reason: %(reason)s")
msg = (_LI("Forbidden to create task. Reason: %(reason)s")
% {'reason': utils.exception_to_str(e)})
LOG.info(msg)
raise webob.exc.HTTPForbidden(explanation=e.msg)
@ -101,12 +103,13 @@ class TasksController(object):
task_repo = self.gateway.get_task_repo(req.context)
task = task_repo.get(task_id)
except exception.NotFound as e:
msg = (_("Failed to find task %(task_id)s. Reason: %(reason)s") %
msg = (_LI("Failed to find task %(task_id)s. Reason: %(reason)s") %
{'task_id': task_id, 'reason': utils.exception_to_str(e)})
LOG.info(msg)
raise webob.exc.HTTPNotFound(explanation=e.msg)
except exception.Forbidden as e:
msg = (_("Forbidden to get task %(task_id)s. Reason: %(reason)s") %
msg = (_LI("Forbidden to get task %(task_id)s. Reason:"
" %(reason)s") %
{'task_id': task_id, 'reason': utils.exception_to_str(e)})
LOG.info(msg)
raise webob.exc.HTTPForbidden(explanation=e.msg)

View File

@ -46,11 +46,13 @@ from glance.common import utils
from glance.db import migration as db_migration
from glance.db.sqlalchemy import api as db_api
from glance.openstack.common.db.sqlalchemy import migration
from glance.openstack.common import gettextutils
from glance.openstack.common import log
from glance.openstack.common import strutils
LOG = log.getLogger(__name__)
_LW = gettextutils._LW
manager_opts = [
cfg.BoolOpt('db_enforce_mysql_charset',
@ -84,11 +86,11 @@ class DbCommands(object):
def _need_sanity_check(self):
if not CONF.db_enforce_mysql_charset:
LOG.warning(_('Warning: '
'The db_enforce_mysql_charset option is now '
'deprecated and will be removed in the Juno '
'release. Please migrate DB manually e.g. '
'convert data of all tables to UTF-8 charset.'))
LOG.warning(_LW('Warning: '
'The db_enforce_mysql_charset option is now '
'deprecated and will be removed in the Juno '
'release. Please migrate DB manually e.g. '
'convert data of all tables to UTF-8 charset.'))
return CONF.db_enforce_mysql_charset
def version(self):

View File

@ -321,11 +321,11 @@ def replication_dump(options, args):
client = imageservice(httplib.HTTPConnection(server, port),
options.mastertoken)
for image in client.get_images():
LOG.info(_LI('Considering: %s') % image['id'])
LOG.debug('Considering: %s' % image['id'])
data_path = os.path.join(path, image['id'])
if not os.path.exists(data_path):
LOG.info(_LI('... storing'))
LOG.info(_LI('Storing: %s') % image['id'])
# Dump glance information
with open(data_path, 'w') as f:
@ -336,7 +336,7 @@ def replication_dump(options, args):
# is the same as that which we got from the detailed images
# request earlier, so we can ignore it here. Note that we also
# only dump active images.
LOG.info(_LI('... image is active'))
LOG.debug('Image %s is active' % image['id'])
image_response = client.get_image(image['id'])
with open(data_path + '.img', 'wb') as f:
while True:
@ -424,14 +424,16 @@ def replication_load(options, args):
del headers[key]
if _dict_diff(meta, headers):
LOG.info(_LI('... metadata has changed'))
LOG.info(_LI('Image %s metadata has changed') %
image_uuid)
headers, body = client.add_image_meta(meta)
_check_upload_response_headers(headers, body)
updated.append(meta['id'])
else:
if not os.path.exists(os.path.join(path, image_uuid + '.img')):
LOG.info(_LI('... dump is missing image data, skipping'))
LOG.debug('%s dump is missing image data, skipping' %
image_uuid)
continue
# Upload the image itself
@ -473,7 +475,7 @@ def replication_livecopy(options, args):
updated = []
for image in master_client.get_images():
LOG.info(_LI('Considering %(id)s') % {'id': image['id']})
LOG.debug('Considering %(id)s' % {'id': image['id']})
for key in options.dontreplicate.split(' '):
if key in image:
LOG.debug('Stripping %(header)s from master metadata',
@ -497,13 +499,14 @@ def replication_livecopy(options, args):
del headers[key]
if _dict_diff(image, headers):
LOG.info(_LI('... metadata has changed'))
LOG.info(_LI('Image %s metadata has changed') %
image['id'])
headers, body = slave_client.add_image_meta(image)
_check_upload_response_headers(headers, body)
updated.append(image['id'])
elif image['status'] == 'active':
LOG.info(_LI('%s is being synced') % image['id'])
LOG.info(_LI('Image %s is being synced') % image['id'])
if not options.metaonly:
image_response = master_client.get_image(image['id'])
try:
@ -570,7 +573,7 @@ def replication_compare(options, args):
% {'image_id': image['id']})
elif image['status'] == 'active':
LOG.info(_LI('%s: entirely missing from the destination')
LOG.info(_LI('Image %s entirely missing from the destination')
% image['id'])
differences[image['id']] = 'missing'

View File

@ -32,6 +32,7 @@ from glance.common import exception
from glance.db.sqlalchemy import models
from glance.openstack.common.db import exception as db_exception
from glance.openstack.common.db.sqlalchemy import session
from glance.openstack.common import gettextutils
import glance.openstack.common.log as os_logging
from glance.openstack.common import timeutils
@ -39,6 +40,8 @@ from glance.openstack.common import timeutils
BASE = models.BASE
sa_logger = None
LOG = os_logging.getLogger(__name__)
_LI = gettextutils._LI
_LW = gettextutils._LW
STATUSES = ['active', 'saving', 'queued', 'killed', 'pending_delete',
@ -57,7 +60,7 @@ def _retry_on_deadlock(exc):
"""Decorator to retry a DB API call if Deadlock was received."""
if isinstance(exc, db_exception.DBDeadlock):
LOG.warn(_("Deadlock detected. Retrying..."))
LOG.warn(_LW("Deadlock detected. Retrying..."))
return True
return False
@ -92,7 +95,7 @@ def clear_db_env():
def _check_mutate_authorization(context, image_ref):
if not is_image_mutable(context, image_ref):
LOG.info(_("Attempted to modify image user did not own."))
LOG.info(_LI("Attempted to modify image user did not own."))
msg = _("You do not own this image")
if image_ref.is_public:
exc_class = exception.ForbiddenPublicImage
@ -300,7 +303,7 @@ def _paginate_query(query, model, limit, sort_keys, marker=None,
if 'id' not in sort_keys:
# TODO(justinsb): If this ever gives a false-positive, check
# the actual primary key, rather than assuming its id
LOG.warn(_('Id not in sort_keys; is sort_keys unique?'))
LOG.warn(_LW('Id not in sort_keys; is sort_keys unique?'))
assert(not (sort_dir and sort_dirs))

View File

@ -19,10 +19,12 @@ Various conveniences used for migration scripts
import sqlalchemy.types
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
String = lambda length: sqlalchemy.types.String(
@ -93,11 +95,11 @@ def from_migration_import(module_name, fromlist):
def create_tables(tables):
for table in tables:
LOG.info(_("creating table %(table)s") % {'table': table})
LOG.info(_LI("creating table %(table)s") % {'table': table})
table.create()
def drop_tables(tables):
for table in tables:
LOG.info(_("dropping table %(table)s") % {'table': table})
LOG.info(_LI("dropping table %(table)s") % {'table': table})
table.drop()

View File

@ -18,9 +18,11 @@ import sqlalchemy
from glance.common import exception
from glance.common import utils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
def upgrade(migrate_engine):
@ -57,10 +59,10 @@ def migrate_location_credentials(migrate_engine, to_quoted):
.values(location=fixed_uri).execute()
except exception.BadStoreUri as e:
reason = utils.exception_to_str(e)
err_msg = _("Invalid store uri for image: %(image_id)s. "
"Details: %(reason)s") % {'image_id': image.id,
'reason': reason}
LOG.exception(err_msg)
msg = _LE("Invalid store uri for image: %(image_id)s. "
"Details: %(reason)s") % {'image_id': image.id,
'reason': reason}
LOG.exception(msg)
raise

View File

@ -35,10 +35,14 @@ import sqlalchemy
from glance.common import crypt
from glance.common import exception
from glance.common import utils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
import glance.store.swift # noqa
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
_LW = gettextutils._LW
CONF = cfg.CONF
CONF.import_opt('metadata_encryption_key', 'glance.common.config')
@ -63,9 +67,9 @@ def migrate_location_credentials(migrate_engine, to_quoted):
reverse.
"""
if not CONF.metadata_encryption_key:
msg = _("'metadata_encryption_key' was not specified in the config"
" file or a config file was not specified. This means that"
" this migration is a NOOP.")
msg = _LI("'metadata_encryption_key' was not specified in the config"
" file or a config file was not specified. This means that"
" this migration is a NOOP.")
LOG.info(msg)
return
@ -83,14 +87,15 @@ def migrate_location_credentials(migrate_engine, to_quoted):
.where(images_table.c.id == image['id'])\
.values(location=fixed_uri).execute()
except exception.Invalid:
msg = _("Failed to decrypt location value for image %(image_id)s")
LOG.warn(msg % {'image_id': image['id']})
msg = _LW("Failed to decrypt location value for image"
" %(image_id)s") % {'image_id': image['id']}
LOG.warn(msg)
except exception.BadStoreUri as e:
reason = utils.exception_to_str(e)
err_msg = _("Invalid store uri for image: %(image_id)s. "
"Details: %(reason)s") % {'image_id': image.id,
'reason': reason}
LOG.exception(err_msg)
msg = _LE("Invalid store uri for image: %(image_id)s. "
"Details: %(reason)s") % {'image_id': image.id,
'reason': reason}
LOG.exception(msg)
raise

View File

@ -24,11 +24,15 @@ from oslo.config import cfg
from glance.common import exception
from glance.common import utils
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
from glance.openstack.common import importutils
import glance.openstack.common.log as logging
from glance.openstack.common import units
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
_LW = gettextutils._LW
image_cache_opts = [
cfg.StrOpt('image_cache_driver', default='sqlite',
@ -61,17 +65,17 @@ class ImageCache(object):
driver_module = (__name__ + '.drivers.' + driver_name + '.Driver')
try:
self.driver_class = importutils.import_class(driver_module)
LOG.info(_("Image cache loaded driver '%s'.") %
LOG.info(_LI("Image cache loaded driver '%s'.") %
driver_name)
except ImportError as import_err:
LOG.warn(_("Image cache driver "
"'%(driver_name)s' failed to load. "
"Got error: '%(import_err)s."),
LOG.warn(_LW("Image cache driver "
"'%(driver_name)s' failed to load. "
"Got error: '%(import_err)s."),
{'driver_name': driver_name,
'import_err': import_err})
driver_module = __name__ + '.drivers.sqlite.Driver'
LOG.info(_("Defaulting to SQLite driver."))
LOG.info(_LI("Defaulting to SQLite driver."))
self.driver_class = importutils.import_class(driver_module)
self.configure_driver()
@ -85,12 +89,12 @@ class ImageCache(object):
self.driver.configure()
except exception.BadDriverConfiguration as config_err:
driver_module = self.driver_class.__module__
LOG.warn(_("Image cache driver "
"'%(driver_module)s' failed to configure. "
"Got error: '%(config_err)s"),
LOG.warn(_LW("Image cache driver "
"'%(driver_module)s' failed to configure. "
"Got error: '%(config_err)s"),
{'driver_module': driver_module,
'config_err': config_err})
LOG.info(_("Defaulting to SQLite driver."))
LOG.info(_LI("Defaulting to SQLite driver."))
default_module = __name__ + '.drivers.sqlite.Driver'
self.driver_class = importutils.import_class(default_module)
self.driver = self.driver_class()
@ -261,9 +265,9 @@ class ImageCache(object):
# bad length), or corrupt data (checksum is wrong).
LOG.exception(utils.exception_to_str(e))
except Exception as e:
LOG.exception(_("Exception encountered while tee'ing "
"image '%(image_id)s' into cache: %(error)s. "
"Continuing with response.") %
LOG.exception(_LE("Exception encountered while tee'ing "
"image '%(image_id)s' into cache: %(error)s. "
"Continuing with response.") %
{'image_id': image_id,
'error': utils.exception_to_str(e)})

View File

@ -31,9 +31,13 @@ import sqlite3
from glance.common import exception
from glance.image_cache.drivers import base
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
_LW = gettextutils._LW
sqlite_opts = [
cfg.StrOpt('image_cache_sqlite_db', default='cache.db',
@ -390,7 +394,7 @@ class Driver(base.Driver):
try:
yield conn
except sqlite3.DatabaseError as e:
msg = _("Error executing SQLite call. Got error: %s") % e
msg = _LE("Error executing SQLite call. Got error: %s") % e
LOG.error(msg)
conn.rollback()
finally:
@ -406,19 +410,19 @@ class Driver(base.Driver):
:param image_id: Image ID
"""
if self.is_cached(image_id):
msg = _("Not queueing image '%s'. Already cached.") % image_id
LOG.warn(msg)
msg = _LI("Not queueing image '%s'. Already cached.") % image_id
LOG.info(msg)
return False
if self.is_being_cached(image_id):
msg = _("Not queueing image '%s'. Already being "
"written to cache") % image_id
LOG.warn(msg)
msg = _LI("Not queueing image '%s'. Already being "
"written to cache") % image_id
LOG.info(msg)
return False
if self.is_queued(image_id):
msg = _("Not queueing image '%s'. Already queued.") % image_id
LOG.warn(msg)
msg = _LI("Not queueing image '%s'. Already queued.") % image_id
LOG.info(msg)
return False
path = self.get_image_filepath(image_id, 'queue')
@ -435,7 +439,7 @@ class Driver(base.Driver):
"""
for path in self.get_cache_files(self.invalid_dir):
os.unlink(path)
LOG.info(_("Removed invalid cache file %s"), path)
LOG.info(_LI("Removed invalid cache file %s") % path)
def delete_stalled_files(self, older_than):
"""
@ -449,10 +453,10 @@ class Driver(base.Driver):
if os.path.getmtime(path) < older_than:
try:
os.unlink(path)
LOG.info(_("Removed stalled cache file %s"), path)
LOG.info(_LI("Removed stalled cache file %s") % path)
except Exception as e:
msg = (_("Failed to delete file %(path)s. "
"Got error: %(e)s") %
msg = (_LW("Failed to delete file %(path)s. "
"Got error: %(e)s"),
dict(path=path, e=e))
LOG.warn(msg)
@ -488,5 +492,5 @@ def delete_cached_file(path):
LOG.debug("Deleting image cache file '%s'", path)
os.unlink(path)
else:
LOG.warn(_("Cached image file '%s' doesn't exist, unable to"
" delete"), path)
LOG.warn(_LW("Cached image file '%s' doesn't exist, unable to"
" delete") % path)

View File

@ -65,9 +65,13 @@ from glance.common import exception
from glance.common import utils
from glance.image_cache.drivers import base
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
_LW = gettextutils._LW
CONF = cfg.CONF
@ -102,11 +106,11 @@ class Driver(base.Driver):
set_xattr(fake_image_filepath, 'hits', '1')
except IOError as e:
if e.errno == errno.EOPNOTSUPP:
msg = (_("The device housing the image cache directory "
"%(image_cache_dir)s does not support xattr. It is "
"likely you need to edit your fstab and add the "
"user_xattr option to the appropriate line for the "
"device housing the cache directory.") %
msg = (_LE("The device housing the image cache directory "
"%(image_cache_dir)s does not support xattr. It is"
" likely you need to edit your fstab and add the "
"user_xattr option to the appropriate line for the"
" device housing the cache directory.") %
{'image_cache_dir': image_cache_dir})
LOG.error(msg)
raise exception.BadDriverConfiguration(driver_name="xattr",
@ -273,13 +277,13 @@ class Driver(base.Driver):
LOG.debug("Fetch finished, moving "
"'%(incomplete_path)s' to '%(final_path)s'",
dict(incomplete_path=incomplete_path,
final_path=final_path))
final_path=final_path))
os.rename(incomplete_path, final_path)
# Make sure that we "pop" the image from the queue...
if self.is_queued(image_id):
LOG.debug("Removing image '%s' from queue after "
"caching it.", image_id)
"caching it." % image_id)
os.unlink(self.get_image_filepath(image_id, 'queue'))
def rollback(e):
@ -288,7 +292,7 @@ class Driver(base.Driver):
invalid_path = self.get_image_filepath(image_id, 'invalid')
LOG.debug("Fetch of cache file failed (%(e)s), rolling back by "
"moving '%(incomplete_path)s' to "
"'%(invalid_path)s'",
"'%(invalid_path)s'" %
{'e': utils.exception_to_str(e),
'incomplete_path': incomplete_path,
'invalid_path': invalid_path})
@ -335,19 +339,19 @@ class Driver(base.Driver):
:param image_id: Image ID
"""
if self.is_cached(image_id):
msg = _("Not queueing image '%s'. Already cached.") % image_id
LOG.warn(msg)
msg = _LI("Not queueing image '%s'. Already cached.") % image_id
LOG.info(msg)
return False
if self.is_being_cached(image_id):
msg = _("Not queueing image '%s'. Already being "
"written to cache") % image_id
LOG.warn(msg)
msg = _LI("Not queueing image '%s'. Already being "
"written to cache") % image_id
LOG.info(msg)
return False
if self.is_queued(image_id):
msg = _("Not queueing image '%s'. Already queued.") % image_id
LOG.warn(msg)
msg = _LI("Not queueing image '%s'. Already queued.") % image_id
LOG.info(msg)
return False
path = self.get_image_filepath(image_id, 'queue')
@ -392,7 +396,7 @@ class Driver(base.Driver):
delete_cached_file(path)
reaped += 1
LOG.info(_("Reaped %(reaped)s %(entry_type)s cache entries"),
LOG.info(_LI("Reaped %(reaped)s %(entry_type)s cache entries"),
{'reaped': reaped, 'entry_type': entry_type})
return reaped
@ -436,11 +440,11 @@ def get_all_regular_files(basepath):
def delete_cached_file(path):
if os.path.exists(path):
LOG.debug("Deleting image cache file '%s'", path)
LOG.debug("Deleting image cache file '%s'" % path)
os.unlink(path)
else:
LOG.warn(_("Cached image file '%s' doesn't exist, unable to"
" delete"), path)
LOG.warn(_LW("Cached image file '%s' doesn't exist, unable to"
" delete") % path)
def _make_namespaced_xattr_key(key, namespace='user'):

View File

@ -22,12 +22,14 @@ import eventlet
from glance.common import exception
from glance import context
from glance.image_cache import base
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
import glance.registry.client.v1.api as registry
import glance.store
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
_LW = gettextutils._LW
class Prefetcher(base.CacheApp):
@ -43,17 +45,17 @@ class Prefetcher(base.CacheApp):
try:
image_meta = registry.get_image_metadata(ctx, image_id)
if image_meta['status'] != 'active':
LOG.warn(_("Image '%s' is not active. Not caching."),
LOG.warn(_LW("Image '%s' is not active. Not caching.") %
image_id)
return False
except exception.NotFound:
LOG.warn(_("No metadata found for image '%s'"), image_id)
LOG.warn(_LW("No metadata found for image '%s'") % image_id)
return False
location = image_meta['location']
image_data, image_size = glance.store.get_from_backend(ctx, location)
LOG.debug("Caching image '%s'", image_id)
LOG.debug("Caching image '%s'" % image_id)
cache_tee_iter = self.cache.cache_tee_iter(image_id, image_data,
image_meta['checksum'])
# Image is tee'd into cache and checksum verified
@ -75,9 +77,9 @@ class Prefetcher(base.CacheApp):
results = pool.imap(self.fetch_image_into_cache, images)
successes = sum([1 for r in results if r is True])
if successes != num_images:
LOG.error(_("Failed to successfully cache all "
"images in queue."))
LOG.warn(_LW("Failed to successfully cache all "
"images in queue."))
return False
LOG.info(_("Successfully cached all %d images"), num_images)
LOG.info(_LI("Successfully cached all %d images") % num_images)
return True

View File

@ -24,10 +24,12 @@ from glance.common import utils
import glance.domain
import glance.domain.proxy
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
CONF = cfg.CONF
CONF.import_opt('image_member_quota', 'glance.common.config')
CONF.import_opt('image_property_quota', 'glance.common.config')
@ -324,7 +326,7 @@ class ImageProxy(glance.domain.proxy.Image):
image_id=self.image.image_id)
except exception.StorageQuotaFull:
with excutils.save_and_reraise_exception():
LOG.info(_('Cleaning up %s after exceeding the quota.')
LOG.info(_LI('Cleaning up %s after exceeding the quota.')
% self.image.image_id)
self.store_utils.safe_delete_from_backend(
self.context, self.image.image_id, self.image.locations[0])

View File

@ -24,12 +24,15 @@ from glance.common import exception
from glance.common import utils
from glance.common import wsgi
import glance.db
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
from glance.openstack.common import strutils
from glance.openstack.common import timeutils
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
CONF = cfg.CONF
@ -118,17 +121,17 @@ class Controller(object):
return self.db_api.image_get_all(context, filters=filters,
**params)
except exception.NotFound:
LOG.info(_("Invalid marker. Image %(id)s could not be "
"found.") % {'id': params.get('marker')})
LOG.info(_LI("Invalid marker. Image %(id)s could not be "
"found.") % {'id': params.get('marker')})
msg = _("Invalid marker. Image could not be found.")
raise exc.HTTPBadRequest(explanation=msg)
except exception.Forbidden:
LOG.info(_("Access denied to image %(id)s but returning "
"'not found'") % {'id': params.get('marker')})
LOG.info(_LI("Access denied to image %(id)s but returning "
"'not found'") % {'id': params.get('marker')})
msg = _("Invalid marker. Image could not be found.")
raise exc.HTTPBadRequest(explanation=msg)
except Exception:
LOG.exception(_("Unable to get images"))
LOG.exception(_LE("Unable to get images"))
raise
def index(self, req):
@ -160,7 +163,7 @@ class Controller(object):
result[field] = image[field]
results.append(result)
LOG.info(_("Returning image list"))
LOG.debug("Returning image list")
return dict(images=results)
def detail(self, req):
@ -178,7 +181,7 @@ class Controller(object):
images = self._get_images(req.context, **params)
image_dicts = [make_image_dict(i) for i in images]
LOG.info(_("Returning detailed image list"))
LOG.debug("Returning detailed image list")
return dict(images=image_dicts)
def _get_query_params(self, req):
@ -332,20 +335,21 @@ class Controller(object):
"""Return data about the given image id."""
try:
image = self.db_api.image_get(req.context, id)
msg = _("Successfully retrieved image %(id)s")
LOG.info(msg % {'id': id})
msg = "Successfully retrieved image %(id)s" % {'id': id}
LOG.debug(msg)
except exception.NotFound:
msg = _("Image %(id)s not found")
LOG.info(msg % {'id': id})
msg = _LI("Image %(id)s not found") % {'id': id}
LOG.info(msg)
raise exc.HTTPNotFound()
except exception.Forbidden:
# If it's private and doesn't belong to them, don't let on
# that it exists
msg = _("Access denied to image %(id)s but returning 'not found'")
LOG.info(msg % {'id': id})
msg = _LI("Access denied to image %(id)s but returning"
" 'not found'") % {'id': id}
LOG.info(msg)
raise exc.HTTPNotFound()
except Exception:
LOG.exception(_("Unable to show image %s"), id)
LOG.exception(_LE("Unable to show image %s") % id)
raise
return dict(image=make_image_dict(image))
@ -362,25 +366,26 @@ class Controller(object):
"""
try:
deleted_image = self.db_api.image_destroy(req.context, id)
msg = _("Successfully deleted image %(id)s")
LOG.info(msg % {'id': id})
msg = _LI("Successfully deleted image %(id)s") % {'id': id}
LOG.info(msg)
return dict(image=make_image_dict(deleted_image))
except exception.ForbiddenPublicImage:
msg = _("Delete denied for public image %(id)s")
LOG.info(msg % {'id': id})
msg = _LI("Delete denied for public image %(id)s") % {'id': id}
LOG.info(msg)
raise exc.HTTPForbidden()
except exception.Forbidden:
# If it's private and doesn't belong to them, don't let on
# that it exists
msg = _("Access denied to image %(id)s but returning 'not found'")
LOG.info(msg % {'id': id})
msg = _LI("Access denied to image %(id)s but returning"
" 'not found'") % {'id': id}
LOG.info(msg)
return exc.HTTPNotFound()
except exception.NotFound:
msg = _("Image %(id)s not found")
LOG.info(msg % {'id': id})
msg = _LI("Image %(id)s not found") % {'id': id}
LOG.info(msg)
return exc.HTTPNotFound()
except Exception:
LOG.exception(_("Unable to delete image %s"), id)
LOG.exception(_LE("Unable to delete image %s") % id)
raise
@utils.mutating
@ -405,9 +410,9 @@ class Controller(object):
image_id = image_data.get('id')
if image_id and not utils.is_uuid_like(image_id):
msg = _("Rejecting image creation request for invalid image "
"id '%(bad_id)s'")
LOG.info(msg % {'bad_id': image_id})
msg = _LI("Rejecting image creation request for invalid image "
"id '%(bad_id)s'") % {'bad_id': image_id}
LOG.info(msg)
msg = _("Invalid image id format")
return exc.HTTPBadRequest(explanation=msg)
@ -418,12 +423,13 @@ class Controller(object):
image_data = _normalize_image_location_for_db(image_data)
image_data = self.db_api.image_create(req.context, image_data)
image_data = dict(image=make_image_dict(image_data))
msg = _("Successfully created image %(id)s") % image_data['image']
msg = (_LI("Successfully created image %(id)s") %
image_data['image'])
LOG.info(msg)
return image_data
except exception.Duplicate:
msg = _("Image with identifier %s already exists!") % image_id
LOG.error(msg)
LOG.warn(msg)
return exc.HTTPConflict(msg)
except exception.Invalid as e:
msg = (_("Failed to add image metadata. "
@ -431,7 +437,7 @@ class Controller(object):
LOG.error(msg)
return exc.HTTPBadRequest(msg)
except Exception:
LOG.exception(_("Unable to create image %s"), image_id)
LOG.exception(_LE("Unable to create image %s"), image_id)
raise
@utils.mutating
@ -470,8 +476,8 @@ class Controller(object):
purge_props=purge_props,
from_state=from_state)
msg = _("Updating metadata for image %(id)s")
LOG.info(msg % {'id': id})
msg = _LI("Updating metadata for image %(id)s") % {'id': id}
LOG.info(msg)
return dict(image=make_image_dict(updated_image))
except exception.Invalid as e:
msg = (_("Failed to update image metadata. "
@ -479,20 +485,21 @@ class Controller(object):
LOG.error(msg)
return exc.HTTPBadRequest(msg)
except exception.NotFound:
msg = _("Image %(id)s not found")
LOG.info(msg % {'id': id})
msg = _LI("Image %(id)s not found") % {'id': id}
LOG.info(msg)
raise exc.HTTPNotFound(body='Image not found',
request=req,
content_type='text/plain')
except exception.ForbiddenPublicImage:
msg = _("Update denied for public image %(id)s")
LOG.info(msg % {'id': id})
msg = _LI("Update denied for public image %(id)s") % {'id': id}
LOG.info(msg)
raise exc.HTTPForbidden()
except exception.Forbidden:
# If it's private and doesn't belong to them, don't let on
# that it exists
msg = _("Access denied to image %(id)s but returning 'not found'")
LOG.info(msg % {'id': id})
msg = _LI("Access denied to image %(id)s but returning"
" 'not found'") % {'id': id}
LOG.info(msg)
raise exc.HTTPNotFound(body='Image not found',
request=req,
content_type='text/plain')
@ -502,7 +509,7 @@ class Controller(object):
request=req,
content_type='text/plain')
except Exception:
LOG.exception(_("Unable to update image %s"), id)
LOG.exception(_LE("Unable to update image %s") % id)
raise

View File

@ -19,10 +19,12 @@ from glance.common import exception
from glance.common import utils
from glance.common import wsgi
import glance.db
from glance.openstack.common import gettextutils
import glance.openstack.common.log as logging
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
class Controller(object):
@ -63,19 +65,20 @@ class Controller(object):
try:
self.db_api.image_get(req.context, image_id)
except exception.NotFound:
msg = _("Image %(id)s not found") % {'id': image_id}
msg = _LI("Image %(id)s not found") % {'id': image_id}
LOG.info(msg)
raise webob.exc.HTTPNotFound(msg)
except exception.Forbidden:
# If it's private and doesn't belong to them, don't let on
# that it exists
msg = _("Access denied to image %(id)s but returning 'not found'")
LOG.info(msg % {'id': image_id})
msg = _LI("Access denied to image %(id)s but returning"
" 'not found'") % {'id': image_id}
LOG.info(msg)
raise webob.exc.HTTPNotFound()
members = self.db_api.image_member_find(req.context, image_id=image_id)
msg = _("Returning member list for image %(id)s")
LOG.info(msg % {'id': image_id})
msg = "Returning member list for image %(id)s" % {'id': image_id}
LOG.debug(msg)
return dict(members=make_member_list(members,
member_id='member',
can_share='can_share'))
@ -103,14 +106,16 @@ class Controller(object):
except exception.Forbidden:
# If it's private and doesn't belong to them, don't let on
# that it exists
msg = _("Access denied to image %(id)s but returning 'not found'")
LOG.info(msg % {'id': image_id})
msg = _LI("Access denied to image %(id)s but returning"
" 'not found'") % {'id': image_id}
LOG.info(msg)
raise webob.exc.HTTPNotFound()
# Can they manipulate the membership?
if not self.is_image_sharable(req.context, image):
msg = _("User lacks permission to share image %(id)s")
LOG.info(msg % {'id': image_id})
msg = (_LI("User lacks permission to share image %(id)s") %
{'id': image_id})
LOG.info(msg)
msg = _("No permission to share that image")
raise webob.exc.HTTPForbidden(msg)
@ -119,9 +124,9 @@ class Controller(object):
memb_list = body['memberships']
except Exception as e:
# Malformed entity...
msg = _("Invalid membership association specified for "
"image %(id)s")
LOG.info(msg % {'id': image_id})
msg = _LI("Invalid membership association specified for "
"image %(id)s") % {'id': image_id}
LOG.info(msg)
msg = (_("Invalid membership association: %s") %
utils.exception_to_str(e))
raise webob.exc.HTTPBadRequest(explanation=msg)
@ -136,9 +141,9 @@ class Controller(object):
can_share=None)
except Exception as e:
# Malformed entity...
msg = _("Invalid membership association specified for "
"image %(id)s")
LOG.info(msg % {'id': image_id})
msg = _LI("Invalid membership association specified for "
"image %(id)s") % {'id': image_id}
LOG.info(msg)
msg = (_("Invalid membership association: %s") %
utils.exception_to_str(e))
raise webob.exc.HTTPBadRequest(explanation=msg)
@ -188,8 +193,9 @@ class Controller(object):
self.db_api.image_member_create(req.context, memb)
# Make an appropriate result
msg = _("Successfully updated memberships for image %(id)s")
LOG.info(msg % {'id': image_id})
msg = (_LI("Successfully updated memberships for image %(id)s") %
{'id': image_id})
LOG.info(msg)
return webob.exc.HTTPNoContent()
@utils.mutating
@ -212,20 +218,22 @@ class Controller(object):
try:
image = self.db_api.image_get(req.context, image_id)
except exception.NotFound:
msg = _("Image %(id)s not found") % {'id': image_id}
msg = _LI("Image %(id)s not found") % {'id': image_id}
LOG.info(msg)
raise webob.exc.HTTPNotFound(msg)
except exception.Forbidden:
# If it's private and doesn't belong to them, don't let on
# that it exists
msg = _("Access denied to image %(id)s but returning 'not found'")
LOG.info(msg % {'id': image_id})
msg = _LI("Access denied to image %(id)s but returning"
" 'not found'") % {'id': image_id}
LOG.info(msg)
raise webob.exc.HTTPNotFound()
# Can they manipulate the membership?
if not self.is_image_sharable(req.context, image):
msg = _("User lacks permission to share image %(id)s")
LOG.info(msg % {'id': image_id})
msg = (_LI("User lacks permission to share image %(id)s") %
{'id': image_id})
LOG.info(msg)
msg = _("No permission to share that image")
raise webob.exc.HTTPForbidden(msg)
@ -236,9 +244,9 @@ class Controller(object):
can_share = bool(body['member']['can_share'])
except Exception as e:
# Malformed entity...
msg = _("Invalid membership association specified for "
"image %(id)s")
LOG.info(msg % {'id': image_id})
msg = _LI("Invalid membership association specified for "
"image %(id)s") % {'id': image_id}
LOG.info(msg)
msg = (_("Invalid membership association: %s") %
utils.exception_to_str(e))
raise webob.exc.HTTPBadRequest(explanation=msg)
@ -258,8 +266,9 @@ class Controller(object):
can_share=bool(can_share))
self.db_api.image_member_create(req.context, values)
msg = _("Successfully updated a membership for image %(id)s")
LOG.info(msg % {'id': image_id})
msg = (_LI("Successfully updated a membership for image %(id)s") %
{'id': image_id})
LOG.info(msg)
return webob.exc.HTTPNoContent()
@utils.mutating
@ -273,20 +282,22 @@ class Controller(object):
try:
image = self.db_api.image_get(req.context, image_id)
except exception.NotFound:
msg = _("Image %(id)s not found") % {'id': image_id}
msg = _LI("Image %(id)s not found") % {'id': image_id}
LOG.info(msg)
raise webob.exc.HTTPNotFound(msg)
except exception.Forbidden:
# If it's private and doesn't belong to them, don't let on
# that it exists
msg = _("Access denied to image %(id)s but returning 'not found'")
LOG.info(msg % {'id': image_id})
msg = _LI("Access denied to image %(id)s but returning"
" 'not found'") % {'id': image_id}
LOG.info(msg)
raise webob.exc.HTTPNotFound()
# Can they manipulate the membership?
if not self.is_image_sharable(req.context, image):
msg = _("User lacks permission to share image %(id)s")
LOG.info(msg % {'id': image_id})
msg = (_LI("User lacks permission to share image %(id)s") %
{'id': image_id})
LOG.info(msg)
msg = _("No permission to share that image")
raise webob.exc.HTTPForbidden(msg)
@ -304,8 +315,9 @@ class Controller(object):
raise webob.exc.HTTPNotFound(explanation=msg)
# Make an appropriate result
msg = _("Successfully deleted a membership from image %(id)s")
LOG.info(msg % {'id': image_id})
msg = (_LI("Successfully deleted a membership from image %(id)s") %
{'id': image_id})
LOG.info(msg)
return webob.exc.HTTPNoContent()
def index_shared_images(self, req, id):
@ -315,13 +327,13 @@ class Controller(object):
try:
members = self.db_api.image_member_find(req.context, member=id)
except exception.NotFound:
msg = _("Member %(id)s not found")
LOG.info(msg % {'id': id})
msg = _LI("Member %(id)s not found") % {'id': id}
LOG.info(msg)
msg = _("Membership could not be found.")
raise webob.exc.HTTPBadRequest(explanation=msg)
msg = _("Returning list of images shared with member %(id)s")
LOG.info(msg % {'id': id})
msg = "Returning list of images shared with member %(id)s" % {'id': id}
LOG.debug(msg)
return dict(shared_images=make_member_list(members,
image_id='image_id',
can_share='can_share'))

View File

@ -21,11 +21,13 @@ the Glance Registry API
from glance.common.client import BaseClient
from glance.common import crypt
from glance.openstack.common import excutils
from glance.openstack.common import gettextutils
from glance.openstack.common import jsonutils
import glance.openstack.common.log as logging
from glance.registry.api.v1 import images
LOG = logging.getLogger(__name__)
_LI = gettextutils._LI
class RegistryClient(BaseClient):
@ -122,8 +124,8 @@ class RegistryClient(BaseClient):
except Exception as exc:
with excutils.save_and_reraise_exception():
exc_name = exc.__class__.__name__
LOG.info(_("Registry client request %(method)s %(action)s "
"raised %(exc_name)s"),
LOG.info(_LI("Registry client request %(method)s %(action)s "
"raised %(exc_name)s"),
{'method': method, 'action': action,
'exc_name': exc_name})
return res

View File

@ -26,11 +26,15 @@ from glance.common import crypt
from glance.common import exception
from glance.common import utils
from glance import context
from glance.openstack.common import gettextutils
from glance.openstack.common import lockutils
import glance.openstack.common.log as logging
import glance.registry.client.v1.api as registry
LOG = logging.getLogger(__name__)
_LE = gettextutils._LE
_LI = gettextutils._LI
_LW = gettextutils._LW
scrubber_opts = [
cfg.StrOpt('scrubber_datadir',
@ -134,7 +138,7 @@ class ScrubFileQueue(ScrubQueue):
else:
break
except Exception:
LOG.error(_("%s file can not be read.") % file_path)
LOG.error(_LE("%s file can not be read.") % file_path)
return uris, delete_times
@ -158,7 +162,7 @@ class ScrubFileQueue(ScrubQueue):
f.write(''.join(lines))
os.chmod(file_path, 0o600)
except Exception:
LOG.error(_("%s file can not be wrote.") % file_path)
LOG.error(_LE("%s file can not be wrote.") % file_path)
def add_location(self, image_id, location, user_context=None):
"""Adding image location to scrub queue.
@ -185,8 +189,8 @@ class ScrubFileQueue(ScrubQueue):
if image['status'] == 'deleted':
return True
except exception.NotFound as e:
LOG.error(_("Failed to find image to delete: %s"),
utils.exception_to_str(e))
LOG.warn(_LW("Failed to find image to delete: %s"),
utils.exception_to_str(e))
return False
delete_time = time.time() + self.scrub_time
@ -220,7 +224,8 @@ class ScrubFileQueue(ScrubQueue):
:retval a list of image image_id and location tuple from scrub queue
"""
if not os.path.exists(self.scrubber_datadir):
LOG.info(_("%s directory does not exist.") % self.scrubber_datadir)
LOG.info(_LI("%s directory does not exist.") %
self.scrubber_datadir)
return []
ret = []
@ -369,8 +374,8 @@ def get_scrub_queues():
class Daemon(object):
def __init__(self, wakeup_time=300, threads=1000):
LOG.info(_("Starting Daemon: wakeup_time=%(wakeup_time)s "
"threads=%(threads)s"),
LOG.info(_LI("Starting Daemon: wakeup_time=%(wakeup_time)s "
"threads=%(threads)s"),
{'wakeup_time': wakeup_time, 'threads': threads})
self.wakeup_time = wakeup_time
self.event = eventlet.event.Event()
@ -383,7 +388,7 @@ class Daemon(object):
try:
self.event.wait()
except KeyboardInterrupt:
msg = _("Daemon Shutdown on KeyboardInterrupt")
msg = _LI("Daemon Shutdown on KeyboardInterrupt")
LOG.info(msg)
def _run(self, application):
@ -395,7 +400,7 @@ class Daemon(object):
class Scrubber(object):
def __init__(self, store_api):
LOG.info(_("Initializing scrubber with configuration: %s") %
LOG.info(_LI("Initializing scrubber with configuration: %s") %
six.text_type({'scrubber_datadir': CONF.scrubber_datadir,
'cleanup': CONF.cleanup_scrubber,
'cleanup_time': CONF.cleanup_scrubber_time,
@ -419,7 +424,7 @@ class Scrubber(object):
else:
image_id_uri_list = queue.get_all_locations()
except Exception:
LOG.error(_("Can not %s scrub jobs from queue.") %
LOG.error(_LE("Can not %s scrub jobs from queue.") %
'pop' if pop else 'get')
return None
@ -443,7 +448,7 @@ class Scrubber(object):
if len(delete_jobs) == 0:
return
LOG.info(_("Scrubbing image %(id)s from %(count)d locations.") %
LOG.info(_LI("Scrubbing image %(id)s from %(count)d locations.") %
{'id': image_id, 'count': len(delete_jobs)})
# NOTE(bourke): The starmap must be iterated to do work
list(pool.starmap(self._delete_image_location_from_backend,
@ -472,8 +477,9 @@ class Scrubber(object):
self.store_api.delete_from_backend(admin_context, uri)
except Exception:
msg = _("Failed to delete URI from image %(image_id)s")
LOG.error(msg % {'image_id': image_id})
msg = (_LE("Failed to delete URI from image %(image_id)s") %
{'image_id': image_id})
LOG.error(msg)
def _read_cleanup_file(self, file_path):
"""Reading cleanup to get latest cleanup timestamp.
@ -508,7 +514,7 @@ class Scrubber(object):
os.chmod(file_path, 0o600)
os.utime(file_path, (cleanup_time, cleanup_time))
except Exception:
LOG.error(_("%s file can not be created.") %
LOG.error(_LE("%s file can not be created.") %
six.text_type(file_path))
def _cleanup(self, pool):
@ -523,8 +529,8 @@ class Scrubber(object):
if cleanup_time > now:
return
LOG.info(_("Getting images deleted before "
"%s") % CONF.cleanup_scrubber_time)
LOG.info(_LI("Getting images deleted before %s") %
CONF.cleanup_scrubber_time)
self._update_cleanup_file(cleanup_file, now)
delete_jobs = self._get_delete_jobs(self.db_queue, False)