From b5d5d1fba02f05e63bc0eb779551f88bc5cd0e7c Mon Sep 17 00:00:00 2001 From: Ashwin Bharambe Date: Thu, 15 May 2025 17:26:42 -0700 Subject: [PATCH] fix deps and tests --- pyproject.toml | 2 +- requirements.txt | 7 ++--- tests/unit/server/test_auth.py | 19 ++++++++++---- uv.lock | 48 ++++++++++++++++++++++++---------- 4 files changed, 53 insertions(+), 23 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4a5470f0b..a41830e64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,6 @@ classifiers = [ dependencies = [ "blobfile", "fire", - "jose", "httpx", "huggingface-hub", "jinja2>=3.1.6", @@ -32,6 +31,7 @@ dependencies = [ "openai>=1.66", "prompt-toolkit", "python-dotenv", + "python-jose", "pydantic>=2", "requests", "rich", diff --git a/requirements.txt b/requirements.txt index a95d6a401..6dfcc1024 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,7 @@ click==8.1.8 colorama==0.4.6 ; sys_platform == 'win32' distro==1.9.0 durationpy==0.9 +ecdsa==0.19.1 exceptiongroup==1.2.2 ; python_full_version < '3.11' filelock==3.17.0 fire==0.7.0 @@ -23,7 +24,6 @@ huggingface-hub==0.29.0 idna==3.10 jinja2==3.1.6 jiter==0.8.2 -jose==1.0.0 jsonschema==4.23.0 jsonschema-specifications==2024.10.1 kubernetes==32.0.1 @@ -40,14 +40,15 @@ pandas==2.2.3 pillow==11.1.0 prompt-toolkit==3.0.50 pyaml==25.1.0 -pyasn1==0.6.1 -pyasn1-modules==0.4.2 +pyasn1==0.4.8 +pyasn1-modules==0.4.1 pycryptodomex==3.21.0 pydantic==2.10.6 pydantic-core==2.27.2 pygments==2.19.1 python-dateutil==2.9.0.post0 python-dotenv==1.0.1 +python-jose==3.4.0 pytz==2025.1 pyyaml==6.0.2 referencing==0.36.2 diff --git a/tests/unit/server/test_auth.py b/tests/unit/server/test_auth.py index a75f9e6b6..f46574fd9 100644 --- a/tests/unit/server/test_auth.py +++ b/tests/unit/server/test_auth.py @@ -12,7 +12,11 @@ from fastapi.testclient import TestClient from llama_stack.distribution.datatypes import AccessAttributes from llama_stack.distribution.server.auth import AuthenticationMiddleware -from llama_stack.distribution.server.auth_providers import AuthProviderConfig, AuthProviderType +from llama_stack.distribution.server.auth_providers import ( + AuthProviderConfig, + AuthProviderType, + TokenValidationResult, +) class MockResponse: @@ -130,6 +134,7 @@ async def mock_post_success(*args, **kwargs): 200, { "message": "Authentication successful", + "principal": "test-principal", "access_attributes": { "roles": ["admin", "user"], "teams": ["ml-team", "nlp-team"], @@ -223,6 +228,7 @@ async def test_http_middleware_with_access_attributes(mock_http_middleware, mock 200, { "message": "Authentication successful", + "principal": "test-principal", "access_attributes": { "roles": ["admin", "user"], "teams": ["ml-team", "nlp-team"], @@ -268,8 +274,8 @@ async def test_http_middleware_no_attributes(mock_http_middleware, mock_scope): assert "user_attributes" in mock_scope attributes = mock_scope["user_attributes"] - assert "namespaces" in attributes - assert attributes["namespaces"] == ["test.jwt.token"] + assert "roles" in attributes + assert attributes["roles"] == ["test.jwt.token"] # Kubernetes Tests @@ -296,8 +302,11 @@ def test_valid_k8s_authentication(mock_api_client, k8s_client, valid_token): # Mock the token validation to return valid access attributes with patch("llama_stack.distribution.server.auth_providers.KubernetesAuthProvider.validate_token") as mock_validate: - mock_validate.return_value = AccessAttributes( - roles=["admin"], teams=["ml-team"], projects=["llama-3"], namespaces=["research"] + mock_validate.return_value = TokenValidationResult( + principal="test-principal", + access_attributes=AccessAttributes( + roles=["admin"], teams=["ml-team"], projects=["llama-3"], namespaces=["research"] + ), ) response = k8s_client.get("/test", headers={"Authorization": f"Bearer {valid_token}"}) assert response.status_code == 200 diff --git a/uv.lock b/uv.lock index 552eab662..c30e2c4c1 100644 --- a/uv.lock +++ b/uv.lock @@ -685,6 +685,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4c/a3/ac312faeceffd2d8f86bc6dcb5c401188ba5a01bc88e69bed97578a0dfcd/durationpy-0.9-py3-none-any.whl", hash = "sha256:e65359a7af5cedad07fb77a2dd3f390f8eb0b74cb845589fa6c057086834dd38", size = 3461 }, ] +[[package]] +name = "ecdsa" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/1f/924e3caae75f471eae4b26bd13b698f6af2c44279f67af317439c2f4c46a/ecdsa-0.19.1.tar.gz", hash = "sha256:478cba7b62555866fcb3bb3fe985e06decbdb68ef55713c4e5ab98c57d508e61", size = 201793 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a3/460c57f094a4a165c84a1341c373b0a4f5ec6ac244b998d5021aade89b77/ecdsa-0.19.1-py2.py3-none-any.whl", hash = "sha256:30638e27cf77b7e15c4c4cc1973720149e1033827cfd00661ca5c8cc0cdb24c3", size = 150607 }, +] + [[package]] name = "exceptiongroup" version = "1.2.2" @@ -1255,12 +1267,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/61/c80ef80ed8a0a21158e289ef70dac01e351d929a1c30cb0f49be60772547/jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566", size = 202374 }, ] -[[package]] -name = "jose" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/3d/832caa69cd0d3be2d608d8290be2221072669aa88e87690837f6b31c480f/jose-1.0.0.tar.gz", hash = "sha256:8436c3617cd94e1ba97828fbb1ce27c129f66c78fb855b4bb47e122b5f345fba", size = 9153 } - [[package]] name = "jsonschema" version = "4.23.0" @@ -1434,7 +1440,6 @@ dependencies = [ { name = "httpx" }, { name = "huggingface-hub" }, { name = "jinja2" }, - { name = "jose" }, { name = "jsonschema" }, { name = "kubernetes" }, { name = "llama-stack-client" }, @@ -1443,6 +1448,7 @@ dependencies = [ { name = "prompt-toolkit" }, { name = "pydantic" }, { name = "python-dotenv" }, + { name = "python-jose" }, { name = "requests" }, { name = "rich" }, { name = "setuptools" }, @@ -1539,7 +1545,6 @@ requires-dist = [ { name = "huggingface-hub" }, { name = "jinja2", specifier = ">=3.1.6" }, { name = "jinja2", marker = "extra == 'codegen'", specifier = ">=3.1.6" }, - { name = "jose" }, { name = "jsonschema" }, { name = "kubernetes" }, { name = "llama-stack-client", specifier = ">=0.2.7" }, @@ -1568,6 +1573,7 @@ requires-dist = [ { name = "pytest-json-report", marker = "extra == 'dev'" }, { name = "pytest-timeout", marker = "extra == 'dev'" }, { name = "python-dotenv" }, + { name = "python-jose" }, { name = "qdrant-client", marker = "extra == 'unit'" }, { name = "requests" }, { name = "rich" }, @@ -2595,23 +2601,23 @@ wheels = [ [[package]] name = "pyasn1" -version = "0.6.1" +version = "0.4.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 } +sdist = { url = "https://files.pythonhosted.org/packages/a4/db/fffec68299e6d7bad3d504147f9094830b704527a7fc098b721d38cc7fa7/pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", size = 146820 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 }, + { url = "https://files.pythonhosted.org/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", size = 77145 }, ] [[package]] name = "pyasn1-modules" -version = "0.4.2" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/67/6afbf0d507f73c32d21084a79946bfcfca5fbc62a72057e9c23797a737c9/pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c", size = 310028 } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, + { url = "https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd", size = 181537 }, ] [[package]] @@ -2895,6 +2901,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863 }, ] +[[package]] +name = "python-jose" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ecdsa" }, + { name = "pyasn1" }, + { name = "rsa" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8e/a0/c49687cf40cb6128ea4e0559855aff92cd5ebd1a60a31c08526818c0e51e/python-jose-3.4.0.tar.gz", hash = "sha256:9a9a40f418ced8ecaf7e3b28d69887ceaa76adad3bcaa6dae0d9e596fec1d680", size = 92145 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/b0/2586ea6b6fd57a994ece0b56418cbe93fff0efb85e2c9eb6b0caf24a4e37/python_jose-3.4.0-py2.py3-none-any.whl", hash = "sha256:9c9f616819652d109bd889ecd1e15e9a162b9b94d682534c9c2146092945b78f", size = 34616 }, +] + [[package]] name = "pytz" version = "2025.1"