<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="2" failures="3" skipped="0" tests="51" time="245.733" timestamp="2026-06-09T15:33:05.437001+00:00" hostname="maas-group-test-kb9lf-e2e-maas-openshift-pod"><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyCRUD" name="test_create_api_key" time="0.172" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyCRUD" name="test_list_api_keys" time="0.150" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyCRUD" name="test_revoke_api_key" time="0.127" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyAuthorization" name="test_admin_manage_other_users_keys" time="0.152" /><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.280" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_other_user_forbidden" time="0.042" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_admin_can_revoke_any_user" time="0.098" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_within_expiration_limit" time="0.036" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_at_expiration_limit" time="0.032" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_exceeds_expiration_limit" time="0.033" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_without_expiration" time="0.033" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyExpiration" name="test_create_key_with_short_expiration" time="0.032" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_api_key_model_access_success" time="0.896" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_invalid_api_key_rejected" time="0.027" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_no_auth_header_rejected" time="0.023" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_revoked_api_key_rejected" time="2.124" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyModelInference" name="test_api_key_chat_completions" time="0.031" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_double_revoke_returns_404" time="0.098" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_nonexistent_key_returns_404" time="0.030" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_then_create_new_key_works" time="0.147" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_individual_revoke_multiple_keys" time="0.196" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_keys_rejected_at_gateway" time="0.307" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_cronjob_exists_and_configured" time="0.113" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_cleanup_networkpolicy_exists" time="0.128" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_create_ephemeral_key" time="0.115" /><testcase classname="test.e2e.tests.test_api_keys.TestEphemeralKeyCleanup" name="test_trigger_cleanup_preserves_active_keys" time="0.575" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_active_subscription" time="9.361" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_degraded_subscription" time="19.214" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_failed_subscription" time="19.341" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_pending_subscription" time="19.389" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_reject_key_for_unreconciled_subscription" time="23.097" /><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionFilter" name="test_search_filters_by_subscription" time="10.002"><failure message="AssertionError: Failed to create key for e2e-filter-sub-a-51f70d67: &#10;assert 500 in (200, 201)&#10; +  where 500 = &lt;Response [500]&gt;.status_code">self = &lt;test_api_keys.TestAPIKeySubscriptionFilter object at 0x7f4fa1456490&gt;
api_keys_base_url = 'https://maas.apps.85781127-4a5f-4709-8232-89c1fb1f248b.prod.konfluxeaas.com/maas-api/v1/api-keys'
headers = {'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1zZlJUQW45Nl94SEVGLWQ5UEVsZFRwbk1XOW1KNnJEdm9uSmNlaGxYMWMifQ.e...2EMy_-BkoBnxB1tZ_auOEso_HR0Fl5XFCjCyGrm_6eoftQ39ilh3DBjKuFt6Yt5JS7m00Maqa6wPHSmtQ', '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-51f70d67: 
E               assert 500 in (200, 201)
E                +  where 500 = &lt;Response [500]&gt;.status_code

test/e2e/tests/test_api_keys.py:1510: AssertionError</failure></testcase><testcase classname="test.e2e.tests.test_api_keys.TestAPIKeySubscriptionFilter" name="test_search_without_subscription_returns_all" time="0.051"><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 0x7f4fa1456160&gt;
api_keys_base_url = 'https://maas.apps.85781127-4a5f-4709-8232-89c1fb1f248b.prod.konfluxeaas.com/maas-api/v1/api-keys'
headers = {'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1zZlJUQW45Nl94SEVGLWQ5UEVsZFRwbk1XOW1KNnJEdm9uSmNlaGxYMWMifQ.e...2EMy_-BkoBnxB1tZ_auOEso_HR0Fl5XFCjCyGrm_6eoftQ39ilh3DBjKuFt6Yt5JS7m00Maqa6wPHSmtQ', '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:1577: AssertionError</failure></testcase><testcase classname="test.e2e.tests.test_namespace_scoping.TestMaaSAPIWatchNamespace" name="test_subscription_in_subscription_namespace_visible_to_api" time="0.033"><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:186: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

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:92: 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:186: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

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:92: RuntimeError</error></testcase><testcase classname="test.e2e.tests.test_namespace_scoping.TestMaaSControllerWatchNamespace" name="test_authpolicy_and_subscription_in_maas_subscription_namespace" time="24.093" /><testcase classname="test.e2e.tests.test_namespace_scoping.TestMaaSControllerWatchNamespace" name="test_authpolicy_and_subscription_in_another_namespace" time="30.089" /><testcase classname="test.e2e.tests.test_namespace_scoping.TestModelRef" name="test_auth_policy_model_ref" time="30.923" /><testcase classname="test.e2e.tests.test_namespace_scoping.TestModelRef" name="test_subscription_model_ref" time="30.767" /><testcase classname="test.e2e.tests.test_negative_security.TestHeaderSpoofing" name="test_injected_identity_headers_ignored" time="0.123" /><testcase classname="test.e2e.tests.test_negative_security.TestHeaderSpoofing" name="test_duplicate_subscription_headers_ignored" time="0.070" /><testcase classname="test.e2e.tests.test_negative_security.TestExpiredKeyRejection" name="test_expired_key_rejected_at_gateway" time="5.092" /><testcase classname="test.e2e.tests.test_negative_security.TestCrossModelAccess" name="test_key_cannot_access_model_outside_subscription" time="0.070" /><testcase classname="test.e2e.tests.test_negative_security.TestAuthPolicyRemoval" name="test_authpolicy_deletion_revokes_access" time="0.824" /><testcase classname="test.e2e.tests.test_negative_security.TestMissingModelRef" name="test_subscription_with_nonexistent_model_ref" time="3.207" /><testcase classname="test.e2e.tests.test_negative_security.TestMissingModelRef" name="test_authpolicy_with_nonexistent_model_ref" time="0.667" /><testcase classname="test.e2e.tests.test_negative_security.TestHeaderAbuse" name="test_special_characters_in_subscription_header" time="0.162" /><testcase classname="test.e2e.tests.test_negative_security.TestWebhookValidation" name="test_subscription_rejected_in_unlabeled_namespace" time="6.185" /><testcase classname="test.e2e.tests.test_negative_security.TestWebhookValidation" name="test_authpolicy_rejected_in_unlabeled_namespace" time="6.040" /><testcase classname="test.e2e.tests.test_subscription.TestAuthEnforcement" name="test_authorized_user_gets_200" time="0.036"><failure message="RuntimeError: Failed to create API key: 500">self = &lt;test_subscription.TestAuthEnforcement object at 0x7f4fa102ad00&gt;

    def test_authorized_user_gets_200(self):
        """API key with system:authenticated group should access the free model.
        Polls because AuthPolicies may still be syncing with Authorino."""
&gt;       api_key = _get_default_api_key()

test/e2e/tests/test_subscription.py:223: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/e2e/tests/test_subscription.py:125: in _get_default_api_key
    _default_api_key_cache[pid] = _create_api_key(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

oc_token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6Ik1zZlJUQW45Nl94SEVGLWQ5UEVsZFRwbk1XOW1KNnJEdm9uSmNlaGxYMWMifQ.eyJhdWQiOlsiaHR0cHM6Ly9wcm...BI0PmK-TRVIGNd7rufkr6cK8yjiPNekqthGr22EMy_-BkoBnxB1tZ_auOEso_HR0Fl5XFCjCyGrm_6eoftQ39ilh3DBjKuFt6Yt5JS7m00Maqa6wPHSmtQ'
name = 'e2e-default-key', 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:243: RuntimeError</failure></testcase></testsuite></testsuites>