diff --git a/.gitignore b/.gitignore index 7b6d95d..93e04ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .idea/ -entraid/__pycache__ +redis_entraid/__pycache__ tests/__pycache__ \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..4b3076e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,22 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "redispy-entraid-credentials" +version = "0.0.1" +authors = [ + { name="Redis Inc.", email="oss@redis.com" }, +] +description = "Entra ID credentials provider implementation for Redis-py client" +readme = "README.md" +requires-python = ">=3.8" +dependencies = [ + "redis @ git+https://github.com/redis/redis-py.git/@vv-tba-support", + "PyJWT~=2.9.0", + "msal~=1.31.0", +] + +[tool.setuptools.packages.find] +include = ["redis_entraid"] +excludea = ["tests", ".github"] diff --git a/entraid/__init__.py b/redis_entraid/__init__.py similarity index 100% rename from entraid/__init__.py rename to redis_entraid/__init__.py diff --git a/entraid/cred_provider.py b/redis_entraid/cred_provider.py similarity index 57% rename from entraid/cred_provider.py rename to redis_entraid/cred_provider.py index b45e045..ab706a2 100644 --- a/entraid/cred_provider.py +++ b/redis_entraid/cred_provider.py @@ -1,11 +1,13 @@ +from dataclasses import dataclass from typing import Union, Tuple, Callable, Any, Awaitable from redis.credentials import StreamingCredentialProvider from redis.auth.token_manager import TokenManagerConfig, RetryPolicy, TokenManager, CredentialsListener -from entraid.identity_provider import EntraIDIdentityProvider +from redis_entraid.identity_provider import EntraIDIdentityProvider +@dataclass class TokenAuthConfig: """ Configuration for token authentication. @@ -19,82 +21,26 @@ class TokenAuthConfig: DEFAULT_MAX_ATTEMPTS = 3 DEFAULT_DELAY_IN_MS = 3 - def __init__(self, idp: EntraIDIdentityProvider): - self._expiration_refresh_ratio = self.DEFAULT_EXPIRATION_REFRESH_RATIO - self._lower_refresh_bound_millis = self.DEFAULT_LOWER_REFRESH_BOUND_MILLIS - self._token_request_execution_timeout_in_ms = self.DEFAULT_TOKEN_REQUEST_EXECUTION_TIMEOUT_IN_MS - self._max_attempts = self.DEFAULT_MAX_ATTEMPTS - self._delay_in_ms = self.DEFAULT_DELAY_IN_MS - self._idp = idp + idp: EntraIDIdentityProvider + expiration_refresh_ratio: float = DEFAULT_EXPIRATION_REFRESH_RATIO + lower_refresh_bound_millis: int = DEFAULT_LOWER_REFRESH_BOUND_MILLIS + token_request_execution_timeout_in_ms: int = DEFAULT_TOKEN_REQUEST_EXECUTION_TIMEOUT_IN_MS + max_attempts: int = DEFAULT_MAX_ATTEMPTS + delay_in_ms: int = DEFAULT_DELAY_IN_MS def get_token_manager_config(self) -> TokenManagerConfig: return TokenManagerConfig( - self._expiration_refresh_ratio, - self._lower_refresh_bound_millis, - self._token_request_execution_timeout_in_ms, + self.expiration_refresh_ratio, + self.lower_refresh_bound_millis, + self.token_request_execution_timeout_in_ms, RetryPolicy( - self._max_attempts, - self._delay_in_ms + self.max_attempts, + self.delay_in_ms ) ) def get_identity_provider(self) -> EntraIDIdentityProvider: - return self._idp - - def expiration_refresh_ratio(self, value: float): - """ - Percentage value of total token TTL when refresh should be triggered. - Default: 0.8 - - :param value: float - :return: Self - """ - self._expiration_refresh_ratio = value - return self - - def lower_refresh_bound_millis(self, value: int): - """ - Represents the minimum time in milliseconds before token expiration to trigger a refresh, in milliseconds. - Default: 0 - - :param value: int - :return: Self - """ - self._lower_refresh_bound_millis = value - return self - - def token_request_execution_timeout_in_ms(self, value: int): - """ - Represents the maximum time in milliseconds to wait for a token request to complete. - Default: 100 - - :param value: int - :return: Self - """ - self._token_request_execution_timeout_in_ms = value - return self - - def max_attempts(self, value: int): - """ - Represents the maximum number of attempts to trigger a refresh in case of error. - Default: 3 - - :param value: int - :return: Self - """ - self._max_attempts = value - return self - - def delay_in_ms(self, value: int): - """ - Represents the delay between retries. - Default: 10 - - :param value: int - :return: Self - """ - self._delay_in_ms = value - return self + return self.idp class EntraIdCredentialsProvider(StreamingCredentialProvider): diff --git a/entraid/identity_provider.py b/redis_entraid/identity_provider.py similarity index 100% rename from entraid/identity_provider.py rename to redis_entraid/identity_provider.py diff --git a/setup.py b/setup.py deleted file mode 100644 index 7c1221b..0000000 --- a/setup.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -from setuptools import find_packages, setup - -setup( - name="redispy-entraid-credentials", - version="0.0.1", - description="Entra ID credentials provider implementation for Redis-py client", - packages=find_packages( - include=["entraid"], - exclude=["tests", ".github"] - ), - install_requires=[ - "redis @ git+https://github.com/redis/redis-py.git/@vv-tba-support", - "PyJWT~=2.9.0", - "msal~=1.31.0" - ], - url="https://github.com/redis-developer/redispy-entra-credentials", - author="Redis Inc.", - author_email="oss@redis.com", -) \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py index 29c6ebe..9360b04 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,8 +5,8 @@ from redis import CredentialProvider from redis.auth.idp import IdentityProviderInterface -from entraid.cred_provider import EntraIdCredentialsProvider, TokenAuthConfig -from entraid.identity_provider import ManagedIdentityType, create_provider_from_managed_identity, \ +from redis_entraid.cred_provider import EntraIdCredentialsProvider, TokenAuthConfig +from redis_entraid.identity_provider import ManagedIdentityType, create_provider_from_managed_identity, \ create_provider_from_service_principal, EntraIDIdentityProvider @@ -93,10 +93,10 @@ def get_credential_provider(request) -> CredentialProvider: ) auth_config = TokenAuthConfig(idp) - auth_config.expiration_refresh_ratio(expiration_refresh_ratio) - auth_config.lower_refresh_bound_millis(lower_refresh_bound_millis) - auth_config.max_attempts(max_attempts) - auth_config.delay_in_ms(delay_in_ms) + auth_config.expiration_refresh_ratio = expiration_refresh_ratio + auth_config.lower_refresh_bound_millis = lower_refresh_bound_millis + auth_config.max_attempts = max_attempts + auth_config.delay_in_ms = delay_in_ms return EntraIdCredentialsProvider( config=auth_config, diff --git a/tests/test_cred_provider.py b/tests/test_cred_provider.py index 9df2dd9..f2ef613 100644 --- a/tests/test_cred_provider.py +++ b/tests/test_cred_provider.py @@ -4,7 +4,7 @@ import pytest from redis.auth.token import TokenInterface -from entraid.cred_provider import EntraIdCredentialsProvider +from redis_entraid.cred_provider import EntraIdCredentialsProvider class TestEntraIdCredentialsProvider: diff --git a/tests/test_identity_provider.py b/tests/test_identity_provider.py index 4b9825c..fbd8dd9 100644 --- a/tests/test_identity_provider.py +++ b/tests/test_identity_provider.py @@ -1,7 +1,7 @@ import pytest from msal import TokenCache -from entraid.identity_provider import EntraIDIdentityProvider +from redis_entraid.identity_provider import EntraIDIdentityProvider class TestEntraIDIdentityProvider: