Skip to content

Commit 2db10b1

Browse files
committed
update test for pr 584
Signed-off-by: Swati Mukund Bagal <sbagal@redhat.com>
1 parent 48088ee commit 2db10b1

File tree

5 files changed

+196
-124
lines changed

5 files changed

+196
-124
lines changed

tests/model_serving/maas_billing/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,7 @@ def maas_subscription_controller_enabled_latest(
10831083
dsc_resource.wait_for_condition(condition="Ready", status="True", timeout=600)
10841084

10851085

1086+
10861087
@pytest.fixture(scope="class")
10871088
def maas_inference_service_tinyllama_free(
10881089
admin_client: DynamicClient,

tests/model_serving/maas_billing/maas_subscription/conftest.py

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,133 @@ def maas_headers_for_actor_api_key(maas_api_key_for_actor: str) -> dict[str, str
203203
return build_maas_headers(token=maas_api_key_for_actor)
204204

205205

206+
@pytest.fixture(scope="function")
207+
def extra_subscription_with_api_key(
208+
request_session_http: requests.Session,
209+
base_url: str,
210+
ocp_token_for_actor: str,
211+
admin_client: DynamicClient,
212+
maas_free_group: str,
213+
maas_model_tinyllama_free: MaaSModelRef,
214+
maas_subscription_namespace: Namespace,
215+
maas_subscription_tinyllama_free: MaaSSubscription,
216+
maas_subscription_controller_enabled_latest: None,
217+
maas_gateway_api: None,
218+
maas_api_gateway_reachable: None,
219+
) -> Generator[str, Any, Any]:
220+
"""
221+
Creates an extra subscription (for nonexistent-group, priority=1) and an API key
222+
bound to the original free subscription. Verifies the user's key still works even
223+
with a second subscription present (OR-logic fix). Revokes key on teardown.
224+
"""
225+
with create_maas_subscription(
226+
admin_client=admin_client,
227+
subscription_namespace=maas_subscription_namespace.name,
228+
subscription_name="extra-subscription",
229+
owner_group_name="nonexistent-group-xyz",
230+
model_name=maas_model_tinyllama_free.name,
231+
model_namespace=maas_model_tinyllama_free.namespace,
232+
tokens_per_minute=999,
233+
window="1m",
234+
priority=1,
235+
teardown=True,
236+
wait_for_resource=True,
237+
) as extra_subscription:
238+
extra_subscription.wait_for_condition(condition="Ready", status="True", timeout=300)
239+
_, body = create_api_key(
240+
base_url=base_url,
241+
ocp_user_token=ocp_token_for_actor,
242+
request_session_http=request_session_http,
243+
api_key_name=f"e2e-one-of-two-{generate_random_name()}",
244+
subscription=maas_subscription_tinyllama_free.name,
245+
)
246+
yield body["key"]
247+
revoke_api_key(
248+
request_session_http=request_session_http,
249+
base_url=base_url,
250+
key_id=body["id"],
251+
ocp_user_token=ocp_token_for_actor,
252+
)
253+
254+
255+
@pytest.fixture(scope="function")
256+
def high_tier_subscription_with_api_key(
257+
request_session_http: requests.Session,
258+
base_url: str,
259+
ocp_token_for_actor: str,
260+
admin_client: DynamicClient,
261+
maas_free_group: str,
262+
maas_model_tinyllama_free: MaaSModelRef,
263+
maas_subscription_namespace: Namespace,
264+
maas_subscription_tinyllama_free: MaaSSubscription,
265+
maas_subscription_controller_enabled_latest: None,
266+
maas_gateway_api: None,
267+
maas_api_gateway_reachable: None,
268+
) -> Generator[str, Any, Any]:
269+
"""
270+
Creates a high-priority subscription (priority=10) for the free group and an API key
271+
bound to it. Returns the API key. Revokes key and cleans up subscription on teardown.
272+
"""
273+
with create_maas_subscription(
274+
admin_client=admin_client,
275+
subscription_namespace=maas_subscription_namespace.name,
276+
subscription_name="high-tier-subscription",
277+
owner_group_name=maas_free_group,
278+
model_name=maas_model_tinyllama_free.name,
279+
model_namespace=maas_model_tinyllama_free.namespace,
280+
tokens_per_minute=9999,
281+
window="1m",
282+
priority=10,
283+
teardown=True,
284+
wait_for_resource=True,
285+
) as high_tier_subscription:
286+
high_tier_subscription.wait_for_condition(condition="Ready", status="True", timeout=300)
287+
_, body = create_api_key(
288+
base_url=base_url,
289+
ocp_user_token=ocp_token_for_actor,
290+
request_session_http=request_session_http,
291+
api_key_name=f"e2e-high-tier-{generate_random_name()}",
292+
subscription=high_tier_subscription.name,
293+
)
294+
yield body["key"]
295+
revoke_api_key(
296+
request_session_http=request_session_http,
297+
base_url=base_url,
298+
key_id=body["id"],
299+
ocp_user_token=ocp_token_for_actor,
300+
)
301+
302+
303+
@pytest.fixture(scope="function")
304+
def api_key_bound_to_system_auth_subscription(
305+
request_session_http: requests.Session,
306+
base_url: str,
307+
ocp_token_for_actor: str,
308+
premium_system_authenticated_access: dict,
309+
maas_subscription_controller_enabled_latest: None,
310+
maas_gateway_api: None,
311+
maas_api_gateway_reachable: None,
312+
) -> Generator[str, Any, Any]:
313+
"""
314+
API key bound to the system:authenticated subscription on the premium model.
315+
Used for tests that verify OR-logic auth policy access. Revoked on teardown.
316+
"""
317+
_, body = create_api_key(
318+
base_url=base_url,
319+
ocp_user_token=ocp_token_for_actor,
320+
request_session_http=request_session_http,
321+
api_key_name=f"e2e-system-auth-{generate_random_name()}",
322+
subscription=premium_system_authenticated_access["subscription"].name,
323+
)
324+
yield body["key"]
325+
revoke_api_key(
326+
request_session_http=request_session_http,
327+
base_url=base_url,
328+
key_id=body["id"],
329+
ocp_user_token=ocp_token_for_actor,
330+
)
331+
332+
206333
@pytest.fixture(scope="class")
207334
def api_key_bound_to_free_subscription(
208335
request_session_http: requests.Session,
@@ -369,7 +496,7 @@ def premium_system_authenticated_access(
369496
model_namespace=maas_model_tinyllama_premium.namespace,
370497
tokens_per_minute=100,
371498
window="1m",
372-
priority=0,
499+
priority=1,
373500
teardown=True,
374501
wait_for_resource=True,
375502
) as system_authenticated_subscription,

tests/model_serving/maas_billing/maas_subscription/test_multiple_auth_policies_per_model.py

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,10 @@
88
chat_payload_for_url,
99
poll_expected_status,
1010
)
11+
from tests.model_serving.maas_billing.utils import build_maas_headers
1112

1213
LOGGER = structlog.get_logger(name=__name__)
1314

14-
MAAS_SUBSCRIPTION_HEADER = "x-maas-subscription"
15-
1615

1716
@pytest.mark.usefixtures(
1817
"maas_unprivileged_model_namespace",
@@ -31,21 +30,18 @@ def test_premium_model_denies_free_actor_by_default(
3130
self,
3231
request_session_http: requests.Session,
3332
model_url_tinyllama_premium: str,
34-
maas_subscription_tinyllama_premium,
3533
maas_headers_for_actor_api_key: dict[str, str],
3634
) -> None:
3735
"""
3836
Verify FREE actor is denied by default on the premium model.
37+
The API key is not bound to the premium subscription, and auth policy denies the free group.
3938
"""
40-
41-
baseline_headers = dict(maas_headers_for_actor_api_key)
42-
baseline_headers[MAAS_SUBSCRIPTION_HEADER] = maas_subscription_tinyllama_premium.name
4339
baseline_payload = chat_payload_for_url(model_url=model_url_tinyllama_premium)
4440

4541
baseline_response = poll_expected_status(
4642
request_session_http=request_session_http,
4743
model_url=model_url_tinyllama_premium,
48-
headers=baseline_headers,
44+
headers=maas_headers_for_actor_api_key,
4945
payload=baseline_payload,
5046
expected_statuses={403},
5147
)
@@ -61,18 +57,14 @@ def test_two_auth_policies_or_logic_allows_access(
6157
self,
6258
request_session_http: requests.Session,
6359
model_url_tinyllama_premium: str,
64-
maas_headers_for_actor_api_key: dict[str, str],
6560
premium_system_authenticated_access,
61+
api_key_bound_to_system_auth_subscription: str,
6662
) -> None:
6763
"""
6864
Verify FREE actor can access the premium model when an extra AuthPolicy
6965
and matching subscription for system:authenticated exist.
66+
API key is minted and bound to the system:authenticated subscription at creation time.
7067
"""
71-
72-
payload = chat_payload_for_url(model_url=model_url_tinyllama_premium)
73-
explicit_headers = dict(maas_headers_for_actor_api_key)
74-
explicit_headers[MAAS_SUBSCRIPTION_HEADER] = premium_system_authenticated_access["subscription"].name
75-
7668
LOGGER.info(
7769
f"Polling for 200 on premium model with OR auth policy: "
7870
f"auth_policy={premium_system_authenticated_access['auth_policy'].name}, "
@@ -82,11 +74,10 @@ def test_two_auth_policies_or_logic_allows_access(
8274
response = poll_expected_status(
8375
request_session_http=request_session_http,
8476
model_url=model_url_tinyllama_premium,
85-
headers=explicit_headers,
86-
payload=payload,
77+
headers=build_maas_headers(token=api_key_bound_to_system_auth_subscription),
78+
payload=chat_payload_for_url(model_url=model_url_tinyllama_premium),
8779
expected_statuses={200},
8880
)
89-
9081
assert response.status_code == 200, (
9182
f"Expected 200 with second AuthPolicy (OR logic), got {response.status_code}: {(response.text or '')[:200]}"
9283
)
@@ -97,21 +88,20 @@ def test_delete_extra_auth_policy_denies_access_on_premium_model(
9788
self,
9889
request_session_http: requests.Session,
9990
model_url_tinyllama_premium: str,
100-
maas_headers_for_actor_api_key: dict[str, str],
10191
premium_system_authenticated_access,
92+
api_key_bound_to_system_auth_subscription: str,
10293
) -> None:
10394
"""
10495
Verify FREE actor loses access again after the extra AuthPolicy is deleted.
96+
API key is minted and bound to the system:authenticated subscription at creation time.
10597
"""
106-
98+
headers = build_maas_headers(token=api_key_bound_to_system_auth_subscription)
10799
payload = chat_payload_for_url(model_url=model_url_tinyllama_premium)
108-
explicit_headers = dict(maas_headers_for_actor_api_key)
109-
explicit_headers[MAAS_SUBSCRIPTION_HEADER] = premium_system_authenticated_access["subscription"].name
110100

111101
poll_expected_status(
112102
request_session_http=request_session_http,
113103
model_url=model_url_tinyllama_premium,
114-
headers=explicit_headers,
104+
headers=headers,
115105
payload=payload,
116106
expected_statuses={200},
117107
)
@@ -121,7 +111,7 @@ def test_delete_extra_auth_policy_denies_access_on_premium_model(
121111
response = poll_expected_status(
122112
request_session_http=request_session_http,
123113
model_url=model_url_tinyllama_premium,
124-
headers=explicit_headers,
114+
headers=headers,
125115
payload=payload,
126116
expected_statuses={403},
127117
)

0 commit comments

Comments
 (0)