#
# Copyright (c) 2014, Arista Networks, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# Neither the name of Arista Networks nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARISTA NETWORKS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
# pylint: disable=W0613,C0103,R0201,W0622,W0614
#
import logging
import webob
import webob.dec
import webob.exc
from routes.middleware import RoutesMiddleware
from ztpserver.serializers import dumps
from ztpserver.constants import CONTENT_TYPE_HTML, HTTP_STATUS_OK
log = logging.getLogger(__name__)
[docs]class WSGIController(object):
[docs] def index(self, request, **kwargs):
return webob.exc.HTTPNoContent()
[docs] def create(self, request, **kwargs):
return webob.exc.HTTPNoContent()
[docs] def new(self, request, **kwargs):
return webob.exc.HTTPNoContent()
[docs] def show(self, request, resource, **kwargs):
return webob.exc.HTTPNotFound()
[docs] def update(self, request, resource, **kwargs):
return webob.exc.HTTPNotFound()
[docs] def delete(self, request, resource, **kwargs):
return webob.exc.HTTPNotFound()
[docs] def edit(self, request, resource, **kwargs):
return webob.exc.HTTPNotFound()
[docs] def response(self, **kwargs):
return webob.Response(**kwargs)
@webob.dec.wsgify
def __call__(self, request):
action = request.urlvars['action']
try:
method = getattr(self, action) #pylint: disable=R0921
result = method(request, **request.urlvars)
except Exception as exc:
log.error('Unrecoverable error detected: %s' % exc.message)
raise webob.exc.HTTPInternalServerError()
if result is None:
result = webob.exc.HTTPNoContent()
elif isinstance(result, dict):
# serialize body based on response content type
if 'body' in result:
content_type = result.get('content_type')
result['body'] = dumps(result['body'], content_type,
'general')
result.setdefault('status', HTTP_STATUS_OK)
result.setdefault('content_type', CONTENT_TYPE_HTML)
result = self.response(**result) #pylint: disable=W0142
elif not isinstance(result, webob.Response) and \
not isinstance(result, webob.static.FileApp):
result = webob.exc.HTTPInternalServerError()
return result
[docs]class WSGIRouter(object):
def __init__(self, mapper):
self.map = mapper
self.router = RoutesMiddleware(self.route, self.map)
@webob.dec.wsgify
def __call__(self, request):
return self.router
@webob.dec.wsgify
[docs] def route(self, request):
''' Routes the incoming request to the appropriate controller '''
if 'controller' not in request.urlvars:
log.debug('WSGIRouter: missing controller (request=%s)' %
request)
return webob.exc.HTTPNotFound()
controller = request.urlvars['controller']
return controller()