Skip to content

Commit 7ddafa2

Browse files
TheKevJamesw-miller
andcommitted
feat(clients): allow non-dev API endpoint roots (talkiq#811)
Specifying an API endpoint root to a client used to imply that the endpoint in use was for dev, which would disable TLS and token bearer authorisation. This is not always a valid assumption, for example when manually specifying a locational endpoint for Google PubSub to target a specific region, as such endpoints are for production and should therefore use TLS and authorisation. Fix this by allowing manual configuration of the `api_is_dev` setting when using a non-dev root, whilst maintaining the old behaviour by default for backwards compatibility. Co-Authored-By: Will Miller <will.miller@pexip.com>
1 parent a1faebd commit 7ddafa2

8 files changed

Lines changed: 74 additions & 35 deletions

File tree

auth/gcloud/aio/auth/token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def get_service_data(
9494
precedence order of various approaches MUST be maintained. It was last
9595
updated to match the following commit:
9696
97-
https://github.com/googleapis/google-auth-library-python/blob/6c1297c4d69ba40a8b9392775c17411253fcd73b/google/auth/_default.py#L504
97+
https://github.com/googleapis/google-auth-library-python/blob/v2.48.0/google/auth/_default.py#L597
9898
"""
9999
# pylint: disable=too-complex
100100
# _get_explicit_environ_credentials()

bigquery/gcloud/aio/bigquery/bigquery.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
log = logging.getLogger(__name__)
2626

2727

28-
def init_api_root(api_root: str | None) -> tuple[bool, str]:
28+
def init_api_root(
29+
api_root: str | None, api_is_dev: bool | None,
30+
) -> tuple[bool, str]:
2931
if api_root:
30-
return True, api_root
32+
return api_is_dev is None or api_is_dev, api_root
3133

3234
host = os.environ.get('BIGQUERY_EMULATOR_HOST')
3335
if host:
@@ -66,8 +68,9 @@ def __init__(
6668
service_file: str | IO[AnyStr] | None = None,
6769
session: Session | None = None, token: Token | None = None,
6870
api_root: str | None = None,
71+
api_is_dev: bool | None = None
6972
) -> None:
70-
self._api_is_dev, self._api_root = init_api_root(api_root)
73+
self._api_is_dev, self._api_root = init_api_root(api_root, api_is_dev)
7174
self.session = AioSession(session)
7275
self.token = token or Token(
7376
service_file=service_file, scopes=SCOPES,

datastore/gcloud/aio/datastore/datastore.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@
4141
LookUpResult = dict[str, str | list[EntityResult | Key]]
4242

4343

44-
def init_api_root(api_root: str | None) -> tuple[bool, str]:
44+
def init_api_root(
45+
api_root: str | None, api_is_dev: bool | None,
46+
) -> tuple[bool, str]:
4547
if api_root:
46-
return True, api_root
48+
return api_is_dev is None or api_is_dev, api_root
4749

4850
host = os.environ.get('DATASTORE_EMULATOR_HOST')
4951
if host:
@@ -68,10 +70,13 @@ class Datastore:
6870
def __init__(
6971
self, project: str | None = None,
7072
service_file: str | IO[AnyStr] | None = None,
71-
namespace: str = '', session: Session | None = None,
72-
token: Token | None = None, api_root: str | None = None,
73+
namespace: str = '',
74+
session: Session | None = None,
75+
token: Token | None = None,
76+
api_root: str | None = None,
77+
api_is_dev: bool | None = None,
7378
) -> None:
74-
self._api_is_dev, self._api_root = init_api_root(api_root)
79+
self._api_is_dev, self._api_root = init_api_root(api_root, api_is_dev)
7580
self.namespace = namespace
7681
self.session = AioSession(session)
7782
self.token = token or Token(

kms/gcloud/aio/kms/kms.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323
]
2424

2525

26-
def init_api_root(api_root: str | None) -> tuple[bool, str]:
26+
def init_api_root(
27+
api_root: str | None, api_is_dev: bool | None,
28+
) -> tuple[bool, str]:
2729
if api_root:
28-
return True, api_root
30+
return api_is_dev is None or api_is_dev, api_root
2931

3032
host = os.environ.get('KMS_EMULATOR_HOST')
3133
if host:
@@ -39,12 +41,18 @@ class KMS:
3941
_api_is_dev: bool
4042

4143
def __init__(
42-
self, keyproject: str, keyring: str, keyname: str,
44+
self,
45+
keyproject: str,
46+
keyring: str,
47+
keyname: str,
4348
service_file: str | IO[AnyStr] | None = None,
44-
location: str = 'global', session: Session | None = None,
45-
token: Token | None = None, api_root: str | None = None,
49+
location: str = 'global',
50+
session: Session | None = None,
51+
token: Token | None = None,
52+
api_root: str | None = None,
53+
api_is_dev: bool | None = None,
4654
) -> None:
47-
self._api_is_dev, self._api_root = init_api_root(api_root)
55+
self._api_is_dev, self._api_root = init_api_root(api_root, api_is_dev)
4856
self._api_root = (
4957
f'{self._api_root}/projects/{keyproject}/locations/{location}/'
5058
f'keyRings/{keyring}/cryptoKeys/{keyname}'

pubsub/gcloud/aio/pubsub/publisher_client.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
log = logging.getLogger(__name__)
2626

2727

28-
def init_api_root(api_root: str | None) -> tuple[bool, str]:
28+
def init_api_root(
29+
api_root: str | None, api_is_dev: bool | None,
30+
) -> tuple[bool, str]:
2931
if api_root:
30-
return True, api_root
32+
return api_is_dev is None or api_is_dev, api_root
3133

3234
host = os.environ.get('PUBSUB_EMULATOR_HOST')
3335
if host:
@@ -42,11 +44,14 @@ class PublisherClient:
4244

4345
# TODO: add project override
4446
def __init__(
45-
self, *, service_file: str | IO[AnyStr] | None = None,
46-
session: Session | None = None, token: Token | None = None,
47+
self, *,
48+
service_file: str | IO[AnyStr] | None = None,
49+
session: Session | None = None,
50+
token: Token | None = None,
4751
api_root: str | None = None,
52+
api_is_dev: bool | None = None,
4853
) -> None:
49-
self._api_is_dev, self._api_root = init_api_root(api_root)
54+
self._api_is_dev, self._api_root = init_api_root(api_root, api_is_dev)
5055

5156
self.session = AioSession(session, verify_ssl=not self._api_is_dev)
5257
self.token = token or Token(

pubsub/gcloud/aio/pubsub/subscriber_client.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
]
2222

2323

24-
def init_api_root(api_root: str | None) -> tuple[bool, str]:
24+
def init_api_root(
25+
api_root: str | None, api_is_dev: bool | None,
26+
) -> tuple[bool, str]:
2527
if api_root:
26-
return True, api_root
28+
return api_is_dev is None or api_is_dev, api_root
2729

2830
host = os.environ.get('PUBSUB_EMULATOR_HOST')
2931
if host:
@@ -37,11 +39,15 @@ class SubscriberClient:
3739
_api_is_dev: bool
3840

3941
def __init__(
40-
self, *, service_file: str | IO[AnyStr] | None = None,
41-
token: Token | None = None, session: Session | None = None,
42+
self,
43+
*,
44+
service_file: str | IO[AnyStr] | None = None,
45+
token: Token | None = None,
46+
session: Session | None = None,
4247
api_root: str | None = None,
48+
api_is_dev: bool | None = None,
4349
) -> None:
44-
self._api_is_dev, self._api_root = init_api_root(api_root)
50+
self._api_is_dev, self._api_root = init_api_root(api_root, api_is_dev)
4551

4652
self.session = AioSession(session, verify_ssl=not self._api_is_dev)
4753
self.token = token or Token(

storage/gcloud/aio/storage/storage.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,11 @@
4242
log = logging.getLogger(__name__)
4343

4444

45-
def init_api_root(api_root: str | None) -> tuple[bool, str]:
45+
def init_api_root(
46+
api_root: str | None, api_is_dev: bool | None,
47+
) -> tuple[bool, str]:
4648
if api_root:
47-
return True, api_root
49+
return api_is_dev is None or api_is_dev, api_root
4850

4951
host = os.environ.get('STORAGE_EMULATOR_HOST')
5052
if host:
@@ -152,11 +154,14 @@ class Storage:
152154
_api_root_write: str
153155

154156
def __init__(
155-
self, *, service_file: str | IO[AnyStr] | None = None,
156-
token: Token | None = None, session: Session | None = None,
157+
self, *,
158+
service_file: str | IO[AnyStr] | None = None,
159+
token: Token | None = None,
160+
session: Session | None = None,
157161
api_root: str | None = None,
162+
api_is_dev: bool | None = None,
158163
) -> None:
159-
self._api_is_dev, self._api_root = init_api_root(api_root)
164+
self._api_is_dev, self._api_root = init_api_root(api_root, api_is_dev)
160165
self._api_root_read = f'{self._api_root}/storage/v1/b'
161166
self._api_root_write = f'{self._api_root}/upload/storage/v1/b'
162167

taskqueue/gcloud/aio/taskqueue/queue.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
log = logging.getLogger(__name__)
2626

2727

28-
def init_api_root(api_root: str | None) -> tuple[bool, str]:
28+
def init_api_root(
29+
api_root: str | None, api_is_dev: bool | None,
30+
) -> tuple[bool, str]:
2931
if api_root:
30-
return True, api_root
32+
return api_is_dev is None or api_is_dev, api_root
3133

3234
host = os.environ.get('CLOUDTASKS_EMULATOR_HOST')
3335
if host:
@@ -42,12 +44,17 @@ class PushQueue:
4244
_queue_path: str
4345

4446
def __init__(
45-
self, project: str, taskqueue: str, location: str = 'us-central1',
47+
self,
48+
project: str,
49+
taskqueue: str,
50+
location: str = 'us-central1',
4651
service_file: str | IO[AnyStr] | None = None,
47-
session: Session | None = None, token: Token | None = None,
52+
session: Session | None = None,
53+
token: Token | None = None,
4854
api_root: str | None = None,
55+
api_is_dev: bool | None = None
4956
) -> None:
50-
self._api_is_dev, self._api_root = init_api_root(api_root)
57+
self._api_is_dev, self._api_root = init_api_root(api_root, api_is_dev)
5158
self._queue_path = (
5259
f'projects/{project}/locations/{location}/queues/{taskqueue}'
5360
)

0 commit comments

Comments
 (0)