493fcc5f0f
When duplicate workbook or workflow is created, html respose is sent because content type of result is 'plain/text'. Code has been change to send 'application/json' content type in case of exception is araise. Change-Id: Icef1f8c5c615e21bb9da5a3d3bef9dacd308d242 Closes-Bug: #1501172
95 lines
3.0 KiB
Python
95 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright 2014 - Mirantis, Inc.
|
|
#
|
|
# 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 functools
|
|
import json
|
|
|
|
import pecan
|
|
import six
|
|
from webob import Response
|
|
from wsme import exc
|
|
|
|
from mistral import exceptions as ex
|
|
|
|
|
|
def wrap_wsme_controller_exception(func):
|
|
"""This decorator wraps controllers method to manage wsme exceptions:
|
|
In case of expected error it aborts the request with specific status code.
|
|
"""
|
|
@functools.wraps(func)
|
|
def wrapped(*args, **kwargs):
|
|
try:
|
|
return func(*args, **kwargs)
|
|
except ex.MistralException as excp:
|
|
pecan.response.translatable_error = excp
|
|
raise exc.ClientSideError(msg=six.text_type(excp),
|
|
status_code=excp.http_code)
|
|
return wrapped
|
|
|
|
|
|
def wrap_pecan_controller_exception(func):
|
|
"""This decorator wraps controllers method to manage pecan exceptions:
|
|
In case of expected error it aborts the request with specific status code.
|
|
"""
|
|
@functools.wraps(func)
|
|
def wrapped(*args, **kwargs):
|
|
try:
|
|
return func(*args, **kwargs)
|
|
except ex.MistralException as excp:
|
|
return Response(
|
|
status=excp.http_code,
|
|
content_type='application/json',
|
|
body=json.dumps(dict(
|
|
faultstring=six.text_type(excp))))
|
|
|
|
return wrapped
|
|
|
|
|
|
def validate_query_params(limit, sort_keys, sort_dirs):
|
|
if limit is not None and limit <= 0:
|
|
raise exc.ClientSideError("Limit must be positive.")
|
|
|
|
if len(sort_keys) < len(sort_dirs):
|
|
raise exc.ClientSideError("Length of sort_keys must be equal or "
|
|
"greater than sort_dirs.")
|
|
|
|
if len(sort_keys) > len(sort_dirs):
|
|
sort_dirs.extend(['asc'] * (len(sort_keys) - len(sort_dirs)))
|
|
|
|
for sort_dir in sort_dirs:
|
|
if sort_dir not in ['asc', 'desc']:
|
|
raise exc.ClientSideError("Unknown sort direction, must be 'desc' "
|
|
"or 'asc'.")
|
|
|
|
|
|
def validate_fields(fields, object_fields):
|
|
"""Check for requested non-existent fields.
|
|
|
|
Check if the user requested non-existent fields.
|
|
|
|
:param fields: A list of fields requested by the user.
|
|
:param object_fields: A list of fields supported by the object.
|
|
"""
|
|
if not fields:
|
|
return
|
|
|
|
invalid_fields = set(fields) - set(object_fields)
|
|
|
|
if invalid_fields:
|
|
raise exc.ClientSideError(
|
|
'Field(s) %s are invalid.' % ', '.join(invalid_fields)
|
|
)
|