Autotest: Move moblab-related RPC to moblab_rpc_interface.py.

This CL moves all RPCs that can only be run on moblab to moblab_rpc_interface.
Also move related unittests to moblab_rpc_interface_unittest.

BUG=chromium:641549
TEST=cros flash to a local moblab, upload boto key, then run a suite on it.

Change-Id: I8246282a4c7250350dd9a4e9043eaeba293ccb34
Reviewed-on: https://chromium-review.googlesource.com/377418
Commit-Ready: Xixuan Wu <xixuan@chromium.org>
Tested-by: Xixuan Wu <xixuan@chromium.org>
Reviewed-by: Fang Deng <fdeng@chromium.org>
Reviewed-by: Dan Shi <dshi@google.com>
diff --git a/frontend/afe/views.py b/frontend/afe/views.py
index 44feef0..5c59aad 100644
--- a/frontend/afe/views.py
+++ b/frontend/afe/views.py
@@ -12,27 +12,50 @@
         __file__, 'autotest_lib.frontend.afe.site_rpc_interface',
         dummy=object())
 
+moblab_rpc_interface = utils.import_site_module(
+        __file__, 'autotest_lib.frontend.afe.moblab_rpc_interface',
+        dummy=object())
+
 # since site_rpc_interface is later in the list, its methods will override those
 # of rpc_interface
-rpc_handler_obj = rpc_handler.RpcHandler((rpc_interface, site_rpc_interface),
+rpc_handler_obj = rpc_handler.RpcHandler((rpc_interface, site_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)
@@ -40,6 +63,11 @@
 
 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')
@@ -54,6 +82,10 @@
 
 
 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({