forked from phoenix/litellm-mirror
(bug fix) /key/update was not storing budget_duration
in the DB (#6941)
* fix - store budget_duration for keys * test_generate_and_update_key * test_update_user_unit_test * fix user update
This commit is contained in:
parent
8af5b11f54
commit
77f714dc51
2 changed files with 84 additions and 1 deletions
|
@ -476,6 +476,7 @@ def prepare_key_update_data(
|
||||||
duration_s = duration_in_seconds(duration=budget_duration)
|
duration_s = duration_in_seconds(duration=budget_duration)
|
||||||
key_reset_at = datetime.now(timezone.utc) + timedelta(seconds=duration_s)
|
key_reset_at = datetime.now(timezone.utc) + timedelta(seconds=duration_s)
|
||||||
non_default_values["budget_reset_at"] = key_reset_at
|
non_default_values["budget_reset_at"] = key_reset_at
|
||||||
|
non_default_values["budget_duration"] = budget_duration
|
||||||
|
|
||||||
_metadata = existing_key_row.metadata or {}
|
_metadata = existing_key_row.metadata or {}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from fastapi import Request
|
from fastapi import Request
|
||||||
|
@ -1305,6 +1305,8 @@ def test_generate_and_update_key(prisma_client):
|
||||||
data=UpdateKeyRequest(
|
data=UpdateKeyRequest(
|
||||||
key=generated_key,
|
key=generated_key,
|
||||||
models=["ada", "babbage", "curie", "davinci"],
|
models=["ada", "babbage", "curie", "davinci"],
|
||||||
|
budget_duration="1mo",
|
||||||
|
max_budget=100,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1333,6 +1335,27 @@ def test_generate_and_update_key(prisma_client):
|
||||||
}
|
}
|
||||||
assert result["info"]["models"] == ["ada", "babbage", "curie", "davinci"]
|
assert result["info"]["models"] == ["ada", "babbage", "curie", "davinci"]
|
||||||
assert result["info"]["team_id"] == _team_2
|
assert result["info"]["team_id"] == _team_2
|
||||||
|
assert result["info"]["budget_duration"] == "1mo"
|
||||||
|
assert result["info"]["max_budget"] == 100
|
||||||
|
|
||||||
|
# budget_reset_at should be 30 days from now
|
||||||
|
assert result["info"]["budget_reset_at"] is not None
|
||||||
|
budget_reset_at = result["info"]["budget_reset_at"].replace(
|
||||||
|
tzinfo=timezone.utc
|
||||||
|
)
|
||||||
|
current_time = datetime.now(timezone.utc)
|
||||||
|
|
||||||
|
print(
|
||||||
|
"days between now and budget_reset_at",
|
||||||
|
(budget_reset_at - current_time).days,
|
||||||
|
)
|
||||||
|
# assert budget_reset_at is 30 days from now
|
||||||
|
assert (
|
||||||
|
abs(
|
||||||
|
(budget_reset_at - current_time).total_seconds() - 30 * 24 * 60 * 60
|
||||||
|
)
|
||||||
|
<= 10
|
||||||
|
)
|
||||||
|
|
||||||
# cleanup - delete key
|
# cleanup - delete key
|
||||||
delete_key_request = KeyRequest(keys=[generated_key])
|
delete_key_request = KeyRequest(keys=[generated_key])
|
||||||
|
@ -2613,6 +2636,15 @@ async def test_create_update_team(prisma_client):
|
||||||
_updated_info["budget_reset_at"], datetime.datetime
|
_updated_info["budget_reset_at"], datetime.datetime
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# budget_reset_at should be 2 days from now
|
||||||
|
budget_reset_at = _updated_info["budget_reset_at"].replace(tzinfo=timezone.utc)
|
||||||
|
current_time = datetime.datetime.now(timezone.utc)
|
||||||
|
|
||||||
|
# assert budget_reset_at is 2 days from now
|
||||||
|
assert (
|
||||||
|
abs((budget_reset_at - current_time).total_seconds() - 2 * 24 * 60 * 60) <= 10
|
||||||
|
)
|
||||||
|
|
||||||
# now hit team_info
|
# now hit team_info
|
||||||
try:
|
try:
|
||||||
response = await team_info(
|
response = await team_info(
|
||||||
|
@ -2756,6 +2788,56 @@ async def test_update_user_role(prisma_client):
|
||||||
print("result from user auth with new key", result)
|
print("result from user auth with new key", result)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio()
|
||||||
|
async def test_update_user_unit_test(prisma_client):
|
||||||
|
"""
|
||||||
|
Unit test for /user/update
|
||||||
|
|
||||||
|
Ensure that params are updated for UpdateUserRequest
|
||||||
|
"""
|
||||||
|
setattr(litellm.proxy.proxy_server, "prisma_client", prisma_client)
|
||||||
|
setattr(litellm.proxy.proxy_server, "master_key", "sk-1234")
|
||||||
|
await litellm.proxy.proxy_server.prisma_client.connect()
|
||||||
|
key = await new_user(
|
||||||
|
data=NewUserRequest(
|
||||||
|
user_email="test@test.com",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
print(key)
|
||||||
|
|
||||||
|
user_info = await user_update(
|
||||||
|
data=UpdateUserRequest(
|
||||||
|
user_id=key.user_id,
|
||||||
|
team_id="1234",
|
||||||
|
max_budget=100,
|
||||||
|
budget_duration="10d",
|
||||||
|
tpm_limit=100,
|
||||||
|
rpm_limit=100,
|
||||||
|
metadata={"very-new-metadata": "something"},
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
print("user_info", user_info)
|
||||||
|
assert user_info is not None
|
||||||
|
_user_info = user_info["data"].model_dump()
|
||||||
|
|
||||||
|
assert _user_info["user_id"] == key.user_id
|
||||||
|
assert _user_info["team_id"] == "1234"
|
||||||
|
assert _user_info["max_budget"] == 100
|
||||||
|
assert _user_info["budget_duration"] == "10d"
|
||||||
|
assert _user_info["tpm_limit"] == 100
|
||||||
|
assert _user_info["rpm_limit"] == 100
|
||||||
|
assert _user_info["metadata"] == {"very-new-metadata": "something"}
|
||||||
|
|
||||||
|
# budget reset at should be 10 days from now
|
||||||
|
budget_reset_at = _user_info["budget_reset_at"].replace(tzinfo=timezone.utc)
|
||||||
|
current_time = datetime.now(timezone.utc)
|
||||||
|
assert (
|
||||||
|
abs((budget_reset_at - current_time).total_seconds() - 10 * 24 * 60 * 60) <= 10
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio()
|
@pytest.mark.asyncio()
|
||||||
async def test_custom_api_key_header_name(prisma_client):
|
async def test_custom_api_key_header_name(prisma_client):
|
||||||
""" """
|
""" """
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue