You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.7 KiB

import httplib2, os, sys, traceback, cgi
from django.http import HttpResponse, HttpResponsePermanentRedirect
from django.http import HttpResponseServerError
from django.template import Context, loader
from autotest_lib.client.common_lib import utils
from autotest_lib.frontend import views_common
from autotest_lib.frontend.afe import models, rpc_handler, rpc_interface
from autotest_lib.frontend.afe import rpc_utils
moblab_rpc_interface = utils.import_site_module(
__file__, 'autotest_lib.frontend.afe.moblab_rpc_interface',
dummy=object())
# since moblab_rpc_interface is later in the list, its methods will
# override those of rpc_interface
rpc_handler_obj = rpc_handler.RpcHandler((rpc_interface,
moblab_rpc_interface),
document_module=rpc_interface)
def handle_rpc(request):
"""Handle the RPC request.
@param request: the RPC request.
"""
return rpc_handler_obj.handle_rpc_request(request)
def rpc_documentation(request):
"""Return the rpc documentation.
@param request: the RPC request.
"""
return rpc_handler_obj.get_rpc_documentation()
def model_documentation(request):
"""Get the model documentation.
@param request: the RPC request.
"""
model_names = ('Label', 'Host', 'Test', 'User', 'AclGroup', 'Job',
'AtomicGroup')
return views_common.model_documentation(models, model_names)
def redirect_with_extra_data(request, url, **kwargs):
"""Redirect according to the extra data.
@param request: the RPC request.
@param url: the partial redirected url.
@param kwargs: the parameters used in redirection.
"""
kwargs['getdata'] = request.GET.urlencode()
kwargs['server_name'] = request.META['SERVER_NAME']
return HttpResponsePermanentRedirect(url % kwargs)
GWT_SERVER = 'http://localhost:8888/'
def gwt_forward(request, forward_addr):
"""Get the response from forwarding address.
@param request: the RPC request.
@param forward_addr: the forwarding address.
"""
url = GWT_SERVER + forward_addr
if len(request.POST) == 0:
headers, content = httplib2.Http().request(url, 'GET')
else:
headers, content = httplib2.Http().request(url, 'POST',
body=request.body)
http_response = HttpResponse(content)
for header, value in headers.iteritems():
if header not in ('connection',):
http_response[header] = value
return http_response
def handler500(request):
"""Redirect to error website page.
@param request: the RPC request.
"""
t = loader.get_template('500.html')
trace = traceback.format_exc()
context = Context({
'type': sys.exc_type,
'value': sys.exc_value,
'traceback': cgi.escape(trace)
})
return HttpResponseServerError(t.render(context))
def handle_file_upload(request):
"""Handler for uploading files.
Saves the files to /tmp and returns the resulting paths on disk.
@param request: request containing the file data.
@returns HttpResponse: with the paths of the saved files.
"""
if request.method == 'POST':
TEMPT_DIR = '/tmp/'
file_paths = []
for file_name, upload_file in request.FILES.iteritems():
file_path = os.path.join(
TEMPT_DIR, '_'.join([file_name, upload_file.name]))
with open(file_path, 'wb+') as destination:
for chunk in upload_file.chunks():
destination.write(chunk)
file_paths.append(file_path)
return HttpResponse(rpc_utils.prepare_for_serialization(file_paths))