<?xml version="1.0" encoding="utf-8"?><testsuites><testsuite name="pytest" errors="0" failures="1" skipped="16" tests="73" time="2923.466" timestamp="2026-09-09T20:20:15.975873" hostname="kserve-group-test-zs9tl-e2e-predictor-pod"><testcase classname="" name="explainer.test_art_explainer" time="0.000"><skipped message="collection skipped">('/workspace/source/test/e2e/explainer/test_art_explainer.py', 48, 'Skipped: ODH does not support art explainer at the moment')</skipped></testcase><testcase classname="" name="predictor.test_grpc" time="0.000"><skipped message="collection skipped">('/workspace/source/test/e2e/predictor/test_grpc.py', 39, 'Skipped: Not testable in ODH at the moment')</skipped></testcase><testcase classname="" name="predictor.test_torchserve" time="0.000"><skipped message="collection skipped">('/workspace/source/test/e2e/predictor/test_torchserve.py', 34, 'Skipped: ODH does not support torchserve at the moment')</skipped></testcase><testcase classname="batcher.test_batcher" name="test_batcher" time="115.301" /><testcase classname="predictor.test_pod_watch" name="test_quick_reconciliation_on_init_container_failure" time="10.299" /><testcase classname="predictor.test_predictive" name="test_predictive_sklearn_v1" time="125.282" /><testcase classname="batcher.test_batcher_custom_port" name="test_batcher_custom_port" time="600.360"><failure message="kubernetes.client.exceptions.ApiException: (404)&#10;Reason: Not Found&#10;HTTP response headers: HTTPHeaderDict({'Audit-Id': 'f8d0bb66-ee12-4344-b0db-d4f43a4ddf95', 'Cache-Control': 'no-cache, private', 'Content-Type': 'text/plain; charset=utf-8', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'X-Content-Type-Options': 'nosniff', 'X-Kubernetes-Pf-Flowschema-Uid': '579c8d6a-7a30-4d77-b114-bffb4b116e5e', 'X-Kubernetes-Pf-Prioritylevel-Uid': '3dc12936-a24b-4662-bb0e-1004e15aa598', 'Date': 'Wed, 09 Sep 2026 20:32:13 GMT', 'Content-Length': '19'})&#10;HTTP response body: 404 page not found">kserve_client = &lt;kserve.api.kserve_client.KServeClient object at 0x7fea3c350ed0&gt;
rest_v1_client = &lt;kserve.inference_client.InferenceRESTClient object at 0x7fea3d5a15d0&gt;
network_layer = 'openshift-route'

    @pytest.mark.predictor
    @pytest.mark.asyncio(scope="session")
    async def test_batcher_custom_port(kserve_client, rest_v1_client, network_layer):
        service_name = "isvc-sklearn-batcher-custom"
    
        predictor = V1beta1PredictorSpec(
            batcher=V1beta1Batcher(
                max_batch_size=32,
                max_latency=5000,
            ),
            min_replicas=1,
            sklearn=V1beta1SKLearnSpec(
                args=["--http_port=5000"],
                storage_uri="gs://kfserving-examples/models/sklearn/1.0/model",
                resources=V1ResourceRequirements(
                    requests={"cpu": "50m", "memory": "128Mi"},
                    limits={"cpu": "100m", "memory": "256Mi"},
                ),
                ports=[V1ContainerPort(container_port=5000, protocol="TCP")],
            ),
        )
    
        isvc = V1beta1InferenceService(
            api_version=constants.KSERVE_V1BETA1,
            kind=constants.KSERVE_KIND_INFERENCESERVICE,
            metadata=client.V1ObjectMeta(
                name=service_name,
                namespace=KSERVE_TEST_NAMESPACE,
                labels={
                    constants.KSERVE_LABEL_NETWORKING_VISIBILITY: constants.KSERVE_LABEL_NETWORKING_VISIBILITY_EXPOSED,
                },
            ),
            spec=V1beta1InferenceServiceSpec(predictor=predictor),
        )
        kserve_client.create(isvc)
        try:
&gt;           kserve_client.wait_isvc_ready(service_name, namespace=KSERVE_TEST_NAMESPACE)

batcher/test_batcher_custom_port.py:79: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kserve.api.kserve_client.KServeClient object at 0x7fea3c350ed0&gt;
name = 'isvc-sklearn-batcher-custom', namespace = 'kserve-ci-e2e-test'
watch = False, timeout_seconds = 600, polling_interval = 10, version = 'v1beta1'
expected_generation = None

    def wait_isvc_ready(
        self,
        name,
        namespace=None,  # pylint:disable=too-many-arguments
        watch=False,
        timeout_seconds=600,
        polling_interval=10,
        version=constants.KSERVE_V1BETA1_VERSION,
        expected_generation=None,
    ):
        """
        Waiting for inference service ready, print out the inference service if timeout.
        :param name: inference service name
        :param namespace: defaults to current or default namespace
        :param watch: True to watch the service until timeout elapsed or status is ready
        :param timeout_seconds: timeout seconds for waiting, default to 600s.
               Print out the InferenceService if timeout.
        :param polling_interval: The time interval to poll status
        :param version: api group version
        :param expected_generation: optional minimum observed generation to consider ready
        :return:
        """
        if watch:
            isvc_watch(
                name=name,
                namespace=namespace,
                timeout_seconds=timeout_seconds,
                generation=expected_generation or 0,
            )
        else:
            for _ in range(round(timeout_seconds / polling_interval)):
                time.sleep(polling_interval)
                if self.is_isvc_ready(
                    name,
                    namespace=namespace,
                    version=version,
                    expected_generation=expected_generation,
                ):
                    return
    
            current_isvc = self.get(name, namespace=namespace, version=version)
            if expected_generation is None:
&gt;               raise RuntimeError(
                    "Timeout to start the InferenceService {}. \
                               The InferenceService is as following: {}".format(
                        name, current_isvc
                    )
                )
E               RuntimeError: Timeout to start the InferenceService isvc-sklearn-batcher-custom.                                The InferenceService is as following: {'apiVersion': 'serving.kserve.io/v1beta1', 'kind': 'InferenceService', 'metadata': {'annotations': {'modelFormat': 'sklearn', 'serving.kserve.io/deploymentMode': 'Standard'}, 'creationTimestamp': '2026-09-09T20:22:13Z', 'finalizers': ['inferenceservice.finalizers', 'odh.inferenceservice.finalizers'], 'generation': 1, 'labels': {'networking.kserve.io/visibility': 'exposed'}, 'managedFields': [{'apiVersion': 'serving.kserve.io/v1beta1', 'fieldsType': 'FieldsV1', 'fieldsV1': {'f:metadata': {'f:labels': {'.': {}, 'f:networking.kserve.io/visibility': {}}}, 'f:spec': {'.': {}, 'f:predictor': {'.': {}, 'f:batcher': {'.': {}, 'f:maxBatchSize': {}, 'f:maxLatency': {}}, 'f:minReplicas': {}, 'f:sklearn': {'.': {}, 'f:args': {}, 'f:name': {}, 'f:ports': {'.': {}, 'k:{"containerPort":5000,"protocol":"TCP"}': {'.': {}, 'f:containerPort': {}, 'f:protocol': {}}}, 'f:resources': {'.': {}, 'f:limits': {'.': {}, 'f:cpu': {}, 'f:memory': {}}, 'f:requests': {'.': {}, 'f:cpu': {}, 'f:memory': {}}}, 'f:storageUri': {}}}}}, 'manager': 'OpenAPI-Generator', 'operation': 'Update', 'time': '2026-09-09T20:22:13Z'}, {'apiVersion': 'serving.kserve.io/v1beta1', 'fieldsType': 'FieldsV1', 'fieldsV1': {'f:metadata': {'f:finalizers': {'.': {}, 'v:"inferenceservice.finalizers"': {}, 'v:"odh.inferenceservice.finalizers"': {}}}}, 'manager': 'manager', 'operation': 'Update', 'time': '2026-09-09T20:22:13Z'}, {'apiVersion': 'serving.kserve.io/v1beta1', 'fieldsType': 'FieldsV1', 'fieldsV1': {'f:status': {'.': {}, 'f:address': {'.': {}, 'f:url': {}}, 'f:components': {'.': {}, 'f:predictor': {}}, 'f:conditions': {}, 'f:deploymentMode': {}, 'f:modelStatus': {'.': {}, 'f:copies': {'.': {}, 'f:failedCopies': {}}, 'f:states': {'.': {}, 'f:activeModelState': {}, 'f:targetModelState': {}}, 'f:transitionStatus': {}}, 'f:observedGeneration': {}, 'f:servingRuntimeName': {}, 'f:url': {}}}, 'manager': 'manager', 'operation': 'Update', 'subresource': 'status', 'time': '2026-09-09T20:22:19Z'}], 'name': 'isvc-sklearn-batcher-custom', 'namespace': 'kserve-ci-e2e-test', 'resourceVersion': '15932', 'uid': '1f761573-8105-4124-ab70-50929283d13f'}, 'spec': {'predictor': {'automountServiceAccountToken': False, 'batcher': {'maxBatchSize': 32, 'maxLatency': 5000}, 'minReplicas': 1, 'model': {'args': ['--http_port=5000'], 'modelFormat': {'name': 'sklearn'}, 'name': '', 'ports': [{'containerPort': 5000, 'protocol': 'TCP'}], 'resources': {'limits': {'cpu': '100m', 'memory': '256Mi'}, 'requests': {'cpu': '50m', 'memory': '128Mi'}}, 'storageUri': 'gs://kfserving-examples/models/sklearn/1.0/model'}}}, 'status': {'address': {'url': 'http://isvc-sklearn-batcher-custom-predictor.kserve-ci-e2e-test.svc.cluster.local'}, 'components': {'predictor': {}}, 'conditions': [{'lastTransitionTime': '2026-09-09T20:22:13Z', 'status': 'True', 'type': 'IngressReady'}, {'lastTransitionTime': '2026-09-09T20:22:13Z', 'message': 'Deployment does not have minimum availability.', 'reason': 'MinimumReplicasUnavailable', 'status': 'False', 'type': 'PredictorReady'}, {'lastTransitionTime': '2026-09-09T20:22:13Z', 'message': 'Deployment does not have minimum availability.', 'reason': 'MinimumReplicasUnavailable', 'status': 'False', 'type': 'Ready'}, {'lastTransitionTime': '2026-09-09T20:22:13Z', 'severity': 'Info', 'status': 'False', 'type': 'Stopped'}], 'deploymentMode': 'Standard', 'modelStatus': {'copies': {'failedCopies': 0}, 'states': {'activeModelState': '', 'targetModelState': 'Pending'}, 'transitionStatus': 'InProgress'}, 'observedGeneration': 1, 'servingRuntimeName': 'kserve-sklearnserver', 'url': 'https://isvc-sklearn-batcher-custom-kserve-ci-e2e-test.apps.53357311-227e-452f-b982-24a032e036be.prod.konfluxeaas.com'}}

../../python/kserve/kserve/api/kserve_client.py:418: RuntimeError

During handling of the above exception, another exception occurred:

kserve_client = &lt;kserve.api.kserve_client.KServeClient object at 0x7fea3c350ed0&gt;
rest_v1_client = &lt;kserve.inference_client.InferenceRESTClient object at 0x7fea3d5a15d0&gt;
network_layer = 'openshift-route'

    @pytest.mark.predictor
    @pytest.mark.asyncio(scope="session")
    async def test_batcher_custom_port(kserve_client, rest_v1_client, network_layer):
        service_name = "isvc-sklearn-batcher-custom"
    
        predictor = V1beta1PredictorSpec(
            batcher=V1beta1Batcher(
                max_batch_size=32,
                max_latency=5000,
            ),
            min_replicas=1,
            sklearn=V1beta1SKLearnSpec(
                args=["--http_port=5000"],
                storage_uri="gs://kfserving-examples/models/sklearn/1.0/model",
                resources=V1ResourceRequirements(
                    requests={"cpu": "50m", "memory": "128Mi"},
                    limits={"cpu": "100m", "memory": "256Mi"},
                ),
                ports=[V1ContainerPort(container_port=5000, protocol="TCP")],
            ),
        )
    
        isvc = V1beta1InferenceService(
            api_version=constants.KSERVE_V1BETA1,
            kind=constants.KSERVE_KIND_INFERENCESERVICE,
            metadata=client.V1ObjectMeta(
                name=service_name,
                namespace=KSERVE_TEST_NAMESPACE,
                labels={
                    constants.KSERVE_LABEL_NETWORKING_VISIBILITY: constants.KSERVE_LABEL_NETWORKING_VISIBILITY_EXPOSED,
                },
            ),
            spec=V1beta1InferenceServiceSpec(predictor=predictor),
        )
        kserve_client.create(isvc)
        try:
            kserve_client.wait_isvc_ready(service_name, namespace=KSERVE_TEST_NAMESPACE)
        except RuntimeError as e:
            print(
&gt;               kserve_client.api_instance.get_namespaced_custom_object(
                    "serving.knative.dev",
                    "v1",
                    KSERVE_TEST_NAMESPACE,
                    "services",
                    service_name + "-predictor",
                )
            )

batcher/test_batcher_custom_port.py:82: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kubernetes.client.api.custom_objects_api.CustomObjectsApi object at 0x7fea3c2d8390&gt;
group = 'serving.knative.dev', version = 'v1', namespace = 'kserve-ci-e2e-test'
plural = 'services', name = 'isvc-sklearn-batcher-custom-predictor'
kwargs = {'_return_http_data_only': True}

    def get_namespaced_custom_object(self, group, version, namespace, plural, name, **kwargs):  # noqa: E501
        """get_namespaced_custom_object  # noqa: E501
    
        Returns a namespace scoped custom object  # noqa: E501
        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        &gt;&gt;&gt; thread = api.get_namespaced_custom_object(group, version, namespace, plural, name, async_req=True)
        &gt;&gt;&gt; result = thread.get()
    
        :param async_req bool: execute request asynchronously
        :param str group: the custom resource's group (required)
        :param str version: the custom resource's version (required)
        :param str namespace: The custom resource's namespace (required)
        :param str plural: the custom resource's plural name. For TPRs this would be lowercase plural kind. (required)
        :param str name: the custom object's name (required)
        :param _preload_content: if False, the urllib3.HTTPResponse object will
                                 be returned without reading/decoding response
                                 data. Default is True.
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :return: object
                 If the method is called asynchronously,
                 returns the request thread.
        """
        kwargs['_return_http_data_only'] = True
&gt;       return self.get_namespaced_custom_object_with_http_info(group, version, namespace, plural, name, **kwargs)  # noqa: E501

../../python/kserve/.venv/lib64/python3.11/site-packages/kubernetes/client/api/custom_objects_api.py:1632: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kubernetes.client.api.custom_objects_api.CustomObjectsApi object at 0x7fea3c2d8390&gt;
group = 'serving.knative.dev', version = 'v1', namespace = 'kserve-ci-e2e-test'
plural = 'services', name = 'isvc-sklearn-batcher-custom-predictor'
kwargs = {'_return_http_data_only': True}
local_var_params = {'_return_http_data_only': True, 'all_params': ['group', 'version', 'namespace', 'plural', 'name', 'async_req', ...], 'auth_settings': ['BearerToken'], 'body_params': None, ...}
all_params = ['group', 'version', 'namespace', 'plural', 'name', 'async_req', ...]
key = '_return_http_data_only', val = True, collection_formats = {}
path_params = {'group': 'serving.knative.dev', 'name': 'isvc-sklearn-batcher-custom-predictor', 'namespace': 'kserve-ci-e2e-test', 'plural': 'services', ...}
query_params = []

    def get_namespaced_custom_object_with_http_info(self, group, version, namespace, plural, name, **kwargs):  # noqa: E501
        """get_namespaced_custom_object  # noqa: E501
    
        Returns a namespace scoped custom object  # noqa: E501
        This method makes a synchronous HTTP request by default. To make an
        asynchronous HTTP request, please pass async_req=True
        &gt;&gt;&gt; thread = api.get_namespaced_custom_object_with_http_info(group, version, namespace, plural, name, async_req=True)
        &gt;&gt;&gt; result = thread.get()
    
        :param async_req bool: execute request asynchronously
        :param str group: the custom resource's group (required)
        :param str version: the custom resource's version (required)
        :param str namespace: The custom resource's namespace (required)
        :param str plural: the custom resource's plural name. For TPRs this would be lowercase plural kind. (required)
        :param str name: the custom object's name (required)
        :param _return_http_data_only: response data without head status code
                                       and headers
        :param _preload_content: if False, the urllib3.HTTPResponse object will
                                 be returned without reading/decoding response
                                 data. Default is True.
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :return: tuple(object, status_code(int), headers(HTTPHeaderDict))
                 If the method is called asynchronously,
                 returns the request thread.
        """
    
        local_var_params = locals()
    
        all_params = [
            'group',
            'version',
            'namespace',
            'plural',
            'name'
        ]
        all_params.extend(
            [
                'async_req',
                '_return_http_data_only',
                '_preload_content',
                '_request_timeout'
            ]
        )
    
        for key, val in six.iteritems(local_var_params['kwargs']):
            if key not in all_params:
                raise ApiTypeError(
                    "Got an unexpected keyword argument '%s'"
                    " to method get_namespaced_custom_object" % key
                )
            local_var_params[key] = val
        del local_var_params['kwargs']
        # verify the required parameter 'group' is set
        if self.api_client.client_side_validation and ('group' not in local_var_params or  # noqa: E501
                                                        local_var_params['group'] is None):  # noqa: E501
            raise ApiValueError("Missing the required parameter `group` when calling `get_namespaced_custom_object`")  # noqa: E501
        # verify the required parameter 'version' is set
        if self.api_client.client_side_validation and ('version' not in local_var_params or  # noqa: E501
                                                        local_var_params['version'] is None):  # noqa: E501
            raise ApiValueError("Missing the required parameter `version` when calling `get_namespaced_custom_object`")  # noqa: E501
        # verify the required parameter 'namespace' is set
        if self.api_client.client_side_validation and ('namespace' not in local_var_params or  # noqa: E501
                                                        local_var_params['namespace'] is None):  # noqa: E501
            raise ApiValueError("Missing the required parameter `namespace` when calling `get_namespaced_custom_object`")  # noqa: E501
        # verify the required parameter 'plural' is set
        if self.api_client.client_side_validation and ('plural' not in local_var_params or  # noqa: E501
                                                        local_var_params['plural'] is None):  # noqa: E501
            raise ApiValueError("Missing the required parameter `plural` when calling `get_namespaced_custom_object`")  # noqa: E501
        # verify the required parameter 'name' is set
        if self.api_client.client_side_validation and ('name' not in local_var_params or  # noqa: E501
                                                        local_var_params['name'] is None):  # noqa: E501
            raise ApiValueError("Missing the required parameter `name` when calling `get_namespaced_custom_object`")  # noqa: E501
    
        collection_formats = {}
    
        path_params = {}
        if 'group' in local_var_params:
            path_params['group'] = local_var_params['group']  # noqa: E501
        if 'version' in local_var_params:
            path_params['version'] = local_var_params['version']  # noqa: E501
        if 'namespace' in local_var_params:
            path_params['namespace'] = local_var_params['namespace']  # noqa: E501
        if 'plural' in local_var_params:
            path_params['plural'] = local_var_params['plural']  # noqa: E501
        if 'name' in local_var_params:
            path_params['name'] = local_var_params['name']  # noqa: E501
    
        query_params = []
    
        header_params = {}
    
        form_params = []
        local_var_files = {}
    
        body_params = None
        # HTTP header `Accept`
        header_params['Accept'] = self.api_client.select_header_accept(
            ['application/json'])  # noqa: E501
    
        # Authentication setting
        auth_settings = ['BearerToken']  # noqa: E501
    
&gt;       return self.api_client.call_api(
            '/apis/{group}/{version}/namespaces/{namespace}/{plural}/{name}', 'GET',
            path_params,
            query_params,
            header_params,
            body=body_params,
            post_params=form_params,
            files=local_var_files,
            response_type='object',  # noqa: E501
            auth_settings=auth_settings,
            async_req=local_var_params.get('async_req'),
            _return_http_data_only=local_var_params.get('_return_http_data_only'),  # noqa: E501
            _preload_content=local_var_params.get('_preload_content', True),
            _request_timeout=local_var_params.get('_request_timeout'),
            collection_formats=collection_formats)

../../python/kserve/.venv/lib64/python3.11/site-packages/kubernetes/client/api/custom_objects_api.py:1739: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kubernetes.client.api_client.ApiClient object at 0x7fea3c2da3d0&gt;
resource_path = '/apis/{group}/{version}/namespaces/{namespace}/{plural}/{name}'
method = 'GET'
path_params = {'group': 'serving.knative.dev', 'name': 'isvc-sklearn-batcher-custom-predictor', 'namespace': 'kserve-ci-e2e-test', 'plural': 'services', ...}
query_params = []
header_params = {'Accept': 'application/json', 'User-Agent': 'OpenAPI-Generator/32.0.1/python'}
body = None, post_params = [], files = {}, response_type = 'object'
auth_settings = ['BearerToken'], async_req = None, _return_http_data_only = True
collection_formats = {}, _preload_content = True, _request_timeout = None
_host = None

    def call_api(self, resource_path, method,
                 path_params=None, query_params=None, header_params=None,
                 body=None, post_params=None, files=None,
                 response_type=None, auth_settings=None, async_req=None,
                 _return_http_data_only=None, collection_formats=None,
                 _preload_content=True, _request_timeout=None, _host=None):
        """Makes the HTTP request (synchronous) and returns deserialized data.
    
        To make an async_req request, set the async_req parameter.
    
        :param resource_path: Path to method endpoint.
        :param method: Method to call.
        :param path_params: Path parameters in the url.
        :param query_params: Query parameters in the url.
        :param header_params: Header parameters to be
            placed in the request header.
        :param body: Request body.
        :param post_params dict: Request post form parameters,
            for `application/x-www-form-urlencoded`, `multipart/form-data`.
        :param auth_settings list: Auth Settings names for the request.
        :param response: Response data type.
        :param files dict: key -&gt; filename, value -&gt; filepath,
            for `multipart/form-data`.
        :param async_req bool: execute request asynchronously
        :param _return_http_data_only: response data without head status code
                                       and headers
        :param collection_formats: dict of collection formats for path, query,
            header, and post parameters.
        :param _preload_content: if False, the urllib3.HTTPResponse object will
                                 be returned without reading/decoding response
                                 data. Default is True.
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :return:
            If async_req parameter is True,
            the request will be called asynchronously.
            The method will return the request thread.
            If parameter async_req is False or missing,
            then the method will return the response directly.
        """
        if not async_req:
&gt;           return self.__call_api(resource_path, method,
                                   path_params, query_params, header_params,
                                   body, post_params, files,
                                   response_type, auth_settings,
                                   _return_http_data_only, collection_formats,
                                   _preload_content, _request_timeout, _host)

../../python/kserve/.venv/lib64/python3.11/site-packages/kubernetes/client/api_client.py:348: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kubernetes.client.api_client.ApiClient object at 0x7fea3c2da3d0&gt;
resource_path = '/apis/serving.knative.dev/v1/namespaces/kserve-ci-e2e-test/services/isvc-sklearn-batcher-custom-predictor'
method = 'GET'
path_params = [('group', 'serving.knative.dev'), ('version', 'v1'), ('namespace', 'kserve-ci-e2e-test'), ('plural', 'services'), ('name', 'isvc-sklearn-batcher-custom-predictor')]
query_params = []
header_params = {'Accept': 'application/json', 'Content-Type': 'application/json', 'User-Agent': 'OpenAPI-Generator/32.0.1/python'}
body = None, post_params = [], files = {}, response_type = 'object'
auth_settings = ['BearerToken'], _return_http_data_only = True
collection_formats = {}, _preload_content = True, _request_timeout = None
_host = None

    def __call_api(
            self, resource_path, method, path_params=None,
            query_params=None, header_params=None, body=None, post_params=None,
            files=None, response_type=None, auth_settings=None,
            _return_http_data_only=None, collection_formats=None,
            _preload_content=True, _request_timeout=None, _host=None):
    
        config = self.configuration
    
        # header parameters
        header_params = header_params or {}
        header_params.update(self.default_headers)
        if self.cookie:
            header_params['Cookie'] = self.cookie
        if header_params:
            header_params = self.sanitize_for_serialization(header_params)
            header_params = dict(self.parameters_to_tuples(header_params,
                                                           collection_formats))
    
        # path parameters
        if path_params:
            path_params = self.sanitize_for_serialization(path_params)
            path_params = self.parameters_to_tuples(path_params,
                                                    collection_formats)
            for k, v in path_params:
                # specified safe chars, encode everything
                resource_path = resource_path.replace(
                    '{%s}' % k,
                    quote(str(v), safe=config.safe_chars_for_path_param)
                )
    
        # query parameters
        if query_params:
            query_params = self.sanitize_for_serialization(query_params)
            query_params = self.parameters_to_tuples(query_params,
                                                     collection_formats)
    
        # post parameters
        if post_params or files:
            post_params = post_params if post_params else []
            post_params = self.sanitize_for_serialization(post_params)
            post_params = self.parameters_to_tuples(post_params,
                                                    collection_formats)
            post_params.extend(self.files_parameters(files))
    
        # auth setting
        self.update_params_for_auth(header_params, query_params, auth_settings)
    
        # body
        if body:
            body = self.sanitize_for_serialization(body)
    
        # request url
        if _host is None:
            url = self.configuration.host + resource_path
        else:
            # use server/host defined in path or operation instead
            url = _host + resource_path
    
        # perform request and return response
&gt;       response_data = self.request(
            method, url, query_params=query_params, headers=header_params,
            post_params=post_params, body=body,
            _preload_content=_preload_content,
            _request_timeout=_request_timeout)

../../python/kserve/.venv/lib64/python3.11/site-packages/kubernetes/client/api_client.py:180: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kubernetes.client.api_client.ApiClient object at 0x7fea3c2da3d0&gt;
method = 'GET'
url = 'https://ad0cdfe0e326f45b5aa1b566eebc3a10-76fd29d5fe107923.elb.us-east-1.amazonaws.com:6443/apis/serving.knative.dev/v1/namespaces/kserve-ci-e2e-test/services/isvc-sklearn-batcher-custom-predictor'
query_params = []
headers = {'Accept': 'application/json', 'Content-Type': 'application/json', 'User-Agent': 'OpenAPI-Generator/32.0.1/python'}
post_params = [], body = None, _preload_content = True, _request_timeout = None

    def request(self, method, url, query_params=None, headers=None,
                post_params=None, body=None, _preload_content=True,
                _request_timeout=None):
        """Makes the HTTP request using RESTClient."""
        if method == "GET":
&gt;           return self.rest_client.GET(url,
                                        query_params=query_params,
                                        _preload_content=_preload_content,
                                        _request_timeout=_request_timeout,

../../python/kserve/.venv/lib64/python3.11/site-packages/kubernetes/client/api_client.py:373: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kubernetes.client.rest.RESTClientObject object at 0x7fea3c2d8d50&gt;
url = 'https://ad0cdfe0e326f45b5aa1b566eebc3a10-76fd29d5fe107923.elb.us-east-1.amazonaws.com:6443/apis/serving.knative.dev/v1/namespaces/kserve-ci-e2e-test/services/isvc-sklearn-batcher-custom-predictor'
headers = {'Accept': 'application/json', 'Content-Type': 'application/json', 'User-Agent': 'OpenAPI-Generator/32.0.1/python'}
query_params = [], _preload_content = True, _request_timeout = None

    def GET(self, url, headers=None, query_params=None, _preload_content=True,
            _request_timeout=None):
&gt;       return self.request("GET", url,
                            headers=headers,
                            _preload_content=_preload_content,
                            _request_timeout=_request_timeout,
                            query_params=query_params)

../../python/kserve/.venv/lib64/python3.11/site-packages/kubernetes/client/rest.py:244: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = &lt;kubernetes.client.rest.RESTClientObject object at 0x7fea3c2d8d50&gt;
method = 'GET'
url = 'https://ad0cdfe0e326f45b5aa1b566eebc3a10-76fd29d5fe107923.elb.us-east-1.amazonaws.com:6443/apis/serving.knative.dev/v1/namespaces/kserve-ci-e2e-test/services/isvc-sklearn-batcher-custom-predictor'
query_params = []
headers = {'Accept': 'application/json', 'Content-Type': 'application/json', 'User-Agent': 'OpenAPI-Generator/32.0.1/python'}
body = None, post_params = {}, _preload_content = True, _request_timeout = None

    def request(self, method, url, query_params=None, headers=None,
                body=None, post_params=None, _preload_content=True,
                _request_timeout=None):
        """Perform requests.
    
        :param method: http request method
        :param url: http request url
        :param query_params: query parameters in the url
        :param headers: http request headers
        :param body: request json body, for `application/json`
        :param post_params: request post parameters,
                            `application/x-www-form-urlencoded`
                            and `multipart/form-data`
        :param _preload_content: if False, the urllib3.HTTPResponse object will
                                 be returned without reading/decoding response
                                 data. Default is True.
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        """
        method = method.upper()
        assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT',
                          'PATCH', 'OPTIONS']
    
        if post_params and body:
            raise ApiValueError(
                "body parameter cannot be used with post_params parameter."
            )
    
        post_params = post_params or {}
        headers = headers or {}
    
        timeout = None
        if _request_timeout:
            if isinstance(_request_timeout, (int, ) if six.PY3 else (int, long)):  # noqa: E501,F821
                timeout = urllib3.Timeout(total=_request_timeout)
            elif (isinstance(_request_timeout, tuple) and
                  len(_request_timeout) == 2):
                timeout = urllib3.Timeout(
                    connect=_request_timeout[0], read=_request_timeout[1])
    
        if 'Content-Type' not in headers:
            headers['Content-Type'] = 'application/json'
    
        try:
            # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
            if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']:
                if query_params:
                    url += '?' + urlencode(query_params)
                if (re.search('json', headers['Content-Type'], re.IGNORECASE) or
                        headers['Content-Type'] == 'application/apply-patch+yaml'):
                    if headers['Content-Type'] == 'application/json-patch+json':
                        if not isinstance(body, list):
                            headers['Content-Type'] = \
                                'application/strategic-merge-patch+json'
                    request_body = None
                    if body is not None:
                        request_body = json.dumps(body)
                    r = self.pool_manager.request(
                        method, url,
                        body=request_body,
                        preload_content=_preload_content,
                        timeout=timeout,
                        headers=headers)
                elif headers['Content-Type'] == 'application/x-www-form-urlencoded':  # noqa: E501
                    r = self.pool_manager.request(
                        method, url,
                        fields=post_params,
                        encode_multipart=False,
                        preload_content=_preload_content,
                        timeout=timeout,
                        headers=headers)
                elif headers['Content-Type'] == 'multipart/form-data':
                    # must del headers['Content-Type'], or the correct
                    # Content-Type which generated by urllib3 will be
                    # overwritten.
                    del headers['Content-Type']
                    r = self.pool_manager.request(
                        method, url,
                        fields=post_params,
                        encode_multipart=True,
                        preload_content=_preload_content,
                        timeout=timeout,
                        headers=headers)
                # Pass a `string` parameter directly in the body to support
                # other content types than Json when `body` argument is
                # provided in serialized form
                elif isinstance(body, str) or isinstance(body, bytes):
                    request_body = body
                    r = self.pool_manager.request(
                        method, url,
                        body=request_body,
                        preload_content=_preload_content,
                        timeout=timeout,
                        headers=headers)
                else:
                    # Cannot generate the request from given parameters
                    msg = """Cannot prepare a request message for provided
                             arguments. Please check that your arguments match
                             declared content type."""
                    raise ApiException(status=0, reason=msg)
            # For `GET`, `HEAD`
            else:
                r = self.pool_manager.request(method, url,
                                              fields=query_params,
                                              preload_content=_preload_content,
                                              timeout=timeout,
                                              headers=headers)
        except urllib3.exceptions.SSLError as e:
            msg = "{0}\n{1}".format(type(e).__name__, str(e))
            raise ApiException(status=0, reason=msg)
    
        if _preload_content:
            r = RESTResponse(r)
    
            # In the python 3, the response.data is bytes.
            # we need to decode it to string.
            if six.PY3:
                r.data = r.data.decode('utf8')
    
            # log response body
            logger.debug("response body: %s", r.data)
    
        if not 200 &lt;= r.status &lt;= 299:
&gt;           raise ApiException(http_resp=r)
E           kubernetes.client.exceptions.ApiException: (404)
E           Reason: Not Found
E           HTTP response headers: HTTPHeaderDict({'Audit-Id': 'f8d0bb66-ee12-4344-b0db-d4f43a4ddf95', 'Cache-Control': 'no-cache, private', 'Content-Type': 'text/plain; charset=utf-8', 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload', 'X-Content-Type-Options': 'nosniff', 'X-Kubernetes-Pf-Flowschema-Uid': '579c8d6a-7a30-4d77-b114-bffb4b116e5e', 'X-Kubernetes-Pf-Prioritylevel-Uid': '3dc12936-a24b-4662-bb0e-1004e15aa598', 'Date': 'Wed, 09 Sep 2026 20:32:13 GMT', 'Content-Length': '19'})
E           HTTP response body: 404 page not found

../../python/kserve/.venv/lib64/python3.11/site-packages/kubernetes/client/rest.py:238: ApiException</failure></testcase><testcase classname="predictor.test_predictive" name="test_predictive_xgboost_v1" time="95.265" /><testcase classname="predictor.test_predictive" name="test_predictive_lightgbm_v1" time="95.257" /><testcase classname="predictor.test_predictive" name="test_predictive_sklearn_v2" time="105.266" /><testcase classname="predictor.test_predictive" name="test_predictive_xgboost_v2" time="95.248" /><testcase classname="predictor.test_predictive" name="test_predictive_lightgbm_v2" time="95.263" /><testcase classname="predictor.test_scheduler_name" name="test_scheduler_name" time="7.184" /><testcase classname="predictor.test_secure_metrics.TestSecureMetrics" name="test_kserve_controller_args" time="5.166" /><testcase classname="predictor.test_secure_metrics.TestSecureMetrics" name="test_llmisvc_controller_args" time="5.162" /><testcase classname="predictor.test_secure_metrics.TestSecureMetrics" name="test_rejects_unauthenticated" time="8.261" /><testcase classname="predictor.test_secure_metrics.TestSecureMetrics" name="test_accepts_authenticated" time="8.142" /><testcase classname="predictor.test_sklearn" name="test_sklearn_kserve" time="95.251" /><testcase classname="custom.test_custom_model_grpc" name="test_custom_model_grpc" time="0.000"><skipped type="pytest.skip" message="Not testable in ODH at the moment">/workspace/source/test/e2e/custom/test_custom_model_grpc.py:56: Not testable in ODH at the moment</skipped></testcase><testcase classname="custom.test_ray" name="test_custom_model_http_ray" time="0.000"><skipped type="pytest.skip" message="Not testable in ODH at the moment">/workspace/source/test/e2e/custom/test_ray.py:44: Not testable in ODH at the moment</skipped></testcase><testcase classname="logger.test_logger" name="test_kserve_logger" time="135.296" /><testcase classname="predictor.test_sklearn" name="test_sklearn_v2_mlserver" time="195.295" /><testcase classname="predictor.test_autogluon" name="test_autogluon_runtime_kserve_v1" time="222.031" /><testcase classname="predictor.test_sklearn" name="test_sklearn_runtime_kserve" time="47.469" /><testcase classname="predictor.test_sklearn" name="test_sklearn_v2_runtime_mlserver" time="105.250" /><testcase classname="predictor.test_autogluon" name="test_autogluon_runtime_kserve_v2" time="141.934" /><testcase classname="predictor.test_sklearn" name="test_sklearn_v2" time="95.332" /><testcase classname="predictor.test_sklearn" name="test_sklearn_v2_grpc" time="0.000"><skipped type="pytest.skip" message="GRPC tests are failing in ODH at the moment">/workspace/source/test/e2e/predictor/test_sklearn.py:347: GRPC tests are failing in ODH at the moment</skipped></testcase><testcase classname="predictor.test_sklearn" name="test_sklearn_v2_mixed" time="105.263" /><testcase classname="predictor.test_autogluon" name="test_autogluon_runtime_kserve_v2_input_variants" time="112.393" /><testcase classname="predictor.test_sklearn" name="test_sklearn_v2_mixed_grpc" time="0.000"><skipped type="pytest.skip" message="GRPC tests are failing in ODH at the moment">/workspace/source/test/e2e/predictor/test_sklearn.py:451: GRPC tests are failing in ODH at the moment</skipped></testcase><testcase classname="predictor.test_tensorflow" name="test_tensorflow_kserve" time="56.677" /><testcase classname="predictor.test_autogluon" name="test_autogluon_runtime_kserve_v2_storage_uri_without_trailing_slash" time="131.731" /><testcase classname="predictor.test_tensorflow" name="test_tensorflow_runtime_kserve" time="46.489" /><testcase classname="predictor.test_triton" name="test_triton" time="147.799" /><testcase classname="predictor.test_autogluon_timeseries" name="test_autogluon_timeseries_runtime_kserve_v1" time="227.962" /><testcase classname="predictor.test_xgboost" name="test_xgboost_kserve" time="125.266" /><testcase classname="predictor.test_xgboost" name="test_xgboost_v2_mlserver" time="55.226" /><testcase classname="predictor.test_autogluon_timeseries" name="test_autogluon_timeseries_runtime_kserve_v1_storage_uri_without_trailing_slash" time="40.402" /><testcase classname="predictor.test_autoscaling" name="test_sklearn_kserve_concurrency" time="0.000"><skipped type="pytest.skip" message="We do not test anymore with Knative">/workspace/source/test/e2e/predictor/test_autoscaling.py:53: We do not test anymore with Knative</skipped></testcase><testcase classname="predictor.test_autoscaling" name="test_sklearn_kserve_rps" time="0.000"><skipped type="pytest.skip" message="We do not test anymore with Knative">/workspace/source/test/e2e/predictor/test_autoscaling.py:103: We do not test anymore with Knative</skipped></testcase><testcase classname="predictor.test_canary" name="test_canary_rollout" time="0.000"><skipped type="pytest.skip" message="Canary rollouts require Knative Serving and are not supported in RawDeployment mode">/workspace/source/test/e2e/predictor/test_canary.py:29: Canary rollouts require Knative Serving and are not supported in RawDeployment mode</skipped></testcase><testcase classname="predictor.test_canary" name="test_canary_rollout_runtime" time="0.000"><skipped type="pytest.skip" message="Canary rollouts require Knative Serving and are not supported in RawDeployment mode">/workspace/source/test/e2e/predictor/test_canary.py:102: Canary rollouts require Knative Serving and are not supported in RawDeployment mode</skipped></testcase><testcase classname="predictor.test_canary_raw_deployment" name="test_canary_create" time="105.254" /><testcase classname="predictor.test_xgboost" name="test_xgboost_single_model_file" time="55.236" /><testcase classname="predictor.test_xgboost" name="test_xgboost_runtime_kserve" time="105.263" /><testcase classname="predictor.test_canary_raw_deployment" name="test_canary_promote" time="185.411" /><testcase classname="predictor.test_xgboost" name="test_xgboost_v2_runtime_mlserver" time="65.237" /><testcase classname="predictor.test_xgboost" name="test_xgboost_v2" time="85.264" /><testcase classname="predictor.test_canary_raw_deployment" name="test_canary_rollback" time="185.350" /><testcase classname="predictor.test_xgboost" name="test_xgboost_v2_grpc" time="0.000"><skipped type="pytest.skip" message="Not testable in ODH at the moment">/workspace/source/test/e2e/predictor/test_xgboost.py:348: Not testable in ODH at the moment</skipped></testcase><testcase classname="storage.test_oci_modelcar" name="test_oci_modelcar_uid_isvc" time="0.036"><skipped type="pytest.skip" message="SKLEARN_MODELCAR_URI not set">/workspace/source/test/e2e/storage/test_oci_modelcar.py:121: SKLEARN_MODELCAR_URI not set</skipped></testcase><testcase classname="storagespec.test_s3_storagespec" name="test_sklearn_s3_storagespec_kserve" time="90.187" /><testcase classname="storagespec.test_s3_tls_storagespec" name="test_s3_tls_global_custom_cert_storagespec_kserve" time="102.321" /><testcase classname="predictor.test_canary_raw_deployment" name="test_canary_force_stop" time="100.306" /><testcase classname="storagespec.test_s3_tls_storagespec" name="test_s3_tls_custom_cert_storagespec_kserve" time="102.268" /><testcase classname="predictor.test_lightgbm" name="test_lightgbm_kserve" time="95.275" /><testcase classname="storagespec.test_s3_tls_storagespec" name="test_s3_tls_serving_cert_storagespec_kserve" time="102.254" /><testcase classname="predictor.test_lightgbm" name="test_lightgbm_runtime_kserve" time="95.468" /><testcase classname="predictor.test_paddle" name="test_paddle_runtime" time="76.269" /><testcase classname="predictor.test_lightgbm" name="test_lightgbm_v2_runtime_mlserver" time="55.326" /><testcase classname="predictor.test_paddle" name="test_paddle_v2_kserve" time="76.657" /><testcase classname="predictor.test_lightgbm" name="test_lightgbm_v2_kserve" time="35.241" /><testcase classname="predictor.test_lightgbm" name="test_lightgbm_v2_grpc" time="0.000"><skipped type="pytest.skip" message="Not testable in ODH at the moment">/workspace/source/test/e2e/predictor/test_lightgbm.py:270: Not testable in ODH at the moment</skipped></testcase><testcase classname="predictor.test_mlflow" name="test_mlflow_v2_runtime_kserve" time="55.289" /><testcase classname="predictor.test_paddle" name="test_paddle_v2_grpc" time="0.000"><skipped type="pytest.skip" message="GRPC tests are failing in ODH at the moment">/workspace/source/test/e2e/predictor/test_paddle.py:206: GRPC tests are failing in ODH at the moment</skipped></testcase><testcase classname="predictor.test_pmml" name="test_pmml_kserve" time="106.430" /><testcase classname="predictor.test_multi_container_probing" name="test_multi_container_probing" time="85.401" /><testcase classname="predictor.test_pmml" name="test_pmml_runtime_kserve" time="106.289" /><testcase classname="predictor.test_paddle" name="test_paddle" time="66.371" /><testcase classname="predictor.test_pmml" name="test_pmml_v2_grpc" time="0.000"><skipped type="pytest.skip" message="Not testable in ODH at the moment">/workspace/source/test/e2e/predictor/test_pmml.py:224: Not testable in ODH at the moment</skipped></testcase><testcase classname="predictor.test_pod_watch" name="test_event_storm_prevention_init_container_isolation" time="128.422" /><testcase classname="predictor.test_pmml" name="test_pmml_v2_kserve" time="106.297" /></testsuite></testsuites>