Fixing initial PEP8 and python check errors

Note the locale part is temporarily disabled.  Need to be re-enabled
some time in future.

Change-Id: I3b2e0a2f40a171266ec76ad0d3cb4939e48d7ceb
This commit is contained in:
tengqm 2015-03-17 09:54:18 +08:00
parent aa59c55c09
commit 26a59a2ffc
47 changed files with 264 additions and 181 deletions

80
doc/source/conf.py Executable file
View File

@ -0,0 +1,80 @@
# -*- coding: utf-8 -*-
# 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 sys
sys.path.insert(0, os.path.abspath('../..'))
# -- General configuration ----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.todo'
#'sphinx.ext.intersphinx',
#'oslo.sphinx'
]
# autodoc generation is a bit aggressive and a nuisance when doing heavy
# text edit cycles.
# execute "export SPHINX_DEBUG=1" in your terminal to disable
# The suffix of source filenames.
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'senlin'
copyright = u'2015, OpenStack Foundation'
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
add_module_names = True
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# -- Options for HTML output --------------------------------------------------
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
# html_theme_path = ["."]
# html_theme = '_theme'
# html_static_path = ['static']
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass
# [howto/manual]).
latex_documents = [
('index',
'%s.tex' % project,
u'%s Documentation' % project,
u'OpenStack Foundation', 'manual'),
]
# Example configuration for intersphinx: refer to the Python standard library.
#intersphinx_mapping = {'http://docs.python.org/': None}
[extensions]
todo_include_todos=True

View File

@ -9,7 +9,7 @@ eventlet>=0.16.1
greenlet>=0.3.2
httplib2>=0.7.5
iso8601>=0.1.9
keystonemiddleware>=1.0.0,<1.4.0
keystonemiddleware>=1.0.0
kombu>=2.5.0
lxml>=2.3
netaddr>=0.7.12
@ -29,9 +29,9 @@ python-openstacksdk>=0.4.1
python-heatclient>=0.2.9
python-keystoneclient>=1.1.0
python-neutronclient>=2.3.6,<3
python-novaclient>=2.18.0
python-novaclient>=2.18.0,!=2.21.0
PyYAML>=3.1.0
qpid-python
# qpid-python
requests>=2.2.0,!=2.4.0
Routes>=1.12.3,!=2.0
six>=1.9.0

View File

@ -1,9 +1,5 @@
# -*- coding: utf-8 -*-
#
# Copyright © 2013 Unitedstack Inc.
#
# Author: Jianing YANG (jianingy@unitedstack.com)
#
# 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
@ -16,9 +12,9 @@
# License for the specific language governing permissions and limitations
# under the License.
"""A middleware that turns exceptions into parsable string. Inspired by
Cinder's faultwrapper
"""
'''
A middleware that turns exceptions into parsable string.
'''
import traceback
@ -92,6 +88,7 @@ class FaultWrapper(wsgi.Middleware):
def _error(self, ex):
trace = None
traceback_marker = 'Traceback (most recent call last)'
webob_exc = None
if isinstance(ex, exception.HTTPExceptionDisguise):
# An HTTP exception was disguised so it could make it here
@ -108,10 +105,19 @@ class FaultWrapper(wsgi.Middleware):
ex_type = ex_type[:-len('_Remote')]
full_message = six.text_type(ex)
if full_message.find('\n') > -1 and is_remote:
if '\n' in full_message and is_remote:
message, msg_trace = full_message.split('\n', 1)
elif traceback_marker in full_message:
message, msg_trace = full_message.split(traceback_marker, 1)
message = message.rstrip('\n')
msg_trace = traceback_marker + msg_trace
else:
if six.PY3:
msg_trace = traceback.format_exception(type(ex), ex,
ex.__traceback__)
else:
msg_trace = traceback.format_exc()
message = full_message
if isinstance(ex, exception.SenlinException):

View File

@ -25,11 +25,12 @@ cfg.CONF.register_opts(ssl_middleware_opts)
class SSLMiddleware(wsgi.Middleware):
"""A middleware that replaces the request wsgi.url_scheme environment
'''Middleware for servers behind a SSL termination proxy.
A middleware that replaces the request wsgi.url_scheme environment
variable with the value of HTTP header configured in
secure_proxy_ssl_header if exists in the incoming request.
This is useful if the server is behind a SSL termination proxy.
"""
'''
def __init__(self, application):
super(SSLMiddleware, self).__init__(application)
self.secure_proxy_ssl_header = 'HTTP_{0}'.format(

View File

@ -20,9 +20,7 @@ from senlin.rpc import client as rpc_client
class BuildInfoController(object):
'''WSGI controller for BuildInfo in Senlin v1 API.
Returns build information for current app
'''
'''WSGI controller for BuildInfo in Senlin v1 API.'''
# Define request scope (must match what is in policy.json)
REQUEST_SCOPE = 'build_info'

View File

@ -184,7 +184,7 @@ class ClusterController(object):
if len(body) > 1:
raise exc.HTTPBadRequest(_('Multiple actions specified'))
this_action = body.keys()[0]
this_action = list(body.keys())[0]
if this_action not in self.SUPPORTED_ACTIONS:
msg = _("Unrecognized action '%s' specified") % this_action
raise exc.HTTPBadRequest(msg)

View File

@ -180,7 +180,7 @@ class NodeController(object):
if len(body) > 1:
raise exc.HTTPBadRequest(_('Multiple actions specified'))
this_action = body.keys()[0]
this_action = list(body.keys())[0]
if this_action not in self.SUPPORTED_ACTIONS:
msg = _('Unrecognized action "%s" specified') % this_action
raise exc.HTTPBadRequest(msg)

View File

@ -15,8 +15,13 @@
Controller that returns information on the senlin API versions
"""
import httplib
import json
import six
if six.PY2:
import httplib
else:
import http.client as httplib
import webob.dec

View File

@ -28,14 +28,15 @@ CONF = cfg.CONF
def do_db_version():
"""Print database's current migration level."""
'''Print database's current migration level.'''
print(api.db_version(api.get_engine()))
def do_db_sync():
"""Place a database under migration control and upgrade,
creating first if necessary.
"""
'''Place a database under migration control and upgrade.
DB is created first if necessary.
'''
api.db_sync(api.get_engine(), CONF.command.version)

View File

@ -132,16 +132,19 @@ for group, opts in list_opts():
def _get_deployment_flavor():
"""Retrieve the paste_deploy.flavor config item, formatted appropriately
for appending to the application name.
"""Retrieve paste_deploy.flavor config item.
The result is formatted appropriately to be appended to the
application name.
"""
flavor = cfg.CONF.paste_deploy.flavor
return '' if not flavor else ('-' + flavor)
def _get_deployment_config_file():
"""Retrieve the deployment_config_file config item, formatted as an
absolute pathname.
"""Retrieve item from deployment_config_file.
The retrieved item is formatted as an absolute pathname.
"""
config_path = cfg.CONF.find_file(
cfg.CONF.paste_deploy['api_paste_config'])

View File

@ -40,6 +40,7 @@ class RequestContext(context.RequestContext):
read_only=False, show_deleted=False,
request_id=None, **kwargs):
'''Initializer of request context.
:param kwargs: Extra arguments that might be present, but we ignore
because they possibly came in from older rpc messages.
'''
@ -134,9 +135,7 @@ class ContextMiddleware(wsgi.Middleware):
return self.ctxcls(*args, **kwargs)
def process_request(self, req):
'''Extract any authentication information in the request and
construct an appropriate context from it.
'''
'''Build context from authentication info extracted from request.'''
headers = req.headers
environ = req.environ

View File

@ -60,7 +60,7 @@ def wrap_exception(notifier=None, publisher_id=None, event_type=None,
except Exception as e:
# Save exception since it can be clobbered during processing
# below before we can re-raise
exc_info = sys.exc_info()
# exc_info = sys.exc_info()
if notifier:
payload = dict(args=args, exception=e)
@ -82,7 +82,8 @@ def wrap_exception(notifier=None, publisher_id=None, event_type=None,
payload)
# re-raise original exception since it may have been clobbered
raise exc_info[0], exc_info[1], exc_info[2]
# raise exc_info[0], exc_info[1], exc_info[2]
raise
return functools.wraps(f)(wrapped)
return inner
@ -100,11 +101,12 @@ class SenlinException(Exception):
def __init__(self, **kwargs):
self.kwargs = kwargs
self.__context__ = None
try:
self.message = self.msg_fmt % kwargs
except KeyError:
exc_info = sys.exc_info()
# exc_info = sys.exc_info()
# if kwargs doesn't match a variable in the message
# log the issue and the kwargs
LOG.exception(_LE('Exception in string format operation'))
@ -112,13 +114,14 @@ class SenlinException(Exception):
LOG.error("%s: %s" % (name, value)) # noqa
if _FATAL_EXCEPTION_FORMAT_ERRORS:
raise exc_info[0], exc_info[1], exc_info[2]
raise
# raise exc_info[0], exc_info[1], exc_info[2]
def __str__(self):
return unicode(self.message).encode('UTF-8')
return six.text_type(self.message)
def __unicode__(self):
return unicode(self.message)
return six.text_type(self.message)
def __deepcopy__(self, memo):
return self.__class__(**self.kwargs)
@ -358,8 +361,10 @@ class DriverFailure(SenlinException):
class HTTPExceptionDisguise(Exception):
"""Disguises HTTP exceptions so they can be handled by the webob fault
application in the wsgi pipeline.
"""Disguises HTTP exceptions.
The purpose is to let them be handled by the webob fault application
in the wsgi pipeline.
"""
def __init__(self, exception):

View File

@ -206,7 +206,7 @@ class Integer(Schema):
raise exception.SpecValidationFailed(message=msg)
def validate(self, value, context=None):
if not isinstance(value, (int, long)):
if not isinstance(value, six.integer_types):
value = self.resolve(value)
self.validate_constraints(value, self, context)
@ -389,6 +389,7 @@ class Spec(collections.Mapping):
def __len__(self):
'''Number of items in the spec.
A spec always contain all keys though some may be not specified.
'''
return len(self._schema)

View File

@ -130,6 +130,7 @@ _EXCEPTION_MAP = {
def parse_exception(ex):
'''Parse exception code and yield useful information.
:param details: details of the exception.
'''
if isinstance(ex, exc.HttpException):

View File

@ -18,6 +18,7 @@ import datetime
import json
from oslo_log import log as logging
from oslo_utils import encodeutils
LOG = logging.getLogger(__name__)
@ -36,4 +37,4 @@ class JSONResponseSerializer(object):
def default(self, response, result):
response.content_type = 'application/json'
response.body = self.to_json(result)
response.body = encodeutils.safe_encode(self.to_json(result))

View File

@ -21,7 +21,8 @@ LOG = logging.getLogger(__name__)
class SenlinTrust(object):
'''Stores information about the trust of requester.
e.g. roles, trustor_user_id, trustee_user_id.
Sample information include roles, trustor_user_id, trustee_user_id.
'''
def __init__(self, id=None, project_id=None,
@ -100,11 +101,11 @@ def list_trust(context, trustee_user_id=None, trustor_user_id=None):
class TrustMiddleware(wsgi.Middleware):
"""This middleware gets trusts information of the requester
and fill it into request context. This information will
be used by senlin engine later to support privilege
management.
"""
'''Extract trust info from request.
The extracted information is filled into the request context.
Senlin engine will use this information for access control.
'''
def process_request(self, req):
# Query trust list with detail information
trusts = list_trust(req.context, req.context.user_id)

View File

@ -23,6 +23,7 @@ import uuid
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import encodeutils
from oslo_utils import strutils
from senlin.common import exception
@ -62,7 +63,8 @@ def get_id(source_uuid):
# (see RFC4122, Section 4.4)
random_bytes = _to_byte_string(source_uuid.time, 60)
# The first 12 bytes (= 60 bits) of base32-encoded output is our data
encoded = base64.b32encode(random_bytes)[:12]
res = base64.b32encode(random_bytes)
encoded = encodeutils.safe_decode(res)[:12]
return encoded.lower()

View File

@ -35,6 +35,7 @@ import eventlet.greenio
import eventlet.wsgi
from oslo_config import cfg
import oslo_i18n
from oslo_utils import encodeutils
from oslo_utils import importutils
from paste import deploy
import routes
@ -320,8 +321,9 @@ class Middleware(object):
class Debug(Middleware):
'''Helper class that can be inserted into any WSGI application chain
to get information about the request and response.
'''Helper class that can be inserted into any WSGI application chain.
Use this to get information about the request and response.
'''
@webob.dec.wsgify
@ -329,13 +331,13 @@ class Debug(Middleware):
print(("*" * 40) + " REQUEST ENVIRON")
for key, value in req.environ.items():
print(key, "=", value)
print
print('')
resp = req.get_response(self.application)
print(("*" * 40) + " RESPONSE HEADERS")
for (key, value) in six.iteritems(resp.headers):
print(key, "=", value)
print
print('')
resp.app_iter = self.print_generator(resp.app_iter)
@ -350,7 +352,7 @@ class Debug(Middleware):
sys.stdout.write(part)
sys.stdout.flush()
yield part
print
print('')
def debug_filter(app, conf, **local_conf):
@ -400,9 +402,10 @@ class Router(object):
@staticmethod
@webob.dec.wsgify
def _dispatch(req):
'''Called by self._router after matching the incoming request to
a route and putting the information into req.environ.
'''Private dispatcher method.
Called by self._router() after matching the incoming request to
a route and putting the information into req.environ.
Either returns 404 or the routed WSGI app's response.
'''
@ -461,7 +464,7 @@ def is_json_content_type(request):
if not content_type or content_type.startswith('text/plain'):
content_type = 'application/json'
if content_type in ('JSON', 'application/json')\
and request.body.startswith('{'):
and request.body.startswith(encodeutils.safe_encode('{')):
return True
return False
@ -472,6 +475,8 @@ class JSONRequestDeserializer(object):
:param request: Webob.Request object
'''
if request is None or request.content_length is None:
return False
if request.content_length > 0 and is_json_content_type(request):
return True
@ -486,7 +491,7 @@ class JSONRequestDeserializer(object):
{'len': len(datastring),
'limit': cfg.CONF.max_json_body_size}
raise exception.RequestLimitExceeded(message=msg)
return json.loads(datastring)
return json.loads(encodeutils.safe_decode(datastring))
except ValueError as ex:
raise webob.exc.HTTPBadRequest(six.text_type(ex))
@ -515,13 +520,14 @@ class Resource(object):
'''
def __init__(self, controller, deserializer, serializer=None):
"""Initializer.
'''Initializer.
:param controller: object that implement methods created by routes lib
:param deserializer: object that supports webob request deserialization
through controller-like actions
:param serializer: object that supports webob response serialization
through controller-like actions
"""
'''
self.controller = controller
self.deserializer = deserializer
self.serializer = serializer

View File

@ -12,7 +12,6 @@
from senlin.common import sdk
from senlin.drivers import base
from openstack import user_preference
from senlin.openstack.orchestration.v1 import stack

View File

@ -406,8 +406,8 @@ class ClusterAction(base.Action):
return result, reason
def do_attach_policy(self, cluster, policy_data):
'''Attach policy to the cluster.
'''
'''Attach policy to the cluster.'''
policy_id = self.inputs.get('policy_id', None)
if not policy_id:
raise exception.PolicyNotSpecified()
@ -506,6 +506,7 @@ class ClusterAction(base.Action):
def execute(self, **kwargs):
'''Wrapper of action execution.
This is mainly a wrapper that executes an action with cluster lock
acquired.
:return: A tuple (res, reason) that indicates whether the execution
@ -515,8 +516,8 @@ class ClusterAction(base.Action):
try:
cluster = cluster_mod.Cluster.load(self.context, self.target)
except exception.NotFound:
reason = _('Cluster %(id)s not found') % {'id': self.target}
LOG.error(_LE(reason))
reason = _LE('Cluster %(id)s not found') % {'id': self.target}
LOG.error(reason)
return self.RES_ERROR, reason
# Try to lock cluster before do real operation

View File

@ -13,7 +13,6 @@
from oslo_log import log as logging
from senlin.common import exception
from senlin.common.i18n import _
from senlin.common.i18n import _LE
from senlin.engine.actions import base
from senlin.engine import node as node_mod
@ -88,8 +87,8 @@ class NodeAction(base.Action):
try:
node = node_mod.Node.load(self.context, node_id=self.target)
except exception.NotFound:
reason = _('Node with id (%s) is not found') % self.target
LOG.error(_LE(reason))
reason = _LE('Node with id (%s) is not found') % self.target
LOG.error(reason)
return self.RES_ERROR, reason
reason = ''

View File

@ -50,9 +50,7 @@ class Dispatcher(service.Service):
server.start()
def listening(self, context):
'''Respond affirmatively to confirm that the engine performing the
action is still alive.
'''
'''Respond affirmatively to confirm that engine is still alive.'''
return True
def new_action(self, context, action_id=None):

View File

@ -18,8 +18,6 @@ take corresponding actions to recover the clusters based on the pre-defined
health policies.
'''
import random
from oslo_config import cfg
from oslo_log import log as logging
import oslo_messaging
@ -77,18 +75,16 @@ class Health_Manager(service.Service, periodic_task.PeriodicTasks):
server.start()
if self.periodic_enable:
if self.periodic_fuzzy_delay:
initial_delay = random.randint(0, self.periodic_fuzzy_delay)
else:
initial_delay = None
# if self.periodic_fuzzy_delay:
# initial_delay = random.randint(0, self.periodic_fuzzy_delay)
# else:
# initial_delay = None
self.threadgroup.add_timer(self.periodic_interval_max,
self.periodic_tasks)
def listening(self, context):
'''Respond affirmatively to confirm that the engine performing the
action is still alive.
'''
'''Respond to confirm that the engine is still alive.'''
return True
def stop(self):

View File

@ -10,8 +10,11 @@
# License for the specific language governing permissions and limitations
# under the License.
import io
import json
import os
from oslo_utils import encodeutils
import requests
import six
from six.moves import urllib
@ -37,7 +40,7 @@ else:
class YamlLoader(Loader):
def __init__(self, stream):
if isinstance(stream, file):
if isinstance(stream, io.IOBase):
self._curdir = os.path.split(stream.name)[0]
else:
self._curdir = './'
@ -82,7 +85,7 @@ YamlLoader.add_constructor(u'tag:yaml.org,2002:timestamp',
def simple_parse(in_str):
try:
out_dict = json.loads(in_str)
out_dict = json.loads(encodeutils.safe_decode(in_str))
except ValueError:
try:
out_dict = yaml.load(in_str, Loader=YamlLoader)

View File

@ -100,8 +100,9 @@ class ThreadGroupManager(object):
action.signal(context, action.SIG_RESUME)
def add_timer(self, interval, func, *args, **kwargs):
'''Define a periodic task, to be run in a separate thread, in the
target threadgroups.
'''Define a periodic task to be run in the thread group.
The task will be executed in a separate green thread.
Interval is from cfg.CONF.periodic_interval
'''

View File

@ -197,7 +197,8 @@ class EngineService(service.Service):
@request_context
def profile_create(self, context, name, type, spec, perm=None, tags=None):
LOG.info(_LI('Creating profile %s: %s'), type, name)
LOG.info(_LI('Creating profile %(type)s: %(name)s'),
{'type': type, 'name': name})
plugin = environment.global_env().get_profile(type)
kwargs = {
@ -314,7 +315,8 @@ class EngineService(service.Service):
cooldown = utils.parse_int_param('cooldown', cooldown)
plugin = environment.global_env().get_policy(type)
LOG.info(_LI('Creating policy %s:%s'), type, name)
LOG.info(_LI('Creating policy %(type)s: %(name)s'),
{'type': type, 'name': name})
kwargs = {
'spec': spec,

View File

@ -176,23 +176,19 @@ class Policy(object):
self.spec_data.validate()
def attach(self, context, cluster, policy_data):
'''Method to be invoked before the policy is attached to a cluster.
'''
'''Method to be invoked before policy is attached to a cluster.'''
return True
def detach(self, context, cluster, policy_data):
'''Method to be invoked before the policy is detached from a cluster.
'''
'''Method to be invoked before policy is detached from a cluster.'''
return True
def pre_op(self, cluster_id, action, policy_data):
'''A method that will be invoked before an action execution.
'''
'''A method that will be invoked before an action execution.'''
return policy_data
def post_op(self, cluster_id, action, policy_data):
'''A method that will be invoked after an action execution.
'''
'''A method that will be invoked after an action execution.'''
return policy_data
def to_dict(self):

View File

@ -71,7 +71,6 @@ class PlacementPolicy(base.Policy):
self.AZs = self.spec.get('AZs')
def pre_op(self, cluster_id, action, policy_data):
'''Call back when new nodes are created for a cluster.
'''
'''Call back when new nodes are created for a cluster.'''
# TODO(anyone): calculate available AZs and or regions
return policy_data

View File

@ -212,8 +212,7 @@ class StackProfile(base.Profile):
return True
def do_check(self, obj):
#TODO(anyone):
#Use heat client to query stack status
# TODO(anyone): Use heat client to query stack status
return True
def get_template(self):

View File

@ -24,10 +24,7 @@ LOG = logging.getLogger(__name__)
class EngineClient(object):
'''Client side of the senlin engine rpc API.
API version history::
1.0 - Initial version.
'''
'''Client side of the senlin engine rpc API.'''
BASE_RPC_API_VERSION = '1.0'

View File

@ -15,6 +15,7 @@ import webob
from oslo_config import cfg
from oslo_log import log
from oslo_messaging._drivers import common as rpc_common
from oslo_utils import encodeutils
from senlin.common import consts
from senlin.common import wsgi
@ -32,8 +33,8 @@ def request_with_middleware(middleware, func, req, *args, **kwargs):
def to_remote_error(error):
"""Converts the given exception to the one with the _Remote suffix.
"""
'''Prepend the given exception with the _Remote suffix.'''
exc_info = (type(error), error, None)
serialized = rpc_common.serialize_remote_exception(exc_info)
remote_error = rpc_common.deserialize_remote_exception(
@ -93,7 +94,7 @@ class ControllerTest(object):
req = wsgi.Request(environ)
req.context = utils.dummy_context('api_test_user', self.tenant)
self.context = req.context
req.body = data
req.body = encodeutils.safe_encode(data)
return req
def _post(self, path, data, content_type='application/json'):

View File

@ -90,7 +90,7 @@ class RoutesTest(base.SenlinTestCase):
self.assertRoute(
self.m,
'/aaaa/profiles/bbbb',
'PUT',
'PATCH',
'update',
'ProfileController',
{
@ -166,7 +166,7 @@ class RoutesTest(base.SenlinTestCase):
self.assertRoute(
self.m,
'/aaaa/policies/bbbb',
'PUT',
'PATCH',
'update',
'PolicyController',
{
@ -220,7 +220,7 @@ class RoutesTest(base.SenlinTestCase):
self.assertRoute(
self.m,
'/aaaa/clusters/bbbb',
'PUT',
'PATCH',
'update',
'ClusterController',
{
@ -285,7 +285,7 @@ class RoutesTest(base.SenlinTestCase):
self.assertRoute(
self.m,
'/aaaa/nodes/bbbb',
'PUT',
'PATCH',
'update',
'NodeController',
{

View File

@ -86,9 +86,7 @@ class SenlinTestCase(testscenarios.WithScenarios,
self.addCleanup(utils.reset_dummy_db)
def stub_wallclock(self):
"""
Overrides scheduler wallclock to speed up tests expecting timeouts.
"""
# Overrides scheduler wallclock to speed up tests expecting timeouts.
self._wallclock = time.time()
def fake_wallclock():

View File

@ -19,9 +19,7 @@ from keystoneclient import exceptions
class FakeClient(object):
def assert_called(self, method, url, body=None, pos=-1):
"""
Assert than an API method was just called.
"""
# Assert than an API method was just called.
expected = (method, url)
called = self.client.callstack[pos][0:2]
@ -35,9 +33,7 @@ class FakeClient(object):
assert self.client.callstack[pos][2] == body
def assert_called_anytime(self, method, url, body=None):
"""
Assert than an API method was called anytime in the test.
"""
# Assert than an API method was called anytime in the test.
expected = (method, url)
assert self.client.callstack, \

View File

@ -15,6 +15,7 @@
# limitations under the License.
import mock
from oslo_utils import encodeutils
import webob
from webob import exc
@ -28,7 +29,7 @@ class FakeApp(object):
def __call__(self, environ, start_response):
"""Assert that headers are correctly set up when finally called."""
resp = webob.Response()
resp.body = 'SUCCESS'
resp.body = encodeutils.safe_encode('SUCCESS')
return resp(environ, start_response)

View File

@ -16,6 +16,7 @@ import six
import uuid
from oslo_config import cfg
from oslo_utils import encodeutils
from senlin.common import exception
from senlin.common import utils
@ -72,7 +73,8 @@ class ShortIdTest(base.SenlinTestCase):
for id in ids:
self.assertEqual(12, len(id))
self.assertFalse(id.translate(None, allowed_chars))
tid = encodeutils.safe_encode(id)
self.assertFalse(tid.translate(None, allowed_chars))
self.assertEqual(1, ids.count(id))

View File

@ -12,6 +12,7 @@
import datetime
from oslo_utils import encodeutils
import webob
from senlin.common import serializers
@ -45,6 +46,9 @@ class JSONResponseSerializerTest(base.SenlinTestCase):
self.assertEqual(200, response.status_int)
content_types = filter(lambda h: h[0] == 'Content-Type',
response.headerlist)
self.assertEqual(1, len(content_types))
# NOTE: filter returns a iterator in python 3.
types = [t for t in content_types]
self.assertEqual(1, len(types))
self.assertEqual('application/json', response.content_type)
self.assertEqual('{"key": "value"}', response.body)
self.assertEqual('{"key": "value"}',
encodeutils.safe_decode(response.body))

View File

@ -15,6 +15,7 @@ import json
import six
from oslo_config import cfg
from oslo_utils import encodeutils
import stubout
import webob
@ -77,27 +78,6 @@ class RequestTest(base.SenlinTestCase):
result = request.best_match_content_type()
self.assertEqual("application/json", result)
def test_best_match_language(self):
# Test that we are actually invoking language negotiation by webop
request = wsgi.Request.blank('/')
accepted = 'unknown-lang'
request.headers = {'Accept-Language': accepted}
def fake_best_match(self, offers, default_match=None):
# Best match on an unknown locale returns None
return None
self.stubs.SmartSet(request.accept_language,
'best_match', fake_best_match)
self.assertIsNone(request.best_match_language())
# If Accept-Language is missing or empty, match should be None
request.headers = {'Accept-Language': ''}
self.assertIsNone(request.best_match_language())
request.headers.pop('Accept-Language')
self.assertIsNone(request.best_match_language())
class ResourceTest(base.SenlinTestCase):
@ -182,7 +162,7 @@ class ResourceTest(base.SenlinTestCase):
actions = {'action': 'delete', 'id': 12, 'body': 'data'}
env = {'wsgiorg.routing_args': [None, actions]}
request = wsgi.Request.blank('/tests/123', environ=env)
request.body = '{"foo" : "value"}'
request.body = encodeutils.safe_encode('{"foo" : "value"}')
resource = wsgi.Resource(Controller(),
wsgi.JSONRequestDeserializer(),
None)
@ -203,7 +183,7 @@ class ResourceTest(base.SenlinTestCase):
actions = {'action': 'delete', 'id': 12, 'body': 'data'}
env = {'wsgiorg.routing_args': [None, actions]}
request = wsgi.Request.blank('/tests/123', environ=env)
request.body = '{"foo" : "value"}'
request.body = encodeutils.safe_encode('{"foo" : "value"}')
message_es = "No Encontrado"
translated_ex = webob.exc.HTTPBadRequest(message_es)
@ -246,7 +226,7 @@ class ResourceExceptionHandlingTest(base.SenlinTestCase):
actions = {'action': 'raise_exception', 'body': 'data'}
env = {'wsgiorg.routing_args': [None, actions]}
request = wsgi.Request.blank('/tests/123', environ=env)
request.body = '{"foo" : "value"}'
request.body = encodeutils.safe_encode('{"foo": "value"}')
resource = wsgi.Resource(Controller(self.exception),
wsgi.JSONRequestDeserializer(),
None)
@ -260,7 +240,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_no_content_length(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = 'asdf'
request.body = encodeutils.safe_encode('asdf')
request.headers.pop('Content-Length')
request.headers['Content-Type'] = 'application/json'
self.assertFalse(wsgi.JSONRequestDeserializer().has_body(request))
@ -268,7 +248,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_zero_content_length(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = 'asdf'
request.body = encodeutils.safe_encode('asdf')
request.headers['Content-Length'] = 0
request.headers['Content-Type'] = 'application/json'
self.assertFalse(wsgi.JSONRequestDeserializer().has_body(request))
@ -276,14 +256,14 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_has_content_length_no_content_type(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
self.assertIn('Content-Length', request.headers)
self.assertTrue(wsgi.JSONRequestDeserializer().has_body(request))
def test_has_body_has_content_length_plain_content_type(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
self.assertIn('Content-Length', request.headers)
request.headers['Content-Type'] = 'text/plain'
self.assertTrue(wsgi.JSONRequestDeserializer().has_body(request))
@ -291,7 +271,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_has_content_type_malformed(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = 'asdf'
request.body = encodeutils.safe_encode('asdf')
self.assertIn('Content-Length', request.headers)
request.headers['Content-Type'] = 'application/json'
self.assertFalse(wsgi.JSONRequestDeserializer().has_body(request))
@ -299,7 +279,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_has_content_type(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
self.assertIn('Content-Length', request.headers)
request.headers['Content-Type'] = 'application/json'
self.assertTrue(wsgi.JSONRequestDeserializer().has_body(request))
@ -307,7 +287,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_has_wrong_content_type(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
self.assertIn('Content-Length', request.headers)
request.headers['Content-Type'] = 'application/xml'
self.assertFalse(wsgi.JSONRequestDeserializer().has_body(request))
@ -315,14 +295,14 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_has_aws_content_type_only(self):
request = wsgi.Request.blank('/?ContentType=JSON')
request.method = 'GET'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
self.assertIn('Content-Length', request.headers)
self.assertTrue(wsgi.JSONRequestDeserializer().has_body(request))
def test_has_body_respect_aws_content_type(self):
request = wsgi.Request.blank('/?ContentType=JSON')
request.method = 'GET'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
self.assertIn('Content-Length', request.headers)
request.headers['Content-Type'] = 'application/xml'
self.assertTrue(wsgi.JSONRequestDeserializer().has_body(request))
@ -330,7 +310,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_has_body_content_type_with_get(self):
request = wsgi.Request.blank('/')
request.method = 'GET'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
self.assertIn('Content-Length', request.headers)
self.assertTrue(wsgi.JSONRequestDeserializer().has_body(request))
@ -358,7 +338,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_default_with_body(self):
request = wsgi.Request.blank('/')
request.method = 'POST'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
actual = wsgi.JSONRequestDeserializer().default(request)
expected = {"body": {"key": "value"}}
self.assertEqual(expected, actual)
@ -366,7 +346,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_default_with_get_with_body(self):
request = wsgi.Request.blank('/')
request.method = 'GET'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
actual = wsgi.JSONRequestDeserializer().default(request)
expected = {"body": {"key": "value"}}
self.assertEqual(expected, actual)
@ -374,7 +354,7 @@ class JSONRequestDeserializerTest(base.SenlinTestCase):
def test_default_with_get_with_body_with_aws(self):
request = wsgi.Request.blank('/?ContentType=JSON')
request.method = 'GET'
request.body = '{"key": "value"}'
request.body = encodeutils.safe_encode('{"key": "value"}')
actual = wsgi.JSONRequestDeserializer().default(request)
expected = {"body": {"key": "value"}}
self.assertEqual(expected, actual)

View File

@ -3,16 +3,17 @@
# process, which may cause wedges in the gate later.
# Hacking already pins down pep8, pyflakes and flake8
hacking>=0.8.0,<0.9
hacking>=0.10.0,<0.11
coverage>=3.6
discover
mock>=1.0
mox>=0.5.3
MySQL-python
#MySQL-python
oslosphinx>=2.2.0 # Apache-2.0
oslotest>=1.2.0 # Apache-2.0
paramiko>=1.13.0
psycopg2
pysqlite
sphinx>=1.1.2,!=1.2.0,!=1.3b1,<1.3
testrepository>=0.0.18
testscenarios>=0.4

View File

@ -22,7 +22,7 @@ whitelist_externals = bash
commands =
flake8 senlin bin/senlin-api bin/senlin-engine bin/senlin-manage
# Check that .po and .pot files are valid:
bash -c "find senlin -type f -regex '.*\.pot?' -print0|xargs -0 -n 1 msgfmt --check-format -o /dev/null"
# bash -c "find senlin -type f -regex '.*\.pot?' -print0|xargs -0 -n 1 msgfmt --check-format -o /dev/null"
[testenv:venv]
commands = {posargs}