[autotest] add a directAFE class which bypasses rpc calls

This CL adds a directAFE object which inherits from frontend.AFE, but
which replaces the underlying RpcClient.run function (responsible for
turning AFE calls into RPC calls) into a function that just makese
direct calls to rpc_interface and site_rpc_interface, bypassing RPC
process. This is desirable in places like test_that, which use an
in-memory process-local sqlite database to back a local afe.

BUG=chromium:236471
TEST=unit tests

Change-Id: Ib89a28be9ebc6f5c4e6ff93a08721ac63ab8b377
Reviewed-on: https://gerrit.chromium.org/gerrit/50383
Commit-Queue: Aviv Keshet <akeshet@chromium.org>
Reviewed-by: Aviv Keshet <akeshet@chromium.org>
Tested-by: Aviv Keshet <akeshet@chromium.org>
diff --git a/frontend/afe/direct_afe.py b/frontend/afe/direct_afe.py
new file mode 100644
index 0000000..568e7f3
--- /dev/null
+++ b/frontend/afe/direct_afe.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import common
+import autotest_lib.server.frontend as frontend
+from autotest_lib.frontend.afe import site_rpc_interface
+from autotest_lib.frontend.afe import rpc_interface
+
+class directAFE(frontend.AFE):
+    """
+    A wrapper for frontend.AFE which exposes all of the AFE
+    functionality, but makes direct calls to site_rpc_interface and
+    rpc_interface rather than making RPC calls to an RPC server.
+    """
+    def run(self, call, **dargs):
+        func = None
+
+        try:
+            func = rpc_interface.__getattribute__(call)
+        except AttributeError:
+            pass
+
+        try:
+            func = site_rpc_interface.__getattribute__(call)
+        except AttributeError:
+            pass
+
+        if not func:
+            raise AttributeError('No function named %s in either '
+                                 'rpc_interface or site_rpc_interface' % call)
+
+        return func(**dargs)
\ No newline at end of file