Add _() to fix i18N compliance (part 1)

In heat, almost 200 log message and at least 30 exception
message are not processed by _(), and will not been translated.
We should use '_("STRING ...")' to enable i18n support.

I will split to two parts for review easier because the files
lost of _() are too much.

Closes-Bug: #1249217

Change-Id: I2c86dc7770a7f6f107ba16711b9cba363ef9b906
This commit is contained in:
chenxiao 2013-11-14 16:57:01 +08:00
parent 161ae8154f
commit c7c4901c80
19 changed files with 159 additions and 113 deletions

View File

@ -30,6 +30,7 @@ import webob
from heat.api.aws import exception
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
logger = logging.getLogger(__name__)
@ -130,10 +131,10 @@ class EC2Token(wsgi.Middleware):
last_failure = None
for auth_uri in self._conf_get('allowed_auth_uris'):
try:
logger.debug("Attempt authorize on %s" % auth_uri)
logger.debug(_("Attempt authorize on %s") % auth_uri)
return self._authorize(req, auth_uri)
except HeatAPIException as e:
logger.debug("Authorize failed: %s" % e.__class__)
logger.debug(_("Authorize failed: %s") % e.__class__)
last_failure = e
raise last_failure or exception.HeatAccessDeniedError()
@ -143,14 +144,14 @@ class EC2Token(wsgi.Middleware):
# here so that we can use both authentication methods.
# Returning here just means the user didn't supply AWS
# authentication and we'll let the app try native keystone next.
logger.info("Checking AWS credentials..")
logger.info(_("Checking AWS credentials.."))
signature = self._get_signature(req)
if not signature:
if 'X-Auth-User' in req.headers:
return self.application
else:
logger.info("No AWS Signature found.")
logger.info(_("No AWS Signature found."))
raise exception.HeatIncompleteSignatureError()
access = self._get_access(req)
@ -158,14 +159,14 @@ class EC2Token(wsgi.Middleware):
if 'X-Auth-User' in req.headers:
return self.application
else:
logger.info("No AWSAccessKeyId/Authorization Credential")
logger.info(_("No AWSAccessKeyId/Authorization Credential"))
raise exception.HeatMissingAuthenticationTokenError()
logger.info("AWS credentials found, checking against keystone.")
logger.info(_("AWS credentials found, checking against keystone."))
if not auth_uri:
logger.error("Ec2Token authorization failed, no auth_uri "
"specified in config file")
logger.error(_("Ec2Token authorization failed, no auth_uri "
"specified in config file"))
raise exception.HeatInternalFailureError(_('Service '
'misconfigured'))
# Make a copy of args for authentication and signature verification.
@ -189,7 +190,7 @@ class EC2Token(wsgi.Middleware):
headers = {'Content-Type': 'application/json'}
keystone_ec2_uri = self._conf_get_keystone_ec2_uri(auth_uri)
logger.info('Authenticating with %s' % keystone_ec2_uri)
logger.info(_('Authenticating with %s') % keystone_ec2_uri)
response = requests.post(keystone_ec2_uri, data=creds_json,
headers=headers)
result = response.json()
@ -197,9 +198,9 @@ class EC2Token(wsgi.Middleware):
token_id = result['access']['token']['id']
tenant = result['access']['token']['tenant']['name']
tenant_id = result['access']['token']['tenant']['id']
logger.info("AWS authentication successful.")
logger.info(_("AWS authentication successful."))
except (AttributeError, KeyError):
logger.info("AWS authentication failure.")
logger.info(_("AWS authentication failure."))
# Try to extract the reason for failure so we can return the
# appropriate AWS error via raising an exception
try:

View File

@ -19,6 +19,7 @@
import webob.exc
from heat.common import wsgi
from heat.openstack.common.gettextutils import _
import heat.openstack.common.rpc.common as rpc_common
@ -31,7 +32,8 @@ class HeatAPIException(webob.exc.HTTPError):
'''
code = 400
title = "HeatAPIException"
explanation = "Generic HeatAPIException, please use specific subclasses!"
explanation = _("Generic HeatAPIException, please use specific "
"subclasses!")
err_type = "Sender"
def __init__(self, detail=None):
@ -72,7 +74,7 @@ class HeatIncompleteSignatureError(HeatAPIException):
'''
code = 400
title = "IncompleteSignature"
explanation = "The request signature does not conform to AWS standards"
explanation = _("The request signature does not conform to AWS standards")
class HeatInternalFailureError(HeatAPIException):
@ -81,7 +83,8 @@ class HeatInternalFailureError(HeatAPIException):
'''
code = 500
title = "InternalFailure"
explanation = "The request processing has failed due to an internal error"
explanation = _("The request processing has failed due to an "
"internal error")
err_type = "Server"
@ -91,7 +94,7 @@ class HeatInvalidActionError(HeatAPIException):
'''
code = 400
title = "InvalidAction"
explanation = "The action or operation requested is invalid"
explanation = _("The action or operation requested is invalid")
class HeatInvalidClientTokenIdError(HeatAPIException):
@ -100,7 +103,7 @@ class HeatInvalidClientTokenIdError(HeatAPIException):
'''
code = 403
title = "InvalidClientTokenId"
explanation = "The certificate or AWS Key ID provided does not exist"
explanation = _("The certificate or AWS Key ID provided does not exist")
class HeatInvalidParameterCombinationError(HeatAPIException):
@ -109,7 +112,7 @@ class HeatInvalidParameterCombinationError(HeatAPIException):
'''
code = 400
title = "InvalidParameterCombination"
explanation = "Incompatible parameters were used together"
explanation = _("Incompatible parameters were used together")
class HeatInvalidParameterValueError(HeatAPIException):
@ -118,7 +121,7 @@ class HeatInvalidParameterValueError(HeatAPIException):
'''
code = 400
title = "InvalidParameterValue"
explanation = "A bad or out-of-range value was supplied"
explanation = _("A bad or out-of-range value was supplied")
class HeatInvalidQueryParameterError(HeatAPIException):
@ -127,7 +130,8 @@ class HeatInvalidQueryParameterError(HeatAPIException):
'''
code = 400
title = "InvalidQueryParameter"
explanation = "AWS query string is malformed, does not adhere to AWS spec"
explanation = _("AWS query string is malformed, does not adhere to "
"AWS spec")
class HeatMalformedQueryStringError(HeatAPIException):
@ -136,7 +140,7 @@ class HeatMalformedQueryStringError(HeatAPIException):
'''
code = 404
title = "MalformedQueryString"
explanation = "The query string is malformed"
explanation = _("The query string is malformed")
class HeatMissingActionError(HeatAPIException):
@ -145,7 +149,7 @@ class HeatMissingActionError(HeatAPIException):
'''
code = 400
title = "MissingAction"
explanation = "The request is missing an action or operation parameter"
explanation = _("The request is missing an action or operation parameter")
class HeatMissingAuthenticationTokenError(HeatAPIException):
@ -155,7 +159,7 @@ class HeatMissingAuthenticationTokenError(HeatAPIException):
'''
code = 403
title = "MissingAuthenticationToken"
explanation = "Does not contain a valid AWS Access Key or certificate"
explanation = _("Does not contain a valid AWS Access Key or certificate")
class HeatMissingParameterError(HeatAPIException):
@ -164,7 +168,7 @@ class HeatMissingParameterError(HeatAPIException):
'''
code = 400
title = "MissingParameter"
explanation = "A mandatory input parameter is missing"
explanation = _("A mandatory input parameter is missing")
class HeatOptInRequiredError(HeatAPIException):
@ -173,7 +177,8 @@ class HeatOptInRequiredError(HeatAPIException):
'''
code = 403
title = "OptInRequired"
explanation = "The AWS Access Key ID needs a subscription for the service"
explanation = _("The AWS Access Key ID needs a subscription for the "
"service")
class HeatRequestExpiredError(HeatAPIException):
@ -183,7 +188,7 @@ class HeatRequestExpiredError(HeatAPIException):
'''
code = 400
title = "RequestExpired"
explanation = "Request expired or more than 15mins in the future"
explanation = _("Request expired or more than 15mins in the future")
class HeatServiceUnavailableError(HeatAPIException):
@ -192,7 +197,7 @@ class HeatServiceUnavailableError(HeatAPIException):
'''
code = 503
title = "ServiceUnavailable"
explanation = "Service temporarily unvavailable"
explanation = _("Service temporarily unvavailable")
err_type = "Server"
@ -202,7 +207,7 @@ class HeatThrottlingError(HeatAPIException):
'''
code = 400
title = "Throttling"
explanation = "Request was denied due to request throttling"
explanation = _("Request was denied due to request throttling")
class AlreadyExistsError(HeatAPIException):
@ -211,7 +216,7 @@ class AlreadyExistsError(HeatAPIException):
'''
code = 400
title = 'AlreadyExists'
explanation = "Resource with the name requested already exists"
explanation = _("Resource with the name requested already exists")
# Not documented in the AWS docs, authentication failure errors
@ -222,7 +227,7 @@ class HeatAccessDeniedError(HeatAPIException):
'''
code = 403
title = "AccessDenied"
explanation = "User is not authorized to perform action"
explanation = _("User is not authorized to perform action")
class HeatSignatureError(HeatAPIException):
@ -232,8 +237,8 @@ class HeatSignatureError(HeatAPIException):
'''
code = 403
title = "SignatureDoesNotMatch"
explanation = ("The request signature we calculated does not match the " +
"signature you provided")
explanation = _("The request signature we calculated does not match the "
"signature you provided")
# Heat-specific errors
@ -243,7 +248,7 @@ class HeatAPINotImplementedError(HeatAPIException):
'''
code = 500
title = "APINotImplemented"
explanation = ("The requested action is not yet implemented")
explanation = _("The requested action is not yet implemented")
err_type = "Server"

View File

@ -22,6 +22,7 @@ import itertools
from heat.api.aws import exception
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
LOG = logging.getLogger(__name__)
@ -103,7 +104,7 @@ def get_param_value(params, key):
try:
return params[key]
except KeyError:
LOG.error("Request does not contain %s parameter!" % key)
LOG.error(_("Request does not contain %s parameter!") % key)
raise exception.HeatMissingParameterError(key)

View File

@ -26,6 +26,7 @@ from heat.rpc import api as engine_api
import heat.openstack.common.rpc.common as rpc_common
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
logger = logging.getLogger(__name__)
@ -213,7 +214,7 @@ class WatchController(object):
# Filter criteria not met, return None
return
except KeyError:
logger.warning("Invalid filter key %s, ignoring" % f)
logger.warning(_("Invalid filter key %s, ignoring") % f)
return result
@ -222,7 +223,7 @@ class WatchController(object):
# FIXME : Don't yet handle filtering by Dimensions
filter_result = dict((k, v) for (k, v) in parms.iteritems() if k in
("MetricName", "Namespace"))
logger.debug("filter parameters : %s" % filter_result)
logger.debug(_("filter parameters : %s") % filter_result)
try:
# Engine does not currently support query by namespace/metric
@ -268,7 +269,7 @@ class WatchController(object):
# need to process (each dict) for dimensions
metric_data = api_utils.extract_param_list(parms, prefix='MetricData')
if not len(metric_data):
logger.error("Request does not contain required MetricData")
logger.error(_("Request does not contain required MetricData"))
return exception.HeatMissingParameterError("MetricData list")
watch_name = None
@ -335,7 +336,8 @@ class WatchController(object):
if 'StateReasonData' in parms:
state_reason_data = parms['StateReasonData']
logger.debug("setting %s to %s" % (name, state_map[state]))
logger.debug(_("setting %(name)s to %(state)s") % {
'name': name, 'state': state_map[state]})
try:
self.engine_rpcapi.set_watch_state(con, watch_name=name,
state=state_map[state])

View File

@ -21,6 +21,7 @@ Middleware for authenticating against custom backends.
import logging
from heat.openstack.common.gettextutils import _
from heat.openstack.common import local
from heat.rpc import client as rpc_client
import webob.exc
@ -41,7 +42,7 @@ class AuthProtocol(object):
Authenticate send downstream on success. Reject request if
we can't authenticate.
"""
LOG.debug('Authenticating user token')
LOG.debug(_('Authenticating user token'))
context = local.store.context
engine = rpc_client.EngineClient()
authenticated = engine.authenticated_to_backend(context)
@ -58,7 +59,8 @@ class AuthProtocol(object):
:param start_response: wsgi response callback
:returns HTTPUnauthorized http response
"""
resp = webob.exc.HTTPUnauthorized("Backend authentication failed", [])
resp = webob.exc.HTTPUnauthorized(_("Backend authentication failed"),
[])
return resp(env, start_response)

View File

@ -24,6 +24,7 @@ from oslo.config import cfg
from heat.openstack.common import importutils
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
logger = logging.getLogger('heat.common.keystoneclient')
@ -97,8 +98,8 @@ class KeystoneClient(object):
kwargs['tenant_name'] = self.context.tenant
kwargs['tenant_id'] = self.context.tenant_id
else:
logger.error("Keystone v2 API connection failed, no password or "
"auth_token!")
logger.error(_("Keystone v2 API connection failed, no password "
"or auth_token!"))
raise exception.AuthorizationFailure()
client_v2 = kc.Client(**kwargs)
@ -108,7 +109,7 @@ class KeystoneClient(object):
if auth_kwargs:
# Sanity check
if not client_v2.auth_ref.trust_scoped:
logger.error("v2 trust token re-scoping failed!")
logger.error(_("v2 trust token re-scoping failed!"))
raise exception.AuthorizationFailure()
# All OK so update the context with the token
self.context.auth_token = client_v2.auth_ref.auth_token
@ -157,8 +158,8 @@ class KeystoneClient(object):
kwargs['auth_url'] = self.context.auth_url.replace('v2.0', 'v3')
kwargs['endpoint'] = kwargs['auth_url']
else:
logger.error("Keystone v3 API connection failed, no password or "
"auth_token!")
logger.error(_("Keystone v3 API connection failed, no password "
"or auth_token!"))
raise exception.AuthorizationFailure()
client = kc_v3.Client(**kwargs)
@ -216,8 +217,8 @@ class KeystoneClient(object):
Returns the keystone ID of the resulting user
"""
if(len(username) > 64):
logger.warning("Truncating the username %s to the last 64 "
"characters." % username)
logger.warning(_("Truncating the username %s to the last 64 "
"characters.") % username)
#get the last 64 characters of the username
username = username[-64:]
user = self.client_v2.users.create(username,
@ -236,12 +237,14 @@ class KeystoneClient(object):
if r.name == cfg.CONF.heat_stack_user_role]
if len(stack_user_role) == 1:
role_id = stack_user_role[0]
logger.debug("Adding user %s to role %s" % (user.id, role_id))
logger.debug(_("Adding user %(user)s to role %(role)s") % {
'user': user.id, 'role': role_id})
self.client_v2.roles.add_user_role(user.id, role_id,
self.context.tenant_id)
else:
logger.error("Failed to add user %s to role %s, check role exists!"
% (username, cfg.CONF.heat_stack_user_role))
logger.error(_("Failed to add user %(user)s to role %(role)s, "
"check role exists!") % {'user': username,
'role': cfg.CONF.heat_stack_user_role})
return user.id
@ -265,8 +268,9 @@ class KeystoneClient(object):
status = 'DELETED'
except Exception as ce:
reason = str(ce)
logger.warning("Problem deleting user %s: %s" %
(user_id, reason))
logger.warning(_("Problem deleting user %(user)s: "
"%(reason)s") % {'user': user_id,
'reason': reason})
eventlet.sleep(1)
except eventlet.Timeout as t:
if t is not tmo:
@ -294,8 +298,9 @@ class KeystoneClient(object):
if len(cred) == 1:
return cred[0]
else:
logger.error("Unexpected number of ec2 credentials %s for %s" %
(len(cred), user_id))
logger.error(_("Unexpected number of ec2 credentials %(len)s "
"for %(user)s") % {'len': len(cred),
'user': user_id})
def disable_stack_user(self, user_id):
# FIXME : This won't work with the v3 keystone API

View File

@ -716,7 +716,8 @@ class Resource(object):
err_body = action_result.get_unserialized_body()
serializer.default(action_result, err_body)
except Exception:
logging.warning("Unable to serialize exception response")
logging.warning(_("Unable to serialize exception "
"response"))
return action_result

View File

@ -73,7 +73,7 @@ def raw_template_get(context, template_id):
result = model_query(context, models.RawTemplate).get(template_id)
if not result:
raise exception.NotFound('raw template with id %s not found' %
raise exception.NotFound(_('raw template with id %s not found') %
template_id)
return result
@ -90,7 +90,8 @@ def resource_get(context, resource_id):
result = model_query(context, models.Resource).get(resource_id)
if not result:
raise exception.NotFound("resource with id %s not found" % resource_id)
raise exception.NotFound(_("resource with id %s not found") %
resource_id)
return result
@ -119,7 +120,7 @@ def resource_get_all(context):
results = model_query(context, models.Resource).all()
if not results:
raise exception.NotFound('no resources were found')
raise exception.NotFound(_('no resources were found'))
return results
@ -156,7 +157,7 @@ def resource_data_get_by_key(context, resource_id, key):
.filter_by(key=key).first())
if not result:
raise exception.NotFound('No resource data found')
raise exception.NotFound(_('No resource data found'))
return result
@ -206,8 +207,8 @@ def resource_get_all_by_stack(context, stack_id):
filter_by(stack_id=stack_id).all()
if not results:
raise exception.NotFound("no resources for stack_id %s were found" %
stack_id)
raise exception.NotFound(_("no resources for stack_id %s were found")
% stack_id)
return results
@ -272,8 +273,10 @@ def stack_update(context, stack_id, values):
stack = stack_get(context, stack_id)
if not stack:
raise exception.NotFound('Attempt to update a stack with id: %s %s' %
(stack_id, 'that does not exist'))
raise exception.NotFound(_('Attempt to update a stack with id: '
'%(id)s %(msg)s') % {
'id': stack_id,
'msg': 'that does not exist'})
old_template_id = stack.raw_template_id
@ -284,8 +287,10 @@ def stack_update(context, stack_id, values):
def stack_delete(context, stack_id):
s = stack_get(context, stack_id)
if not s:
raise exception.NotFound('Attempt to delete a stack with id: %s %s' %
(stack_id, 'that does not exist'))
raise exception.NotFound(_('Attempt to delete a stack with id: '
'%(id)s %(msg)s') % {
'id': stack_id,
'msg': 'that does not exist'})
session = Session.object_session(s)
@ -432,8 +437,10 @@ def watch_rule_update(context, watch_id, values):
wr = watch_rule_get(context, watch_id)
if not wr:
raise exception.NotFound('Attempt to update a watch with id: %s %s' %
(watch_id, 'that does not exist'))
raise exception.NotFound(_('Attempt to update a watch with id: '
'%(id)s %(msg)s') % {
'id': watch_id,
'msg': 'that does not exist'})
wr.update(values)
wr.save(_session(context))
@ -442,9 +449,10 @@ def watch_rule_update(context, watch_id, values):
def watch_rule_delete(context, watch_id):
wr = watch_rule_get(context, watch_id)
if not wr:
raise exception.NotFound('Attempt to delete watch_rule: %s %s' %
(watch_id, 'that does not exist'))
raise exception.NotFound(_('Attempt to delete watch_rule: '
'%(id)s %(msg)s') % {
'id': watch_id,
'msg': 'that does not exist'})
session = Session.object_session(wr)
for d in wr.watch_data:

View File

@ -43,7 +43,8 @@ def patched_with_engine(f, *a, **kw):
return f(*a, **kw)
finally:
if isinstance(engine, migrate_util.Engine) and engine is not url:
migrate_util.log.debug('Disposing SQLAlchemy engine %s', engine)
migrate_util.log.debug(_('Disposing SQLAlchemy engine %s') %
engine)
engine.dispose()

View File

@ -64,7 +64,7 @@ def _list_environment_files(env_dir):
try:
return os.listdir(env_dir)
except OSError as osex:
LOG.error('Failed to read %s' % (env_dir))
LOG.error(_('Failed to read %s') % env_dir)
LOG.exception(osex)
return []
@ -83,15 +83,17 @@ def _load_global_environment(env, env_dir=None):
try:
file_path = os.path.join(env_dir, env_name)
with open(file_path) as env_fd:
LOG.info('Loading %s' % file_path)
LOG.info(_('Loading %s') % file_path)
env_body = environment_format.parse(env_fd.read())
environment_format.default_for_missing(env_body)
env.load(env_body)
except ValueError as vex:
LOG.error('Failed to parse %s/%s' % (env_dir, env_name))
LOG.error(_('Failed to parse %(dir)s/%(name)s') % {
'dir': env_dir, 'name': env_name})
LOG.exception(vex)
except IOError as ioex:
LOG.error('Failed to read %s/%s' % (env_dir, env_name))
LOG.error(_('Failed to read %(dir)s/%(name)s') % {
'dir': env_dir, 'name': env_name})
LOG.exception(ioex)

View File

@ -498,8 +498,10 @@ class AutoScalingGroup(InstanceGroup, CooldownMixin):
Adjust the size of the scaling group if the cooldown permits.
"""
if self._cooldown_inprogress():
logger.info("%s NOT performing scaling adjustment, cooldown %s" %
(self.name, self.properties['Cooldown']))
logger.info(_("%(name)s NOT performing scaling adjustment, "
"cooldown %(cooldown)s") % {
'name': self.name,
'cooldown': self.properties['Cooldown']})
return
capacity = len(self.get_instances())
@ -519,14 +521,15 @@ class AutoScalingGroup(InstanceGroup, CooldownMixin):
new_capacity = capacity + rounded
if new_capacity > int(self.properties['MaxSize']):
logger.warn('can not exceed %s' % self.properties['MaxSize'])
logger.warn(_('can not exceed %s') % self.properties['MaxSize'])
return
if new_capacity < int(self.properties['MinSize']):
logger.warn('can not be less than %s' % self.properties['MinSize'])
logger.warn(_('can not be less than %s') %
self.properties['MinSize'])
return
if new_capacity == capacity:
logger.debug('no change in capacity %d' % capacity)
logger.debug(_('no change in capacity %d') % capacity)
return
result = self.resize(new_capacity)
@ -664,21 +667,25 @@ class ScalingPolicy(signal_responder.SignalResponder, CooldownMixin):
alarm_state = details.get('current',
details.get('state', 'alarm')).lower()
logger.info('%s Alarm, new state %s' % (self.name, alarm_state))
logger.info(_('%(name)s Alarm, new state %(state)s') % {
'name': self.name, 'state': alarm_state})
if alarm_state != 'alarm':
return
if self._cooldown_inprogress():
logger.info("%s NOT performing scaling action, cooldown %s" %
(self.name, self.properties['Cooldown']))
logger.info(_("%(name)s NOT performing scaling action, "
"cooldown %(cooldown)s") % {
'name': self.name,
'cooldown': self.properties['Cooldown']})
return
asgn_id = self.properties['AutoScalingGroupName']
group = self.stack.resource_by_refid(asgn_id)
logger.info('%s Alarm, adjusting Group %s by %s' %
(self.name, group.name,
self.properties['ScalingAdjustment']))
logger.info(_('%(name)s Alarm, adjusting Group %(group)s '
'by %(filter)s') % {
'name': self.name, 'group': group.name,
'filter': self.properties['ScalingAdjustment']})
group.adjust(int(self.properties['ScalingAdjustment']),
self.properties['AdjustmentType'])

View File

@ -20,6 +20,7 @@ from heat.common import exception
from heat.openstack.common import excutils
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
logger = logging.getLogger(__name__)
@ -52,14 +53,14 @@ class ElasticIp(resource.Resource):
ips = self.neutron().show_floatingip(self.resource_id)
except ne as e:
if e.status_code == 404:
logger.warn("Floating IPs not found: %s" % str(e))
logger.warn(_("Floating IPs not found: %s") % str(e))
else:
self.ipaddress = ips['floatingip']['floating_ip_address']
else:
try:
ips = self.nova().floating_ips.get(self.resource_id)
except clients.novaclient.exceptions.NotFound as ex:
logger.warn("Floating IPs not found: %s" % str(ex))
logger.warn(_("Floating IPs not found: %s") % str(ex))
else:
self.ipaddress = ips.ip
return self.ipaddress or ''
@ -76,24 +77,24 @@ class ElasticIp(resource.Resource):
'floatingip': props})['floatingip']
self.ipaddress = ips['floating_ip_address']
self.resource_id_set(ips['id'])
logger.info('ElasticIp create %s' % str(ips))
logger.info(_('ElasticIp create %s') % str(ips))
else:
if self.properties['Domain']:
raise exception.Error('Domain property can not be set on '
'resource %s without Neutron available' %
self.name)
raise exception.Error(_('Domain property can not be set on '
'resource %s without Neutron available')
% self.name)
try:
ips = self.nova().floating_ips.create()
except clients.novaclient.exceptions.NotFound:
with excutils.save_and_reraise_exception():
msg = ("No default floating IP pool configured."
"Set 'default_floating_pool' in nova.conf.")
msg = _("No default floating IP pool configured. "
"Set 'default_floating_pool' in nova.conf.")
logger.error(msg)
if ips:
self.ipaddress = ips.ip
self.resource_id_set(ips.id)
logger.info('ElasticIp create %s' % str(ips))
logger.info(_('ElasticIp create %s') % str(ips))
if self.properties['InstanceId']:
server = self.nova().servers.get(self.properties['InstanceId'])
@ -160,7 +161,8 @@ class ElasticIpAssociation(resource.Resource):
if self.properties['EIP']:
if not self.properties['InstanceId']:
logger.warn('Skipping association, InstanceId not specified')
logger.warn(_('Skipping association, InstanceId not '
'specified'))
return
server = self.nova().servers.get(self.properties['InstanceId'])
server.add_floating_ip(self.properties['EIP'])
@ -181,7 +183,7 @@ class ElasticIpAssociation(resource.Resource):
port_rsrc = ports['ports'][0]
port_id = port_rsrc['id']
else:
logger.warn('Skipping association, resource not specified')
logger.warn(_('Skipping association, resource not specified'))
return
float_id = self.properties['AllocationId']

View File

@ -56,19 +56,21 @@ class Restarter(signal_responder.SignalResponder):
else:
alarm_state = details.get('state', 'alarm').lower()
logger.info('%s Alarm, new state %s' % (self.name, alarm_state))
logger.info(_('%(name)s Alarm, new state %(state)s') % {
'name': self.name, 'state': alarm_state})
if alarm_state != 'alarm':
return
victim = self._find_resource(self.properties['InstanceId'])
if victim is None:
logger.info('%s Alarm, can not find instance %s' %
(self.name, self.properties['InstanceId']))
logger.info(_('%(name)s Alarm, can not find instance '
'%(instance)s') % {'name': self.name,
'instance': self.properties['InstanceId']})
return
logger.info('%s Alarm, restarting resource: %s' %
(self.name, victim.name))
logger.info(_('%(name)s Alarm, restarting resource: %(victim)s') % {
'name': self.name, 'victim': victim.name})
self.stack.restart_resource(victim.name)
def _resolve_attribute(self, name):
@ -536,7 +538,7 @@ class Instance(resource.Resource):
raise exception.NotFound(_('Failed to find instance %s') %
self.resource_id)
else:
logger.debug("suspending instance %s" % self.resource_id)
logger.debug(_("suspending instance %s") % self.resource_id)
# We want the server.suspend to happen after the volume
# detachement has finished, so pass both tasks and the server
suspend_runner = scheduler.TaskRunner(server.suspend)
@ -590,7 +592,7 @@ class Instance(resource.Resource):
raise exception.NotFound(_('Failed to find instance %s') %
self.resource_id)
else:
logger.debug("resuming instance %s" % self.resource_id)
logger.debug(_("resuming instance %s") % self.resource_id)
server.resume()
return server, scheduler.TaskRunner(self._attach_volumes_task())

View File

@ -16,6 +16,7 @@
from heat.engine import clients
from heat.common import exception
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
from heat.engine import resource
logger = logging.getLogger(__name__)
@ -49,7 +50,7 @@ class InternetGateway(resource.Resource):
# add a heat configuration variable to set the ID of
# the default one
raise exception.Error(
'Expected 1 external network, found %d' % len(ext_nets))
_('Expected 1 external network, found %d') % len(ext_nets))
external_network_id = ext_nets[0]['id']
return external_network_id

View File

@ -18,6 +18,7 @@ from heat.engine import stack_resource
from heat.engine.resources import nova_utils
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
logger = logging.getLogger(__name__)
@ -353,7 +354,7 @@ class LoadBalancer(stack_resource.StackResource):
client = self.nova()
for i in instances:
ip = nova_utils.server_to_ipaddress(client, i) or '0.0.0.0'
logger.debug('haproxy server:%s' % ip)
logger.debug(_('haproxy server:%s') % ip)
servers.append('%sserver server%d %s:%s %s' % (spaces, n,
ip, inst_port,
check))

View File

@ -80,7 +80,8 @@ class FloatingIP(neutron.NeutronResource):
attributes = self.neutron().show_floatingip(
self.resource_id)['floatingip']
except NeutronClientException as ex:
logger.warn("failed to fetch resource attributes: %s" % str(ex))
logger.warn(_("failed to fetch resource attributes: %s") %
str(ex))
return None
return self.handle_get_attributes(self.name, key, attributes)

View File

@ -120,7 +120,8 @@ class NeutronResource(resource.Resource):
try:
attributes = self._show_resource()
except NeutronClientException as ex:
logger.warn("failed to fetch resource attributes: %s" % str(ex))
logger.warn(_("failed to fetch resource attributes: %s") %
str(ex))
return None
return self.handle_get_attributes(self.name, name, attributes)

View File

@ -144,7 +144,7 @@ class Port(neutron.NeutronResource):
self._prepare_list_properties(props)
logger.debug('updating port with %s' % props)
logger.debug(_('updating port with %s') % props)
self.neutron().update_port(self.resource_id, {'port': props})
def check_update_complete(self, *args):

View File

@ -29,6 +29,7 @@ from heat.common import exception
from heat.engine import clients
from heat.engine import scheduler
from heat.openstack.common import log as logging
from heat.openstack.common.gettextutils import _
from heat.openstack.common import uuidutils
logger = logging.getLogger(__name__)
@ -60,7 +61,7 @@ def get_image_id(nova_client, image_identifier):
try:
image_id = nova_client.images.get(image_identifier).id
except clients.novaclient.exceptions.NotFound:
logger.info("Image %s was not found in glance"
logger.info(_("Image %s was not found in glance")
% image_identifier)
raise exception.ImageNotFound(image_name=image_identifier)
else:
@ -68,16 +69,17 @@ def get_image_id(nova_client, image_identifier):
image_list = nova_client.images.list()
except clients.novaclient.exceptions.ClientException as ex:
raise exception.Error(
message="Error retrieving image list from nova: %s" % str(ex))
message=(_("Error retrieving image list from nova: %s") %
str(ex)))
image_names = dict(
(o.id, o.name)
for o in image_list if o.name == image_identifier)
if len(image_names) == 0:
logger.info("Image %s was not found in glance" %
logger.info(_("Image %s was not found in glance") %
image_identifier)
raise exception.ImageNotFound(image_name=image_identifier)
elif len(image_names) > 1:
logger.info("Mulitple images %s were found in glance with name"
logger.info(_("Mulitple images %s were found in glance with name")
% image_identifier)
raise exception.PhysicalResourceNameAmbiguity(
name=image_identifier)
@ -264,7 +266,8 @@ def server_to_ipaddress(client, server):
try:
server = client.servers.get(server)
except clients.novaclient.exceptions.NotFound as ex:
logger.warn('Instance (%s) not found: %s' % (server, str(ex)))
logger.warn(_('Instance (%(server)s) not found: %(ex)s') % {
'server': server, 'ex': str(ex)})
else:
for n in server.networks:
if len(server.networks[n]) > 0: