1*9c5db199SXin Liimport httplib2, os, sys, traceback, cgi 2*9c5db199SXin Li 3*9c5db199SXin Lifrom django.http import HttpResponse, HttpResponsePermanentRedirect 4*9c5db199SXin Lifrom django.http import HttpResponseServerError 5*9c5db199SXin Lifrom django.template import Context, loader 6*9c5db199SXin Lifrom autotest_lib.client.common_lib import utils 7*9c5db199SXin Lifrom autotest_lib.frontend import views_common 8*9c5db199SXin Lifrom autotest_lib.frontend.afe import models, rpc_handler, rpc_interface 9*9c5db199SXin Lifrom autotest_lib.frontend.afe import rpc_utils 10*9c5db199SXin Li 11*9c5db199SXin Lirpc_handler_obj = rpc_handler.RpcHandler((rpc_interface, ), 12*9c5db199SXin Li document_module=rpc_interface) 13*9c5db199SXin Li 14*9c5db199SXin Li 15*9c5db199SXin Lidef handle_rpc(request): 16*9c5db199SXin Li """Handle the RPC request. 17*9c5db199SXin Li 18*9c5db199SXin Li @param request: the RPC request. 19*9c5db199SXin Li """ 20*9c5db199SXin Li return rpc_handler_obj.handle_rpc_request(request) 21*9c5db199SXin Li 22*9c5db199SXin Li 23*9c5db199SXin Lidef rpc_documentation(request): 24*9c5db199SXin Li """Return the rpc documentation. 25*9c5db199SXin Li 26*9c5db199SXin Li @param request: the RPC request. 27*9c5db199SXin Li """ 28*9c5db199SXin Li return rpc_handler_obj.get_rpc_documentation() 29*9c5db199SXin Li 30*9c5db199SXin Li 31*9c5db199SXin Lidef model_documentation(request): 32*9c5db199SXin Li """Get the model documentation. 33*9c5db199SXin Li 34*9c5db199SXin Li @param request: the RPC request. 35*9c5db199SXin Li """ 36*9c5db199SXin Li model_names = ('Label', 'Host', 'Test', 'User', 'AclGroup', 'Job', 37*9c5db199SXin Li 'AtomicGroup') 38*9c5db199SXin Li return views_common.model_documentation(models, model_names) 39*9c5db199SXin Li 40*9c5db199SXin Li 41*9c5db199SXin Lidef redirect_with_extra_data(request, url, **kwargs): 42*9c5db199SXin Li """Redirect according to the extra data. 43*9c5db199SXin Li 44*9c5db199SXin Li @param request: the RPC request. 45*9c5db199SXin Li @param url: the partial redirected url. 46*9c5db199SXin Li @param kwargs: the parameters used in redirection. 47*9c5db199SXin Li """ 48*9c5db199SXin Li kwargs['getdata'] = request.GET.urlencode() 49*9c5db199SXin Li kwargs['server_name'] = request.META['SERVER_NAME'] 50*9c5db199SXin Li return HttpResponsePermanentRedirect(url % kwargs) 51*9c5db199SXin Li 52*9c5db199SXin Li 53*9c5db199SXin LiGWT_SERVER = 'http://localhost:8888/' 54*9c5db199SXin Lidef gwt_forward(request, forward_addr): 55*9c5db199SXin Li """Get the response from forwarding address. 56*9c5db199SXin Li 57*9c5db199SXin Li @param request: the RPC request. 58*9c5db199SXin Li @param forward_addr: the forwarding address. 59*9c5db199SXin Li """ 60*9c5db199SXin Li url = GWT_SERVER + forward_addr 61*9c5db199SXin Li if len(request.POST) == 0: 62*9c5db199SXin Li headers, content = httplib2.Http().request(url, 'GET') 63*9c5db199SXin Li else: 64*9c5db199SXin Li headers, content = httplib2.Http().request(url, 'POST', 65*9c5db199SXin Li body=request.body) 66*9c5db199SXin Li http_response = HttpResponse(content) 67*9c5db199SXin Li for header, value in headers.iteritems(): 68*9c5db199SXin Li if header not in ('connection',): 69*9c5db199SXin Li http_response[header] = value 70*9c5db199SXin Li return http_response 71*9c5db199SXin Li 72*9c5db199SXin Li 73*9c5db199SXin Lidef handler500(request): 74*9c5db199SXin Li """Redirect to error website page. 75*9c5db199SXin Li 76*9c5db199SXin Li @param request: the RPC request. 77*9c5db199SXin Li """ 78*9c5db199SXin Li t = loader.get_template('500.html') 79*9c5db199SXin Li trace = traceback.format_exc() 80*9c5db199SXin Li context = Context({ 81*9c5db199SXin Li 'type': sys.exc_type, 82*9c5db199SXin Li 'value': sys.exc_value, 83*9c5db199SXin Li 'traceback': cgi.escape(trace) 84*9c5db199SXin Li }) 85*9c5db199SXin Li return HttpResponseServerError(t.render(context)) 86*9c5db199SXin Li 87*9c5db199SXin Li 88*9c5db199SXin Lidef handle_file_upload(request): 89*9c5db199SXin Li """Handler for uploading files. 90*9c5db199SXin Li 91*9c5db199SXin Li Saves the files to /tmp and returns the resulting paths on disk. 92*9c5db199SXin Li 93*9c5db199SXin Li @param request: request containing the file data. 94*9c5db199SXin Li 95*9c5db199SXin Li @returns HttpResponse: with the paths of the saved files. 96*9c5db199SXin Li """ 97*9c5db199SXin Li if request.method == 'POST': 98*9c5db199SXin Li TEMPT_DIR = '/tmp/' 99*9c5db199SXin Li file_paths = [] 100*9c5db199SXin Li for file_name, upload_file in request.FILES.iteritems(): 101*9c5db199SXin Li file_path = os.path.join( 102*9c5db199SXin Li TEMPT_DIR, '_'.join([file_name, upload_file.name])) 103*9c5db199SXin Li with open(file_path, 'wb+') as destination: 104*9c5db199SXin Li for chunk in upload_file.chunks(): 105*9c5db199SXin Li destination.write(chunk) 106*9c5db199SXin Li file_paths.append(file_path) 107*9c5db199SXin Li return HttpResponse(rpc_utils.prepare_for_serialization(file_paths)) 108