diff --git a/HACKING.rst b/HACKING.rst index e03f416580..042d7773a8 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -41,6 +41,7 @@ Nova Specific Commandments - [N326] Translated messages cannot be concatenated. String should be included in translated message. - [N327] assert_called_once() is not a valid method - [N328] Validate that LOG.info messages use _LI. +- [N329] Validate that LOG.exception messages use _LE. Creating Unit Tests ------------------- diff --git a/nova/api/ec2/__init__.py b/nova/api/ec2/__init__.py index 962c195a21..6a5d03dec0 100644 --- a/nova/api/ec2/__init__.py +++ b/nova/api/ec2/__init__.py @@ -87,7 +87,7 @@ class FaultWrapper(wsgi.Middleware): try: return req.get_response(self.application) except Exception as ex: - LOG.exception(_("FaultWrapper: %s"), ex) + LOG.exception(_LE("FaultWrapper: %s"), ex) return faults.Fault(webob.exc.HTTPInternalServerError()) diff --git a/nova/api/metadata/handler.py b/nova/api/metadata/handler.py index 74fb6f2ade..e452ca3a25 100644 --- a/nova/api/metadata/handler.py +++ b/nova/api/metadata/handler.py @@ -144,7 +144,7 @@ class MetadataRequestHandler(wsgi.Application): try: meta_data = self.get_metadata_by_remote_address(remote_address) except Exception: - LOG.exception(_('Failed to get metadata for ip: %s'), + LOG.exception(_LE('Failed to get metadata for ip: %s'), remote_address) msg = _('An unknown error has occurred. ' 'Please try your request again.') @@ -202,7 +202,7 @@ class MetadataRequestHandler(wsgi.Application): meta_data = self.get_metadata_by_instance_id(instance_id, remote_address) except Exception: - LOG.exception(_('Failed to get metadata for instance id: %s'), + LOG.exception(_LE('Failed to get metadata for instance id: %s'), instance_id) msg = _('An unknown error has occurred. ' 'Please try your request again.') diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index e927569bee..95488bd766 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -29,6 +29,7 @@ from nova.api.openstack import wsgi from nova import exception from nova.i18n import _ from nova.i18n import _LC +from nova.i18n import _LE from nova.i18n import _LI from nova.i18n import _LW from nova.i18n import translate @@ -89,7 +90,7 @@ class FaultWrapper(base_wsgi.Middleware): status, webob.exc.HTTPInternalServerError)() def _error(self, inner, req): - LOG.exception(_("Caught error: %s"), unicode(inner)) + LOG.exception(_LE("Caught error: %s"), unicode(inner)) safe = getattr(inner, 'safe', False) headers = getattr(inner, 'headers', None) diff --git a/nova/api/openstack/compute/plugins/__init__.py b/nova/api/openstack/compute/plugins/__init__.py index 71cbe00e9d..186a338aaa 100644 --- a/nova/api/openstack/compute/plugins/__init__.py +++ b/nova/api/openstack/compute/plugins/__init__.py @@ -14,7 +14,7 @@ from nova import exception -from nova.i18n import _ +from nova.i18n import _, _LE from nova.openstack.common import log as logging LOG = logging.getLogger(__name__) @@ -48,7 +48,7 @@ class LoadedExtensionInfo(object): ' '.join(extension.__doc__.strip().split())) LOG.debug('Ext version: %i', extension.version) except AttributeError as ex: - LOG.exception(_("Exception loading extension: %s"), ex) + LOG.exception(_LE("Exception loading extension: %s"), ex) return False return True diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py index 90702b93ef..df07d6d034 100644 --- a/nova/api/openstack/extensions.py +++ b/nova/api/openstack/extensions.py @@ -28,6 +28,7 @@ from nova.api.openstack import wsgi from nova.api.openstack import xmlutil from nova import exception from nova.i18n import _ +from nova.i18n import _LE from nova.i18n import _LW from nova.openstack.common import log as logging import nova.policy @@ -239,7 +240,7 @@ class ExtensionManager(object): LOG.debug('Ext namespace: %s', extension.namespace) LOG.debug('Ext updated: %s', extension.updated) except AttributeError as ex: - LOG.exception(_("Exception loading extension: %s"), ex) + LOG.exception(_LE("Exception loading extension: %s"), ex) return False return True @@ -498,7 +499,7 @@ def expected_errors(errors): # expected error. raise - LOG.exception(_("Unexpected exception in API method")) + LOG.exception(_LE("Unexpected exception in API method")) msg = _('Unexpected API Error. Please report this at ' 'http://bugs.launchpad.net/nova/ and attach the Nova ' 'API log if possible.\n%s') % type(exc) diff --git a/nova/cells/messaging.py b/nova/cells/messaging.py index 7c5c060bad..eafe7d6ece 100644 --- a/nova/cells/messaging.py +++ b/nova/cells/messaging.py @@ -202,7 +202,7 @@ class _BaseMessage(object): except Exception as exc: resp_value = sys.exc_info() failure = True - LOG.exception(_("Error processing message locally: %(exc)s"), + LOG.exception(_LE("Error processing message locally: %(exc)s"), {'exc': exc}) return Response(self.routing_path, resp_value, failure) @@ -407,7 +407,7 @@ class _TargetedMessage(_BaseMessage): next_hop = self._get_next_hop() except Exception as exc: exc_info = sys.exc_info() - LOG.exception(_("Error locating next hop for message: %(exc)s"), + LOG.exception(_LE("Error locating next hop for message: %(exc)s"), {'exc': exc}) return self._send_response_from_exception(exc_info) @@ -513,7 +513,7 @@ class _BroadcastMessage(_BaseMessage): next_hops = self._get_next_hops() except Exception as exc: exc_info = sys.exc_info() - LOG.exception(_("Error locating next hops for message: %(exc)s"), + LOG.exception(_LE("Error locating next hops for message: %(exc)s"), {'exc': exc}) return self._send_response_from_exception(exc_info) @@ -533,7 +533,7 @@ class _BroadcastMessage(_BaseMessage): # Error just trying to send to cells. Send a single response # with the failure. exc_info = sys.exc_info() - LOG.exception(_("Error sending message to next hops: %(exc)s"), + LOG.exception(_LE("Error sending message to next hops: %(exc)s"), {'exc': exc}) self._cleanup_response_queue() return self._send_response_from_exception(exc_info) diff --git a/nova/cells/rpcapi.py b/nova/cells/rpcapi.py index 09c51c16f6..9a398504d7 100644 --- a/nova/cells/rpcapi.py +++ b/nova/cells/rpcapi.py @@ -28,7 +28,7 @@ from oslo import messaging from oslo.serialization import jsonutils from nova import exception -from nova.i18n import _ +from nova.i18n import _LE from nova.objects import base as objects_base from nova.openstack.common import log as logging from nova import rpc @@ -385,7 +385,7 @@ class CellsAPI(object): cctxt.cast(ctxt, 'bdm_update_or_create_at_top', bdm=bdm, create=create) except Exception: - LOG.exception(_("Failed to notify cells of BDM update/create.")) + LOG.exception(_LE("Failed to notify cells of BDM update/create.")) def bdm_destroy_at_top(self, ctxt, instance_uuid, device_name=None, volume_id=None): @@ -401,7 +401,7 @@ class CellsAPI(object): device_name=device_name, volume_id=volume_id) except Exception: - LOG.exception(_("Failed to notify cells of BDM destroy.")) + LOG.exception(_LE("Failed to notify cells of BDM destroy.")) def get_migrations(self, ctxt, filters): """Get all migrations applying the filters.""" diff --git a/nova/cells/scheduler.py b/nova/cells/scheduler.py index 82ead762fa..853308e8fc 100644 --- a/nova/cells/scheduler.py +++ b/nova/cells/scheduler.py @@ -30,7 +30,7 @@ from nova.compute import vm_states from nova import conductor from nova.db import base from nova import exception -from nova.i18n import _, _LE, _LI +from nova.i18n import _LE, _LI from nova import objects from nova.objects import base as obj_base from nova.openstack.common import log as logging @@ -195,8 +195,8 @@ class CellsScheduler(base.Base): build_inst_kwargs) return except Exception: - LOG.exception(_("Couldn't communicate with cell '%s'") % - target_cell.name) + LOG.exception(_LE("Couldn't communicate with cell '%s'"), + target_cell.name) # FIXME(comstud): Would be nice to kick this back up so that # the parent cell could retry, if we had a parent. LOG.error(_LE("Couldn't communicate with any cells")) @@ -242,7 +242,7 @@ class CellsScheduler(base.Base): time.sleep(sleep_time) continue except Exception: - LOG.exception(_("Error scheduling instances %(instance_uuids)s"), + LOG.exception(_LE("Error scheduling instances %(instance_uuids)s"), {'instance_uuids': instance_uuids}) ctxt = message.ctxt for instance_uuid in instance_uuids: diff --git a/nova/cells/state.py b/nova/cells/state.py index 3849ee6d51..2258fa5a0d 100644 --- a/nova/cells/state.py +++ b/nova/cells/state.py @@ -31,7 +31,7 @@ from nova.cells import rpc_driver from nova import context from nova.db import base from nova import exception -from nova.i18n import _, _LE +from nova.i18n import _LE from nova.openstack.common import fileutils from nova.openstack.common import log as logging from nova import rpc @@ -176,7 +176,7 @@ class CellStateManager(base.Base): attempts += 1 if attempts > 120: raise - LOG.exception(_('DB error: %s') % e) + LOG.exception(_LE('DB error: %s'), e) time.sleep(30) my_cell_capabs = {} diff --git a/nova/cmd/all.py b/nova/cmd/all.py index 7d7c9d43b1..c4ce244b92 100644 --- a/nova/cmd/all.py +++ b/nova/cmd/all.py @@ -29,7 +29,7 @@ import sys from oslo.config import cfg from nova import config -from nova.i18n import _ +from nova.i18n import _LE from nova import objects from nova.objectstore import s3server from nova.openstack.common import log as logging @@ -60,13 +60,13 @@ def main(): server = service.WSGIService(api, use_ssl=should_use_ssl) launcher.launch_service(server, workers=server.workers or 1) except (Exception, SystemExit): - LOG.exception(_('Failed to load %s') % '%s-api' % api) + LOG.exception(_LE('Failed to load %s-api'), api) for mod in [s3server, xvp_proxy]: try: launcher.launch_service(mod.get_wsgi_server()) except (Exception, SystemExit): - LOG.exception(_('Failed to load %s') % mod.__name__) + LOG.exception(_LE('Failed to load %s'), mod.__name__) for binary in ['nova-compute', 'nova-network', 'nova-scheduler', 'nova-cert', 'nova-conductor']: @@ -89,5 +89,5 @@ def main(): topic=topic, manager=manager)) except (Exception, SystemExit): - LOG.exception(_('Failed to load %s'), binary) + LOG.exception(_LE('Failed to load %s'), binary) launcher.wait() diff --git a/nova/compute/monitors/virt/cpu_monitor.py b/nova/compute/monitors/virt/cpu_monitor.py index e677e1d92a..691210b2dc 100644 --- a/nova/compute/monitors/virt/cpu_monitor.py +++ b/nova/compute/monitors/virt/cpu_monitor.py @@ -23,7 +23,7 @@ from oslo.utils import timeutils from nova.compute import monitors from nova.compute.monitors import cpu_monitor as monitor from nova import exception -from nova.i18n import _ +from nova.i18n import _LE from nova.openstack.common import log as logging CONF = cfg.CONF @@ -109,8 +109,8 @@ class ComputeDriverCPUMonitor(monitor._CPUMonitorBase): self._data["cpu.iowait.time"] = stats["iowait"] self._data["cpu.frequency"] = stats["frequency"] except (NotImplementedError, TypeError, KeyError) as ex: - LOG.exception(_("Not all properties needed are implemented " - "in the compute driver: %s"), ex) + LOG.exception(_LE("Not all properties needed are implemented " + "in the compute driver: %s"), ex) raise exception.ResourceMonitorError( monitor=self.__class__.__name__) diff --git a/nova/console/xvp.py b/nova/console/xvp.py index 5a407a137d..82f76ca2a9 100644 --- a/nova/console/xvp.py +++ b/nova/console/xvp.py @@ -121,7 +121,7 @@ class XVPConsoleProxy(object): cfile.write(config) except IOError: with excutils.save_and_reraise_exception(): - LOG.exception(_("Failed to write configuration file")) + LOG.exception(_LE("Failed to write configuration file")) def _xvp_stop(self): LOG.debug('Stopping xvp') diff --git a/nova/crypto.py b/nova/crypto.py index 36bf43858f..b96d11b4ba 100644 --- a/nova/crypto.py +++ b/nova/crypto.py @@ -38,7 +38,7 @@ from pyasn1.type import univ from nova import context from nova import db from nova import exception -from nova.i18n import _ +from nova.i18n import _, _LE from nova.openstack.common import fileutils from nova.openstack.common import log as logging from nova import paths @@ -399,7 +399,7 @@ def _sign_csr(csr_text, ca_folder): csrfile.write(csr_text) except IOError: with excutils.save_and_reraise_exception(): - LOG.exception(_('Failed to write inbound.csr')) + LOG.exception(_LE('Failed to write inbound.csr')) LOG.debug('Flags path: %s', ca_folder) start = os.getcwd() diff --git a/nova/db/api.py b/nova/db/api.py index 6e34ce1745..1bdeffebf4 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -31,7 +31,7 @@ from oslo.config import cfg from oslo.db import concurrency from nova.cells import rpcapi as cells_rpcapi -from nova.i18n import _ +from nova.i18n import _LE from nova.openstack.common import log as logging @@ -625,7 +625,7 @@ def instance_destroy(context, instance_uuid, constraint=None, try: cells_rpcapi.CellsAPI().instance_destroy_at_top(context, rv) except Exception: - LOG.exception(_("Failed to notify cells of instance destroy")) + LOG.exception(_LE("Failed to notify cells of instance destroy")) return rv @@ -737,7 +737,7 @@ def instance_update(context, instance_uuid, values, update_cells=True): try: cells_rpcapi.CellsAPI().instance_update_at_top(context, rv) except Exception: - LOG.exception(_("Failed to notify cells of instance update")) + LOG.exception(_LE("Failed to notify cells of instance update")) return rv @@ -765,7 +765,7 @@ def instance_update_and_get_original(context, instance_uuid, values, try: cells_rpcapi.CellsAPI().instance_update_at_top(context, rv[1]) except Exception: - LOG.exception(_("Failed to notify cells of instance update")) + LOG.exception(_LE("Failed to notify cells of instance update")) return rv @@ -1688,7 +1688,7 @@ def bw_usage_update(context, uuid, mac, start_period, bw_in, bw_out, uuid, mac, start_period, bw_in, bw_out, last_ctr_in, last_ctr_out, last_refreshed) except Exception: - LOG.exception(_("Failed to notify cells of bw_usage update")) + LOG.exception(_LE("Failed to notify cells of bw_usage update")) return rv diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 55865c5b50..5686d1ec3f 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -60,7 +60,7 @@ from nova.compute import vm_states import nova.context from nova.db.sqlalchemy import models from nova import exception -from nova.i18n import _, _LI +from nova.i18n import _, _LI, _LE from nova.openstack.common import log as logging from nova.openstack.common import uuidutils from nova import quota @@ -844,8 +844,8 @@ def floating_ip_bulk_destroy(context, ips): project_id=project_id) except Exception: with excutils.save_and_reraise_exception(): - LOG.exception(_("Failed to update usages bulk " - "deallocating floating IP")) + LOG.exception(_LE("Failed to update usages bulk " + "deallocating floating IP")) @require_context diff --git a/nova/db/sqlalchemy/migrate_repo/versions/216_havana.py b/nova/db/sqlalchemy/migrate_repo/versions/216_havana.py index 0469e5a265..886ca2ef88 100644 --- a/nova/db/sqlalchemy/migrate_repo/versions/216_havana.py +++ b/nova/db/sqlalchemy/migrate_repo/versions/216_havana.py @@ -20,7 +20,7 @@ from sqlalchemy import ForeignKey, Index, Integer, MetaData, String, Table from sqlalchemy import Text from sqlalchemy.types import NullType -from nova.i18n import _ +from nova.i18n import _LE from nova.openstack.common import log as logging LOG = logging.getLogger(__name__) @@ -81,7 +81,7 @@ def _create_shadow_tables(migrate_engine): shadow_table.create() except Exception: LOG.info(repr(shadow_table)) - LOG.exception(_('Exception while creating table.')) + LOG.exception(_LE('Exception while creating table.')) raise @@ -108,7 +108,7 @@ def _populate_instance_types(instance_types_table): 'is_public': True}) except Exception: LOG.info(repr(instance_types_table)) - LOG.exception(_('Exception while seeding instance_types table')) + LOG.exception(_LE('Exception while seeding instance_types table')) raise @@ -1100,7 +1100,7 @@ def upgrade(migrate_engine): table.create() except Exception: LOG.info(repr(table)) - LOG.exception(_('Exception while creating table.')) + LOG.exception(_LE('Exception while creating table.')) raise # task log unique constraint diff --git a/nova/db/sqlalchemy/utils.py b/nova/db/sqlalchemy/utils.py index 3cafc45b43..77733b5362 100644 --- a/nova/db/sqlalchemy/utils.py +++ b/nova/db/sqlalchemy/utils.py @@ -24,7 +24,7 @@ from sqlalchemy.types import NullType from nova.db.sqlalchemy import api as db from nova import exception -from nova.i18n import _ +from nova.i18n import _, _LE from nova.openstack.common import log as logging @@ -129,8 +129,8 @@ def create_shadow_table(migrate_engine, table_name=None, table=None, # which raises unwrapped OperationalError, so we should catch it until # oslo.db would wraps all such exceptions LOG.info(repr(shadow_table)) - LOG.exception(_('Exception while creating table.')) + LOG.exception(_LE('Exception while creating table.')) raise exception.ShadowTableExists(name=shadow_table_name) except Exception: LOG.info(repr(shadow_table)) - LOG.exception(_('Exception while creating table.')) + LOG.exception(_LE('Exception while creating table.')) diff --git a/nova/exception.py b/nova/exception.py index 763bb58453..ec10963f2c 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -29,7 +29,7 @@ from oslo.config import cfg from oslo.utils import excutils import webob.exc -from nova.i18n import _ +from nova.i18n import _, _LE from nova.openstack.common import log as logging from nova import safe_utils @@ -121,7 +121,7 @@ class NovaException(Exception): exc_info = sys.exc_info() # kwargs doesn't match a variable in the message # log the issue and the kwargs - LOG.exception(_('Exception in string format operation')) + LOG.exception(_LE('Exception in string format operation')) for name, value in kwargs.iteritems(): LOG.error("%s: %s" % (name, value)) # noqa diff --git a/nova/hacking/checks.py b/nova/hacking/checks.py index a10bdb9271..404f11a4fa 100644 --- a/nova/hacking/checks.py +++ b/nova/hacking/checks.py @@ -56,9 +56,11 @@ asse_equal_start_with_none_re = re.compile( r"assertEqual\(None,") conf_attribute_set_re = re.compile(r"CONF\.[a-z0-9_.]+\s*=\s*\w") log_translation = re.compile( - r"(.)*LOG\.(audit|error|warn|warning|critical|exception)\(\s*('|\")") + r"(.)*LOG\.(audit|error|warn|warning|critical)\(\s*('|\")") log_translation_info = re.compile( r"(.)*LOG\.(info)\(\s*(_\(|'|\")") +log_translation_exception = re.compile( + r"(.)*LOG\.(exception)\(\s*(_\(|'|\")") translated_log = re.compile( r"(.)*LOG\.(audit|error|info|warn|warning|critical|exception)" "\(\s*_\(\s*('|\")") @@ -303,6 +305,9 @@ def validate_log_translations(logical_line, physical_line, filename): msg = "N328: LOG.info messages require translations `_LI()`!" if log_translation_info.match(logical_line): yield (0, msg) + msg = "N329: LOG.exception messages require translations `_LE()`!" + if log_translation_exception.match(logical_line): + yield (0, msg) msg = "N321: Log messages require translations!" if log_translation.match(logical_line): yield (0, msg) diff --git a/nova/network/base_api.py b/nova/network/base_api.py index 2d784ae104..436bffc204 100644 --- a/nova/network/base_api.py +++ b/nova/network/base_api.py @@ -21,7 +21,7 @@ from oslo.utils import excutils from nova.db import base from nova import hooks -from nova.i18n import _ +from nova.i18n import _, _LE from nova.network import model as network_model from nova import objects from nova.openstack.common import log as logging @@ -47,7 +47,7 @@ def update_instance_cache_with_nw_info(impl, context, instance, ic.save(update_cells=update_cells) except Exception: with excutils.save_and_reraise_exception(): - LOG.exception(_('Failed storing info cache'), instance=instance) + LOG.exception(_LE('Failed storing info cache'), instance=instance) def refresh_cache(f): diff --git a/nova/network/floating_ips.py b/nova/network/floating_ips.py index 916a494d6d..5dc3e21e79 100644 --- a/nova/network/floating_ips.py +++ b/nova/network/floating_ips.py @@ -275,8 +275,8 @@ class FloatingIP(object): reservations = None except Exception: reservations = None - LOG.exception(_("Failed to update usages deallocating " - "floating IP")) + LOG.exception(_LE("Failed to update usages deallocating " + "floating IP")) rows_updated = objects.FloatingIP.deallocate(context, address) # number of updated rows will be 0 if concurrently another diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index e03cf7bc86..f9d3aa041b 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -822,7 +822,7 @@ def clean_conntrack(fixed_ip): _execute('conntrack', '-D', '-r', fixed_ip, run_as_root=True, check_exit_code=[0, 1]) except processutils.ProcessExecutionError: - LOG.exception(_('Error deleting conntrack entries for %s'), fixed_ip) + LOG.exception(_LE('Error deleting conntrack entries for %s'), fixed_ip) def _enable_ipv4_forwarding(): diff --git a/nova/network/manager.py b/nova/network/manager.py index 7cf814fa53..e112530ed6 100644 --- a/nova/network/manager.py +++ b/nova/network/manager.py @@ -977,8 +977,8 @@ class NetworkManager(manager.Manager): quotas.reserve(context, fixed_ips=-1, project_id=quota_project, user_id=quota_user) except Exception: - LOG.exception(_("Failed to update usages deallocating " - "fixed IP")) + LOG.exception(_LE("Failed to update usages deallocating " + "fixed IP")) try: self._do_trigger_security_group_members_refresh_for_instance( diff --git a/nova/network/security_group/neutron_driver.py b/nova/network/security_group/neutron_driver.py index 3131b842b0..77e9ecca36 100644 --- a/nova/network/security_group/neutron_driver.py +++ b/nova/network/security_group/neutron_driver.py @@ -54,7 +54,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): body).get('security_group') except n_exc.NeutronClientException as e: exc_info = sys.exc_info() - LOG.exception(_("Neutron Error creating security group %s"), + LOG.exception(_LE("Neutron Error creating security group %s"), name) if e.status_code == 401: # TODO(arosen) Cannot raise generic response from neutron here @@ -75,7 +75,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): security_group['id'], body).get('security_group') except n_exc.NeutronClientException as e: exc_info = sys.exc_info() - LOG.exception(_("Neutron Error updating security group %s"), + LOG.exception(_LE("Neutron Error updating security group %s"), name) if e.status_code == 401: # TODO(arosen) Cannot raise generic response from neutron here @@ -159,7 +159,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): 'security_groups') except n_exc.NeutronClientException: with excutils.save_and_reraise_exception(): - LOG.exception(_("Neutron Error getting security groups")) + LOG.exception(_LE("Neutron Error getting security groups")) converted_rules = [] for security_group in security_groups: converted_rules.append( @@ -205,15 +205,15 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): except n_exc.NeutronClientException as e: exc_info = sys.exc_info() if e.status_code == 404: - LOG.exception(_("Neutron Error getting security group %s"), + LOG.exception(_LE("Neutron Error getting security group %s"), name) self.raise_not_found(six.text_type(e)) elif e.status_code == 409: - LOG.exception(_("Neutron Error adding rules to security " - "group %s"), name) + LOG.exception(_LE("Neutron Error adding rules to security " + "group %s"), name) self.raise_over_quota(six.text_type(e)) else: - LOG.exception(_("Neutron Error:")) + LOG.exception(_LE("Neutron Error:")) raise exc_info[0], exc_info[1], exc_info[2] converted_rules = [] for rule in rules: @@ -267,7 +267,8 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): neutron.delete_security_group_rule(rule_ids.pop()) except n_exc.NeutronClientException: with excutils.save_and_reraise_exception(): - LOG.exception(_("Neutron Error unable to delete %s"), rule_ids) + LOG.exception(_LE("Neutron Error unable to delete %s"), + rule_ids) def get_rule(self, context, id): neutron = neutronv2.get_client(context) @@ -411,14 +412,14 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): 'project': context.project_id}) self.raise_not_found(msg) else: - LOG.exception(_("Neutron Error:")) + LOG.exception(_LE("Neutron Error:")) raise exc_info[0], exc_info[1], exc_info[2] params = {'device_id': instance['uuid']} try: ports = neutron.list_ports(**params).get('ports') except n_exc.NeutronClientException: with excutils.save_and_reraise_exception(): - LOG.exception(_("Neutron Error:")) + LOG.exception(_LE("Neutron Error:")) if not ports: msg = (_("instance_id %s could not be found as device id on" @@ -444,7 +445,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): neutron.update_port(port['id'], {'port': updated_port}) except Exception: with excutils.save_and_reraise_exception(): - LOG.exception(_("Neutron Error:")) + LOG.exception(_LE("Neutron Error:")) @compute_api.wrap_check_security_groups_policy def remove_from_instance(self, context, instance, security_group_name): @@ -464,14 +465,14 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): 'project': context.project_id}) self.raise_not_found(msg) else: - LOG.exception(_("Neutron Error:")) + LOG.exception(_LE("Neutron Error:")) raise exc_info[0], exc_info[1], exc_info[2] params = {'device_id': instance['uuid']} try: ports = neutron.list_ports(**params).get('ports') except n_exc.NeutronClientException: with excutils.save_and_reraise_exception(): - LOG.exception(_("Neutron Error:")) + LOG.exception(_LE("Neutron Error:")) if not ports: msg = (_("instance_id %s could not be found as device id on" @@ -500,7 +501,7 @@ class SecurityGroupAPI(security_group_base.SecurityGroupBase): found_security_group = True except Exception: with excutils.save_and_reraise_exception(): - LOG.exception(_("Neutron Error:")) + LOG.exception(_LE("Neutron Error:")) if not found_security_group: msg = (_("Security group %(security_group_name)s not associated " "with the instance %(instance)s") % diff --git a/nova/notifications.py b/nova/notifications.py index 776bf60cc1..18e652b336 100644 --- a/nova/notifications.py +++ b/nova/notifications.py @@ -28,7 +28,7 @@ import six from nova.compute import flavors import nova.context from nova import db -from nova.i18n import _ +from nova.i18n import _LE from nova.image import glance from nova import network from nova.network import model as network_model @@ -146,7 +146,7 @@ def send_update(context, old_instance, new_instance, service=None, host=None): service=service, host=host, old_display_name=old_display_name) except Exception: - LOG.exception(_("Failed to send state update notification"), + LOG.exception(_LE("Failed to send state update notification"), instance=new_instance) @@ -185,7 +185,7 @@ def send_update_with_states(context, instance, old_vm_state, new_vm_state, new_vm_state=new_vm_state, new_task_state=new_task_state, service=service, host=host) except Exception: - LOG.exception(_("Failed to send state update notification"), + LOG.exception(_LE("Failed to send state update notification"), instance=instance) @@ -289,7 +289,7 @@ def bandwidth_usage(instance_ref, audit_start, except Exception: try: with excutils.save_and_reraise_exception(): - LOG.exception(_('Failed to get nw_info'), + LOG.exception(_LE('Failed to get nw_info'), instance=instance_ref) except Exception: if ignore_missing_network_data: diff --git a/nova/quota.py b/nova/quota.py index dcb2928670..578cbdad29 100644 --- a/nova/quota.py +++ b/nova/quota.py @@ -25,7 +25,7 @@ import six from nova import db from nova import exception -from nova.i18n import _ +from nova.i18n import _LE from nova import objects from nova.openstack.common import log as logging @@ -1327,7 +1327,8 @@ class QuotaEngine(object): # usage resynchronization and the reservation expiration # mechanisms will resolve the issue. The exception is # logged, however, because this is less than optimal. - LOG.exception(_("Failed to commit reservations %s"), reservations) + LOG.exception(_LE("Failed to commit reservations %s"), + reservations) return LOG.debug("Committed reservations %s", reservations) @@ -1350,7 +1351,7 @@ class QuotaEngine(object): # usage resynchronization and the reservation expiration # mechanisms will resolve the issue. The exception is # logged, however, because this is less than optimal. - LOG.exception(_("Failed to roll back reservations %s"), + LOG.exception(_LE("Failed to roll back reservations %s"), reservations) return LOG.debug("Rolled back reservations %s", reservations) diff --git a/nova/scheduler/driver.py b/nova/scheduler/driver.py index 383969dc36..3582cb44ee 100644 --- a/nova/scheduler/driver.py +++ b/nova/scheduler/driver.py @@ -29,7 +29,7 @@ from nova.compute import utils as compute_utils from nova.compute import vm_states from nova import db from nova import exception -from nova.i18n import _, _LW +from nova.i18n import _, _LE, _LW from nova import notifications from nova.openstack.common import log as logging from nova import rpc @@ -57,7 +57,7 @@ def handle_schedule_error(context, ex, instance_uuid, request_spec): ex.format_message().strip(), instance_uuid=instance_uuid) else: - LOG.exception(_("Exception during scheduler.run_instance")) + LOG.exception(_LE("Exception during scheduler.run_instance")) state = vm_states.ERROR.upper() LOG.warning(_LW('Setting instance to %s state.'), state, instance_uuid=instance_uuid) diff --git a/nova/scheduler/scheduler_options.py b/nova/scheduler/scheduler_options.py index 6d52e2ac66..43d04a3f9d 100644 --- a/nova/scheduler/scheduler_options.py +++ b/nova/scheduler/scheduler_options.py @@ -28,7 +28,7 @@ from oslo.serialization import jsonutils from oslo.utils import excutils from oslo.utils import timeutils -from nova.i18n import _ +from nova.i18n import _LE from nova.openstack.common import log as logging @@ -66,8 +66,8 @@ class SchedulerOptions(object): return os.path.getmtime(filename) except os.error as e: with excutils.save_and_reraise_exception(): - LOG.exception(_("Could not stat scheduler options file " - "%(filename)s: '%(e)s'"), + LOG.exception(_LE("Could not stat scheduler options file " + "%(filename)s: '%(e)s'"), {'filename': filename, 'e': e}) def _load_file(self, handle): @@ -75,7 +75,7 @@ class SchedulerOptions(object): try: return jsonutils.load(handle) except ValueError as e: - LOG.exception(_("Could not decode scheduler options: '%s'"), e) + LOG.exception(_LE("Could not decode scheduler options: '%s'"), e) return {} def _get_time_now(self): diff --git a/nova/service.py b/nova/service.py index 6f27a3808b..e29ab461b9 100644 --- a/nova/service.py +++ b/nova/service.py @@ -295,7 +295,7 @@ class Service(service.Service): try: self.manager.cleanup_host() except Exception: - LOG.exception(_('Service error occurred during cleanup_host')) + LOG.exception(_LE('Service error occurred during cleanup_host')) pass super(Service, self).stop() diff --git a/nova/virt/block_device.py b/nova/virt/block_device.py index bb47e975d8..292fb5aaba 100644 --- a/nova/virt/block_device.py +++ b/nova/virt/block_device.py @@ -20,6 +20,7 @@ from oslo.utils import excutils from nova import block_device from nova.i18n import _ +from nova.i18n import _LE from nova.i18n import _LI from nova import objects from nova.objects import base as obj_base @@ -253,8 +254,8 @@ class DriverVolumeBlockDevice(DriverBlockDevice): device_type=self['device_type'], encryption=encryption) except Exception: # pylint: disable=W0702 with excutils.save_and_reraise_exception(): - LOG.exception(_("Driver failed to attach volume " - "%(volume_id)s at %(mountpoint)s"), + LOG.exception(_LE("Driver failed to attach volume " + "%(volume_id)s at %(mountpoint)s"), {'volume_id': volume_id, 'mountpoint': self['mount_device']}, context=context, instance=instance) diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py index b808ab9eaf..20374b45e7 100644 --- a/nova/virt/disk/api.py +++ b/nova/virt/disk/api.py @@ -415,7 +415,7 @@ def teardown_container(container_dir, container_root_device=None): utils.execute('qemu-nbd', '-d', container_root_device, run_as_root=True) except Exception as exn: - LOG.exception(_('Failed to teardown container filesystem: %s'), exn) + LOG.exception(_LE('Failed to teardown container filesystem: %s'), exn) def clean_lxc_namespace(container_dir): @@ -428,7 +428,7 @@ def clean_lxc_namespace(container_dir): img = _DiskImage(image=None, mount_dir=container_dir) img.umount() except Exception as exn: - LOG.exception(_('Failed to umount container filesystem: %s'), exn) + LOG.exception(_LE('Failed to umount container filesystem: %s'), exn) def inject_data_into_fs(fs, key, net, metadata, admin_password, files, diff --git a/nova/virt/driver.py b/nova/virt/driver.py index f076f79fd9..c637b62c28 100644 --- a/nova/virt/driver.py +++ b/nova/virt/driver.py @@ -1381,7 +1381,7 @@ def load_compute_driver(virtapi, compute_driver=None): virtapi) return utils.check_isinstance(driver, ComputeDriver) except ImportError: - LOG.exception(_("Unable to load the virtualization driver")) + LOG.exception(_LE("Unable to load the virtualization driver")) sys.exit(1) diff --git a/nova/virt/hyperv/vmops.py b/nova/virt/hyperv/vmops.py index b415968a40..74a8a2e467 100644 --- a/nova/virt/hyperv/vmops.py +++ b/nova/virt/hyperv/vmops.py @@ -408,7 +408,7 @@ class VMOps(object): self._delete_disk_files(instance_name) except Exception: with excutils.save_and_reraise_exception(): - LOG.exception(_('Failed to destroy instance: %s'), + LOG.exception(_LE('Failed to destroy instance: %s'), instance_name) def reboot(self, instance, network_info, reboot_type): diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 1198d73c87..7f4d8a4ef4 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -1418,7 +1418,7 @@ class LibvirtDriver(driver.ComputeDriver): virt_dom.attachDeviceFlags(conf.to_xml(), flags) except Exception as ex: - LOG.exception(_('Failed to attach volume at mountpoint: %s'), + LOG.exception(_LE('Failed to attach volume at mountpoint: %s'), mountpoint, instance=instance) if isinstance(ex, libvirt.libvirtError): errcode = ex.get_error_code() diff --git a/nova/virt/xenapi/driver.py b/nova/virt/xenapi/driver.py index 1a977fc3b4..4880ff0020 100644 --- a/nova/virt/xenapi/driver.py +++ b/nova/virt/xenapi/driver.py @@ -30,7 +30,7 @@ from oslo.serialization import jsonutils from oslo.utils import units import six.moves.urllib.parse as urlparse -from nova.i18n import _ +from nova.i18n import _, _LE from nova.openstack.common import log as logging from nova import utils from nova.virt import driver @@ -138,7 +138,7 @@ class XenAPIDriver(driver.ComputeDriver): try: vm_utils.cleanup_attached_vdis(self._session) except Exception: - LOG.exception(_('Failure while cleaning up attached VDIs')) + LOG.exception(_LE('Failure while cleaning up attached VDIs')) def instance_exists(self, instance): """Checks existence of an instance on the host. diff --git a/nova/virt/xenapi/host.py b/nova/virt/xenapi/host.py index 3f93b360ef..1560e1df38 100644 --- a/nova/virt/xenapi/host.py +++ b/nova/virt/xenapi/host.py @@ -105,8 +105,8 @@ class Host(object): break except self._session.XenAPI.Failure: - LOG.exception(_('Unable to migrate VM %(vm_ref)s ' - 'from %(host)s'), + LOG.exception(_LE('Unable to migrate VM %(vm_ref)s ' + 'from %(host)s'), {'vm_ref': vm_ref, 'host': host}) instance.host = host instance.vm_state = vm_states.ACTIVE @@ -309,7 +309,7 @@ def call_xenhost(session, method, arg_dict): return '' return jsonutils.loads(result) except ValueError: - LOG.exception(_("Unable to get updated status")) + LOG.exception(_LE("Unable to get updated status")) return None except session.XenAPI.Failure as e: LOG.error(_LE("The call to %(method)s returned " diff --git a/nova/virt/xenapi/pool.py b/nova/virt/xenapi/pool.py index 56b5d7b364..d0586cdf38 100644 --- a/nova/virt/xenapi/pool.py +++ b/nova/virt/xenapi/pool.py @@ -62,8 +62,8 @@ class ResourcePool(object): aggregate.update_metadata(metadata) op(host) except Exception: - LOG.exception(_('Aggregate %(aggregate_id)s: unrecoverable state ' - 'during operation on %(host)s'), + LOG.exception(_LE('Aggregate %(aggregate_id)s: unrecoverable ' + 'state during operation on %(host)s'), {'aggregate_id': aggregate['id'], 'host': host}) def add_to_aggregate(self, context, aggregate, host, slave_info=None): diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index 530bf24d36..c15de564a9 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -1432,11 +1432,11 @@ def _fetch_vhd_image(context, session, instance, image_id): if type(handler) == type(default_handler): raise - LOG.exception(_("Download handler '%(handler)s' raised an" - " exception, falling back to default handler" - " '%(default_handler)s'") % - {'handler': handler, - 'default_handler': default_handler}) + LOG.exception(_LE("Download handler '%(handler)s' raised an" + " exception, falling back to default handler" + " '%(default_handler)s'"), + {'handler': handler, + 'default_handler': default_handler}) vdis = default_handler.download_image( context, session, instance, image_id) @@ -1581,7 +1581,7 @@ def _fetch_disk_image(context, session, instance, name_label, image_id, return {vdi_role: dict(uuid=vdi_uuid, file=None)} except (session.XenAPI.Failure, IOError, OSError) as e: # We look for XenAPI and OS failures. - LOG.exception(_("Failed to fetch glance image"), + LOG.exception(_LE("Failed to fetch glance image"), instance=instance) e.args = e.args + ([dict(type=ImageType.to_string(image_type), uuid=vdi_uuid, @@ -1813,7 +1813,7 @@ def compile_diagnostics(vm_rec): return diags except expat.ExpatError as e: - LOG.exception(_('Unable to parse rrd of %s'), e) + LOG.exception(_LE('Unable to parse rrd of %s'), e) return {"Unable to retrieve diagnostics": e} @@ -1963,8 +1963,8 @@ def _get_rrd(server, vm_uuid): vm_uuid)) return xml.read() except IOError: - LOG.exception(_('Unable to obtain RRD XML for VM %(vm_uuid)s with ' - 'server details: %(server)s.'), + LOG.exception(_LE('Unable to obtain RRD XML for VM %(vm_uuid)s with ' + 'server details: %(server)s.'), {'vm_uuid': vm_uuid, 'server': server}) return None diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py index edfaf50919..6bd7c057c6 100644 --- a/nova/virt/xenapi/vmops.py +++ b/nova/virt/xenapi/vmops.py @@ -921,8 +921,8 @@ class VMOps(object): undo_mgr, old_vdi_ref) transfer_vhd_to_dest(new_vdi_ref, new_vdi_uuid) except Exception as error: - LOG.exception(_("_migrate_disk_resizing_down failed. " - "Restoring orig vm due_to: %s."), error, + LOG.exception(_LE("_migrate_disk_resizing_down failed. " + "Restoring orig vm due_to: %s."), error, instance=instance) undo_mgr._rollback() raise exception.InstanceFaultRollback(error) @@ -1075,8 +1075,8 @@ class VMOps(object): transfer_ephemeral_disks_then_all_leaf_vdis() except Exception as error: - LOG.exception(_("_migrate_disk_resizing_up failed. " - "Restoring orig vm due_to: %s."), error, + LOG.exception(_LE("_migrate_disk_resizing_up failed. " + "Restoring orig vm due_to: %s."), error, instance=instance) try: self._restore_orig_vm_and_cleanup_orphan(instance)