Use vpython to execute gsutil in virtualenv

This addresses the issue with BOTO configuration which was breaking
Fuchsia bots when used with hermetic bundles.

Change-Id: Id4b0c4711f17310ea1893f84d2bf06a1cf645ce9
diff --git a/recipe_modules/gsutil/api.py b/recipe_modules/gsutil/api.py
index 01c92bb..c4a73dd 100644
--- a/recipe_modules/gsutil/api.py
+++ b/recipe_modules/gsutil/api.py
@@ -13,20 +13,12 @@
   def __init__(self, *args, **kwargs):
     super(GSUtilApi, self).__init__(*args, **kwargs)
     self._gsutil_tool = None
-    self._boto_config = None
-
-  def set_boto_config(self, path):
-    self._boto_config = path
-
-  @property
-  def default_boto_config(self):
-    return self.m.path.expanduser(self.m.path.join('~', '.boto'))
 
   def __call__(self, *args, **kwargs):
     """Return a step to run arbitrary gsutil command."""
     assert self._gsutil_tool
     name = kwargs.pop('name', 'gsutil ' + args[0])
-
+    infra_step = kwargs.pop('infra_step', True)
     cmd_prefix = []
     # Note that metadata arguments have to be passed before the command.
     metadata = kwargs.pop('metadata', [])
@@ -46,13 +38,9 @@
       '-o',
       'GSUtil:software_update_check_period=0',
     ])
-
-    env = self.m.context.env
-    if self._boto_config:
-      env.setdefault('BOTO_CONFIG', self._boto_config)
-
-    with self.m.context(env=env):
-      return self.m.python(name, self._gsutil_tool, cmd_prefix + list(args), **kwargs)
+    return self.m.python(name, self._gsutil_tool, cmd_prefix + list(args),
+                         venv=self.resource('gsutil.vpython'),
+                         infra_step=infra_step, **kwargs)
 
   @recipe_api.non_step
   def normalize(self, url):
diff --git a/recipe_modules/gsutil/examples/full.expected/basic.json b/recipe_modules/gsutil/examples/full.expected/basic.json
index b924316..fcb04af 100644
--- a/recipe_modules/gsutil/examples/full.expected/basic.json
+++ b/recipe_modules/gsutil/examples/full.expected/basic.json
@@ -31,7 +31,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-h",
@@ -48,9 +50,7 @@
       "[TMP_BASE]/file",
       "gs://example/path/to/file"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil cp",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/example/path/to/file@@@"
@@ -58,7 +58,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-h",
@@ -78,9 +80,7 @@
       "[TMP_BASE]/file",
       "gs://example/path/to/file"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil cp (2)",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/example/path/to/file@@@"
@@ -88,7 +88,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -97,14 +99,14 @@
       "gs://example/some/random/path/**",
       "gs://example/staging"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil cp (3)"
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -113,14 +115,14 @@
       "gs://example/path/to/file",
       "[TMP_BASE]/file"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil download url"
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -129,14 +131,14 @@
       "gs://example/staging/to/file",
       "[TMP_BASE]/erang"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil cp (4)"
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -146,14 +148,14 @@
       "example",
       "path/to/file"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil signurl"
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -161,14 +163,14 @@
       "rm",
       "gs://example/staging/to/file"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil rm"
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -176,14 +178,14 @@
       "ls",
       "gs://example/foo"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil ls"
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -192,9 +194,7 @@
       "gs://example/path/to/file",
       "gs://example/staging/to/file"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil cp (5)",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.copy@https://storage.cloud.google.com/example/staging/to/file@@@"
@@ -202,7 +202,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -210,9 +212,7 @@
       "cat",
       "gs://example/foo"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "gsutil cat"
   },
   {
diff --git a/recipe_modules/gsutil/examples/full.py b/recipe_modules/gsutil/examples/full.py
index 17c48f8..daec5ff 100644
--- a/recipe_modules/gsutil/examples/full.py
+++ b/recipe_modules/gsutil/examples/full.py
@@ -10,7 +10,6 @@
 
 def RunSteps(api):
   api.gsutil.ensure_gsutil()
-  api.gsutil.set_boto_config(api.gsutil.default_boto_config)
 
   local_file = api.path['tmp_base'].join('file')
   bucket = 'example'
diff --git a/recipe_modules/gsutil/resources/gsutil.vpython b/recipe_modules/gsutil/resources/gsutil.vpython
new file mode 100644
index 0000000..680bbed
--- /dev/null
+++ b/recipe_modules/gsutil/resources/gsutil.vpython
@@ -0,0 +1,10 @@
+# vpython VirtualEnv installation package for "gsutil".
+
+wheel <
+  name: "infra/python/wheels/google_compute_engine-py2_py3"
+  version: "version:2.3.7"
+>
+wheel <
+  name: "infra/python/wheels/boto-py2_py3"
+  version: "version:2.47.0"
+>
diff --git a/recipes/fuchsia.expected/arm64_skip_tests.json b/recipes/fuchsia.expected/arm64_skip_tests.json
index 96d771d..fc55376 100644
--- a/recipes/fuchsia.expected/arm64_skip_tests.json
+++ b/recipes/fuchsia.expected/arm64_skip_tests.json
@@ -143,7 +143,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -152,9 +154,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
@@ -361,7 +360,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -370,9 +371,7 @@
       "[TMP_BASE]/fuchsia.tar.gz",
       "gs://fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "upload fuchsia.tar.gz",
     "~followup_annotations": [
       "@@@STEP_LINK@fuchsia.tar.gz@https://storage.cloud.google.com/fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909@@@"
diff --git a/recipes/fuchsia.expected/backtrace.json b/recipes/fuchsia.expected/backtrace.json
index 9058123..9d4baab 100644
--- a/recipes/fuchsia.expected/backtrace.json
+++ b/recipes/fuchsia.expected/backtrace.json
@@ -175,7 +175,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -184,9 +186,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
diff --git a/recipes/fuchsia.expected/boot_module.json b/recipes/fuchsia.expected/boot_module.json
index 6bf9bf7..32bf143 100644
--- a/recipes/fuchsia.expected/boot_module.json
+++ b/recipes/fuchsia.expected/boot_module.json
@@ -175,7 +175,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -184,9 +186,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
@@ -449,7 +448,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -458,9 +459,7 @@
       "[TMP_BASE]/fuchsia.tar.gz",
       "gs://fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "upload fuchsia.tar.gz",
     "~followup_annotations": [
       "@@@STEP_LINK@fuchsia.tar.gz@https://storage.cloud.google.com/fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909@@@"
diff --git a/recipes/fuchsia.expected/default.json b/recipes/fuchsia.expected/default.json
index a648bad..f99d79b 100644
--- a/recipes/fuchsia.expected/default.json
+++ b/recipes/fuchsia.expected/default.json
@@ -143,7 +143,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -152,9 +154,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
@@ -363,7 +362,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -372,9 +373,7 @@
       "[TMP_BASE]/fuchsia.tar.gz",
       "gs://fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "upload fuchsia.tar.gz",
     "~followup_annotations": [
       "@@@STEP_LINK@fuchsia.tar.gz@https://storage.cloud.google.com/fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909@@@"
diff --git a/recipes/fuchsia.expected/failed_tests.json b/recipes/fuchsia.expected/failed_tests.json
index 46c57dc..5b40dc2 100644
--- a/recipes/fuchsia.expected/failed_tests.json
+++ b/recipes/fuchsia.expected/failed_tests.json
@@ -175,7 +175,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -184,9 +186,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
diff --git a/recipes/fuchsia.expected/no_goma.json b/recipes/fuchsia.expected/no_goma.json
index 3864ef7..8a66fe5 100644
--- a/recipes/fuchsia.expected/no_goma.json
+++ b/recipes/fuchsia.expected/no_goma.json
@@ -111,7 +111,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -120,9 +122,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
@@ -230,7 +229,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -239,9 +240,7 @@
       "[TMP_BASE]/fuchsia.tar.gz",
       "gs://fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "upload fuchsia.tar.gz",
     "~followup_annotations": [
       "@@@STEP_LINK@fuchsia.tar.gz@https://storage.cloud.google.com/fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909@@@"
diff --git a/recipes/fuchsia.expected/release.json b/recipes/fuchsia.expected/release.json
index 1a96688..5111229 100644
--- a/recipes/fuchsia.expected/release.json
+++ b/recipes/fuchsia.expected/release.json
@@ -143,7 +143,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -152,9 +154,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
@@ -364,7 +363,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -373,9 +374,7 @@
       "[TMP_BASE]/fuchsia.tar.gz",
       "gs://fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "upload fuchsia.tar.gz",
     "~followup_annotations": [
       "@@@STEP_LINK@fuchsia.tar.gz@https://storage.cloud.google.com/fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909@@@"
diff --git a/recipes/fuchsia.expected/tests.json b/recipes/fuchsia.expected/tests.json
index 860ca04..7c2b250 100644
--- a/recipes/fuchsia.expected/tests.json
+++ b/recipes/fuchsia.expected/tests.json
@@ -175,7 +175,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -184,9 +186,6 @@
       "[TMP_BASE]/jiri.snapshot",
       "gs://fuchsia/jiri/snapshots/8ac5404b688b34f2d34d1c8a648413aca30b7a97"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
     "infra_step": true,
     "name": "upload jiri.snapshot",
     "~followup_annotations": [
@@ -449,7 +448,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -458,9 +459,7 @@
       "[TMP_BASE]/fuchsia.tar.gz",
       "gs://fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "upload fuchsia.tar.gz",
     "~followup_annotations": [
       "@@@STEP_LINK@fuchsia.tar.gz@https://storage.cloud.google.com/fuchsia-archive/cd963da3f17c3acc611a9b9c1b272fcd6ae39909@@@"
diff --git a/recipes/fuchsia.py b/recipes/fuchsia.py
index 2db3042..b9de43a 100644
--- a/recipes/fuchsia.py
+++ b/recipes/fuchsia.py
@@ -231,7 +231,6 @@
 
   api.jiri.ensure_jiri()
   api.gsutil.ensure_gsutil()
-  api.gsutil.set_boto_config(api.gsutil.default_boto_config)
   if use_goma:
     api.goma.ensure_goma()
   if tests:
diff --git a/recipes/go_toolchain.expected/linux_new.json b/recipes/go_toolchain.expected/linux_new.json
index b35993c..fc47d67 100644
--- a/recipes/go_toolchain.expected/linux_new.json
+++ b/recipes/go_toolchain.expected/linux_new.json
@@ -328,7 +328,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -337,6 +339,7 @@
       "[TMP_BASE]/go.cipd",
       "gs://fuchsia/golang/linux-amd64/40-chars-fake-of-the-package-instance_id"
     ],
+    "infra_step": true,
     "name": "gsutil cp",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/fuchsia/golang/linux-amd64/40-chars-fake-of-the-package-instance_id@@@"
diff --git a/recipes/go_toolchain.expected/mac_new.json b/recipes/go_toolchain.expected/mac_new.json
index 9d0544b..867ae14 100644
--- a/recipes/go_toolchain.expected/mac_new.json
+++ b/recipes/go_toolchain.expected/mac_new.json
@@ -328,7 +328,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -337,6 +339,7 @@
       "[TMP_BASE]/go.cipd",
       "gs://fuchsia/golang/mac-amd64/40-chars-fake-of-the-package-instance_id"
     ],
+    "infra_step": true,
     "name": "gsutil cp",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/fuchsia/golang/mac-amd64/40-chars-fake-of-the-package-instance_id@@@"
diff --git a/recipes/jiri.expected/ci_new.json b/recipes/jiri.expected/ci_new.json
index 3b6bffd..8708372 100644
--- a/recipes/jiri.expected/ci_new.json
+++ b/recipes/jiri.expected/ci_new.json
@@ -289,7 +289,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -298,6 +300,7 @@
       "[TMP_BASE]/jiri.cipd",
       "gs://fuchsia/jiri/linux-amd64/40-chars-fake-of-the-package-instance_id"
     ],
+    "infra_step": true,
     "name": "gsutil cp",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/fuchsia/jiri/linux-amd64/40-chars-fake-of-the-package-instance_id@@@"
diff --git a/recipes/rust_toolchain.expected/linux_new.json b/recipes/rust_toolchain.expected/linux_new.json
index 550cded..6f825f6 100644
--- a/recipes/rust_toolchain.expected/linux_new.json
+++ b/recipes/rust_toolchain.expected/linux_new.json
@@ -271,7 +271,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -280,6 +282,7 @@
       "[TMP_BASE]/rust_tmp_1/rust.cipd",
       "gs://fuchsia/rust/linux-amd64/40-chars-fake-of-the-package-instance_id"
     ],
+    "infra_step": true,
     "name": "gsutil cp",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/fuchsia/rust/linux-amd64/40-chars-fake-of-the-package-instance_id@@@"
diff --git a/recipes/rust_toolchain.expected/mac_new.json b/recipes/rust_toolchain.expected/mac_new.json
index f34dc23..72f44c4 100644
--- a/recipes/rust_toolchain.expected/mac_new.json
+++ b/recipes/rust_toolchain.expected/mac_new.json
@@ -271,7 +271,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -280,6 +282,7 @@
       "[TMP_BASE]/rust_tmp_1/rust.cipd",
       "gs://fuchsia/rust/mac-amd64/40-chars-fake-of-the-package-instance_id"
     ],
+    "infra_step": true,
     "name": "gsutil cp",
     "~followup_annotations": [
       "@@@STEP_LINK@gsutil.upload@https://storage.googleapis.com/fuchsia/rust/mac-amd64/40-chars-fake-of-the-package-instance_id@@@"
diff --git a/recipes/web_view.expected/default.json b/recipes/web_view.expected/default.json
index f22420d..da071bb 100644
--- a/recipes/web_view.expected/default.json
+++ b/recipes/web_view.expected/default.json
@@ -300,7 +300,9 @@
   },
   {
     "cmd": [
-      "python",
+      "vpython",
+      "-spec",
+      "RECIPE_MODULE[infra::gsutil]/resources/gsutil.vpython",
       "-u",
       "[START_DIR]/cipd/gsutil/gsutil",
       "-o",
@@ -309,9 +311,7 @@
       "[START_DIR]/out/release-x86-64/x64-shared/libwebkit.so",
       "gs://fuchsia/x86_64/webkit/c22471f4e3f842ae18dd9adec82ed9eb78ed1127/libwebkit.so"
     ],
-    "env": {
-      "BOTO_CONFIG": "[HOME]/.boto"
-    },
+    "infra_step": true,
     "name": "upload libwebkit.so",
     "~followup_annotations": [
       "@@@STEP_LINK@libwebkit.so@https://storage.googleapis.com/fuchsia/x86_64/webkit/c22471f4e3f842ae18dd9adec82ed9eb78ed1127/libwebkit.so@@@"
diff --git a/recipes/web_view.py b/recipes/web_view.py
index 11cfaeb..f172050 100644
--- a/recipes/web_view.py
+++ b/recipes/web_view.py
@@ -42,7 +42,6 @@
              patch_storage, patch_repository_url, manifest, remote, target):
   api.jiri.ensure_jiri()
   api.gsutil.ensure_gsutil()
-  api.gsutil.set_boto_config(api.gsutil.default_boto_config)
   api.goma.ensure_goma()
 
   with api.context(infra_steps=True):