61 lines
1.5 KiB
Python
61 lines
1.5 KiB
Python
#!/usr/bin/env python
|
|
"""Utilities to run gcloud for the BQ CLI."""
|
|
|
|
import logging
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
from typing import List, Optional
|
|
|
|
from typing_extensions import TypeAlias
|
|
|
|
from pyglib import resources
|
|
|
|
if sys.version_info >= (3, 9):
|
|
GcloudPopen: TypeAlias = subprocess.Popen[str]
|
|
else:
|
|
# Before python 3.9 the type `subprocess.Popen[str]` is unsupported.
|
|
GcloudPopen: TypeAlias = subprocess.Popen # pylint: disable=g-bare-generic
|
|
|
|
_gcloud_path = None
|
|
|
|
|
|
def _get_gcloud_path() -> str:
|
|
"""Returns the string to use to call gcloud."""
|
|
global _gcloud_path
|
|
if _gcloud_path:
|
|
logging.info('Found cached gcloud path: %s', _gcloud_path)
|
|
return _gcloud_path
|
|
|
|
if 'nt' == os.name:
|
|
binary = 'gcloud.cmd'
|
|
else:
|
|
binary = 'gcloud'
|
|
|
|
# If a gcloud binary has been bundled with this code then use that version
|
|
# instead of the system installed version.
|
|
try:
|
|
binary = resources.GetResourceFilename(
|
|
'google3/cloud/sdk/gcloud/gcloud.par'
|
|
)
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
logging.info('Found gcloud path: %s', binary)
|
|
_gcloud_path = binary
|
|
return binary
|
|
|
|
|
|
def run_gcloud_command(
|
|
cmd: List[str], stderr: Optional[int] = None
|
|
) -> GcloudPopen:
|
|
"""Runs the given gcloud command and returns the Popen object."""
|
|
gcloud_path = _get_gcloud_path()
|
|
logging.info('Running gcloud command: %s %s', gcloud_path, ' '.join(cmd))
|
|
return subprocess.Popen(
|
|
[gcloud_path] + cmd,
|
|
stdout=subprocess.PIPE,
|
|
stderr=stderr,
|
|
universal_newlines=True,
|
|
)
|