From 26a59a2ffcd4b605e238fc3533a42d1943b95227 Mon Sep 17 00:00:00 2001 From: tengqm Date: Tue, 17 Mar 2015 09:54:18 +0800 Subject: [PATCH] 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 --- doc/source/conf.py | 80 +++++++++++++++++++ requirements.txt | 6 +- senlin/api/middleware/fault.py | 24 +++--- senlin/api/middleware/ssl.py | 7 +- senlin/api/openstack/v1/build_info.py | 4 +- senlin/api/openstack/v1/clusters.py | 2 +- senlin/api/openstack/v1/nodes.py | 2 +- senlin/api/openstack/versions.py | 7 +- senlin/cmd/manage.py | 9 ++- senlin/common/config.py | 11 ++- senlin/common/context.py | 5 +- senlin/common/exception.py | 21 +++-- senlin/common/schema.py | 3 +- senlin/common/sdk.py | 1 + senlin/common/serializers.py | 3 +- senlin/common/trust.py | 13 +-- senlin/common/utils.py | 4 +- senlin/common/wsgi.py | 34 ++++---- senlin/drivers/heat_v1.py | 1 - senlin/engine/actions/cluster_action.py | 9 ++- senlin/engine/actions/node_action.py | 5 +- senlin/engine/cluster.py | 2 +- senlin/engine/dispatcher.py | 4 +- senlin/engine/health_manager.py | 18 ++--- senlin/engine/parser.py | 7 +- senlin/engine/scheduler.py | 5 +- senlin/engine/service.py | 6 +- senlin/policies/base.py | 12 +-- senlin/policies/placement_policy.py | 3 +- .../profiles/aws/autoscaling/launch_config.py | 4 +- senlin/profiles/os/heat/resource.py | 4 +- senlin/profiles/os/heat/stack.py | 3 +- senlin/rpc/client.py | 5 +- senlin/tests/__init__.py | 6 +- senlin/tests/apiv1/shared.py | 7 +- senlin/tests/apiv1/test_routes.py | 8 +- senlin/tests/common/base.py | 4 +- senlin/tests/common/fakes.py | 8 +- senlin/tests/db/test_action_api.py | 2 +- senlin/tests/engine/test_policies.py | 4 +- senlin/tests/test_auth_url.py | 3 +- senlin/tests/test_common_policy.py | 2 +- senlin/tests/test_common_utils.py | 4 +- senlin/tests/test_serializers.py | 8 +- senlin/tests/test_wsgi.py | 54 ++++--------- test-requirements.txt | 9 ++- tox.ini | 2 +- 47 files changed, 264 insertions(+), 181 deletions(-) create mode 100755 doc/source/conf.py diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100755 index 000000000..8b06f09ff --- /dev/null +++ b/doc/source/conf.py @@ -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 + diff --git a/requirements.txt b/requirements.txt index 79fc289aa..80082ea77 100644 --- a/requirements.txt +++ b/requirements.txt @@ -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 diff --git a/senlin/api/middleware/fault.py b/senlin/api/middleware/fault.py index 623202413..5c8313e03 100644 --- a/senlin/api/middleware/fault.py +++ b/senlin/api/middleware/fault.py @@ -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: - msg_trace = traceback.format_exc() + 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): diff --git a/senlin/api/middleware/ssl.py b/senlin/api/middleware/ssl.py index 65c3ef2b9..3817bbefe 100644 --- a/senlin/api/middleware/ssl.py +++ b/senlin/api/middleware/ssl.py @@ -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( diff --git a/senlin/api/openstack/v1/build_info.py b/senlin/api/openstack/v1/build_info.py index d9339b92d..516782421 100644 --- a/senlin/api/openstack/v1/build_info.py +++ b/senlin/api/openstack/v1/build_info.py @@ -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' diff --git a/senlin/api/openstack/v1/clusters.py b/senlin/api/openstack/v1/clusters.py index 612dc20c3..fc2c9710c 100644 --- a/senlin/api/openstack/v1/clusters.py +++ b/senlin/api/openstack/v1/clusters.py @@ -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) diff --git a/senlin/api/openstack/v1/nodes.py b/senlin/api/openstack/v1/nodes.py index 303d8ea03..cda7cd746 100644 --- a/senlin/api/openstack/v1/nodes.py +++ b/senlin/api/openstack/v1/nodes.py @@ -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) diff --git a/senlin/api/openstack/versions.py b/senlin/api/openstack/versions.py index 55b5220fd..f89df9e53 100644 --- a/senlin/api/openstack/versions.py +++ b/senlin/api/openstack/versions.py @@ -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 diff --git a/senlin/cmd/manage.py b/senlin/cmd/manage.py index 77b9a72c2..1d94197cd 100644 --- a/senlin/cmd/manage.py +++ b/senlin/cmd/manage.py @@ -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) diff --git a/senlin/common/config.py b/senlin/common/config.py index 5e4198d8b..a7fceb3cb 100644 --- a/senlin/common/config.py +++ b/senlin/common/config.py @@ -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']) diff --git a/senlin/common/context.py b/senlin/common/context.py index 99c3951c4..4291075b3 100644 --- a/senlin/common/context.py +++ b/senlin/common/context.py @@ -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 diff --git a/senlin/common/exception.py b/senlin/common/exception.py index aae568ffe..c85355408 100644 --- a/senlin/common/exception.py +++ b/senlin/common/exception.py @@ -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): diff --git a/senlin/common/schema.py b/senlin/common/schema.py index 456366537..0c5c921d0 100644 --- a/senlin/common/schema.py +++ b/senlin/common/schema.py @@ -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) diff --git a/senlin/common/sdk.py b/senlin/common/sdk.py index e7ba98cba..c633d2168 100644 --- a/senlin/common/sdk.py +++ b/senlin/common/sdk.py @@ -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): diff --git a/senlin/common/serializers.py b/senlin/common/serializers.py index fae9b6a94..bf4dcf0a2 100644 --- a/senlin/common/serializers.py +++ b/senlin/common/serializers.py @@ -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)) diff --git a/senlin/common/trust.py b/senlin/common/trust.py index 7c16d2908..0374b6d4a 100644 --- a/senlin/common/trust.py +++ b/senlin/common/trust.py @@ -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) diff --git a/senlin/common/utils.py b/senlin/common/utils.py index f15da4894..6116dadd3 100644 --- a/senlin/common/utils.py +++ b/senlin/common/utils.py @@ -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() diff --git a/senlin/common/wsgi.py b/senlin/common/wsgi.py index b747791c6..2295212c3 100644 --- a/senlin/common/wsgi.py +++ b/senlin/common/wsgi.py @@ -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. ''' @@ -452,16 +455,16 @@ def is_json_content_type(request): aws_content_type = request.params.get("ContentType") except Exception: aws_content_type = None - #respect aws_content_type when both available + # respect aws_content_type when both available content_type = aws_content_type or request.content_type else: content_type = request.content_type - #bug #1887882 - #for back compatible for null or plain content type + # bug #1887882 + # for back compatible for null or plain content type 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 diff --git a/senlin/drivers/heat_v1.py b/senlin/drivers/heat_v1.py index b791cf2c4..91a718978 100644 --- a/senlin/drivers/heat_v1.py +++ b/senlin/drivers/heat_v1.py @@ -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 diff --git a/senlin/engine/actions/cluster_action.py b/senlin/engine/actions/cluster_action.py index 25520541b..c2e12676a 100644 --- a/senlin/engine/actions/cluster_action.py +++ b/senlin/engine/actions/cluster_action.py @@ -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 diff --git a/senlin/engine/actions/node_action.py b/senlin/engine/actions/node_action.py index 95fa72bb5..6172afe40 100644 --- a/senlin/engine/actions/node_action.py +++ b/senlin/engine/actions/node_action.py @@ -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 = '' diff --git a/senlin/engine/cluster.py b/senlin/engine/cluster.py index 4e7308ca1..bb9c36647 100644 --- a/senlin/engine/cluster.py +++ b/senlin/engine/cluster.py @@ -254,7 +254,7 @@ class Cluster(periodic_task.PeriodicTasks): Set cluster status to DELETED. ''' - #self.set_status(context, self.DELETED) + # self.set_status(context, self.DELETED) db_api.cluster_delete(context, self.id) return True diff --git a/senlin/engine/dispatcher.py b/senlin/engine/dispatcher.py index 6bb649121..fa4cf5872 100644 --- a/senlin/engine/dispatcher.py +++ b/senlin/engine/dispatcher.py @@ -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): diff --git a/senlin/engine/health_manager.py b/senlin/engine/health_manager.py index 9364e99f8..532ee66c1 100644 --- a/senlin/engine/health_manager.py +++ b/senlin/engine/health_manager.py @@ -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 @@ -58,14 +56,14 @@ class Health_Manager(service.Service, periodic_task.PeriodicTasks): self.topic = topic self.version = version - #params for periodic running task + # params for periodic running task self.periodic_interval_max = CONF.periodic_interval_max self.periodic_enable = CONF.periodic_enable self.periodic_fuzzy_delay = CONF.periodic_fuzzy_delay def periodic_tasks(self, raise_on_error=False): """Tasks to be run at a periodic interval.""" - #TODO(anyone): iterate clusters and call their periodic_tasks + # TODO(anyone): iterate clusters and call their periodic_tasks return self.periodic_interval_max def start(self): @@ -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): diff --git a/senlin/engine/parser.py b/senlin/engine/parser.py index 2437e56fe..7d134cc96 100644 --- a/senlin/engine/parser.py +++ b/senlin/engine/parser.py @@ -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) diff --git a/senlin/engine/scheduler.py b/senlin/engine/scheduler.py index 22c64caf9..0fe2f77b5 100644 --- a/senlin/engine/scheduler.py +++ b/senlin/engine/scheduler.py @@ -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 ''' diff --git a/senlin/engine/service.py b/senlin/engine/service.py index dc530f68b..cb1b28f1d 100644 --- a/senlin/engine/service.py +++ b/senlin/engine/service.py @@ -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, diff --git a/senlin/policies/base.py b/senlin/policies/base.py index 33caa1cdc..7f14a3dc7 100644 --- a/senlin/policies/base.py +++ b/senlin/policies/base.py @@ -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): diff --git a/senlin/policies/placement_policy.py b/senlin/policies/placement_policy.py index af468f9ce..9a1c037b7 100644 --- a/senlin/policies/placement_policy.py +++ b/senlin/policies/placement_policy.py @@ -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 diff --git a/senlin/profiles/aws/autoscaling/launch_config.py b/senlin/profiles/aws/autoscaling/launch_config.py index a983521f0..b4a877aa5 100644 --- a/senlin/profiles/aws/autoscaling/launch_config.py +++ b/senlin/profiles/aws/autoscaling/launch_config.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -#from senlin.drivers import heat_v1 as heat +# from senlin.drivers import heat_v1 as heat from senlin.profiles import base __type_name__ = 'aws.autoscaling.launchconfig' @@ -59,5 +59,5 @@ class LaunchConfigProfile(base.Profile): return True def do_check(self, id): - #TODO(liuh): add actual checking logic + # TODO(liuh): add actual checking logic return True diff --git a/senlin/profiles/os/heat/resource.py b/senlin/profiles/os/heat/resource.py index 20d7ae8d3..a824ac8df 100644 --- a/senlin/profiles/os/heat/resource.py +++ b/senlin/profiles/os/heat/resource.py @@ -10,7 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. -#from senlin.drivers import heat_v1 as heat +# from senlin.drivers import heat_v1 as heat from senlin.profiles import base __type_name__ = 'os.heat.resource' @@ -40,5 +40,5 @@ class ResourceProfile(base.Profile): return {} def do_check(self, id): - #TODO(liuh): add actual checking logic + # TODO(liuh): add actual checking logic return True diff --git a/senlin/profiles/os/heat/stack.py b/senlin/profiles/os/heat/stack.py index 58cbe8cc2..aa4a58bc7 100644 --- a/senlin/profiles/os/heat/stack.py +++ b/senlin/profiles/os/heat/stack.py @@ -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): diff --git a/senlin/rpc/client.py b/senlin/rpc/client.py index 99f99e9be..22ede3c0d 100644 --- a/senlin/rpc/client.py +++ b/senlin/rpc/client.py @@ -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' diff --git a/senlin/tests/__init__.py b/senlin/tests/__init__.py index 1634fd8f1..fed5dba78 100644 --- a/senlin/tests/__init__.py +++ b/senlin/tests/__init__.py @@ -18,7 +18,7 @@ def fake_translate_msgid(msgid, domain, desired_locale=None): oslo_i18n.enable_lazy() -#To ensure messages don't really get translated while running tests. -#As there are lots of places where matching is expected when comparing -#exception message(translated) with raw message. +# To ensure messages don't really get translated while running tests. +# As there are lots of places where matching is expected when comparing +# exception message(translated) with raw message. oslo_i18n._translate_msgid = fake_translate_msgid diff --git a/senlin/tests/apiv1/shared.py b/senlin/tests/apiv1/shared.py index 21b579ca6..811b21a41 100644 --- a/senlin/tests/apiv1/shared.py +++ b/senlin/tests/apiv1/shared.py @@ -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'): diff --git a/senlin/tests/apiv1/test_routes.py b/senlin/tests/apiv1/test_routes.py index ec3fb65ed..0a1a91b98 100644 --- a/senlin/tests/apiv1/test_routes.py +++ b/senlin/tests/apiv1/test_routes.py @@ -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', { diff --git a/senlin/tests/common/base.py b/senlin/tests/common/base.py index b0ca7057e..be4917e8f 100644 --- a/senlin/tests/common/base.py +++ b/senlin/tests/common/base.py @@ -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(): diff --git a/senlin/tests/common/fakes.py b/senlin/tests/common/fakes.py index 30075524b..a59e9e478 100644 --- a/senlin/tests/common/fakes.py +++ b/senlin/tests/common/fakes.py @@ -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, \ diff --git a/senlin/tests/db/test_action_api.py b/senlin/tests/db/test_action_api.py index 572ab59ea..7a8e2d053 100644 --- a/senlin/tests/db/test_action_api.py +++ b/senlin/tests/db/test_action_api.py @@ -283,7 +283,7 @@ class DBAPIActionTest(base.SenlinTestCase): for spec in specs: action = _create_action(self.ctx, action=shared.sample_action, **spec) - #action.status = db_api.ACTION_INIT + # action.status = db_api.ACTION_INIT id_of[spec['name']] = action.id db_api.action_add_dependency(self.ctx, diff --git a/senlin/tests/engine/test_policies.py b/senlin/tests/engine/test_policies.py index c4ea148a1..f46a94f1e 100644 --- a/senlin/tests/engine/test_policies.py +++ b/senlin/tests/engine/test_policies.py @@ -284,7 +284,7 @@ class PolicyTest(base.SenlinTestCase): p = self.eng.policy_get(self.ctx, pid) self.assertEqual('p-2', p['name']) - # 2. update cooldown + # 2. update cooldown p2 = self.eng.policy_update(self.ctx, pid, cooldown=120) self.assertEqual(pid, p2['id']) self.assertEqual(120, p2['cooldown']) @@ -293,7 +293,7 @@ class PolicyTest(base.SenlinTestCase): p = self.eng.policy_get(self.ctx, pid) self.assertEqual(120, p['cooldown']) - # 3. update level + # 3. update level p2 = self.eng.policy_update(self.ctx, pid, level=50) self.assertEqual(pid, p2['id']) self.assertEqual(50, p2['level']) diff --git a/senlin/tests/test_auth_url.py b/senlin/tests/test_auth_url.py index 5c5012928..1fb33849d 100644 --- a/senlin/tests/test_auth_url.py +++ b/senlin/tests/test_auth_url.py @@ -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) diff --git a/senlin/tests/test_common_policy.py b/senlin/tests/test_common_policy.py index d2d5f50bc..3ba02a0ed 100644 --- a/senlin/tests/test_common_policy.py +++ b/senlin/tests/test_common_policy.py @@ -17,7 +17,7 @@ from oslo_config import cfg from senlin.common import exception from senlin.common import policy from senlin.openstack.common import policy as base_policy -from senlin.tests.common import base +from senlin.tests.common import base from senlin.tests.common import utils policy_path = os.path.dirname(os.path.realpath(__file__)) + "/policy/" diff --git a/senlin/tests/test_common_utils.py b/senlin/tests/test_common_utils.py index d97187d35..3fc47c63d 100644 --- a/senlin/tests/test_common_utils.py +++ b/senlin/tests/test_common_utils.py @@ -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)) diff --git a/senlin/tests/test_serializers.py b/senlin/tests/test_serializers.py index 8f63e377e..f06e32e8e 100644 --- a/senlin/tests/test_serializers.py +++ b/senlin/tests/test_serializers.py @@ -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)) diff --git a/senlin/tests/test_wsgi.py b/senlin/tests/test_wsgi.py index 8d7d3653c..2bf43c9d8 100644 --- a/senlin/tests/test_wsgi.py +++ b/senlin/tests/test_wsgi.py @@ -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) diff --git a/test-requirements.txt b/test-requirements.txt index 3d389e729..d7bd74344 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -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 -oslosphinx>=2.2.0 # Apache-2.0 -oslotest>=1.2.0 # Apache-2.0 +#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 diff --git a/tox.ini b/tox.ini index 1a8063dfe..3245eb60d 100644 --- a/tox.ini +++ b/tox.ini @@ -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}