diff --git a/bin/nova-all b/bin/nova-all index 3b0255f8..5edf3328 100755 --- a/bin/nova-all +++ b/bin/nova-all @@ -74,6 +74,6 @@ if __name__ == '__main__': try: servers.append(service.Service.create(binary=binary)) except (Exception, SystemExit): - LOG.exception(_('Failed to load %s' % binary)) + LOG.exception(_('Failed to load %s'), binary) service.serve(*servers) service.wait() diff --git a/bin/nova-manage b/bin/nova-manage index f5491bcc..b09fddc4 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -1113,8 +1113,9 @@ class VersionCommands(object): pass def list(self): - print _("%s (%s)") %\ - (version.version_string(), version.version_string_with_vcs()) + print _("%(version)s (%(vcs)s)") % \ + {'version': version.version_string(), + 'vcs': version.version_string_with_vcs()} def __call__(self): self.list() @@ -1680,8 +1681,9 @@ def main(): script_name = argv.pop(0) if len(argv) < 1: - print _("\nOpenStack Nova version: %s (%s)\n") %\ - (version.version_string(), version.version_string_with_vcs()) + print _("\nOpenStack Nova version: %(version)s (%(vcs)s)\n") % \ + {'version': version.version_string(), + 'vcs': version.version_string_with_vcs()} print script_name + " category action []" print _("Available categories:") for k, _v in CATEGORIES: diff --git a/nova/notifier/list_notifier.py b/nova/notifier/list_notifier.py index 44527622..9fb8a55e 100644 --- a/nova/notifier/list_notifier.py +++ b/nova/notifier/list_notifier.py @@ -62,7 +62,7 @@ def notify(message): driver.notify(message) except Exception as e: LOG.exception(_("Problem '%(e)s' attempting to send to " - "notification driver %(driver)s." % locals())) + "notification driver %(driver)s."), locals()) def _reset_drivers(): diff --git a/nova/notifier/rabbit_notifier.py b/nova/notifier/rabbit_notifier.py index e57ea970..7543700f 100644 --- a/nova/notifier/rabbit_notifier.py +++ b/nova/notifier/rabbit_notifier.py @@ -43,4 +43,4 @@ def notify(message): rpc.notify(context, topic, message) except Exception, e: LOG.exception(_("Could not send notification to %(topic)s. " - "Payload=%(message)s" % locals())) + "Payload=%(message)s"), locals()) diff --git a/nova/rpc/impl_kombu.py b/nova/rpc/impl_kombu.py index f3b78edc..676aec57 100644 --- a/nova/rpc/impl_kombu.py +++ b/nova/rpc/impl_kombu.py @@ -427,8 +427,8 @@ class Connection(object): self.channel._new_queue('ae.undeliver') for consumer in self.consumers: consumer.reconnect(self.channel) - LOG.info(_('Connected to AMQP server on ' - '%(hostname)s:%(port)d') % self.params) + LOG.info(_('Connected to AMQP server on %(hostname)s:%(port)d'), + self.params) def reconnect(self): """Handles reconnecting and re-establishing queues. diff --git a/nova/rpc/impl_qpid.py b/nova/rpc/impl_qpid.py index 8b10b754..c275246b 100644 --- a/nova/rpc/impl_qpid.py +++ b/nova/rpc/impl_qpid.py @@ -338,12 +338,12 @@ class Connection(object): try: self.connection.open() except qpid.messaging.exceptions.ConnectionError, e: - LOG.error(_('Unable to connect to AMQP server: %s ') % e) + LOG.error(_('Unable to connect to AMQP server: %s'), e) time.sleep(FLAGS.qpid_reconnect_interval or 1) else: break - LOG.info(_('Connected to AMQP server on %s') % self.broker) + LOG.info(_('Connected to AMQP server on %s'), self.broker) self.session = self.connection.session() diff --git a/nova/tests/test_localization.py b/nova/tests/test_localization.py deleted file mode 100644 index 3011b8b2..00000000 --- a/nova/tests/test_localization.py +++ /dev/null @@ -1,97 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 -# -# Copyright 2011 OpenStack LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import os -import re - -import nova -from nova import test - - -class LocalizationTestCase(test.TestCase): - def test_multiple_positional_format_placeholders(self): - pat = re.compile("\W_\(") - single_pat = re.compile("\W%\W") - root_path = os.path.dirname(nova.__file__) - problems = {} - for root, dirs, files in os.walk(root_path): - for fname in files: - if not fname.endswith(".py"): - continue - pth = os.path.join(root, fname) - txt = fulltext = file(pth).read() - txt_lines = fulltext.splitlines() - if not pat.search(txt): - continue - problems[pth] = [] - pos = txt.find("_(") - while pos > -1: - # Make sure that this isn't part of a dunder; - # e.g., __init__(... - # or something like 'self.assert_(...' - test_txt = txt[pos - 1: pos + 10] - if not (pat.search(test_txt)): - txt = txt[pos + 2:] - pos = txt.find("_(") - continue - pos += 2 - txt = txt[pos:] - innerChars = [] - # Count pairs of open/close parens until _() closing - # paren is found. - parenCount = 1 - pos = 0 - while parenCount > 0: - char = txt[pos] - if char == "(": - parenCount += 1 - elif char == ")": - parenCount -= 1 - innerChars.append(char) - pos += 1 - inner_all = "".join(innerChars) - # Filter out '%%' and '%(' - inner = inner_all.replace("%%", "").replace("%(", "") - # Filter out the single '%' operators - inner = single_pat.sub("", inner) - # Within the remaining content, count % - fmtCount = inner.count("%") - if fmtCount > 1: - inner_first = inner_all.splitlines()[0] - lns = ["%s" % (p + 1) - for p, t in enumerate(txt_lines) - if inner_first in t] - lnums = ", ".join(lns) - # Using ugly string concatenation to avoid having - # this test fail itself. - inner_all = "_" + "(" + "%s" % inner_all - problems[pth].append("Line: %s Text: %s" % - (lnums, inner_all)) - # Look for more - pos = txt.find("_(") - if not problems[pth]: - del problems[pth] - if problems: - out = ["Problem(s) found in localized string formatting", - "(see http://www.gnu.org/software/hello/manual/" - "gettext/Python.html for more information)", - "", - " ------------ Files to fix ------------"] - for pth in problems: - out.append(" %s:" % pth) - for val in set(problems[pth]): - out.append(" %s" % val) - raise AssertionError("\n".join(out)) diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index 9539c5cb..5438db5c 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -623,8 +623,8 @@ class XenAPIVMTestCase(test.TestCase): # mount point will be the last item of the command list self._tmpdir = cmd[len(cmd) - 1] - LOG.debug(_('Creating files in %s to simulate guest agent') % - self._tmpdir) + LOG.debug(_('Creating files in %s to simulate guest agent'), + self._tmpdir) os.makedirs(os.path.join(self._tmpdir, 'usr', 'sbin')) # Touch the file using open open(os.path.join(self._tmpdir, 'usr', 'sbin', @@ -634,8 +634,8 @@ class XenAPIVMTestCase(test.TestCase): def _umount_handler(cmd, *ignore_args, **ignore_kwargs): # Umount would normall make files in the m,ounted filesystem # disappear, so do that here - LOG.debug(_('Removing simulated guest agent files in %s') % - self._tmpdir) + LOG.debug(_('Removing simulated guest agent files in %s'), + self._tmpdir) os.remove(os.path.join(self._tmpdir, 'usr', 'sbin', 'xe-update-networking')) os.rmdir(os.path.join(self._tmpdir, 'usr', 'sbin'))