Replace '_' with '_LI', '_LE', '_LW', '_LC'
oslo.i18n uses different marker functions to separate the translatable messages into different catalogs, which the translation teams can prioritize translating. For details, please refer to: http://docs.openstack.org/developer/oslo.i18n/guidelines.html#guidelines-for-use-in-openstack Added hacking rules for warning, info, critical, error and exception about checking translation for log messages and fixed for below cases only, 1. LOG.error(_("")) 2. LOG.info(_("")) 3. LOG.exception(_("")) 4. LOG.critical(_("")) 5. LOG.warning(_("")) Below scenario is not handled in this patch, If message is passed to LOG call using separate variable, ex. msg = (_("") LOG.error(msg) Change-Id: Idbf8779cdfc41ca1424bebcd101096bec482872f
This commit is contained in:
parent
cc3435647d
commit
6eebebc80b
@ -16,3 +16,9 @@ glance Specific Commandments
|
|||||||
assertIsNone(A)
|
assertIsNone(A)
|
||||||
- [G319] Validate that debug level logs are not translated
|
- [G319] Validate that debug level logs are not translated
|
||||||
- [G320] For python 3 compatibility, use six.text_type() instead of unicode()
|
- [G320] For python 3 compatibility, use six.text_type() instead of unicode()
|
||||||
|
- [G321] Validate that LOG messages, except debug ones, have translations
|
||||||
|
- [G322] Validate that LOG.info messages use _LI.
|
||||||
|
- [G323] Validate that LOG.exception messages use _LE.
|
||||||
|
- [G324] Validate that LOG.error messages use _LE.
|
||||||
|
- [G325] Validate that LOG.critical messages use _LC.
|
||||||
|
- [G326] Validate that LOG.warning messages use _LW.
|
@ -22,6 +22,7 @@ from glance import i18n
|
|||||||
import glance.openstack.common.log as logging
|
import glance.openstack.common.log as logging
|
||||||
|
|
||||||
_ = i18n._
|
_ = i18n._
|
||||||
|
_LE = i18n._LE
|
||||||
|
|
||||||
location_strategy_opts = [
|
location_strategy_opts = [
|
||||||
cfg.StrOpt('location_strategy', default='location_order',
|
cfg.StrOpt('location_strategy', default='location_order',
|
||||||
@ -61,8 +62,9 @@ def _load_strategies():
|
|||||||
mgr.driver.init()
|
mgr.driver.init()
|
||||||
modules[strategy_name] = mgr.driver
|
modules[strategy_name] = mgr.driver
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.error(_("Failed to load location strategy module "
|
LOG.error(_LE("Failed to load location strategy module "
|
||||||
"%(module)s: %(e)s") % {'module': module_name, 'e': e})
|
"%(module)s: %(e)s") % {'module': module_name,
|
||||||
|
'e': e})
|
||||||
return modules
|
return modules
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ from glance.openstack.common import policy
|
|||||||
CONFIG = ConfigParser.SafeConfigParser(dict_type=OrderedDict)
|
CONFIG = ConfigParser.SafeConfigParser(dict_type=OrderedDict)
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
_ = i18n._
|
_ = i18n._
|
||||||
|
_LE = i18n._LE
|
||||||
|
|
||||||
property_opts = [
|
property_opts = [
|
||||||
cfg.StrOpt('property_protection_file',
|
cfg.StrOpt('property_protection_file',
|
||||||
@ -99,7 +100,7 @@ class PropertyRules(object):
|
|||||||
if self.prop_prot_rule_format == 'policies':
|
if self.prop_prot_rule_format == 'policies':
|
||||||
if ',' in permissions:
|
if ',' in permissions:
|
||||||
LOG.error(
|
LOG.error(
|
||||||
_("Multiple policies '%s' not allowed"
|
_LE("Multiple policies '%s' not allowed "
|
||||||
"for a given operation. Policies can be "
|
"for a given operation. Policies can be "
|
||||||
"combined in the policy file"),
|
"combined in the policy file"),
|
||||||
permissions)
|
permissions)
|
||||||
|
@ -25,6 +25,7 @@ from glance import i18n
|
|||||||
from glance.openstack.common import log as logging
|
from glance.openstack.common import log as logging
|
||||||
|
|
||||||
_ = i18n._
|
_ = i18n._
|
||||||
|
_LE = i18n._LE
|
||||||
|
|
||||||
swift_opts = [
|
swift_opts = [
|
||||||
cfg.StrOpt('default_swift_reference',
|
cfg.StrOpt('default_swift_reference',
|
||||||
@ -97,6 +98,6 @@ class SwiftParams(object):
|
|||||||
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) as e:
|
||||||
LOG.exception(_("Invalid format of swift store config"
|
LOG.exception(_LE("Invalid format of swift store config "
|
||||||
"cfg"))
|
"cfg"))
|
||||||
return account_params
|
return account_params
|
||||||
|
@ -51,6 +51,8 @@ import glance.openstack.common.log as logging
|
|||||||
|
|
||||||
|
|
||||||
_ = i18n._
|
_ = i18n._
|
||||||
|
_LE = i18n._LE
|
||||||
|
_LI = i18n._LI
|
||||||
|
|
||||||
bind_opts = [
|
bind_opts = [
|
||||||
cfg.StrOpt('bind_host', default='0.0.0.0',
|
cfg.StrOpt('bind_host', default='0.0.0.0',
|
||||||
@ -265,7 +267,7 @@ class Server(object):
|
|||||||
self.pool.spawn_n(self._single_run, self.application, self.sock)
|
self.pool.spawn_n(self._single_run, self.application, self.sock)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
LOG.info(_("Starting %d workers") % CONF.workers)
|
LOG.info(_LI("Starting %d workers") % CONF.workers)
|
||||||
signal.signal(signal.SIGTERM, kill_children)
|
signal.signal(signal.SIGTERM, kill_children)
|
||||||
signal.signal(signal.SIGINT, kill_children)
|
signal.signal(signal.SIGINT, kill_children)
|
||||||
signal.signal(signal.SIGHUP, hup)
|
signal.signal(signal.SIGHUP, hup)
|
||||||
@ -280,13 +282,14 @@ class Server(object):
|
|||||||
try:
|
try:
|
||||||
pid, status = os.wait()
|
pid, status = os.wait()
|
||||||
if os.WIFEXITED(status) or os.WIFSIGNALED(status):
|
if os.WIFEXITED(status) or os.WIFSIGNALED(status):
|
||||||
LOG.info(_('Removing dead child %s') % pid)
|
LOG.info(_LI('Removing dead child %s') % pid)
|
||||||
self.children.remove(pid)
|
self.children.remove(pid)
|
||||||
if os.WIFEXITED(status) and os.WEXITSTATUS(status) != 0:
|
if os.WIFEXITED(status) and os.WEXITSTATUS(status) != 0:
|
||||||
LOG.error(_('Not respawning child %d, cannot '
|
LOG.error(_LE('Not respawning child %d, cannot '
|
||||||
'recover from termination') % pid)
|
'recover from termination') % pid)
|
||||||
if not self.children:
|
if not self.children:
|
||||||
LOG.info(_('All workers have terminated. Exiting'))
|
LOG.info(_LI('All workers have terminated. '
|
||||||
|
'Exiting'))
|
||||||
self.running = False
|
self.running = False
|
||||||
else:
|
else:
|
||||||
self.run_child()
|
self.run_child()
|
||||||
@ -294,7 +297,7 @@ class Server(object):
|
|||||||
if err.errno not in (errno.EINTR, errno.ECHILD):
|
if err.errno not in (errno.EINTR, errno.ECHILD):
|
||||||
raise
|
raise
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
LOG.info(_('Caught keyboard interrupt. Exiting.'))
|
LOG.info(_LI('Caught keyboard interrupt. Exiting.'))
|
||||||
break
|
break
|
||||||
eventlet.greenio.shutdown_safe(self.sock)
|
eventlet.greenio.shutdown_safe(self.sock)
|
||||||
self.sock.close()
|
self.sock.close()
|
||||||
@ -320,12 +323,12 @@ class Server(object):
|
|||||||
# and is respawned unnecessarily as a result
|
# and is respawned unnecessarily as a result
|
||||||
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
||||||
self.run_server()
|
self.run_server()
|
||||||
LOG.info(_('Child %d exiting normally') % os.getpid())
|
LOG.info(_LI('Child %d exiting normally') % os.getpid())
|
||||||
# self.pool.waitall() has been called by run_server, so
|
# self.pool.waitall() has been called by run_server, so
|
||||||
# its safe to exit here
|
# its safe to exit here
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
else:
|
else:
|
||||||
LOG.info(_('Started child %s') % pid)
|
LOG.info(_LI('Started child %s') % pid)
|
||||||
self.children.append(pid)
|
self.children.append(pid)
|
||||||
|
|
||||||
def run_server(self):
|
def run_server(self):
|
||||||
@ -349,7 +352,7 @@ class Server(object):
|
|||||||
|
|
||||||
def _single_run(self, application, sock):
|
def _single_run(self, application, sock):
|
||||||
"""Start a WSGI server in a new green thread."""
|
"""Start a WSGI server in a new green thread."""
|
||||||
LOG.info(_("Starting single process server"))
|
LOG.info(_LI("Starting single process server"))
|
||||||
eventlet.wsgi.server(sock, application, custom_pool=self.pool,
|
eventlet.wsgi.server(sock, application, custom_pool=self.pool,
|
||||||
log=self._wsgi_logger,
|
log=self._wsgi_logger,
|
||||||
debug=False)
|
debug=False)
|
||||||
|
@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
import pep8
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Guidelines for writing new hacking checks
|
Guidelines for writing new hacking checks
|
||||||
|
|
||||||
@ -41,6 +43,18 @@ asse_equal_end_with_none_re = re.compile(
|
|||||||
asse_equal_start_with_none_re = re.compile(
|
asse_equal_start_with_none_re = re.compile(
|
||||||
r"(.)*assertEqual\(None, (\w|\.|\'|\"|\[|\])+\)")
|
r"(.)*assertEqual\(None, (\w|\.|\'|\"|\[|\])+\)")
|
||||||
unicode_func_re = re.compile(r"(\s|\W|^)unicode\(")
|
unicode_func_re = re.compile(r"(\s|\W|^)unicode\(")
|
||||||
|
log_translation = re.compile(
|
||||||
|
r"(.)*LOG\.(audit)\(\s*('|\")")
|
||||||
|
log_translation_info = re.compile(
|
||||||
|
r"(.)*LOG\.(info)\(\s*(_\(|'|\")")
|
||||||
|
log_translation_exception = re.compile(
|
||||||
|
r"(.)*LOG\.(exception)\(\s*(_\(|'|\")")
|
||||||
|
log_translation_error = re.compile(
|
||||||
|
r"(.)*LOG\.(error)\(\s*(_\(|'|\")")
|
||||||
|
log_translation_critical = re.compile(
|
||||||
|
r"(.)*LOG\.(critical)\(\s*(_\(|'|\")")
|
||||||
|
log_translation_warning = re.compile(
|
||||||
|
r"(.)*LOG\.(warning)\(\s*(_\(|'|\")")
|
||||||
|
|
||||||
|
|
||||||
def assert_true_instance(logical_line):
|
def assert_true_instance(logical_line):
|
||||||
@ -101,9 +115,34 @@ def no_direct_use_of_unicode_function(logical_line):
|
|||||||
yield(0, "G320: Use six.text_type() instead of unicode()")
|
yield(0, "G320: Use six.text_type() instead of unicode()")
|
||||||
|
|
||||||
|
|
||||||
|
def validate_log_translations(logical_line, physical_line, filename):
|
||||||
|
# Translations are not required in the test directory
|
||||||
|
if pep8.noqa(physical_line):
|
||||||
|
return
|
||||||
|
msg = "G322: LOG.info messages require translations `_LI()`!"
|
||||||
|
if log_translation_info.match(logical_line):
|
||||||
|
yield (0, msg)
|
||||||
|
msg = "G323: LOG.exception messages require translations `_LE()`!"
|
||||||
|
if log_translation_exception.match(logical_line):
|
||||||
|
yield (0, msg)
|
||||||
|
msg = "G324: LOG.error messages require translations `_LE()`!"
|
||||||
|
if log_translation_error.match(logical_line):
|
||||||
|
yield (0, msg)
|
||||||
|
msg = "G325: LOG.critical messages require translations `_LC()`!"
|
||||||
|
if log_translation_critical.match(logical_line):
|
||||||
|
yield (0, msg)
|
||||||
|
msg = "G326: LOG.warning messages require translations `_LW()`!"
|
||||||
|
if log_translation_warning.match(logical_line):
|
||||||
|
yield (0, msg)
|
||||||
|
msg = "G321: Log messages require translations!"
|
||||||
|
if log_translation.match(logical_line):
|
||||||
|
yield (0, msg)
|
||||||
|
|
||||||
|
|
||||||
def factory(register):
|
def factory(register):
|
||||||
register(assert_true_instance)
|
register(assert_true_instance)
|
||||||
register(assert_equal_type)
|
register(assert_equal_type)
|
||||||
register(assert_equal_none)
|
register(assert_equal_none)
|
||||||
register(no_translate_debug_logs)
|
register(no_translate_debug_logs)
|
||||||
register(no_direct_use_of_unicode_function)
|
register(no_direct_use_of_unicode_function)
|
||||||
|
register(validate_log_translations)
|
||||||
|
@ -20,9 +20,14 @@ from oslo.config import cfg
|
|||||||
|
|
||||||
import glance.context
|
import glance.context
|
||||||
import glance.db.sqlalchemy.api as db_api
|
import glance.db.sqlalchemy.api as db_api
|
||||||
|
from glance import i18n
|
||||||
import glance.openstack.common.log as logging
|
import glance.openstack.common.log as logging
|
||||||
import glance.registry.context
|
import glance.registry.context
|
||||||
|
|
||||||
|
_ = i18n._
|
||||||
|
_LC = i18n._LC
|
||||||
|
_LI = i18n._LI
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
LOG.addHandler(logging.StreamHandler())
|
LOG.addHandler(logging.StreamHandler())
|
||||||
LOG.setLevel(logging.DEBUG)
|
LOG.setLevel(logging.DEBUG)
|
||||||
@ -44,7 +49,7 @@ def build_image_owner_map(owner_map, db, context):
|
|||||||
owner_name = image['owner']
|
owner_name = image['owner']
|
||||||
|
|
||||||
if not owner_name:
|
if not owner_name:
|
||||||
LOG.info('Image %s has no owner. Skipping.' % image_id)
|
LOG.info(_LI('Image %s has no owner. Skipping.') % image_id)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -65,7 +70,7 @@ def build_image_owner_map(owner_map, db, context):
|
|||||||
def update_image_owners(image_owner_map, db, context):
|
def update_image_owners(image_owner_map, db, context):
|
||||||
for (image_id, image_owner) in image_owner_map.items():
|
for (image_id, image_owner) in image_owner_map.items():
|
||||||
db.image_update(context, image_id, {'owner': image_owner})
|
db.image_update(context, image_id, {'owner': image_owner})
|
||||||
LOG.info('Image %s successfully updated.' % image_id)
|
LOG.info(_LI('Image %s successfully updated.') % image_id)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
@ -96,7 +101,7 @@ if __name__ == "__main__":
|
|||||||
admin_password = config.keystone_admin_password
|
admin_password = config.keystone_admin_password
|
||||||
|
|
||||||
if not (auth_uri and admin_tenant_name and admin_user and admin_password):
|
if not (auth_uri and admin_tenant_name and admin_user and admin_password):
|
||||||
LOG.critical('Missing authentication arguments')
|
LOG.critical(_LC('Missing authentication arguments'))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
ks = keystoneclient.v2_0.client.Client(username=admin_user,
|
ks = keystoneclient.v2_0.client.Client(username=admin_user,
|
||||||
|
Loading…
Reference in New Issue
Block a user