Skip to content

Commit 8a4b1a5

Browse files
committed
wip: migrate trustyaiservice tests to kserveraw
1 parent f074dcf commit 8a4b1a5

File tree

10 files changed

+183
-22
lines changed

10 files changed

+183
-22
lines changed

tests/model_explainability/trustyai_service/conftest.py

Lines changed: 89 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
from typing import Generator, Any
23

34
import pytest
@@ -14,11 +15,13 @@
1415
from ocp_resources.pod import Pod
1516
from ocp_resources.role import Role
1617
from ocp_resources.role_binding import RoleBinding
18+
from ocp_resources.route import Route
1719
from ocp_resources.secret import Secret
1820
from ocp_resources.service import Service
1921
from ocp_resources.service_account import ServiceAccount
2022
from ocp_resources.serving_runtime import ServingRuntime
2123
from ocp_resources.trustyai_service import TrustyAIService
24+
from pytest_testconfig import py_config
2225

2326
from tests.model_explainability.trustyai_service.constants import (
2427
TAI_DATA_CONFIG,
@@ -50,7 +53,8 @@
5053
from utilities.operator_utils import get_cluster_service_version
5154
from utilities.constants import KServeDeploymentType, Labels, OPENSHIFT_OPERATORS, MARIADB, TRUSTYAI_SERVICE_NAME
5255
from utilities.inference_utils import create_isvc
53-
from utilities.infra import update_configmap_data, create_inference_token
56+
from ocp_resources.resource import ResourceEditor
57+
from utilities.infra import create_inference_token, get_kserve_storage_initialize_image
5458

5559
DB_CREDENTIALS_SECRET_NAME: str = "db-credentials"
5660
DB_NAME: str = "trustyai_db"
@@ -96,15 +100,74 @@ def trustyai_service(
96100
yield trustyai_service
97101

98102

103+
@pytest.fixture(scope="session")
104+
def kserve_raw_config(admin_client: DynamicClient) -> Generator[ConfigMap, Any, Any]:
105+
"""Configure KServe for KServeRaw support by adding logger configuration."""
106+
107+
storage_initializer_image = get_kserve_storage_initialize_image(client=admin_client)
108+
logger_config = {
109+
"image": storage_initializer_image,
110+
"memoryRequest": "100Mi",
111+
"memoryLimit": "1Gi",
112+
"cpuRequest": "100m",
113+
"cpuLimit": "1",
114+
"defaultUrl": "http://default-broker",
115+
"caBundle": "kserve-logger-ca-bundle",
116+
"caCertFile": "service-ca.crt",
117+
"tlsSkipVerify": False,
118+
}
119+
120+
data = {"logger": json.dumps(obj=logger_config)}
121+
122+
cm = ConfigMap(
123+
client=admin_client,
124+
name="inferenceservice-config",
125+
namespace=py_config["applications_namespace"],
126+
ensure_exists=True,
127+
)
128+
129+
with ResourceEditor(
130+
patches={
131+
cm: {
132+
"metadata": {"annotations": {"opendatahub.io/managed": "false"}},
133+
"data": data,
134+
}
135+
}
136+
):
137+
yield cm
138+
139+
140+
@pytest.fixture(scope="class")
141+
def kserve_logger_ca_bundle(admin_client: DynamicClient, model_namespace: Namespace) -> Generator[ConfigMap, Any, Any]:
142+
"""Create CA certificate ConfigMap required for KServeRaw logger."""
143+
with ConfigMap(
144+
client=admin_client,
145+
name="kserve-logger-ca-bundle",
146+
namespace=model_namespace.name,
147+
annotations={"service.beta.openshift.io/inject-cabundle": "true"},
148+
data={},
149+
) as ca_bundle:
150+
yield ca_bundle
151+
152+
99153
@pytest.fixture(scope="session")
100154
def user_workload_monitoring_config(admin_client: DynamicClient) -> Generator[ConfigMap, Any, Any]:
101-
data = {"config.yaml": yaml.dump({"prometheus": {"logLevel": "debug", "retention": "15d"}})}
102-
with update_configmap_data(
155+
data = {"config.yaml": yaml.dump(data={"prometheus": {"logLevel": "debug", "retention": "15d"}})}
156+
157+
cm = ConfigMap(
103158
client=admin_client,
104159
name="user-workload-monitoring-config",
105160
namespace="openshift-user-workload-monitoring",
106-
data=data,
107-
) as cm:
161+
ensure_exists=True,
162+
)
163+
164+
with ResourceEditor(
165+
patches={
166+
cm: {
167+
"data": data,
168+
}
169+
}
170+
):
108171
yield cm
109172

110173

@@ -218,6 +281,8 @@ def gaussian_credit_model(
218281
minio_service: Service,
219282
minio_data_connection: Secret,
220283
mlserver_runtime: ServingRuntime,
284+
kserve_raw_config: ConfigMap,
285+
kserve_logger_ca_bundle: ConfigMap,
221286
teardown_resources: bool,
222287
) -> Generator[InferenceService, Any, Any]:
223288
gaussian_credit_model_kwargs = {
@@ -232,13 +297,15 @@ def gaussian_credit_model(
232297
isvc.clean_up()
233298
else:
234299
with create_isvc(
235-
deployment_mode=KServeDeploymentType.SERVERLESS,
300+
deployment_mode=KServeDeploymentType.RAW_DEPLOYMENT,
236301
model_format=XGBOOST,
237302
runtime=mlserver_runtime.name,
238303
storage_key=minio_data_connection.name,
239304
storage_path=GAUSSIAN_CREDIT_MODEL_STORAGE_PATH,
240305
enable_auth=True,
306+
external_route=True,
241307
wait_for_predictor_pods=False,
308+
wait=False,
242309
resources=GAUSSIAN_CREDIT_MODEL_RESOURCES,
243310
teardown=teardown_resources,
244311
**gaussian_credit_model_kwargs,
@@ -251,6 +318,22 @@ def gaussian_credit_model(
251318
yield isvc
252319

253320

321+
@pytest.fixture(scope="class")
322+
def gaussian_credit_model_route(
323+
admin_client: DynamicClient,
324+
model_namespace: Namespace,
325+
gaussian_credit_model: InferenceService,
326+
) -> Generator[Route, Any, Any]:
327+
"""Create Route for gaussian credit model InferenceService."""
328+
with Route(
329+
client=admin_client,
330+
name=f"{gaussian_credit_model.name}-route",
331+
namespace=model_namespace.name,
332+
service=gaussian_credit_model.name,
333+
) as route:
334+
yield route
335+
336+
254337
@pytest.fixture(scope="class")
255338
def isvc_getter_service_account(
256339
admin_client: DynamicClient, model_namespace: Namespace

tests/model_explainability/trustyai_service/drift/test_drift.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,11 @@
3333
{"storage": "pvc"},
3434
id="pvc-storage",
3535
),
36-
pytest.param(
37-
{"name": "test-drift-db"},
38-
MinIo.PodConfig.MODEL_MESH_MINIO_CONFIG,
39-
{"bucket": MinIo.Buckets.MODELMESH_EXAMPLE_MODELS},
40-
{"storage": "db"},
41-
id="db-storage",
42-
),
4336
],
4437
indirect=True,
4538
)
4639
@pytest.mark.usefixtures("minio_pod")
47-
@pytest.mark.serverless
40+
@pytest.mark.rawdeployment
4841
@pytest.mark.smoke
4942
class TestDriftMetrics:
5043
"""
@@ -67,6 +60,7 @@ def test_drift_send_inference(
6760
model_namespace,
6861
trustyai_service,
6962
gaussian_credit_model,
63+
# gaussian_credit_model_route,
7064
isvc_getter_token,
7165
) -> None:
7266
send_inferences_and_verify_trustyai_service_registered(

tests/model_explainability/trustyai_service/fairness/conftest.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import pytest
44
from kubernetes.dynamic import DynamicClient
5+
from ocp_resources.config_map import ConfigMap
56
from ocp_resources.inference_service import InferenceService
67
from ocp_resources.namespace import Namespace
78
from ocp_resources.pod import Pod
9+
from ocp_resources.route import Route
810
from ocp_resources.secret import Secret
911
from ocp_resources.service import Service
1012
from ocp_resources.serving_runtime import ServingRuntime
@@ -44,19 +46,22 @@ def onnx_loan_model(
4446
minio_service: Service,
4547
minio_data_connection: Secret,
4648
ovms_runtime: ServingRuntime,
49+
kserve_raw_config: ConfigMap,
50+
kserve_logger_ca_bundle: ConfigMap,
4751
) -> Generator[InferenceService, Any, Any]:
4852
with create_isvc(
4953
client=admin_client,
5054
name="demo-loan-nn-onnx-alpha",
5155
namespace=model_namespace.name,
52-
deployment_mode=KServeDeploymentType.SERVERLESS,
56+
deployment_mode=KServeDeploymentType.RAW_DEPLOYMENT,
5357
model_format=ModelFormat.ONNX,
5458
runtime=ovms_runtime.name,
5559
storage_key=minio_data_connection.name,
5660
storage_path="ovms/loan_model_alpha",
5761
min_replicas=1,
5862
resources={"limits": {"cpu": "2", "memory": "8Gi"}, "requests": {"cpu": "1", "memory": "4Gi"}},
5963
enable_auth=True,
64+
external_route=True,
6065
model_version="1",
6166
wait=True,
6267
wait_for_predictor_pods=False,
@@ -67,3 +72,19 @@ def onnx_loan_model(
6772
runtime_name=ovms_runtime.name,
6873
)
6974
yield isvc
75+
76+
77+
@pytest.fixture(scope="class")
78+
def onnx_loan_model_route(
79+
admin_client: DynamicClient,
80+
model_namespace: Namespace,
81+
onnx_loan_model: InferenceService,
82+
) -> Generator[Route, Any, Any]:
83+
"""Create Route for ONNX loan model InferenceService."""
84+
with Route(
85+
client=admin_client,
86+
name=f"{onnx_loan_model.name}-route",
87+
namespace=model_namespace.name,
88+
service=onnx_loan_model.name,
89+
) as route:
90+
yield route

tests/model_explainability/trustyai_service/fairness/test_fairness.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def get_fairness_request_json_data(isvc: InferenceService) -> dict[str, Any]:
7171
indirect=True,
7272
)
7373
@pytest.mark.usefixtures("minio_pod")
74-
@pytest.mark.serverless
74+
@pytest.mark.rawdeployment
7575
@pytest.mark.smoke
7676
class TestFairnessMetrics:
7777
"""
@@ -95,6 +95,7 @@ def test_fairness_send_inference(
9595
model_namespace,
9696
trustyai_service,
9797
onnx_loan_model,
98+
onnx_loan_model_route,
9899
isvc_getter_token,
99100
):
100101
send_inferences_and_verify_trustyai_service_registered(

tests/model_explainability/trustyai_service/service/multi_ns/conftest.py

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
from typing import Generator, Any, List
44
import pytest
55
from ocp_resources.namespace import Namespace
6+
from ocp_resources.pod import Pod
7+
from ocp_resources.route import Route
68
from ocp_resources.secret import Secret
9+
from ocp_resources.service import Service
710
from ocp_resources.serving_runtime import ServingRuntime
811
from ocp_resources.inference_service import InferenceService
912
from ocp_resources.trustyai_service import TrustyAIService
@@ -12,6 +15,7 @@
1215
from ocp_resources.role_binding import RoleBinding
1316
from utilities.constants import OPENSHIFT_OPERATORS, MARIADB, TRUSTYAI_SERVICE_NAME
1417
from ocp_resources.maria_db import MariaDB
18+
from ocp_resources.config_map import ConfigMap
1519
from tests.model_explainability.trustyai_service.constants import (
1620
TAI_METRICS_CONFIG,
1721
TAI_DATA_CONFIG,
@@ -104,6 +108,28 @@ def trustyai_service_with_pvc_storage_multi_ns(
104108
yield services
105109

106110

111+
@pytest.fixture(scope="class")
112+
def kserve_logger_ca_bundle_multi_ns(
113+
admin_client: DynamicClient, model_namespaces: List[Namespace]
114+
) -> Generator[List[ConfigMap], Any, None]:
115+
"""Create CA certificate ConfigMaps required for KServeRaw logger in each namespace."""
116+
with ExitStack() as stack:
117+
ca_bundles = [
118+
stack.enter_context(
119+
ConfigMap(
120+
client=admin_client,
121+
name="kserve-logger-ca-bundle",
122+
namespace=ns.name,
123+
annotations={"service.beta.openshift.io/inject-cabundle": "true"},
124+
data={},
125+
teardown=False,
126+
)
127+
)
128+
for ns in model_namespaces
129+
]
130+
yield ca_bundles
131+
132+
107133
@pytest.fixture(scope="class")
108134
def mlserver_runtime_multi_ns(admin_client, model_namespaces) -> Generator[List[ServingRuntime], Any, None]:
109135
with ExitStack() as stack:
@@ -128,7 +154,14 @@ def mlserver_runtime_multi_ns(admin_client, model_namespaces) -> Generator[List[
128154

129155
@pytest.fixture(scope="class")
130156
def gaussian_credit_model_multi_ns(
131-
admin_client, model_namespaces, minio_pod, minio_service, minio_data_connection_multi_ns, mlserver_runtime_multi_ns
157+
admin_client: DynamicClient,
158+
model_namespaces: List[Namespace],
159+
minio_pod: Pod,
160+
minio_service: Service,
161+
minio_data_connection_multi_ns: List[Secret],
162+
mlserver_runtime_multi_ns: List[ServingRuntime],
163+
kserve_raw_config: ConfigMap,
164+
kserve_logger_ca_bundle_multi_ns: List[ConfigMap],
132165
) -> Generator[List[InferenceService], Any, None]:
133166
with ExitStack() as stack:
134167
models = []
@@ -137,12 +170,13 @@ def gaussian_credit_model_multi_ns(
137170
client=admin_client,
138171
namespace=ns.name,
139172
name=GAUSSIAN_CREDIT_MODEL,
140-
deployment_mode=KServeDeploymentType.SERVERLESS,
173+
deployment_mode=KServeDeploymentType.RAW_DEPLOYMENT,
141174
model_format=XGBOOST,
142175
runtime=runtime.name,
143176
storage_key=secret.name,
144177
storage_path=GAUSSIAN_CREDIT_MODEL_STORAGE_PATH,
145178
enable_auth=True,
179+
external_route=True,
146180
wait_for_predictor_pods=False,
147181
resources=GAUSSIAN_CREDIT_MODEL_RESOURCES,
148182
)
@@ -159,6 +193,28 @@ def gaussian_credit_model_multi_ns(
159193
yield models
160194

161195

196+
@pytest.fixture(scope="class")
197+
def gaussian_credit_model_routes_multi_ns(
198+
admin_client: DynamicClient,
199+
model_namespaces: List[Namespace],
200+
gaussian_credit_model_multi_ns: List[InferenceService],
201+
) -> Generator[List[Route], Any, None]:
202+
"""Create Routes for multi-namespace gaussian credit model InferenceServices."""
203+
with ExitStack() as stack:
204+
routes = []
205+
for ns, isvc in zip(model_namespaces, gaussian_credit_model_multi_ns):
206+
route = stack.enter_context(
207+
Route(
208+
client=admin_client,
209+
name=f"{isvc.name}-route",
210+
namespace=ns.name,
211+
service=isvc.name,
212+
)
213+
)
214+
routes.append(route)
215+
yield routes
216+
217+
162218
@pytest.fixture(scope="class")
163219
def isvc_getter_service_account_multi_ns(admin_client, model_namespaces) -> Generator[List[ServiceAccount], None, None]:
164220
with ExitStack() as stack:

tests/model_explainability/trustyai_service/service/multi_ns/test_trustyai_service_multi_ns.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
],
3030
indirect=True,
3131
)
32-
@pytest.mark.serverless
32+
@pytest.mark.rawdeployment
3333
class TestTrustyAIServiceMultipleNS:
3434
"""Verifies TrustyAIService operations across multiple namespaces,
3535
i.e. registering inference requests, uploading data, scheduling and deleting metrics,
@@ -41,6 +41,7 @@ def test_drift_send_inference_and_verify_trustyai_service_multiple_ns(
4141
current_client_token,
4242
trustyai_service_with_pvc_storage_multi_ns,
4343
gaussian_credit_model_multi_ns,
44+
gaussian_credit_model_routes_multi_ns,
4445
isvc_getter_token_multi_ns,
4546
):
4647
for tai, model, token in zip(
@@ -136,6 +137,7 @@ def test_drift_send_inference_and_verify_trustyai_service_with_db_storage(
136137
model_namespaces,
137138
trustyai_service_with_db_storage_multi_ns,
138139
gaussian_credit_model_multi_ns,
140+
gaussian_credit_model_routes_multi_ns,
139141
isvc_getter_token_multi_ns,
140142
):
141143
for tai, inference_model, inference_token in zip(

tests/model_explainability/trustyai_service/service/test_trustyai_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def test_validate_trustyai_service_image(
8585
indirect=True,
8686
)
8787
@pytest.mark.usefixtures("minio_pod")
88-
@pytest.mark.serverless
88+
@pytest.mark.rawdeployment
8989
def test_trustyai_service_db_migration(
9090
admin_client,
9191
current_client_token,

0 commit comments

Comments
 (0)