feat: add client_encryped_cert_source to ClientOptions (#31)
diff --git a/google/api_core/client_options.py b/google/api_core/client_options.py
index 7cb49c6..b6d9384 100644
--- a/google/api_core/client_options.py
+++ b/google/api_core/client_options.py
@@ -56,12 +56,31 @@
api_endpoint (str): The desired API endpoint, e.g., compute.googleapis.com
client_cert_source (Callable[[], (bytes, bytes)]): An optional callback
which returns client certificate bytes and private key bytes both in
- PEM format.
+ PEM format. ``client_cert_source`` and ``client_encrypted_cert_source``
+ are mutually exclusive.
+ client_encrypted_cert_source (Callable[[], (str, str, bytes)]): An optional
+ callback which returns client certificate file path, encrypted private
+ key file path, and the passphrase bytes.``client_cert_source`` and
+ ``client_encrypted_cert_source`` are mutually exclusive.
+
+ Raises:
+ ValueError: If both ``client_cert_source`` and ``client_encrypted_cert_source``
+ are provided.
"""
- def __init__(self, api_endpoint=None, client_cert_source=None):
+ def __init__(
+ self,
+ api_endpoint=None,
+ client_cert_source=None,
+ client_encrypted_cert_source=None,
+ ):
+ if client_cert_source and client_encrypted_cert_source:
+ raise ValueError(
+ "client_cert_source and client_encrypted_cert_source are mutually exclusive"
+ )
self.api_endpoint = api_endpoint
self.client_cert_source = client_cert_source
+ self.client_encrypted_cert_source = client_encrypted_cert_source
def __repr__(self):
return "ClientOptions: " + repr(self.__dict__)
diff --git a/tests/unit/test_client_options.py b/tests/unit/test_client_options.py
index 7f17544..67c4f6b 100644
--- a/tests/unit/test_client_options.py
+++ b/tests/unit/test_client_options.py
@@ -21,6 +21,10 @@
return b"cert", b"key"
+def get_client_encrypted_cert():
+ return "cert_path", "key_path", b"passphrase"
+
+
def test_constructor():
options = client_options.ClientOptions(
@@ -31,6 +35,30 @@
assert options.client_cert_source() == (b"cert", b"key")
+def test_constructor_with_encrypted_cert_source():
+
+ options = client_options.ClientOptions(
+ api_endpoint="foo.googleapis.com",
+ client_encrypted_cert_source=get_client_encrypted_cert,
+ )
+
+ assert options.api_endpoint == "foo.googleapis.com"
+ assert options.client_encrypted_cert_source() == (
+ "cert_path",
+ "key_path",
+ b"passphrase",
+ )
+
+
+def test_constructor_with_both_cert_sources():
+ with pytest.raises(ValueError):
+ client_options.ClientOptions(
+ api_endpoint="foo.googleapis.com",
+ client_cert_source=get_client_cert,
+ client_encrypted_cert_source=get_client_encrypted_cert,
+ )
+
+
def test_from_dict():
options = client_options.from_dict(
{"api_endpoint": "foo.googleapis.com", "client_cert_source": get_client_cert}
@@ -57,6 +85,6 @@
assert (
repr(options)
- == "ClientOptions: {'api_endpoint': 'foo.googleapis.com', 'client_cert_source': None}"
- or "ClientOptions: {'client_cert_source': None, 'api_endpoint': 'foo.googleapis.com'}"
+ == "ClientOptions: {'api_endpoint': 'foo.googleapis.com', 'client_cert_source': None, 'client_encrypted_cert_source': None}"
+ or "ClientOptions: {'client_encrypted_cert_source': None, 'client_cert_source': None, 'api_endpoint': 'foo.googleapis.com'}"
)