<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="14" failures="2" skipped="15" tests="191" time="2286.178" timestamp="2026-11-02T17:38:12.461980+00:00" hostname="ai-gateway-controller-groupa3f651d15e730c2648831450c2abb45e-pod"><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_other_user_forbidden" time="122.992" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_missing_scope_returns_400" time="0.119" /><testcase classname="tests.test_api_keys.TestAPIKeyExpiration" name="test_expiration_policy_boundaries[within-limit]" time="0.104" /><testcase classname="tests.test_api_keys.TestAPIKeyExpiration" name="test_expiration_policy_boundaries[at-limit]" time="0.106" /><testcase classname="tests.test_api_keys.TestAPIKeyExpiration" name="test_expiration_policy_boundaries[exceeds-limit]" time="0.211" /><testcase classname="tests.test_api_keys.TestAPIKeyExpiration" name="test_expiration_policy_boundaries[without-expiration]" time="0.186" /><testcase classname="tests.test_api_keys.TestAPIKeyExpiration" name="test_expiration_policy_boundaries[short-expiration]" time="0.146" /><testcase classname="tests.test_api_keys.TestAPIKeyModelInference" name="test_api_key_model_access_success" time="0.281" /><testcase classname="tests.test_api_keys.TestAPIKeyModelInference" name="test_invalid_api_key_rejected" time="0.061" /><testcase classname="tests.test_api_keys.TestAPIKeyModelInference" name="test_no_auth_header_rejected" time="0.042" /><testcase classname="tests.test_api_keys.TestAPIKeyModelInference" name="test_revoked_api_key_rejected" time="2.352" /><testcase classname="tests.test_api_keys.TestAPIKeyCRUD" name="test_list_api_keys" time="126.315" /><testcase classname="tests.test_api_keys.TestAPIKeyModelInference" name="test_api_key_chat_completions" time="0.111" /><testcase classname="tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_nonexistent_key_returns_404" time="0.118" /><testcase classname="tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_then_create_new_key_works" time="0.493" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_by_subscription" time="25.794" /><testcase classname="tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_individual_revoke_multiple_keys" time="0.604" /><testcase classname="tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_revoke_keys_rejected_at_gateway" time="1.161" /><testcase classname="tests.test_api_keys.TestEphemeralKeyCleanup" name="test_cronjob_exists_and_configured" time="0.157" /><testcase classname="tests.test_api_keys.TestEphemeralKeyCleanup" name="test_cleanup_networkpolicy_exists" time="0.150" /><testcase classname="tests.test_api_keys.TestEphemeralKeyCleanup" name="test_create_ephemeral_key" time="0.327" /><testcase classname="tests.test_api_keys.TestEphemeralKeyCleanup" name="test_trigger_cleanup_preserves_active_keys" time="0.250"><skipped type="pytest.skip" message="Cannot find maas-api pod in odh-ai-gateway-infra: error: error executing jsonpath &quot;{.items[0].metadata.name}&quot;: Error executing template: array index out of bounds: index 0, length 0. Printing more information for debugging the template:&#10;&#09;template was:&#10;&#09;&#09;{.items[0].metadata.name}&#10;&#09;object given to jsonpath engine was:&#10;&#09;&#09;map[string]interface {}{&quot;apiVersion&quot;:&quot;v1&quot;, &quot;items&quot;:[]interface {}{}, &quot;kind&quot;:&quot;List&quot;, &quot;metadata&quot;:map[string]interface {}{&quot;resourceVersion&quot;:&quot;&quot;}}">/workspace/source/test/maas-e2e/test/e2e/tests/test_api_keys.py:1429: Cannot find maas-api pod in odh-ai-gateway-infra: error: error executing jsonpath "{.items[0].metadata.name}": Error executing template: array index out of bounds: index 0, length 0. Printing more information for debugging the template:
	template was:
		{.items[0].metadata.name}
	object given to jsonpath engine was:
		map[string]interface {}{"apiVersion":"v1", "items":[]interface {}{}, "kind":"List", "metadata":map[string]interface {}{"resourceVersion":""}}</skipped></testcase><testcase classname="tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_active_subscription" time="14.529" /><testcase classname="tests.test_api_keys.TestAPIKeyAuthorization" name="test_non_admin_cannot_access_other_users_keys" time="144.485" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_dry_run_by_subscription" time="14.839" /><testcase classname="tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_degraded_subscription" time="14.627" /><testcase classname="tests.test_api_keys.TestAPIKeyRevocationE2E" name="test_double_revoke_returns_404" time="0.342" /><testcase classname="tests.test_api_keys.TestAPIKeySubscriptionFilter" name="test_search_without_subscription_returns_all" time="0.715" /><testcase classname="tests.test_api_keys.TestAPIKeyLabels" name="test_create_api_key_with_labels" time="0.247" /><testcase classname="tests.test_api_keys.TestAPIKeyLabels" name="test_search_api_keys_by_labels" time="1.358" /><testcase classname="tests.test_api_keys.TestAPIKeyAuthorization" name="test_admin_manage_other_users_keys" time="155.891" /><testcase classname="tests.test_api_keys.TestAPIKeyLabels" name="test_labels_validation_errors" time="0.882" /><testcase classname="tests.test_api_keys.TestAPIKeyLabels" name="test_backward_compatibility_no_labels" time="0.728" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_dry_run" time="1.511" /><testcase classname="tests.test_namespace_scoping.TestMaaSAPIWatchNamespace" name="test_subscription_in_subscription_namespace_visible_to_api" time="0.000"><skipped type="pytest.skip" message="test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true">/workspace/source/test/maas-e2e/test/e2e/tests/test_namespace_scoping.py:214: test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true</skipped></testcase><testcase classname="tests.test_namespace_scoping.TestMaaSControllerWatchNamespace" name="test_authpolicy_and_subscription_in_maas_subscription_namespace" time="0.000"><skipped type="pytest.skip" message="test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true">/workspace/source/test/maas-e2e/test/e2e/tests/test_namespace_scoping.py:287: test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true</skipped></testcase><testcase classname="tests.test_namespace_scoping.TestMaaSControllerWatchNamespace" name="test_authpolicy_and_subscription_in_another_namespace" time="0.000"><skipped type="pytest.skip" message="test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true">/workspace/source/test/maas-e2e/test/e2e/tests/test_namespace_scoping.py:324: test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true</skipped></testcase><testcase classname="tests.test_namespace_scoping.TestModelRef" name="test_auth_policy_model_ref" time="0.000"><skipped type="pytest.skip" message="test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true">/workspace/source/test/maas-e2e/test/e2e/tests/test_namespace_scoping.py:382: test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true</skipped></testcase><testcase classname="tests.test_namespace_scoping.TestModelRef" name="test_subscription_model_ref" time="0.000"><skipped type="pytest.skip" message="test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true">/workspace/source/test/maas-e2e/test/e2e/tests/test_namespace_scoping.py:456: test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true</skipped></testcase><testcase classname="tests.test_negative_security.TestAPIKeyManagementIsolation" name="test_api_key_cannot_mint_another_api_key" time="0.772" /><testcase classname="tests.test_negative_security.TestHeaderSpoofing" name="test_forged_identity_headers_rejected_on_key_mint[username-only]" time="1.094" /><testcase classname="tests.test_namespace_scoping.TestMaaSAPIWatchNamespace" name="test_subscription_in_another_namespace_not_visible_to_api" time="0.000"><skipped type="pytest.skip" message="test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true">/workspace/source/test/maas-e2e/test/e2e/tests/test_namespace_scoping.py:247: test_namespace_scoping validates single-tenant dormant mode; skipped when ENABLE_TENANT_NAMESPACE_DISCOVERY=true</skipped></testcase><testcase classname="tests.test_negative_security.TestHeaderSpoofing" name="test_forged_identity_headers_rejected_on_key_mint[keyname-only]" time="1.040" /><testcase classname="tests.test_negative_security.TestHeaderSpoofing" name="test_forged_identity_headers_rejected_on_key_mint[group-only]" time="1.097" /><testcase classname="tests.test_negative_security.TestHeaderSpoofing" name="test_forged_identity_headers_rejected_on_key_mint[identity-envelope]" time="1.027" /><testcase classname="tests.test_api_keys.TestAPIKeySubscriptionFilter" name="test_search_filters_by_subscription" time="29.078" /><testcase classname="tests.test_api_keys.TestAPIKeySubscriptionPhases" name="test_create_key_for_failed_subscription" time="15.150" /><testcase classname="tests.test_negative_security.TestHeaderSpoofing" name="test_forged_identity_headers_rejected_on_key_mint[admin-scope]" time="0.833" /><testcase classname="tests.test_negative_security.TestHeaderSpoofing" name="test_injected_identity_headers_rejected_on_inference" time="0.486" /><testcase classname="tests.test_negative_security.TestMissingModelRef" name="test_subscription_with_nonexistent_model_ref" time="13.919" /><testcase classname="tests.test_negative_security.TestCrossModelAccess" name="test_key_cannot_access_model_outside_subscription" time="0.416" /><testcase classname="tests.test_negative_security.TestHeaderAbuse" name="test_special_characters_in_subscription_header" time="0.698" /><testcase classname="tests.test_negative_security.TestInternalEndpointIsolation" name="test_internal_endpoint_not_routable[subscriptions-select]" time="0.198" /><testcase classname="tests.test_negative_security.TestInternalEndpointIsolation" name="test_internal_endpoint_not_routable[api-keys-cleanup]" time="0.187" /><testcase classname="tests.test_negative_security.TestInternalEndpointIsolation" name="test_internal_endpoint_not_routable[api-keys-validate]" time="0.199" /><testcase classname="tests.test_negative_security.TestInternalEndpointIsolation" name="test_health_endpoint_accessible" time="0.029" /><testcase classname="tests.test_negative_security.TestInternalEndpointIsolation" name="test_v1_models_via_maas_api_prefix" time="0.258" /><testcase classname="tests.test_subscription.TestAuthEnforcement" name="test_authorized_user_gets_200" time="0.210" /><testcase classname="tests.test_subscription.TestAuthEnforcement" name="test_no_auth_gets_401" time="0.038" /><testcase classname="tests.test_subscription.TestAuthEnforcement" name="test_invalid_token_gets_403" time="0.096" /><testcase classname="tests.test_subscription.TestAuthEnforcement" name="test_wrong_group_gets_403" time="0.057" /><testcase classname="tests.test_api_keys.TestAPIKeyCRUD" name="test_revoke_api_key" time="164.243" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_by_subscription_forbidden_for_non_admin" time="0.112" /><testcase classname="tests.test_api_keys.TestAPIKeyCRUD" name="test_create_api_key" time="164.983" /><testcase classname="tests.test_subscription.TestAPIKeySubscriptionBinding" name="test_create_api_key_uses_highest_priority_subscription" time="2.724" /><testcase classname="tests.test_subscription.TestAPIKeySubscriptionBinding" name="test_create_api_key_with_explicit_simulator_subscription" time="10.627" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_own_keys" time="167.062" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_admin_can_revoke_any_user" time="1.541" /><testcase classname="tests.test_subscription.TestOrderingEdgeCases" name="test_subscription_before_auth_policy" time="17.345" /><testcase classname="tests.test_subscription.TestAPIKeySubscriptionBinding" name="test_create_api_key_nonexistent_subscription_errors" time="13.130" /><testcase classname="tests.test_api_keys.TestAPIKeyBulkOperations" name="test_bulk_revoke_combined_user_and_subscription" time="16.451" /><testcase classname="tests.test_negative_security.TestMissingModelRef" name="test_authpolicy_with_nonexistent_model_ref" time="3.152" /><testcase classname="tests.test_negative_security.TestExpiredKeyRejection" name="test_expired_key_rejected_at_gateway" time="5.170" /><testcase classname="tests.test_subscription.TestE2ESubscriptionFlow" name="test_e2e_with_both_access_and_subscription_gets_200" time="13.144" /><testcase classname="tests.test_subscription.TestSubscriptionEnforcement" name="test_subscribed_user_gets_200" time="0.418" /><testcase classname="tests.test_subscription.TestE2ESubscriptionFlow" name="test_e2e_mint_api_key_denied_for_inaccessible_subscription" time="24.091" /><testcase classname="tests.test_subscription.TestE2ESubscriptionFlow" name="test_e2e_group_based_access_gets_200" time="15.050" /><testcase classname="tests.test_subscription.TestE2ESubscriptionFlow" name="test_e2e_multiple_subscriptions_separate_keys_gets_200" time="24.217" /><testcase classname="tests.test_subscription.TestE2ESubscriptionFlow" name="test_e2e_with_subscription_but_no_access_gets_403" time="15.328" /><testcase classname="tests.test_negative_security.TestHeaderSpoofing" name="test_duplicate_subscription_headers_ignored" time="10.135" /><testcase classname="tests.test_subscription.TestE2ESubscriptionFlow" name="test_e2e_group_based_subscription_but_no_auth_gets_403" time="12.303" /><testcase classname="tests.test_subscription.TestDegradedSubscriptionFiltering" name="test_degraded_healthy_model_allows_inference" time="14.657" /><testcase classname="tests.test_subscription.TestStatusReporting" name="test_subscription_failed_status_with_missing_model" time="92.879" /><testcase classname="tests.test_subscription.TestStatusReporting" name="test_authpolicy_active_status_with_valid_model" time="3.640" /><testcase classname="tests.test_subscription_list_endpoints.TestListSubscriptionsForModel" name="test_returns_subscriptions_for_model" time="33.546" /><testcase classname="tests.test_subscription.TestStatusReporting" name="test_authpolicy_failed_status_with_missing_model" time="106.904" /><testcase classname="tests.test_subscription.TestStatusReporting" name="test_subscription_status_transitions_on_model_deletion" time="139.524" /><testcase classname="tests.test_subscription.TestDegradedSubscriptionFiltering" name="test_models_endpoint_with_degraded_subscription_api_key" time="14.252" /><testcase classname="tests.test_subscription.TestStatusReporting" name="test_authpolicy_degraded_status_with_partial_models" time="130.457" /><testcase classname="tests.test_subscription_list_endpoints.TestListSubscriptionsForModel" name="test_unknown_model_returns_empty" time="0.766" /><testcase classname="tests.test_subscription_list_endpoints.TestSubscriptionModelAccessFiltering" name="test_omits_subscription_with_no_authorized_models" time="14.819" /><testcase classname="tests.test_subscription.TestStatusReporting" name="test_subscription_active_status_with_valid_model" time="125.012" /><testcase classname="tests.test_subscription.TestStatusReporting" name="test_subscription_degraded_status_with_partial_models" time="124.697" /><testcase classname="tests.test_subscription_list_endpoints.TestSubscriptionModelAccessFiltering" name="test_filters_unauthorized_models" time="30.685" /><testcase classname="tests.test_subscription_list_endpoints.TestListSubscriptions" name="test_unauthenticated_returns_401[subscriptions-for-model]" time="105.427" /><testcase classname="tests.test_subscription_list_endpoints.TestListSubscriptions" name="test_model_ref_display_name_and_description_enriched" time="56.262" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_empty_subscription_header_value" time="11.762" /><testcase classname="tests.test_subscription_list_endpoints.TestListSubscriptions" name="test_returns_accessible_subscriptions" time="5.853" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_user_token_returns_all_models" time="28.501" /><testcase classname="tests.test_subscription.TestDegradedSubscriptionFiltering" name="test_models_endpoint_with_degraded_subscription_kube_token" time="14.499" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_response_schema_and_metadata" time="5.367" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_api_key_with_inaccessible_subscription_403" time="15.592" /><testcase classname="tests.test_subscription_list_endpoints.TestListSubscriptions" name="test_unauthenticated_returns_401[all-subscriptions]" time="26.219" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_deduplication_same_model_multiple_refs" time="33.693" /><testcase classname="tests.test_subscription_list_endpoints.TestListSubscriptions" name="test_subscription_includes_model_refs" time="44.271" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_access_denied_to_subscription_403" time="31.523" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_api_key_with_deleted_subscription_403" time="44.233" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_user_token_with_subscription_header_filters" time="28.626" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_invalid_subscription_header_403" time="33.467" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_api_key_ignores_subscription_header" time="62.754" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_multiple_api_keys_different_subscriptions" time="26.111" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_service_account_token_multiple_subs_no_header" time="24.822" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_api_key_scoped_to_subscription" time="35.367" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_service_account_token_multiple_subs_with_header" time="25.058" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_multiple_distinct_models_in_subscription" time="54.165" /><testcase classname="tests.test_smoke" name="test_chat_completions_gateway_alive" time="0.453" /><testcase classname="tests.test_tenant.TestTenantLifecycle" name="test_tenant_ready_and_phase_healthy" time="0.460" /><testcase classname="tests.test_tenant.TestTenantContract" name="test_status_has_phase_and_conditions" time="0.147" /><testcase classname="tests.test_models_endpoint.TestModelsEndpoint" name="test_unauthenticated_request_401" time="0.090" /><testcase classname="tests.test_tenant.TestTenantContract" name="test_spec_is_well_formed" time="0.154" /><testcase classname="tests.test_tenant.TestTenantContract" name="test_conditions_use_kubernetes_metav1_shape" time="0.484" /><testcase classname="tests.test_tenant.TestTenantNoFalseOwnership" name="test_maas_user_crs_not_owned_by_tenant" time="0.472" /><testcase classname="tests.test_config_tenant.TestConfigAnchorPresence" name="test_cluster_config_default_exists" time="0.579" /><testcase classname="tests.test_config_tenant.TestConfigAnchorPresence" name="test_cluster_config_not_terminating" time="0.202" /><testcase classname="tests.test_config_tenant.TestConfigTenantOwnership" name="test_tenant_config_lists_config_owner_reference" time="0.153" /><testcase classname="tests.test_config_tenant.TestConfigTenantOwnership" name="test_maas_controller_deployment_does_not_list_config_owner_reference" time="0.171" /><testcase classname="tests.test_tenant_discovery" name="test_tenant_discovery_with_invalid_token" time="5.497" /><testcase classname="tests.test_config_tenant.TestConfigTenantOwnership" name="test_default_aitenant_lists_config_owner_reference" time="0.521" /><testcase classname="tests.test_tenant_discovery" name="test_tenant_discovery_requires_auth" time="5.143" /><testcase classname="tests.test_smoke" name="test_chat_completions_streaming_sse" time="0.305" /><testcase classname="tests.test_tenant_discovery" name="test_tenant_discovery_not_exposed_through_gateway" time="0.039" /><testcase classname="tests.test_aitenant_lifecycle.TestAITenantLifecycle" name="test_default_aitenant_bootstraps_maas_tenant_config_without_gateway_mutation" time="2.217" /><testcase classname="tests.test_smoke" name="test_healthz_or_404" time="0.026" /><testcase classname="tests.test_aitenant_lifecycle.TestAITenantLifecycle" name="test_aitenant_create_bootstrap_resources" time="68.071" /><testcase classname="tests.test_smoke" name="test_legacy_completions_optionally" time="0.292" /><testcase classname="tests.test_aitenant_lifecycle.TestAITenantLifecycle" name="test_aitenant_rejected_outside_ai_tenants_namespace" time="8.768" /><testcase classname="tests.test_aitenant_lifecycle.TestAITenantLifecycle" name="test_aitenant_delete_cleans_maas_resources_and_preserves_user_objects" time="70.908" /><testcase classname="tests.test_tenant_discovery" name="test_tenant_discovery_gateway_matches_deployment" time="0.001"><skipped type="pytest.skip" message="Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.">/workspace/source/test/maas-e2e/test/e2e/tests/test_tenant_discovery.py:155: Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.</skipped></testcase><testcase classname="tests.test_tenant_discovery" name="test_tenant_discovery_authenticated" time="0.001"><skipped type="pytest.skip" message="Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.">/workspace/source/test/maas-e2e/test/e2e/tests/test_tenant_discovery.py:79: Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.</skipped></testcase><testcase classname="tests.test_tenant_namespace_discovery.TestTenantNamespaceDiscovery" name="test_labeled_tenant_namespace_is_discovered" time="283.309"><failure message="AssertionError: maasauthpolicy/e2e-policy-b4d9a3d1 in ai-tenant-e2e-mt-b4d9a3d1 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;e2e-policy-b4d9a3d1&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-mt-b4d9a3d1&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name&quot;:&quot;facebook-opt-125m-simulated...&#10;[truncated; full report in element text]">self = &lt;test_tenant_namespace_discovery.TestTenantNamespaceDiscovery object at 0x7fcce9f2ac90&gt;

    def test_labeled_tenant_namespace_is_discovered(self):
        """1.1: Controller discovers labeled tenant namespaces and reconciles CRs."""
        case = new_discovery_case(use_default_gateway=True)
        try:
            apply_discovery_labels(case["tenant_ns"], case["tenant_label_name"])
            apply_tenant_cr(case["tenant_ns"], DEFAULT_GATEWAY_NAME)
            apply_maas_auth_policy(case["policy_name"], case["tenant_ns"])
            apply_maas_subscription(case["subscription_name"], case["tenant_ns"])
    
            wait_for_finalizer("maasauthpolicy", case["policy_name"], case["tenant_ns"], FINALIZER_AUTHPOLICY)
            wait_for_finalizer("maassubscription", case["subscription_name"], case["tenant_ns"], FINALIZER_SUBSCRIPTION)
&gt;           auth = wait_for_status_phase(
                "maasauthpolicy",
                case["policy_name"],
                case["tenant_ns"],
                expected_phase="Active",
            )

test/maas-e2e/test/e2e/tests/test_tenant_namespace_discovery.py:92: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'e2e-policy-b4d9a3d1'
namespace = 'ai-tenant-e2e-mt-b4d9a3d1'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7fcce9a33060&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/e2e-policy-b4d9a3d1 in ai-tenant-e2e-mt-b4d9a3d1 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"e2e-policy-b4d9a3d1","namespace":"ai-tenant-e2e-mt-b4d9a3d1"},"spec":{"modelRefs":[{"name":"facebook-opt-125m-simulated","namespace":"llm"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T17:45:09Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'e2e-policy-b4d9a3d1', 'namespace': 'ai-tenant-e2e-mt-b4d9a3d1', 'resourceVersion': '52432', 'uid': '369f5a61-53f5-49b4-9204-e333a6bf4130'}, 'spec': {'modelRefs': [{'name': 'facebook-opt-125m-simulated', 'namespace': 'llm'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T17:45:10Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/maas-gateway-auth to be accepted and enforced: AuthPolicy status observed generation 2, current generation is 29', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</failure></testcase><testcase classname="tests.test_tenant_namespace_discovery.TestTenantNamespaceDiscovery" name="test_unlabeled_namespace_ignored" time="107.039" /><testcase classname="tests.test_aitenant_lifecycle.TestAITenantLifecycle" name="test_aitenant_delete_releases_tenantconfig_finalizer" time="73.144" /><testcase classname="tests.test_smoke" name="test_tokens_endpoint_replaced_by_api_keys" time="0.475" /><testcase classname="tests.test_tenant_namespace_discovery.TestTenantNamespaceDiscovery" name="test_namespace_qualified_collision_prevention" time="205.640" /><testcase classname="tests.test_smoke" name="test_models_catalog" time="0.102" /><testcase classname="tests.test_tenant_namespace_discovery.TestTenantWebhookValidation" name="test_maassubscription_rejected_without_tenant_config_cr" time="8.372" /><testcase classname="tests.test_tenant_namespace_discovery.TestTenantWebhookValidation" name="test_maasauthpolicy_rejected_without_tenant_config_cr" time="8.414" /><testcase classname="tests.test_tenant_namespace_discovery.TestLegacyDefaultNamespaceStillWorks" name="test_models_as_a_service_namespace_reconciles" time="181.040"><failure message="AssertionError: maasauthpolicy/e2e-default-ns-e83e5da2 in models-as-a-service did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;e2e-default-ns-e83e5da2&quot;,&quot;namespace&quot;:&quot;models-as-a-service&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name&quot;:&quot;facebook-opt-125m-simulated&quot;,&quot;n...&#10;[truncated; full report in element text]">self = &lt;test_tenant_namespace_discovery.TestLegacyDefaultNamespaceStillWorks object at 0x7f634df49f10&gt;

    def test_models_as_a_service_namespace_reconciles(self):
        ns = legacy_default_namespace()
        suffix = uuid.uuid4().hex[:8]
        policy_name = f"e2e-default-ns-{suffix}"
        try:
            apply_maas_auth_policy(policy_name, ns)
            wait_for_finalizer("maasauthpolicy", policy_name, ns, FINALIZER_AUTHPOLICY)
&gt;           wait_for_status_phase("maasauthpolicy", policy_name, ns, expected_phase="Active")

test/maas-e2e/test/e2e/tests/test_tenant_namespace_discovery.py:394: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'e2e-default-ns-e83e5da2'
namespace = 'models-as-a-service'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f634dcc1260&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/e2e-default-ns-e83e5da2 in models-as-a-service did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"e2e-default-ns-e83e5da2","namespace":"models-as-a-service"},"spec":{"modelRefs":[{"name":"facebook-opt-125m-simulated","namespace":"llm"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T17:45:53Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'e2e-default-ns-e83e5da2', 'namespace': 'models-as-a-service', 'resourceVersion': '54381', 'uid': 'fb7027f2-a1e1-4640-84ad-5079e108b53a'}, 'spec': {'modelRefs': [{'name': 'facebook-opt-125m-simulated', 'namespace': 'llm'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T17:45:54Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/maas-gateway-auth to be accepted and enforced: AuthPolicy status observed generation 2, current generation is 38', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</failure></testcase><testcase classname="tests.test_aitenant_lifecycle.TestAITenantLifecycle" name="test_aitenant_migrates_and_removes_legacy_tenant" time="66.318" /><testcase classname="tests.test_aitenant_lifecycle.TestAITenantLifecycle" name="test_aitenant_derives_non_default_tenant_namespace" time="65.179" /><testcase classname="tests.test_tenant_namespace_discovery.TestTenantNamespaceDiscovery" name="test_per_tenant_oidc_configuration" time="0.487"><skipped type="pytest.skip" message="OIDC_ISSUER_URL not set; per-tenant OIDC E2E requires external OIDC deploy">/workspace/source/test/maas-e2e/test/e2e/tests/test_tenant_namespace_discovery.py:190: OIDC_ISSUER_URL not set; per-tenant OIDC E2E requires external OIDC deploy</skipped></testcase><testcase classname="tests.test_tenant_namespace_discovery.TestTenantNamespaceDiscovery" name="test_dynamic_discovery_after_label_added" time="267.266" /><testcase classname="tests.test_tenant_discovery_isolation" name="test_tenant_discovery_each_tenant_returns_own_gateway" time="105.938"><skipped type="pytest.skip" message="Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.">/workspace/source/test/maas-e2e/test/e2e/tests/test_tenant_discovery_isolation.py:228: Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.</skipped></testcase><testcase classname="tests.test_gateway_scoped_authpolicy.TestGatewayAuthPolicyStructure" name="test_gateway_auth_policy_contract" time="0.520" /><testcase classname="tests.test_gateway_scoped_authpolicy.TestGatewayAuthPolicyManagementEndpointAccess" name="test_gateway_default_auth_scoped_if_present" time="0.001"><skipped type="pytest.skip" message="legacy gateway-default-auth is scoped to the shared default gateway">/workspace/source/test/maas-e2e/test/e2e/tests/test_gateway_scoped_authpolicy.py:212: legacy gateway-default-auth is scoped to the shared default gateway</skipped></testcase><testcase classname="tests.test_multi_tenant_integration.TestMultiTenantIntegration" name="test_full_tenant_lifecycle_create_to_delete" time="424.332" /><testcase classname="tests.test_tenant_namespace_discovery.TestTenantNamespaceDiscovery" name="test_tenant_admin_rbac_is_namespace_scoped" time="193.313" /><testcase classname="tests.test_tenant_discovery_isolation" name="test_tenant_discovery_cross_tenant_isolation" time="119.190"><skipped type="pytest.skip" message="Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.">/workspace/source/test/maas-e2e/test/e2e/tests/test_tenant_discovery_isolation.py:141: Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.</skipped></testcase><testcase classname="tests.test_gateway_scoped_authpolicy.TestGatewayAuthPolicyLifecycle" name="test_only_one_gateway_authpolicy_named_maas_gateway_auth" time="0.394" /><testcase classname="tests.test_tenant_discovery_isolation" name="test_tenant_discovery_unauthorized_access" time="137.340" /><testcase classname="tests.test_gateway_scoped_authpolicy.TestGatewayAuthPolicyManagementEndpointAccess" name="test_management_rules_have_model_identity_guards" time="0.176" /><testcase classname="tests.test_tenant_namespace_discovery.TestTenantNamespaceDiscovery" name="test_label_removal_stops_reconciliation" time="117.524" /><testcase classname="tests.test_gateway_scoped_authpolicy.TestGatewayAuthPolicyLifecycle" name="test_gateway_auth_rego_is_fixed_size" time="3.782" /><testcase classname="tests.test_tenant_discovery_isolation" name="test_tenant_discovery_same_tenant_access" time="164.503"><skipped type="pytest.skip" message="Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.">/workspace/source/test/maas-e2e/test/e2e/tests/test_tenant_discovery_isolation.py:93: Skipping when Gateway uses ClusterIP + OpenShift Route (unsupported configuration). This mixes incompatible routing paradigms. Gateway has no external hostname in spec.listeners, so /v1/tenants returns an error. Supported configuration: LoadBalancer service with hostname in spec.listeners.</skipped></testcase><testcase classname="tests.test_multi_tenant_integration.TestMultiTenantIntegration" name="test_tenant_namespace_label_change_triggers_reconciliation" time="123.180" /><testcase classname="tests.test_multi_tenant_maas_api.TestPerTenantMaaSAPI" name="test_aitenant_creates_dedicated_maas_api_infrastructure" time="166.751" /><testcase classname="tests.test_multi_tenant_integration.TestMultiTenantIntegration" name="test_same_named_resources_across_tenants" time="205.333" /><testcase classname="tests.test_multi_tenant_maas_api.TestPerTenantMaaSAPI" name="test_tenant_name_environment_variable_set" time="165.157" /><testcase classname="tests.test_multi_tenant_maas_api.TestPerTenantMaaSAPI" name="test_service_routing_isolation" time="170.086" /><testcase classname="tests.test_multi_tenant_maas_api.TestPerTenantMaaSAPI" name="test_httproute_tenant_attachment" time="173.289" /><testcase classname="tests.test_multi_tenant_maas_api.TestPerTenantMaaSAPI" name="test_default_and_multiple_tenants_coexist" time="359.019" /><testcase classname="tests.test_multi_tenant_integration.TestMultiTenantIntegration" name="test_default_tenant_unaffected_by_multitenancy_enablement" time="135.313" /><testcase classname="tests.test_tenant_model_inference.TestTenantModelInference" name="test_model_routes_through_tenant_gateway" time="540.080" /><testcase classname="tests.test_tenant_model_inference.TestTenantModelInference" name="test_inference_succeeds_through_tenant_gateway[tenant_a]" time="2.262" /><testcase classname="tests.test_tenant_model_inference.TestTenantBodyRouting" name="test_each_tenant_routes_to_own_model" time="135.874" /><testcase classname="tests.test_tenant_model_inference.TestTenantGatewayNegativeSecurity" name="test_missing_api_key_denied_on_tenant_gateway[tenant_b]" time="975.483"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-d5b905-auth in ai-tenant-e2e-inf-b-d5b905 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-d5b905-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-b-d5b905&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-d5b905-auth'
namespace = 'ai-tenant-e2e-inf-b-d5b905'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f0ce000fd80&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-d5b905-auth in ai-tenant-e2e-inf-b-d5b905 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-d5b905-auth","namespace":"ai-tenant-e2e-inf-b-d5b905"},"spec":{"modelRefs":[{"name":"test-model-d5b905","namespace":"ai-tenant-e2e-inf-b-d5b905"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:12Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-d5b905-auth', 'namespace': 'ai-tenant-e2e-inf-b-d5b905', 'resourceVersion': '92902', 'uid': '875dac32-ab5e-4d83-9071-2d421e64e5dd'}, 'spec': {'modelRefs': [{'name': 'test-model-d5b905', 'namespace': 'ai-tenant-e2e-inf-b-d5b905'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:12Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-b-d5b905-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (90054946b412d9a5438caf17da75c157a0023d02361bd193d12f14d04128e137) AuthConfig (e71ef6dce14bc1880fc8dc805c7c5777a1f9104647ef14bf5b26e628d65799bf) AuthConfig (a7c36b579cbc6f5f7f3167414a773bba4556d9115e3a70e5fb01b634e6528b0f) AuthConfig (760c2e4e97e20ff89daed983874240e10076c6d47e8eb39026c4b9951240dc24) AuthConfig (c01a0279692db076722c7a97236af851947466691081083a345a4dc7a9cd8a13) AuthConfig (f92ae3e587b5f21e8c867744cc89036e9b954bc84f3ad85f68d502ca9ebcf934) AuthConfig (dfdfe021c671820500218705f78356360da3d71c7dbf41ba275506b797e6abc9) AuthConfig (503a49fee2aa0976bdba9bbe2b961deaeac239413ed127c4c7f2ae25c984260d) AuthConfig (54b31c1d15eb2cb6c35449414f94ee2497e8c498bec5d70c14a48c33667a06f2) AuthConfig (f5676996769e69660f916b160074c202b3b6343b49d9bc714d0b205a66016078) AuthConfig (c875289f70e19a306ea46aeeafcca6d9b9c014363b05c849f60b3321a0bfe29a) AuthConfig (e51373f7fc45fbb4f06146022d05574a3d8c72bbeeecf562ef18332617da4a37) AuthConfig (6f43e8120714d44588eefa727269a91eb710cf74acbd013abb9e888adc2c65c9) AuthConfig (9729779596f96bf5df53d3fe66b46a25c4e192ac4f3bbf12a35693f13440ec11) AuthConfig (b3e4d611924a0331e5bb4094b1d778a1461a7838e71772db9ae3e61df12874f0) AuthConfig (8c940ea4e98a78d831a0f752d2775901e4775ebd12446fde907865c1fea5f02b) AuthConfig (93f32aa47ddcec70c791d114cfa26fd547a3c8f9087ba47b1d1f5ab52257d4b0) AuthConfig (99f99256337adb620a66730d60affba61fbf3e3f52b0b33c15125aac5b79f19f)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantGatewayNegativeSecurity" name="test_forged_identity_headers_denied_on_tenant_gateway[tenant_b]" time="0.001"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-d5b905-auth in ai-tenant-e2e-inf-b-d5b905 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-d5b905-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-b-d5b905&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-d5b905-auth'
namespace = 'ai-tenant-e2e-inf-b-d5b905'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f0ce000fd80&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-d5b905-auth in ai-tenant-e2e-inf-b-d5b905 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-d5b905-auth","namespace":"ai-tenant-e2e-inf-b-d5b905"},"spec":{"modelRefs":[{"name":"test-model-d5b905","namespace":"ai-tenant-e2e-inf-b-d5b905"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:12Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-d5b905-auth', 'namespace': 'ai-tenant-e2e-inf-b-d5b905', 'resourceVersion': '92902', 'uid': '875dac32-ab5e-4d83-9071-2d421e64e5dd'}, 'spec': {'modelRefs': [{'name': 'test-model-d5b905', 'namespace': 'ai-tenant-e2e-inf-b-d5b905'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:12Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-b-d5b905-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (90054946b412d9a5438caf17da75c157a0023d02361bd193d12f14d04128e137) AuthConfig (e71ef6dce14bc1880fc8dc805c7c5777a1f9104647ef14bf5b26e628d65799bf) AuthConfig (a7c36b579cbc6f5f7f3167414a773bba4556d9115e3a70e5fb01b634e6528b0f) AuthConfig (760c2e4e97e20ff89daed983874240e10076c6d47e8eb39026c4b9951240dc24) AuthConfig (c01a0279692db076722c7a97236af851947466691081083a345a4dc7a9cd8a13) AuthConfig (f92ae3e587b5f21e8c867744cc89036e9b954bc84f3ad85f68d502ca9ebcf934) AuthConfig (dfdfe021c671820500218705f78356360da3d71c7dbf41ba275506b797e6abc9) AuthConfig (503a49fee2aa0976bdba9bbe2b961deaeac239413ed127c4c7f2ae25c984260d) AuthConfig (54b31c1d15eb2cb6c35449414f94ee2497e8c498bec5d70c14a48c33667a06f2) AuthConfig (f5676996769e69660f916b160074c202b3b6343b49d9bc714d0b205a66016078) AuthConfig (c875289f70e19a306ea46aeeafcca6d9b9c014363b05c849f60b3321a0bfe29a) AuthConfig (e51373f7fc45fbb4f06146022d05574a3d8c72bbeeecf562ef18332617da4a37) AuthConfig (6f43e8120714d44588eefa727269a91eb710cf74acbd013abb9e888adc2c65c9) AuthConfig (9729779596f96bf5df53d3fe66b46a25c4e192ac4f3bbf12a35693f13440ec11) AuthConfig (b3e4d611924a0331e5bb4094b1d778a1461a7838e71772db9ae3e61df12874f0) AuthConfig (8c940ea4e98a78d831a0f752d2775901e4775ebd12446fde907865c1fea5f02b) AuthConfig (93f32aa47ddcec70c791d114cfa26fd547a3c8f9087ba47b1d1f5ab52257d4b0) AuthConfig (99f99256337adb620a66730d60affba61fbf3e3f52b0b33c15125aac5b79f19f)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantModelInference" name="test_tenant_isolation_cross_gateway_blocked" time="969.415"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-2c9b1d-auth in ai-tenant-e2e-inf-b-2c9b1d did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-2c9b1d-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-b-2c9b1d&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-2c9b1d-auth'
namespace = 'ai-tenant-e2e-inf-b-2c9b1d'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f200f280220&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-2c9b1d-auth in ai-tenant-e2e-inf-b-2c9b1d did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-2c9b1d-auth","namespace":"ai-tenant-e2e-inf-b-2c9b1d"},"spec":{"modelRefs":[{"name":"test-model-2c9b1d","namespace":"ai-tenant-e2e-inf-b-2c9b1d"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:11Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-2c9b1d-auth', 'namespace': 'ai-tenant-e2e-inf-b-2c9b1d', 'resourceVersion': '92897', 'uid': 'd5e3c846-b831-419e-becf-c8dcbc2a7238'}, 'spec': {'modelRefs': [{'name': 'test-model-2c9b1d', 'namespace': 'ai-tenant-e2e-inf-b-2c9b1d'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:12Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-b-2c9b1d-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (ec394103ab80a5a0037d11ddbe4489c8edd7a7fe7c0f9f099e9300059cc85cae) AuthConfig (12f96ce8b1f9ce52ee2ef4ed3da67b4fe6d12135f438499cdfca63a685e0118c) AuthConfig (065f845b565d0acac61b120dfcca13ad93b6a82dc5f492403b7cfa75b86f19b5) AuthConfig (b02be290c6507138a34032f25cd10d2ddc735b6977cd87a99efa37bdcc61dbb4) AuthConfig (2583ed3069ea64af538be5da282483087f59bdde7d196771c3736b46056f1184) AuthConfig (467edcaa73c5a1aa9a8160ece9e65f31cec895d1d16aa984d827e6831e6d35ba) AuthConfig (45eb67d75c1d00aa652e594fd30a34d990819fbf963182b97072a74f06b28d7d) AuthConfig (45914e71de64f0b78ccab640767a249750f7ab00d8b2f1d2a6cb700fd24940b4) AuthConfig (f5885909e2e61c1abdd02c3ba3c7e81372b01f8421d3d94ee3a55493f29ce28a) AuthConfig (f43b2718fee3ae1e3098c6e4fb6f75f530b4e6ee9e5b504f1fe457dd41082f5e) AuthConfig (202b21b3a341c6ff122dda11488086fc891fcdbf4774ce773c98be1eafbbeb5e) AuthConfig (54c8812c5de7ac5e98acc523e5371b07eb9ed2dddfd8186a5c6aa2b924eeaa81) AuthConfig (04336c1fbc0fd297688635bc618897811690c7e07e54fbfbd02a79467e25d0dd) AuthConfig (28b144b433d79e6f4bc597e8ef0efc38ae9e36a1d647ad9ac216dd573a73909f) AuthConfig (18165baced909811a537b4a4e3d5d91726652385c69d1a23a4662008e54a9413) AuthConfig (81bc1000a6e7ce7eded4690766e819a2482f7e7265272b3627ce4b1d0911cdc3) AuthConfig (c4aefefc62fff0c1e9ab88627a16133290970f6f91b6139ee2c324c5604a33bb) AuthConfig (318137f1b58057799bd10eb5d09aa96e6d8a2bc0c6132ef66425143b1aa18886)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantBodyRouting" name="test_model_in_body_routing[correct-model]" time="61.600"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-2c9b1d-auth in ai-tenant-e2e-inf-b-2c9b1d did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-2c9b1d-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-b-2c9b1d&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-2c9b1d-auth'
namespace = 'ai-tenant-e2e-inf-b-2c9b1d'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f200f280220&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-2c9b1d-auth in ai-tenant-e2e-inf-b-2c9b1d did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-2c9b1d-auth","namespace":"ai-tenant-e2e-inf-b-2c9b1d"},"spec":{"modelRefs":[{"name":"test-model-2c9b1d","namespace":"ai-tenant-e2e-inf-b-2c9b1d"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:11Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-2c9b1d-auth', 'namespace': 'ai-tenant-e2e-inf-b-2c9b1d', 'resourceVersion': '92897', 'uid': 'd5e3c846-b831-419e-becf-c8dcbc2a7238'}, 'spec': {'modelRefs': [{'name': 'test-model-2c9b1d', 'namespace': 'ai-tenant-e2e-inf-b-2c9b1d'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:12Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-b-2c9b1d-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (ec394103ab80a5a0037d11ddbe4489c8edd7a7fe7c0f9f099e9300059cc85cae) AuthConfig (12f96ce8b1f9ce52ee2ef4ed3da67b4fe6d12135f438499cdfca63a685e0118c) AuthConfig (065f845b565d0acac61b120dfcca13ad93b6a82dc5f492403b7cfa75b86f19b5) AuthConfig (b02be290c6507138a34032f25cd10d2ddc735b6977cd87a99efa37bdcc61dbb4) AuthConfig (2583ed3069ea64af538be5da282483087f59bdde7d196771c3736b46056f1184) AuthConfig (467edcaa73c5a1aa9a8160ece9e65f31cec895d1d16aa984d827e6831e6d35ba) AuthConfig (45eb67d75c1d00aa652e594fd30a34d990819fbf963182b97072a74f06b28d7d) AuthConfig (45914e71de64f0b78ccab640767a249750f7ab00d8b2f1d2a6cb700fd24940b4) AuthConfig (f5885909e2e61c1abdd02c3ba3c7e81372b01f8421d3d94ee3a55493f29ce28a) AuthConfig (f43b2718fee3ae1e3098c6e4fb6f75f530b4e6ee9e5b504f1fe457dd41082f5e) AuthConfig (202b21b3a341c6ff122dda11488086fc891fcdbf4774ce773c98be1eafbbeb5e) AuthConfig (54c8812c5de7ac5e98acc523e5371b07eb9ed2dddfd8186a5c6aa2b924eeaa81) AuthConfig (04336c1fbc0fd297688635bc618897811690c7e07e54fbfbd02a79467e25d0dd) AuthConfig (28b144b433d79e6f4bc597e8ef0efc38ae9e36a1d647ad9ac216dd573a73909f) AuthConfig (18165baced909811a537b4a4e3d5d91726652385c69d1a23a4662008e54a9413) AuthConfig (81bc1000a6e7ce7eded4690766e819a2482f7e7265272b3627ce4b1d0911cdc3) AuthConfig (c4aefefc62fff0c1e9ab88627a16133290970f6f91b6139ee2c324c5604a33bb) AuthConfig (318137f1b58057799bd10eb5d09aa96e6d8a2bc0c6132ef66425143b1aa18886)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantGatewayNegativeSecurity" name="test_forged_identity_headers_denied_on_tenant_gateway[tenant_a]" time="844.639"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-96768b-auth in ai-tenant-e2e-inf-a-96768b did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-96768b-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-a-96768b&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-96768b-auth'
namespace = 'ai-tenant-e2e-inf-a-96768b'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f0de5ca8f40&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-96768b-auth in ai-tenant-e2e-inf-a-96768b did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-96768b-auth","namespace":"ai-tenant-e2e-inf-a-96768b"},"spec":{"modelRefs":[{"name":"test-model-96768b","namespace":"ai-tenant-e2e-inf-a-96768b"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:23Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-96768b-auth', 'namespace': 'ai-tenant-e2e-inf-a-96768b', 'resourceVersion': '92670', 'uid': '2d38c13b-3031-4024-a992-a581a5bbdee2'}, 'spec': {'modelRefs': [{'name': 'test-model-96768b', 'namespace': 'ai-tenant-e2e-inf-a-96768b'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:23Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-a-96768b-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (fa46732204eb89640e5c7dc9f1fec0565445a1590770bdb5b9680ad460524601) AuthConfig (c8b401de911d1dbbb8e0f0a90215153564d1a8bdc262854e7a5ebc47661a86a2) AuthConfig (62c0c13d1acbab70e7123ffe848f0ddefe132695700d42a9314893b0806882ac) AuthConfig (ae2e4fc6474bb4cdb2954fb3af943b971272614f69b9c0fb93e802b42a1fbb02) AuthConfig (44daef693b53a5e2d0bd9fe555d68d88986cab14406cc6e26d3c53047fbef9e3) AuthConfig (d54feed3057080898d119a577ef323c16cbf984a8d48363a6b2a2b0db7f7f7c0) AuthConfig (06c3827491d62b5ad14c6002a1b1df526875259613f16c1425a0ef56772ff451) AuthConfig (903c48c42a8a8e738fafa39ae4474b38457c6d2d40c855adef2003ac222a5495) AuthConfig (d032b4be85c14bd85b3cdb48ae0b60ed624ab87f3dfb887cafa6b4e58196b81f) AuthConfig (efe93d371e218cebff84335881df373d04a2d8d08e4d0b77d51610929e9491ec) AuthConfig (6a6a6f09b986a76d785507410d89290d2fc0f387cc21316d73657bc37f124d09) AuthConfig (00af1f4ba52fe85885f63c85db849f5287cad03e9086980b1b6d5008d4fd5eba) AuthConfig (ae431b91451acc0975df21ea35721fdc359577f76c3b80aba4353224aadaf42e) AuthConfig (a9f2cc1d28d9d483cc4a0aa0e2f266d4319367e86c4b8c82ced21a5d831d2e59) AuthConfig (a4be2e5aea88ac1bc94927e9a7f22d9d4f7233fe0d0a099fc8173b7d2458b09a) AuthConfig (e7430dafbb4f44cb2bf341e6991d8820e5c03f464735c0154346432a8430fe99) AuthConfig (5512ae15c1f111aa854920b49de312a06d12c6af90a50fd4f4dff40fde09bb68) AuthConfig (2476976496d1732c32843f25f37b78cfb2158d2fafede889f853fe71893d55c4)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantBodyRouting" name="test_model_in_body_routing[wrong-model]" time="119.488"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-96768b-auth in ai-tenant-e2e-inf-a-96768b did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-96768b-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-a-96768b&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-96768b-auth'
namespace = 'ai-tenant-e2e-inf-a-96768b'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f0de5ca8f40&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-96768b-auth in ai-tenant-e2e-inf-a-96768b did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-96768b-auth","namespace":"ai-tenant-e2e-inf-a-96768b"},"spec":{"modelRefs":[{"name":"test-model-96768b","namespace":"ai-tenant-e2e-inf-a-96768b"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:23Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-96768b-auth', 'namespace': 'ai-tenant-e2e-inf-a-96768b', 'resourceVersion': '92670', 'uid': '2d38c13b-3031-4024-a992-a581a5bbdee2'}, 'spec': {'modelRefs': [{'name': 'test-model-96768b', 'namespace': 'ai-tenant-e2e-inf-a-96768b'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:23Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-a-96768b-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (fa46732204eb89640e5c7dc9f1fec0565445a1590770bdb5b9680ad460524601) AuthConfig (c8b401de911d1dbbb8e0f0a90215153564d1a8bdc262854e7a5ebc47661a86a2) AuthConfig (62c0c13d1acbab70e7123ffe848f0ddefe132695700d42a9314893b0806882ac) AuthConfig (ae2e4fc6474bb4cdb2954fb3af943b971272614f69b9c0fb93e802b42a1fbb02) AuthConfig (44daef693b53a5e2d0bd9fe555d68d88986cab14406cc6e26d3c53047fbef9e3) AuthConfig (d54feed3057080898d119a577ef323c16cbf984a8d48363a6b2a2b0db7f7f7c0) AuthConfig (06c3827491d62b5ad14c6002a1b1df526875259613f16c1425a0ef56772ff451) AuthConfig (903c48c42a8a8e738fafa39ae4474b38457c6d2d40c855adef2003ac222a5495) AuthConfig (d032b4be85c14bd85b3cdb48ae0b60ed624ab87f3dfb887cafa6b4e58196b81f) AuthConfig (efe93d371e218cebff84335881df373d04a2d8d08e4d0b77d51610929e9491ec) AuthConfig (6a6a6f09b986a76d785507410d89290d2fc0f387cc21316d73657bc37f124d09) AuthConfig (00af1f4ba52fe85885f63c85db849f5287cad03e9086980b1b6d5008d4fd5eba) AuthConfig (ae431b91451acc0975df21ea35721fdc359577f76c3b80aba4353224aadaf42e) AuthConfig (a9f2cc1d28d9d483cc4a0aa0e2f266d4319367e86c4b8c82ced21a5d831d2e59) AuthConfig (a4be2e5aea88ac1bc94927e9a7f22d9d4f7233fe0d0a099fc8173b7d2458b09a) AuthConfig (e7430dafbb4f44cb2bf341e6991d8820e5c03f464735c0154346432a8430fe99) AuthConfig (5512ae15c1f111aa854920b49de312a06d12c6af90a50fd4f4dff40fde09bb68) AuthConfig (2476976496d1732c32843f25f37b78cfb2158d2fafede889f853fe71893d55c4)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_auth_isolation.TestTenantAuthIsolation" name="test_api_key_creation_scoped_to_tenant" time="535.674"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/e2e-auth-iso-664e79 in ai-tenant-e2e-shared-a-w3-557feb did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;e2e-auth-iso-664e79&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-shared-a-w3-557feb&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[...&#10;[truncated; full report in element text]">tenant_env = ({'name': 'e2e-shared-a-w3-557feb', 'namespace': 'ai-tenant-e2e-shared-a-w3-557feb', 'base_url': 'https://e2e-shared-a...-b-w3-227939.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/maas-api', 'model_name': 'auth-test-model-227939', ...})

    @pytest.fixture(scope="module")
    def tenant_auth_setup(tenant_env):
        tenant_a, tenant_b = tenant_env
        suffix = uuid.uuid4().hex[:6]
        policy_name = f"e2e-auth-iso-{suffix}"
        subscription_name = f"e2e-auth-iso-{suffix}"
        try:
            for tenant in tenant_env:
&gt;               make_tenant_model_accessible(
                    tenant["model_name"],
                    tenant["namespace"],
                    policy_name,
                    subscription_name,
                    gateway_name=tenant["gateway_name"],
                    trlp_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )

test/maas-e2e/test/e2e/tests/test_tenant_auth_isolation.py:135: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'e2e-auth-iso-664e79'
namespace = 'ai-tenant-e2e-shared-a-w3-557feb'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f1a728f8040&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/e2e-auth-iso-664e79 in ai-tenant-e2e-shared-a-w3-557feb did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"e2e-auth-iso-664e79","namespace":"ai-tenant-e2e-shared-a-w3-557feb"},"spec":{"modelRefs":[{"name":"auth-test-model-557feb","namespace":"ai-tenant-e2e-shared-a-w3-557feb"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:08:31Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'e2e-auth-iso-664e79', 'namespace': 'ai-tenant-e2e-shared-a-w3-557feb', 'resourceVersion': '104000', 'uid': '80fc9104-8519-43be-8f08-a455c1a7f9b9'}, 'spec': {'modelRefs': [{'name': 'auth-test-model-557feb', 'namespace': 'ai-tenant-e2e-shared-a-w3-557feb'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:08:38Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-shared-a-w3-557feb-maas-auth to be accepted and enforced: AuthPolicy status has not reported an observed generation', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_auth_isolation.TestTenantAuthIsolation" name="test_api_key_validates_against_correct_tenant" time="122.596"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/e2e-auth-iso-664e79 in ai-tenant-e2e-shared-a-w3-557feb did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;e2e-auth-iso-664e79&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-shared-a-w3-557feb&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[...&#10;[truncated; full report in element text]">tenant_env = ({'name': 'e2e-shared-a-w3-557feb', 'namespace': 'ai-tenant-e2e-shared-a-w3-557feb', 'base_url': 'https://e2e-shared-a...-b-w3-227939.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/maas-api', 'model_name': 'auth-test-model-227939', ...})

    @pytest.fixture(scope="module")
    def tenant_auth_setup(tenant_env):
        tenant_a, tenant_b = tenant_env
        suffix = uuid.uuid4().hex[:6]
        policy_name = f"e2e-auth-iso-{suffix}"
        subscription_name = f"e2e-auth-iso-{suffix}"
        try:
            for tenant in tenant_env:
&gt;               make_tenant_model_accessible(
                    tenant["model_name"],
                    tenant["namespace"],
                    policy_name,
                    subscription_name,
                    gateway_name=tenant["gateway_name"],
                    trlp_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )

test/maas-e2e/test/e2e/tests/test_tenant_auth_isolation.py:135: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'e2e-auth-iso-664e79'
namespace = 'ai-tenant-e2e-shared-a-w3-557feb'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f1a728f8040&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/e2e-auth-iso-664e79 in ai-tenant-e2e-shared-a-w3-557feb did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"e2e-auth-iso-664e79","namespace":"ai-tenant-e2e-shared-a-w3-557feb"},"spec":{"modelRefs":[{"name":"auth-test-model-557feb","namespace":"ai-tenant-e2e-shared-a-w3-557feb"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:08:31Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'e2e-auth-iso-664e79', 'namespace': 'ai-tenant-e2e-shared-a-w3-557feb', 'resourceVersion': '104000', 'uid': '80fc9104-8519-43be-8f08-a455c1a7f9b9'}, 'spec': {'modelRefs': [{'name': 'auth-test-model-557feb', 'namespace': 'ai-tenant-e2e-shared-a-w3-557feb'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:08:38Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-shared-a-w3-557feb-maas-auth to be accepted and enforced: AuthPolicy status has not reported an observed generation', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantModelInference" name="test_auth_envoyfilters_select_their_gateway_workloads" time="844.634"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-872354-auth in ai-tenant-e2e-inf-a-872354 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-872354-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-a-872354&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-872354-auth'
namespace = 'ai-tenant-e2e-inf-a-872354'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7fcce9fe3880&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-872354-auth in ai-tenant-e2e-inf-a-872354 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-872354-auth","namespace":"ai-tenant-e2e-inf-a-872354"},"spec":{"modelRefs":[{"name":"test-model-872354","namespace":"ai-tenant-e2e-inf-a-872354"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:23Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-872354-auth', 'namespace': 'ai-tenant-e2e-inf-a-872354', 'resourceVersion': '92711', 'uid': '467b0a83-b7b4-42b5-a801-972c372d4f81'}, 'spec': {'modelRefs': [{'name': 'test-model-872354', 'namespace': 'ai-tenant-e2e-inf-a-872354'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:23Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-a-872354-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (7886e3b70984a327ce3c2e75e14c26c9b318451460b371aea2d23dffdad2f652) AuthConfig (6b3d8e93e66331cc0670ea6b7d060ec60b0bbed480b475adcd732ccc78f2d5a4) AuthConfig (4882d787c925be03f76af45e1dea8c13cc171e11073055da1aa486afd51e075e) AuthConfig (025d6477efa378b1a78b341bbce364d4a44de02ecd31c693723a724a51007caa) AuthConfig (6993f8c3ad62c42ae9ed35147c9b8296ed8ee926a6a50ca742e3ea256a422f33) AuthConfig (bc6e243a94b5be0674559773dee64d0a442aa716d1a9c7a8bda24435fbc73774) AuthConfig (449bfb7baf30e0985931cad678fb99b62037fbae5423fc59493b7e0ee64e5df7) AuthConfig (d3822a0eeefd0bff71e886a7ea7ed52077d9bafeba14879642e45c3a6d4ac374) AuthConfig (0defa0869115927c6a338042083c7fe094034505350c1e81a3a4526bc05971ff) AuthConfig (c9676dc1aca4c197d656ba41aff943a6536bf420137b8dae67cd35a833862d1d) AuthConfig (946004b250c5671ccf5688af46a207990a3905e7606e29ab566c9346a43fbe22) AuthConfig (6432a4927c44f58f2c5c2733eabbee92c4109d9c5dcbda1ece6d7c21bc20ffaf) AuthConfig (8f7c8655638844821a6f3e853cc78d7c814d82b06f001c306e1c8a866dc39c85) AuthConfig (ce23aed649198acc5a3fa1cf83a13bd80992df6824ea2704b50a6c0ebd3fcd91) AuthConfig (798fdded8c2049173ff1d933adc86e557e03d9bb6988eb86840936f0fe139572) AuthConfig (e87e5af0e4cfb3a496493cafd1bb94d52db02a40820562843d68c29bb67fbac7) AuthConfig (392374c08929ea4a4f58bb6f5e9176a082289036ba884ae9805828343d515f45) AuthConfig (05566fad0be375c73cd3f7c3395f4d8755830a0f2dc533a089b8e5d3abbf8f3d)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantBodyRouting" name="test_model_in_body_routing[missing-model]" time="72.597"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-872354-auth in ai-tenant-e2e-inf-a-872354 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-872354-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-a-872354&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-872354-auth'
namespace = 'ai-tenant-e2e-inf-a-872354'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7fcce9fe3880&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-872354-auth in ai-tenant-e2e-inf-a-872354 did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-872354-auth","namespace":"ai-tenant-e2e-inf-a-872354"},"spec":{"modelRefs":[{"name":"test-model-872354","namespace":"ai-tenant-e2e-inf-a-872354"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:23Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-872354-auth', 'namespace': 'ai-tenant-e2e-inf-a-872354', 'resourceVersion': '92711', 'uid': '467b0a83-b7b4-42b5-a801-972c372d4f81'}, 'spec': {'modelRefs': [{'name': 'test-model-872354', 'namespace': 'ai-tenant-e2e-inf-a-872354'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:23Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-a-872354-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (7886e3b70984a327ce3c2e75e14c26c9b318451460b371aea2d23dffdad2f652) AuthConfig (6b3d8e93e66331cc0670ea6b7d060ec60b0bbed480b475adcd732ccc78f2d5a4) AuthConfig (4882d787c925be03f76af45e1dea8c13cc171e11073055da1aa486afd51e075e) AuthConfig (025d6477efa378b1a78b341bbce364d4a44de02ecd31c693723a724a51007caa) AuthConfig (6993f8c3ad62c42ae9ed35147c9b8296ed8ee926a6a50ca742e3ea256a422f33) AuthConfig (bc6e243a94b5be0674559773dee64d0a442aa716d1a9c7a8bda24435fbc73774) AuthConfig (449bfb7baf30e0985931cad678fb99b62037fbae5423fc59493b7e0ee64e5df7) AuthConfig (d3822a0eeefd0bff71e886a7ea7ed52077d9bafeba14879642e45c3a6d4ac374) AuthConfig (0defa0869115927c6a338042083c7fe094034505350c1e81a3a4526bc05971ff) AuthConfig (c9676dc1aca4c197d656ba41aff943a6536bf420137b8dae67cd35a833862d1d) AuthConfig (946004b250c5671ccf5688af46a207990a3905e7606e29ab566c9346a43fbe22) AuthConfig (6432a4927c44f58f2c5c2733eabbee92c4109d9c5dcbda1ece6d7c21bc20ffaf) AuthConfig (8f7c8655638844821a6f3e853cc78d7c814d82b06f001c306e1c8a866dc39c85) AuthConfig (ce23aed649198acc5a3fa1cf83a13bd80992df6824ea2704b50a6c0ebd3fcd91) AuthConfig (798fdded8c2049173ff1d933adc86e557e03d9bb6988eb86840936f0fe139572) AuthConfig (e87e5af0e4cfb3a496493cafd1bb94d52db02a40820562843d68c29bb67fbac7) AuthConfig (392374c08929ea4a4f58bb6f5e9176a082289036ba884ae9805828343d515f45) AuthConfig (05566fad0be375c73cd3f7c3395f4d8755830a0f2dc533a089b8e5d3abbf8f3d)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantGatewayNegativeSecurity" name="test_missing_api_key_denied_on_tenant_gateway[tenant_a]" time="1026.519"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-b2fc9f-auth in ai-tenant-e2e-inf-b-b2fc9f did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-b2fc9f-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-b-b2fc9f&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-b2fc9f-auth'
namespace = 'ai-tenant-e2e-inf-b-b2fc9f'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f0c1372f4c0&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-b2fc9f-auth in ai-tenant-e2e-inf-b-b2fc9f did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-b2fc9f-auth","namespace":"ai-tenant-e2e-inf-b-b2fc9f"},"spec":{"modelRefs":[{"name":"test-model-b2fc9f","namespace":"ai-tenant-e2e-inf-b-b2fc9f"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:10Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-b2fc9f-auth', 'namespace': 'ai-tenant-e2e-inf-b-b2fc9f', 'resourceVersion': '92883', 'uid': 'ac66a8f8-0196-4078-9fe8-34171799ecc7'}, 'spec': {'modelRefs': [{'name': 'test-model-b2fc9f', 'namespace': 'ai-tenant-e2e-inf-b-b2fc9f'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:10Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-b-b2fc9f-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (402a613e0006994f2ca8d1e136b2395ecd6b553fd4d50352429c2f64ceb178aa) AuthConfig (a246796480d71ca9280e6ed6d8b23cbefaa85aa02c14f913cf3d3b9c2e745096) AuthConfig (382887bdb062f7d303180b65568a123d07435d2f8318cc785dc401be686706bb) AuthConfig (518c90fdbb471b9ea541b1b1ef39d1fccefe00a34df78f93e96982508c9ca59a) AuthConfig (7cc875c29c6cc2a3eccf8226e9fabc353871efccde2ef98e44a27db3875f907c) AuthConfig (162051dc09da331a9cd57c7f960eea4eb54575c1342d2700070289fe724c2690) AuthConfig (9a87692e97f3ceb1165dbb798a9f53ffd33e9dddfc25974a5efd5c0081f218b0) AuthConfig (308c81e0a4d6bfe471d3081cb355709487e4b398d1ac040dc12d0d545671456f) AuthConfig (a06576a82b59267222f836284414bce881db54c5f7a5e9e9e6c056ce657955d7) AuthConfig (a78179e19701d8fa2d02503f47f00d32e6ec5941f1ebc60f0702ee2c9f3b3e52) AuthConfig (d35e37e4462c94fc1be8b3118eeecc2e03c6a7e165790ce74024e6830bb75206) AuthConfig (f4a2496537ff7e2dc77011934240f96f738ade42715d3e519792caefa381f82d) AuthConfig (a9fbc4dcc07ca58fd7e44a5837d999819948c69cbb9d79c5c5bcaf8d430356aa) AuthConfig (a025980ecdc0721611a617814287cb6d4f8548c5e7ad14160d9d6f20cfc1febf) AuthConfig (eeeaeca82b78dde5cc1170e0a48c29c2ae4cbfa6e1f3e7329046b32884720bc5) AuthConfig (ad64732bdf528a1157ed015da900b6f643030a510094c8c8f35349c3db3696c0) AuthConfig (9ec2d4ce41fc818592256e17641a0d2ab01bf44fc781901d02af3c1fc4e0d0a1) AuthConfig (b6e9e43534714fc724cd2c46c19cd0ab1e4f1c5237db64cac8b5c2a4da2cceda)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantGatewayNegativeSecurity" name="test_invalid_api_key_denied_on_tenant_gateway[tenant_b]" time="122.814"><error message="failed on setup with &quot;AssertionError: maasauthpolicy/test-model-b2fc9f-auth in ai-tenant-e2e-inf-b-b2fc9f did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{&quot;apiVersion&quot;:&quot;maas.opendatahub.io/v1alpha1&quot;,&quot;kind&quot;:&quot;MaaSAuthPolicy&quot;,&quot;metadata&quot;:{&quot;annotations&quot;:{},&quot;name&quot;:&quot;test-model-b2fc9f-auth&quot;,&quot;namespace&quot;:&quot;ai-tenant-e2e-inf-b-b2fc9f&quot;},&quot;spec&quot;:{&quot;modelRefs&quot;:[{&quot;name...&#10;[truncated; full report in element text]">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
&gt;               make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:177: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:1296: in make_tenant_model_accessible
    wait_for_status_phase(
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:343: in wait_for_status_phase
    return wait_for_json(kind, name, namespace, predicate=_predicate, timeout=timeout, interval=interval)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

kind = 'maasauthpolicy', name = 'test-model-b2fc9f-auth'
namespace = 'ai-tenant-e2e-inf-b-b2fc9f'
predicate = &lt;function wait_for_status_phase.&lt;locals&gt;._predicate at 0x7f0c1372f4c0&gt;
timeout = 180, interval = 5

    def wait_for_json(
        kind: str,
        name: str,
        namespace: Optional[str] = None,
        *,
        predicate=None,
        timeout: int = 180,
        interval: int = 5,
    ) -&gt; dict:
        deadline = time.time() + timeout
        last_obj = None
        while time.time() &lt; deadline:
            obj = get_json_or_none(kind, name, namespace)
            if obj is not None:
                last_obj = obj
                if predicate is None or predicate(obj):
                    return obj
            time.sleep(interval)
&gt;       raise AssertionError(
            f"{kind}/{name} in {namespace or '&lt;cluster&gt;'} did not satisfy condition. Last object: {last_obj}"
        )
E       AssertionError: maasauthpolicy/test-model-b2fc9f-auth in ai-tenant-e2e-inf-b-b2fc9f did not satisfy condition. Last object: {'apiVersion': 'maas.opendatahub.io/v1alpha1', 'kind': 'MaaSAuthPolicy', 'metadata': {'annotations': {'kubectl.kubernetes.io/last-applied-configuration': '{"apiVersion":"maas.opendatahub.io/v1alpha1","kind":"MaaSAuthPolicy","metadata":{"annotations":{},"name":"test-model-b2fc9f-auth","namespace":"ai-tenant-e2e-inf-b-b2fc9f"},"spec":{"modelRefs":[{"name":"test-model-b2fc9f","namespace":"ai-tenant-e2e-inf-b-b2fc9f"}],"subjects":{"groups":[{"name":"system:authenticated"}]}}}\n'}, 'creationTimestamp': '2026-11-02T18:02:10Z', 'finalizers': ['maas.opendatahub.io/authpolicy-cleanup'], 'generation': 1, 'name': 'test-model-b2fc9f-auth', 'namespace': 'ai-tenant-e2e-inf-b-b2fc9f', 'resourceVersion': '92883', 'uid': 'ac66a8f8-0196-4078-9fe8-34171799ecc7'}, 'spec': {'modelRefs': [{'name': 'test-model-b2fc9f', 'namespace': 'ai-tenant-e2e-inf-b-b2fc9f'}], 'subjects': {'groups': [{'name': 'system:authenticated'}]}}, 'status': {'conditions': [{'lastTransitionTime': '2026-11-02T18:02:10Z', 'message': 'Waiting for gateway AuthPolicy openshift-ingress/e2e-inf-b-b2fc9f-maas-auth to be accepted and enforced: AuthPolicy waiting for the following components to sync: [AuthConfig (402a613e0006994f2ca8d1e136b2395ecd6b553fd4d50352429c2f64ceb178aa) AuthConfig (a246796480d71ca9280e6ed6d8b23cbefaa85aa02c14f913cf3d3b9c2e745096) AuthConfig (382887bdb062f7d303180b65568a123d07435d2f8318cc785dc401be686706bb) AuthConfig (518c90fdbb471b9ea541b1b1ef39d1fccefe00a34df78f93e96982508c9ca59a) AuthConfig (7cc875c29c6cc2a3eccf8226e9fabc353871efccde2ef98e44a27db3875f907c) AuthConfig (162051dc09da331a9cd57c7f960eea4eb54575c1342d2700070289fe724c2690) AuthConfig (9a87692e97f3ceb1165dbb798a9f53ffd33e9dddfc25974a5efd5c0081f218b0) AuthConfig (308c81e0a4d6bfe471d3081cb355709487e4b398d1ac040dc12d0d545671456f) AuthConfig (a06576a82b59267222f836284414bce881db54c5f7a5e9e9e6c056ce657955d7) AuthConfig (a78179e19701d8fa2d02503f47f00d32e6ec5941f1ebc60f0702ee2c9f3b3e52) AuthConfig (d35e37e4462c94fc1be8b3118eeecc2e03c6a7e165790ce74024e6830bb75206) AuthConfig (f4a2496537ff7e2dc77011934240f96f738ade42715d3e519792caefa381f82d) AuthConfig (a9fbc4dcc07ca58fd7e44a5837d999819948c69cbb9d79c5c5bcaf8d430356aa) AuthConfig (a025980ecdc0721611a617814287cb6d4f8548c5e7ad14160d9d6f20cfc1febf) AuthConfig (eeeaeca82b78dde5cc1170e0a48c29c2ae4cbfa6e1f3e7329046b32884720bc5) AuthConfig (ad64732bdf528a1157ed015da900b6f643030a510094c8c8f35349c3db3696c0) AuthConfig (9ec2d4ce41fc818592256e17641a0d2ab01bf44fc781901d02af3c1fc4e0d0a1) AuthConfig (b6e9e43534714fc724cd2c46c19cd0ab1e4f1c5237db64cac8b5c2a4da2cceda)]', 'observedGeneration': 1, 'reason': 'Unknown', 'status': 'Unknown', 'type': 'Ready'}], 'phase': 'Pending'}}

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:288: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantModelInference" name="test_inference_succeeds_through_tenant_gateway[tenant_b]" time="1103.472"><error message="failed on setup with &quot;AssertionError: https://e2e-inf-b-8a209f.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/ai-tenant-e2e-inf-b-8a209f/test-model-8a209f/v1/chat/completions did not reject an unknown API key for 10s within 180s; last: status=500 x-ext-auth-reason=None body=Internal Server Error.&quot;">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
                make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )
                # Store model path (with /v1 for OpenAI API compatibility)
                case["model_path"] = f"/{case['tenant_ns']}/{model_name}/v1"
    
            for case in (case_a, case_b):
&gt;               wait_for_route_auth_enforced(
                    f"{_get_tenant_gateway_url(case['gateway_name'])}{case['model_path']}"
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:189: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:430: in wait_for_route_auth_enforced
    wait_until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

check = &lt;function wait_for_route_auth_enforced.&lt;locals&gt;._check at 0x7f634dcc18a0&gt;
timeout = 180
what = 'https://e2e-inf-b-8a209f.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/ai-tenant-e2e-inf-b-8a209f/test-model-8a209f/v1/chat/completions did not reject an unknown API key for 10s'
interval = 2

    def wait_until(check, timeout: int, what: str, interval: int = 5):
        """Poll check() until it returns a truthy value. Assertion failures and transient
        cluster or HTTP errors count as "not yet"; the last one ends up in the timeout message."""
        deadline = time.time() + timeout
        while True:
            try:
                result = check()
                if result:
                    return result
                last = result
            except (AssertionError, subprocess.TimeoutExpired, requests.RequestException) as exc:
                last = exc
&gt;           assert time.time() &lt; deadline, f"{what} within {timeout}s; last: {last}"
                   ^^^^^^^^^^^^^^^^^^^^^^
E           AssertionError: https://e2e-inf-b-8a209f.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/ai-tenant-e2e-inf-b-8a209f/test-model-8a209f/v1/chat/completions did not reject an unknown API key for 10s within 180s; last: status=500 x-ext-auth-reason=None body=Internal Server Error.

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:266: AssertionError</error></testcase><testcase classname="tests.test_tenant_model_inference.TestTenantGatewayNegativeSecurity" name="test_invalid_api_key_denied_on_tenant_gateway[tenant_a]" time="114.385"><error message="failed on setup with &quot;AssertionError: https://e2e-inf-b-8a209f.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/ai-tenant-e2e-inf-b-8a209f/test-model-8a209f/v1/chat/completions did not reject an unknown API key for 10s within 180s; last: status=500 x-ext-auth-reason=None body=Internal Server Error.&quot;">@pytest.fixture(scope="module")
    def tenant_inference_cases():
        """Set up two tenants with models for inference testing."""
        require_aitenant_crd()
        case_a = new_named_tenant_case("e2e-inf-a")
        case_b = new_named_tenant_case("e2e-inf-b")
    
        try:
            # Bootstrap tenants
            for case in (case_a, case_b):
                bootstrap_aitenant_tenant(case)
    
            # Create both LLMInferenceServices before waiting on either. The llmisvc
            # controller reconciles them one at a time and runs minutes behind under
            # parallel load, so B should queue while A's wait runs, not after it.
            for case in (case_a, case_b):
                # Track model name early for cleanup
                case["model_name"] = f"test-model-{case['suffix']}"
                _create_llmis(
                    case["model_name"],
                    case["tenant_ns"],
                    case["gateway_name"],
                    GATEWAY_NAMESPACE,
                )
    
            for case in (case_a, case_b):
                model_name = case["model_name"]
                # Re-applies the LLMIS created above unchanged, then waits for it.
                provision_tenant_model(
                    model_name,
                    case["tenant_ns"],
                    case["gateway_name"],
                    ready_timeout=MODEL_BACKEND_READY_TIMEOUT,
                )
                make_tenant_model_accessible(
                    model_name,
                    case["tenant_ns"],
                    f"{model_name}-auth",
                    f"{model_name}-sub",
                    token_limit=10000,
                    gateway_name=case["gateway_name"],
                )
                # Store model path (with /v1 for OpenAI API compatibility)
                case["model_path"] = f"/{case['tenant_ns']}/{model_name}/v1"
    
            for case in (case_a, case_b):
&gt;               wait_for_route_auth_enforced(
                    f"{_get_tenant_gateway_url(case['gateway_name'])}{case['model_path']}"
                )

test/maas-e2e/test/e2e/tests/test_tenant_model_inference.py:189: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:430: in wait_for_route_auth_enforced
    wait_until(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

check = &lt;function wait_for_route_auth_enforced.&lt;locals&gt;._check at 0x7f634dcc18a0&gt;
timeout = 180
what = 'https://e2e-inf-b-8a209f.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/ai-tenant-e2e-inf-b-8a209f/test-model-8a209f/v1/chat/completions did not reject an unknown API key for 10s'
interval = 2

    def wait_until(check, timeout: int, what: str, interval: int = 5):
        """Poll check() until it returns a truthy value. Assertion failures and transient
        cluster or HTTP errors count as "not yet"; the last one ends up in the timeout message."""
        deadline = time.time() + timeout
        while True:
            try:
                result = check()
                if result:
                    return result
                last = result
            except (AssertionError, subprocess.TimeoutExpired, requests.RequestException) as exc:
                last = exc
&gt;           assert time.time() &lt; deadline, f"{what} within {timeout}s; last: {last}"
                   ^^^^^^^^^^^^^^^^^^^^^^
E           AssertionError: https://e2e-inf-b-8a209f.apps.de06ce2496430a335bdc.prod.konflux-ocp-ci.dev/ai-tenant-e2e-inf-b-8a209f/test-model-8a209f/v1/chat/completions did not reject an unknown API key for 10s within 180s; last: status=500 x-ext-auth-reason=None body=Internal Server Error.

test/maas-e2e/test/e2e/tests/multitenancy_helpers.py:266: AssertionError</error></testcase><testcase classname="tests.test_tenant_auth_isolation.TestTenantAuthIsolation" name="test_api_key_rejected_cross_tenant" time="169.804" /><testcase classname="tests.test_tenant_auth_isolation.TestTenantAuthIsolation" name="test_oidc_token_validation_per_tenant" time="108.770"><skipped type="pytest.skip" message="Per-tenant OIDC tokens unavailable — set OIDC_TOKEN_URL (tenant-a) and OIDC_TOKEN_URL_TENANT_B (tenant-b), or OIDC_TOKEN_TENANT_A / OIDC_TOKEN_TENANT_B">/workspace/source/test/maas-e2e/test/e2e/tests/test_tenant_auth_isolation.py:223: Per-tenant OIDC tokens unavailable — set OIDC_TOKEN_URL (tenant-a) and OIDC_TOKEN_URL_TENANT_B (tenant-b), or OIDC_TOKEN_TENANT_A / OIDC_TOKEN_TENANT_B</skipped></testcase></testsuite></testsuites>