lib/cipd: Add default install destination.

Add a default install destination to reduce boilerplate and
magic value references to the same directory around usages of
InstallPackage.

BUG=b:223433932
TEST=run_tests, CQ

Change-Id: I45e5a13b0e35ddf6f1dffb30290cb4382325314a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/3662302
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Alex Klein <saklein@chromium.org>
Tested-by: Alex Klein <saklein@chromium.org>
diff --git a/api/compile_build_api_proto.py b/api/compile_build_api_proto.py
index d9da070..43b306c 100644
--- a/api/compile_build_api_proto.py
+++ b/api/compile_build_api_proto.py
@@ -12,7 +12,7 @@
 import os
 from pathlib import Path
 import tempfile
-from typing import Iterable, Union
+from typing import Iterable, Optional, Union
 
 from chromite.lib import cipd
 from chromite.lib import commandline
@@ -20,7 +20,6 @@
 from chromite.lib import cros_build_lib
 from chromite.lib import git
 from chromite.lib import osutils
-from chromite.lib import path_util
 
 
 # Chromite's protobuf library version (third_party/google/protobuf).
@@ -28,8 +27,6 @@
 
 _CIPD_PACKAGE = 'infra/tools/protoc/linux-amd64'
 _CIPD_PACKAGE_VERSION = f'protobuf_version:v{PROTOC_VERSION}'
-_CIPD_DESINATION = (
-    Path(path_util.GetCacheDir()).absolute() / 'cipd' / 'packages')
 
 
 class Error(Exception):
@@ -52,6 +49,14 @@
   # chromite/third_party/google/protobuf.
   CHROMITE = enum.auto()
 
+  def get_protoc_command(self, cipd_root: Optional[Path] = None) -> Path:
+    """Get protoc command path."""
+    assert self is ProtocVersion.SDK or cipd_root
+    if self is ProtocVersion.SDK:
+      return Path('protoc')
+    elif cipd_root:
+      return cipd_root / 'protoc'
+
 
 @enum.unique
 class SubdirectorySet(enum.Enum):
@@ -90,28 +95,20 @@
     return os.path.join(constants.CHROMITE_DIR, 'api', 'gen')
 
 
-def _get_protoc_command(protoc_version: ProtocVersion, cipd_root: Path = None):
-  """Get the protoc command for the target protoc."""
-  if protoc_version is ProtocVersion.SDK:
-    return 'protoc'
-  elif cipd_root:
-    return str(cipd_root / 'protoc')
-
-
 def _get_proto_dir(_protoc_version):
   """Get the proto directory for the target protoc."""
   return os.path.join(constants.CHROMITE_DIR, 'infra', 'proto')
 
 
-def InstallProtoc(protoc_version: ProtocVersion) -> str:
+def InstallProtoc(protoc_version: ProtocVersion) -> Path:
   """Install protoc from CIPD."""
   if protoc_version is not ProtocVersion.CHROMITE:
     cipd_root = None
   else:
     cipd_root = Path(
         cipd.InstallPackage(cipd.GetCIPDFromCache(), _CIPD_PACKAGE,
-                            _CIPD_PACKAGE_VERSION, _CIPD_DESINATION))
-  return _get_protoc_command(protoc_version, cipd_root)
+                            _CIPD_PACKAGE_VERSION))
+  return protoc_version.get_protoc_command(cipd_root)
 
 
 def _CleanTargetDirectory(directory: str):
@@ -140,7 +137,7 @@
 
 
 def _GenerateFiles(source: str, output: str, protoc_version: ProtocVersion,
-                   dir_subset: SubdirectorySet, protoc_bin_path: str):
+                   dir_subset: SubdirectorySet, protoc_bin_path: Path):
   """Generate the proto files from the |source| tree into |output|.
 
   Args: