[autotest] Use RetryingAFE for RPCs to shards

RPC call can fail by timeout time to time.
If a RPC sent to a shard from a master fails, DB inconsistency can happen.
Let's use RetryingAFE when sending RPCs to shards.

BUG=chromium:496452
TEST=puppylab. Try to add/remove labels for a sharded host.
It uses RPCs that calls RetryingAFE.
Unit Tests.
frontend.afe.rpc_interface_unittest
frontend.afe.site_rpc_interface_unittest
DEPLOY=apache

Change-Id: I23853c8c0f76d31bb10493759cafdbdc6c003b3f
Reviewed-on: https://chromium-review.googlesource.com/276248
Reviewed-by: Mungyung Ryu <mkryu@google.com>
Tested-by: Mungyung Ryu <mkryu@google.com>
Commit-Queue: Mungyung Ryu <mkryu@google.com>
diff --git a/frontend/afe/rpc_utils.py b/frontend/afe/rpc_utils.py
index 569fc42..d60bd0f 100644
--- a/frontend/afe/rpc_utils.py
+++ b/frontend/afe/rpc_utils.py
@@ -17,9 +17,9 @@
 from autotest_lib.client.common_lib import global_config, priorities
 from autotest_lib.client.common_lib import time_utils
 from autotest_lib.client.common_lib.cros.graphite import autotest_stats
-from autotest_lib.server.cros import provision
-from autotest_lib.server import frontend
 from autotest_lib.server import utils as server_utils
+from autotest_lib.server.cros import provision
+from autotest_lib.server.cros.dynamic_suite import frontend_wrappers
 
 NULL_DATETIME = datetime.datetime.max
 NULL_DATE = datetime.date.max
@@ -1235,7 +1235,7 @@
     @param **kwargs: Keyword arguments to pass in the rpcs.
     """
     for shard_hostname in shard_hostnames:
-        afe = frontend.AFE(server=shard_hostname)
+        afe = frontend_wrappers.RetryingAFE(server=shard_hostname)
         afe.run(rpc_call, **kwargs)
 
 
@@ -1270,7 +1270,8 @@
     @wraps(func)
     def replacement(**kwargs):
         if server_utils.is_shard():
-            master_afe = frontend.AFE(server=get_global_afe_hostname())
-            return master_afe.run(func.func_name, **kwargs)
+            afe = frontend_wrappers.RetryingAFE(
+                    server=get_global_afe_hostname())
+            return afe.run(func.func_name, **kwargs)
         return func(**kwargs)
     return replacement