<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="2" failures="3" skipped="0" tests="41" time="223.032" timestamp="2026-06-09T00:14:49.807928+00:00" hostname="maas-group-test-ftc6c-e2e-maas-openshift-pod"><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyCRUD" name="test_create_api_key" time="0.110" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyCRUD" name="test_list_api_keys" time="0.146" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyCRUD" name="test_revoke_api_key" time="0.120" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyAuthorization" name="test_admin_manage_other_users_keys" time="0.140" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyAuthorization" name="test_non_admin_cannot_access_other_users_keys" time="0.100" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_own_keys" time="0.271" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_other_user_forbidden" time="0.036" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_admin_can_revoke_any_user" time="0.107" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_within_expiration_limit" time="0.034" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_at_expiration_limit" time="0.037" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_exceeds_expiration_limit" time="0.034" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_without_expiration" time="0.035" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_with_short_expiration" time="0.035" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_api_key_model_access_success" time="0.109" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_invalid_api_key_rejected" time="0.024" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_no_auth_header_rejected" time="0.020" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_revoked_api_key_rejected" time="2.130" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_api_key_chat_completions" time="0.032" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_double_revoke_returns_404" time="0.113" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_nonexistent_key_returns_404" time="0.032" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_then_create_new_key_works" time="0.160" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_individual_revoke_multiple_keys" time="0.212" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_keys_rejected_at_gateway" time="0.312" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_cronjob_exists_and_configured" time="0.108" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_cleanup_networkpolicy_exists" time="0.106" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_create_ephemeral_key" time="0.133" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_trigger_cleanup_preserves_active_keys" time="0.500" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_active_subscription" time="11.360" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_degraded_subscription" time="19.187" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_failed_subscription" time="19.389" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_pending_subscription" time="19.291" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_reject_key_for_unreconciled_subscription" time="22.754" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionFilter" name="test_search_filters_by_subscription" time="9.947"><failure message="AssertionError: Failed to create key for e2e-filter-sub-a-ccf152d5: &#10;assert 500 in (200, 201)&#10; +  where 500 = &lt;Response [500]&gt;.status_code">self = &lt;test_api_keys.TestAPIKeySubscriptionFilter object at 0x7f4e8ebde3a0&gt;
api_keys_base_url = 'https://maas.apps.54a17485-d670-447e-b26c-658967c15186.prod.konfluxeaas.com/maas-api/v1/api-keys'
headers = {'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjNERk5GWi1KWm51VUMwWEdDY1VfX1dLSzZxZzg0RHU3dHkyME9XdXEzT0kifQ.e...4ouZhzrjcCJLbCZcrmachzeOzpakuAPYkPAcKdBJnxC6klbvoVtQRqFvvDqULkLzcxE1uoty8DQEPq98w', 'Content-Type': 'application/json'}

    def test_search_filters_by_subscription(self, api_keys_base_url: str, headers: dict):
        """Search with subscription filter returns only keys bound to that subscription."""
        sub_a = f"e2e-filter-sub-a-{os.urandom(4).hex()}"
        sub_b = f"e2e-filter-sub-b-{os.urandom(4).hex()}"
        ns = _ns()
        sa_name = f"e2e-filter-sa-{os.urandom(4).hex()}"
    
        key_ids_a = []
        key_ids_b = []
        try:
            # Create one SA authorized for both subscriptions so that
            # exclusion in search results is attributable to the subscription
            # filter, not user-scoping.
            oc_token = _create_sa_token(sa_name, namespace=MODEL_NAMESPACE)
            sa_user = _sa_to_user(sa_name, namespace=MODEL_NAMESPACE)
            sa_headers = {"Authorization": f"Bearer {oc_token}", "Content-Type": "application/json"}
    
            _create_test_auth_policy(f"{sub_a}-auth", MODEL_REF, users=[sa_user])
            _create_test_subscription(sub_a, MODEL_REF, users=[sa_user])
            _wait_for_maas_subscription_phase(sub_a, namespace=ns)
    
            _create_test_auth_policy(f"{sub_b}-auth", MODEL_REF, users=[sa_user])
            _create_test_subscription(sub_b, MODEL_REF, users=[sa_user])
            _wait_for_maas_subscription_phase(sub_b, namespace=ns)
    
            # Create 2 keys bound to sub_a
            for i in range(2):
                r = requests.post(
                    api_keys_base_url,
                    headers=sa_headers,
                    json={"name": f"e2e-filter-a-{i}", "subscription": sub_a},
                    timeout=TIMEOUT,
                    verify=TLS_VERIFY,
                )
&gt;               assert r.status_code in (200, 201), f"Failed to create key for {sub_a}: {r.text}"
E               AssertionError: Failed to create key for e2e-filter-sub-a-ccf152d5: 
E               assert 500 in (200, 201)
E                +  where 500 = &lt;Response [500]&gt;.status_code

test/e2e/tests/test_api_keys.py:1516: AssertionError</failure></testcase><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionFilter" name="test_search_without_subscription_returns_all" time="0.043"><failure message="AssertionError: Failed to create key: &#10;assert 500 in (200, 201)&#10; +  where 500 = &lt;Response [500]&gt;.status_code">self = &lt;test_api_keys.TestAPIKeySubscriptionFilter object at 0x7f4e8ebdec70&gt;
api_keys_base_url = 'https://maas.apps.54a17485-d670-447e-b26c-658967c15186.prod.konfluxeaas.com/maas-api/v1/api-keys'
headers = {'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IjNERk5GWi1KWm51VUMwWEdDY1VfX1dLSzZxZzg0RHU3dHkyME9XdXEzT0kifQ.e...4ouZhzrjcCJLbCZcrmachzeOzpakuAPYkPAcKdBJnxC6klbvoVtQRqFvvDqULkLzcxE1uoty8DQEPq98w', 'Content-Type': 'application/json'}

    def test_search_without_subscription_returns_all(self, api_keys_base_url: str, headers: dict):
        """Search without subscription filter returns keys across all subscriptions."""
        key_ids = []
        try:
            # Create keys with explicit subscription binding
            for i in range(2):
                r = requests.post(
                    api_keys_base_url,
                    headers=headers,
                    json={"name": f"e2e-nofilter-{i}", "subscription": SIMULATOR_SUBSCRIPTION},
                    timeout=TIMEOUT,
                    verify=TLS_VERIFY,
                )
&gt;               assert r.status_code in (200, 201), f"Failed to create key: {r.text}"
E               AssertionError: Failed to create key: 
E               assert 500 in (200, 201)
E                +  where 500 = &lt;Response [500]&gt;.status_code

test/e2e/tests/test_api_keys.py:1583: AssertionError</failure></testcase><testcase classname="test.e2e.tests.test_namespace_scoping.TestMaaSAPIWatchNamespace" name="test_subscription_in_subscription_namespace_visible_to_api" time="0.035"><error message="failed on setup with &quot;RuntimeError: Failed to create API key: 500&quot;">@pytest.fixture(scope="module")
    def api_key():
        """Create an API key for tests."""
&gt;       key_id, key = _create_ns_api_key("e2e-ns-scoping-key")

test/e2e/tests/test_namespace_scoping.py:185: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = 'e2e-ns-scoping-key'

    def _create_ns_api_key(name: str = None) -&gt; tuple[str, str]:
        """Create an API key and return (key_id, plaintext_key).
    
        Retries on empty 403 from gateway propagation delay (Envoy may not have
        loaded the AuthPolicy yet).
        """
        token = _get_token()
        url = f"{_maas_api_url()}/v1/api-keys"
        key_name = name or f"e2e-ns-test-{uuid.uuid4().hex[:8]}"
    
        retries = 6
        delay = 5
        for attempt in range(1, retries + 1):
            r = requests.post(
                url,
                headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
                json={"name": key_name},
                timeout=TIMEOUT,
                verify=TLS_VERIFY,
            )
            if r.status_code == 403 and not r.text.strip():
                if attempt &lt; retries:
                    log.info("Gateway returned empty 403 (attempt %d/%d), retrying in %ds...",
                             attempt, retries, delay)
                    time.sleep(delay)
                    continue
            break
    
        if r.status_code not in (200, 201):
&gt;           raise RuntimeError(f"Failed to create API key: {r.status_code} {r.text}")
E           RuntimeError: Failed to create API key: 500

test/e2e/tests/test_namespace_scoping.py:91: RuntimeError</error></testcase><testcase classname="test.e2e.tests.test_namespace_scoping.TestMaaSAPIWatchNamespace" name="test_subscription_in_another_namespace_not_visible_to_api" time="0.000"><error message="failed on setup with &quot;RuntimeError: Failed to create API key: 500&quot;">@pytest.fixture(scope="module")
    def api_key():
        """Create an API key for tests."""
&gt;       key_id, key = _create_ns_api_key("e2e-ns-scoping-key")

test/e2e/tests/test_namespace_scoping.py:185: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

name = 'e2e-ns-scoping-key'

    def _create_ns_api_key(name: str = None) -&gt; tuple[str, str]:
        """Create an API key and return (key_id, plaintext_key).
    
        Retries on empty 403 from gateway propagation delay (Envoy may not have
        loaded the AuthPolicy yet).
        """
        token = _get_token()
        url = f"{_maas_api_url()}/v1/api-keys"
        key_name = name or f"e2e-ns-test-{uuid.uuid4().hex[:8]}"
    
        retries = 6
        delay = 5
        for attempt in range(1, retries + 1):
            r = requests.post(
                url,
                headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
                json={"name": key_name},
                timeout=TIMEOUT,
                verify=TLS_VERIFY,
            )
            if r.status_code == 403 and not r.text.strip():
                if attempt &lt; retries:
                    log.info("Gateway returned empty 403 (attempt %d/%d), retrying in %ds...",
                             attempt, retries, delay)
                    time.sleep(delay)
                    continue
            break
    
        if r.status_code not in (200, 201):
&gt;           raise RuntimeError(f"Failed to create API key: {r.status_code} {r.text}")
E           RuntimeError: Failed to create API key: 500

test/e2e/tests/test_namespace_scoping.py:91: RuntimeError</error></testcase><testcase classname="test.e2e.tests.test_namespace_scoping.TestMaaSControllerWatchNamespace" name="test_authpolicy_and_subscription_in_maas_subscription_namespace" time="23.950" /><testcase classname="test.e2e.tests.test_namespace_scoping.TestMaaSControllerWatchNamespace" name="test_authpolicy_and_subscription_in_another_namespace" time="29.857" /><testcase classname="test.e2e.tests.test_namespace_scoping.TestModelRef" name="test_auth_policy_model_ref" time="30.671" /><testcase classname="test.e2e.tests.test_namespace_scoping.TestModelRef" name="test_subscription_model_ref" time="30.771" /><testcase classname="test.e2e.tests.test_negative_security.TestHeaderSpoofing" name="test_injected_identity_headers_ignored" time="0.053"><failure message="RuntimeError: Failed to create API key: 500">self = &lt;test_negative_security.TestHeaderSpoofing object at 0x7f4e8ec9f3a0&gt;

    def test_injected_identity_headers_ignored(self):
        """Client injects X-MaaS-Username/Group/Key-Id — platform ignores them.
    
        Validates that Authorino strips attacker-controlled identity headers.
        The request should succeed (200) using the real key-derived identity,
        proving the spoofed headers had no effect on authorization.
        """
&gt;       api_key = _create_api_key(_get_cluster_token(), subscription=SIMULATOR_SUBSCRIPTION)

test/e2e/tests/test_negative_security.py:83: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

oc_token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjNERk5GWi1KWm51VUMwWEdDY1VfX1dLSzZxZzg0RHU3dHkyME9XdXEzT0kifQ.eyJhdWQiOlsiaHR0cHM6Ly9wcm...x7mMP_CuQnO3auYIAL7Ko4j2jbypFV5VHqWZ54ouZhzrjcCJLbCZcrmachzeOzpakuAPYkPAcKdBJnxC6klbvoVtQRqFvvDqULkLzcxE1uoty8DQEPq98w'
name = None, subscription = 'simulator-subscription'

    def _create_api_key(oc_token: str, name: str = None, subscription: str = None) -&gt; str:
        """Create an API key using the MaaS API and return the plaintext key.
    
        Args:
            oc_token: OC token for authentication with maas-api
            name: Optional name for the key (auto-generated if not provided)
            subscription: Optional MaaSSubscription name to bind (highest-priority auto-bind if omitted)
    
        Returns:
            The plaintext API key (sk-oai-xxx format)
        """
        r = _create_api_key_raw(oc_token, name, subscription)
        if r.status_code not in (200, 201):
&gt;           raise RuntimeError(f"Failed to create API key: {r.status_code} {r.text}")
E           RuntimeError: Failed to create API key: 500

test/e2e/tests/test_helper.py:246: RuntimeError</failure></testcase></testsuite></testsuites>