Add support for COS toolchain

- Add support for COS own toolchain by checking which of the cos-sdk and
  chromiumos-sdk path has a file refered to by the toolchain_path
  content.

- Switch to using gs:// URLs for SDK download for consistency instead of
  using https:// for certain cases

Change-Id: I74ac4338b9182aac387315258436d55d4daac171
Reviewed-on: https://cos-review.googlesource.com/c/cos/tools/+/34300
Tested-by: Oleksandr Tymoshenko <ovt@google.com>
Reviewed-by: Robert Kolchmeyer <rkolchmeyer@google.com>
Cloud-Build: GCB Service account <228075978874@cloudbuild.gserviceaccount.com>
diff --git a/src/cmd/cos_kernel_devenv/devenv.sh b/src/cmd/cos_kernel_devenv/devenv.sh
index 407f409..8b4b953 100755
--- a/src/cmd/cos_kernel_devenv/devenv.sh
+++ b/src/cmd/cos_kernel_devenv/devenv.sh
@@ -8,7 +8,6 @@
 RETRY_COUNT=${RETRY_COUNT:-5}
 
 readonly COS_CI_DOWNLOAD_GCS="gs://cos-infra-prod-artifacts-official"
-readonly CHROMIUMOS_SDK_GCS="https://storage.googleapis.com/chromiumos-sdk"
 readonly TOOLCHAIN_URL_FILENAME="toolchain_path"
 readonly KERNEL_HEADERS="kernel-headers.tgz"
 readonly KERNEL_HEADERS_DIR="kernel-headers"
@@ -36,7 +35,10 @@
 MODE=""
 
 CROS_TC_VERSION="2021.06.26.094653"
-CROS_TC_DOWNLOAD_GCS="https://storage.googleapis.com/chromiumos-sdk/"
+# Chromium OS toolchain bucket
+CROS_TC_DOWNLOAD_GCS="gs://chromiumos-sdk/"
+# COS toolchain bucket
+COS_TC_DOWNLOAD_GCS="gs://cos-sdk/"
 
 # Can be overridden by the command-line argument
 TOOLCHAIN_ARCH="x86_64"
@@ -81,23 +83,23 @@
 	# Example output: projects/438692578867/zones/us-west2-a
 	# If not running on GCE, use "cos-tools" by default.
 	metadata_zone="$(curl -s -H Metadata-Flavor:Google http://metadata/computeMetadata/v1/instance/zone)" || {
-		readonly COS_DOWNLOAD_GCS="https://storage.googleapis.com/cos-tools"
+		readonly COS_DOWNLOAD_GCS="gs://cos-tools"
 		return
 	}
 	zone="$( echo $metadata_zone | rev | cut -d '/' -f 1 | rev )"
 	prefix="$( echo $zone | cut -d '-' -f 1 )"
 	case $prefix in
 		"us" | "northamerica" | "southamerica")
-			readonly COS_DOWNLOAD_GCS="https://storage.googleapis.com/cos-tools"
+			readonly COS_DOWNLOAD_GCS="gs://cos-tools"
 			;;
 		"europe")
-			readonly COS_DOWNLOAD_GCS="https://storage.googleapis.com/cos-tools-eu"
+			readonly COS_DOWNLOAD_GCS="gs://cos-tools-eu"
 			;;
 		"asia" | "australia")
-			readonly COS_DOWNLOAD_GCS="https://storage.googleapis.com/cos-tools-asia"
+			readonly COS_DOWNLOAD_GCS="gs://cos-tools-asia"
 			;;
 		*)
-			readonly COS_DOWNLOAD_GCS="https://storage.googleapis.com/cos-tools"
+			readonly COS_DOWNLOAD_GCS="gs://cos-tools"
 			;;
 	esac
 }
@@ -138,15 +140,37 @@
   info "Download finished"
 }
 
+# Get the toolchain description in the form of $toolchain-$version
+# For CrOS toolchain it's just a basename without extension but for
+# COS toolchain version needs to be extarcted from the GCS bucket path
+get_toolchain_pkg_name() {
+  local -r download_url=$1
+  case "${download_url}" in
+    *//cos-sdk/*)
+      local -r toolchain="$(basename -s .tar.xz "${download_url}")"
+      local -r path="$(echo "${download_url}" | sed 's@\w\+://cos-sdk/@@')"
+      local -r version="$(echo "${path}" | awk -F / '{print $1 "-" $2}')"
+      echo "${toolchain}-${version}"
+      ;;
+    *//chromiumos-sdk/*)
+      echo "$(basename -s .tar.xz "${download_url}")"
+      ;;
+    *)
+      error "Unknown toolchain source: ${download_url}"
+      exit ${RETCODE_ERROR}
+      ;;
+  esac
+}
+
 install_cross_toolchain_pkg() {
   local -r download_url=$1
   local -r tmpdownload="$(mktemp -d)"
   local -r archive_name="$(basename "${download_url}")"
-  local -r pkg_name="${archive_name%%.tar.xz}"
+  local -r pkg_name="$(get_toolchain_pkg_name "${download_url}")"
   local -r toolchain_dir="/build/toolchains/${pkg_name}"
   if [[ ! -d "${toolchain_dir}" ]]; then
-    info "toolchains/Downloading prebuilt toolchain from ${download_url}"
-    download_from_url "${download_url}" "${tmpdownload}/${archive_name}"
+    info "Downloading prebuilt toolchain from ${download_url}"
+    download_from_gcs "${download_url}" "${tmpdownload}/${archive_name}"
     # Don't unpack Rust toolchain elements because they are not needed and they
     # use a lot of disk space.
     mkdir -p "${toolchain_dir}"
@@ -175,7 +199,7 @@
   info "Obtaining toolchain_env file from ${tc_env_file_path}"
 
   # Download toolchain_env if present
-  if ! download_from_url "${tc_env_file_path}" "${BUILD_DIR}/${TOOLCHAIN_ENV_FILENAME}"; then
+  if ! download_from_gcs "${tc_env_file_path}" "${BUILD_DIR}/${TOOLCHAIN_ENV_FILENAME}"; then
     error "Failed to download toolchain file"
     error "Make sure build id '$RELEASE_ID' is valid"
     return ${RETCODE_ERROR}
@@ -184,7 +208,7 @@
   # Download .gcs file with the original location of the toolchain
   # we need the version to put it in cachable location
   local -r tc_gcs_download_url="${COS_DOWNLOAD_GCS}/${RELEASE_ID}/${TOOLCHAIN_ARCHIVE_GCS}"
-  if ! download_from_url "${tc_gcs_download_url}" "${BUILD_DIR}/${TOOLCHAIN_ARCHIVE_GCS}"; then
+  if ! download_from_gcs "${tc_gcs_download_url}" "${BUILD_DIR}/${TOOLCHAIN_ARCHIVE_GCS}"; then
     error "Failed to download toolchain .gcs file"
     error "Make sure build id '$RELEASE_ID' is valid"
     return ${RETCODE_ERROR}
@@ -192,7 +216,7 @@
 
   local -r bucket=$(cat "${BUILD_DIR}/${TOOLCHAIN_ARCHIVE_GCS}" | grep ^bucket: | cut -d ' ' -f 2)
   local -r path=$(cat "${BUILD_DIR}/${TOOLCHAIN_ARCHIVE_GCS}" | grep ^path: | cut -d ' ' -f 2)
-  local -r tc_download_url="https://storage.googleapis.com/$bucket/$path"
+  local -r tc_download_url="gs://$bucket/$path"
 
   # Install toolchain pkg
   install_cross_toolchain_pkg "${tc_download_url}"
@@ -203,7 +227,7 @@
   local -r kernel_headers_file_path="${COS_DOWNLOAD_GCS}/${RELEASE_ID}/${KERNEL_HEADERS}"
   info "Obtaining kernel headers file from ${kernel_headers_file_path}"
 
-  if ! download_from_url "${kernel_headers_file_path}" "${BUILD_DIR}/${KERNEL_HEADERS}"; then
+  if ! download_from_gcs "${kernel_headers_file_path}" "${BUILD_DIR}/${KERNEL_HEADERS}"; then
         return ${RETCODE_ERROR}
   fi
   mkdir -p "${BUILD_DIR}/${KERNEL_HEADERS_DIR}"
@@ -236,11 +260,15 @@
         return ${RETCODE_ERROR}
   fi
 
-  local -r tc_download_url="${CROS_TC_DOWNLOAD_GCS}$(cat ${BUILD_DIR}/${TOOLCHAIN_URL_FILENAME})"
-  if [[ -z "$tc_download_url" ]]; then
-    error "Failed to download toolchain URL file"
-    error "Make sure build id '$RELEASE_ID' is valid"
-    return ${RETCODE_ERROR}
+  local -r tc_path="$(cat ${BUILD_DIR}/${TOOLCHAIN_URL_FILENAME})"
+  local tc_download_url="${COS_TC_DOWNLOAD_GCS}${tc_path}"
+  if ! gsutil -q stat "${tc_download_url}"; then
+    tc_download_url="${CROS_TC_DOWNLOAD_GCS}${tc_path}"
+  fi
+
+  if ! gsutil -q stat "${tc_download_url}"; then
+        error "Toolchain path '${tc_path}' does not exist in either COS or CrOS GCS buckets"
+        return ${RETCODE_ERROR}
   fi
 
   # Install toolchain pkg