Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add get_bq_config_path() to _cloud_sdk.py #1358

Merged
merged 6 commits into from
Aug 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 33 additions & 10 deletions google/auth/_cloud_sdk.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@


# The ~/.config subdirectory containing gcloud credentials.
_CONFIG_DIRECTORY = "gcloud"
_CONFIG_DIRECTORY_GCLOUD = "gcloud"
# The ~/.config subdirectory containing gcloud credentials for bq.
_CONFIG_DIRECTORY_BQ = "bq"
# Windows systems store config at %APPDATA%\gcloud
_WINDOWS_CONFIG_ROOT_ENV_VAR = "APPDATA"
# The name of the file in the Cloud SDK config that contains default
Expand All @@ -42,32 +44,53 @@
)


def get_config_path():
"""Returns the absolute path the the Cloud SDK's configuration directory.
def get_config_path(config_directory=_CONFIG_DIRECTORY_GCLOUD):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A cursory look suggests this is only used in gcloud's code base.

Can you own making sure that there is no regression when this library is updated in Piper?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes of course. I was actually making a change in the gcloud code base first and that's when I realized the path definitions happen here. How often do you merge into google3 and when will this change be expected to land?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The merge is manual. I can provide instructions for how you can do it

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. Could you help me reach @sai-sunder-s for a review so I can proceed?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @clundin25, I've received an approval from @sai-sunder-s and am ready for merge instructions now.

"""Returns the absolute path of the given configuration directory.

Args:
config_directory: The absolute path of the configuration directory.

Returns:
str: The Cloud SDK config path.
str: The config path.
"""
# If the path is explicitly set, return that.
try:
return os.environ[environment_vars.CLOUD_SDK_CONFIG_DIR]
except KeyError:
pass

# Non-windows systems store this at ~/.config/gcloud
# Non-windows systems store this at ~/.config/<config_directory>.
if os.name != "nt":
return os.path.join(os.path.expanduser("~"), ".config", _CONFIG_DIRECTORY)
# Windows systems store config at %APPDATA%\gcloud
return os.path.join(os.path.expanduser("~"), ".config", config_directory)
# Windows systems store config at %APPDATA%\<config_directory>.
else:
try:
return os.path.join(
os.environ[_WINDOWS_CONFIG_ROOT_ENV_VAR], _CONFIG_DIRECTORY
os.environ[_WINDOWS_CONFIG_ROOT_ENV_VAR], config_directory
)
except KeyError:
# This should never happen unless someone is really
# messing with things, but we'll cover the case anyway.
drive = os.environ.get("SystemDrive", "C:")
return os.path.join(drive, "\\", _CONFIG_DIRECTORY)
return os.path.join(drive, "\\", config_directory)


def get_gcloud_config_path():
"""Returns the absolute path of Cloud CLI's configuration directory.

Returns:
str: The Cloud CLI config path.
"""
return get_config_path(config_directory=_CONFIG_DIRECTORY_GCLOUD)


def get_bq_config_path():
"""Returns the absolute path of bq's configuration directory.

Returns:
str: The bq config path.
"""
return get_config_path(config_directory=_CONFIG_DIRECTORY_BQ)


def get_application_default_credentials_path():
Expand All @@ -78,7 +101,7 @@ def get_application_default_credentials_path():
Returns:
str: The full path to application default credentials.
"""
config_path = get_config_path()
config_path = get_gcloud_config_path()
return os.path.join(config_path, _CREDENTIALS_FILENAME)


Expand Down
Binary file modified system_tests/secrets.tar.enc
Binary file not shown.
61 changes: 50 additions & 11 deletions tests/test__cloud_sdk.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,40 +112,79 @@ def test_get_application_default_credentials_path(get_config_dir):
)


def test_get_config_path_env_var(monkeypatch):
def test_get_gcloud_config_path_env_var(monkeypatch):
config_path_sentinel = "config_path"
monkeypatch.setenv(environment_vars.CLOUD_SDK_CONFIG_DIR, config_path_sentinel)
config_path = _cloud_sdk.get_config_path()
config_path = _cloud_sdk.get_gcloud_config_path()
assert config_path == config_path_sentinel


@mock.patch("os.path.expanduser")
def test_get_config_path_unix(expanduser):
def test_get_gcloud_config_path_unix(expanduser):
expanduser.side_effect = lambda path: path

config_path = _cloud_sdk.get_config_path()
config_path = _cloud_sdk.get_gcloud_config_path()

assert os.path.split(config_path) == ("~/.config", _cloud_sdk._CONFIG_DIRECTORY)
assert os.path.split(config_path) == (
"~/.config",
_cloud_sdk._CONFIG_DIRECTORY_GCLOUD,
)


@mock.patch("os.name", new="nt")
def test_get_gcloud_config_path_windows(monkeypatch):
appdata = "appdata"
monkeypatch.setenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, appdata)

config_path = _cloud_sdk.get_gcloud_config_path()

assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY_GCLOUD)


@mock.patch("os.name", new="nt")
def test_get_gcloud_config_path_no_appdata(monkeypatch):
monkeypatch.delenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, raising=False)
monkeypatch.setenv("SystemDrive", "G:")

config_path = _cloud_sdk.get_gcloud_config_path()

assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY_GCLOUD)


def test_get_bq_config_path_env_var(monkeypatch):
config_path_sentinel = "config_path"
monkeypatch.setenv(environment_vars.CLOUD_SDK_CONFIG_DIR, config_path_sentinel)
config_path = _cloud_sdk.get_bq_config_path()
assert config_path == config_path_sentinel


@mock.patch("os.path.expanduser")
def test_get_bq_config_path_unix(expanduser):
expanduser.side_effect = lambda path: path

config_path = _cloud_sdk.get_bq_config_path()

assert os.path.split(config_path) == ("~/.config", _cloud_sdk._CONFIG_DIRECTORY_BQ)


@mock.patch("os.name", new="nt")
def test_get_config_path_windows(monkeypatch):
def test_get_bq_config_path_windows(monkeypatch):
appdata = "appdata"
monkeypatch.setenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, appdata)

config_path = _cloud_sdk.get_config_path()
config_path = _cloud_sdk.get_bq_config_path()

assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY)
assert os.path.split(config_path) == (appdata, _cloud_sdk._CONFIG_DIRECTORY_BQ)


@mock.patch("os.name", new="nt")
def test_get_config_path_no_appdata(monkeypatch):
def test_get_bq_config_path_no_appdata(monkeypatch):
monkeypatch.delenv(_cloud_sdk._WINDOWS_CONFIG_ROOT_ENV_VAR, raising=False)
monkeypatch.setenv("SystemDrive", "G:")

config_path = _cloud_sdk.get_config_path()
config_path = _cloud_sdk.get_bq_config_path()

assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY)
assert os.path.split(config_path) == ("G:/\\", _cloud_sdk._CONFIG_DIRECTORY_BQ)


@mock.patch("os.name", new="nt")
Expand Down