Skip to content

Commit b65c644

Browse files
author
Milind Waykole
committed
Fix test for Rawkserve clusteripnone chnages
Signed-off-by: Milind Waykole <mwaykole@mwaykole-thinkpadp1gen4i.bengluru.csb>
1 parent 212b8d9 commit b65c644

3 files changed

Lines changed: 170 additions & 0 deletions

File tree

tests/model_serving/model_server/components/kserve_dsc_deployment_mode/conftest.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from tests.model_serving.model_server.components.kserve_dsc_deployment_mode.utils import (
1616
patch_dsc_default_deployment_mode,
17+
patch_raw_default_deployment_config,
1718
)
1819
from utilities.constants import ModelAndFormat
1920
from utilities.inference_utils import create_isvc
@@ -54,6 +55,54 @@ def patched_default_deployment_mode_in_dsc(
5455
)
5556

5657

58+
@pytest.fixture(scope="class")
59+
def default_deployment_serviceconfig_in_dsc(
60+
request: FixtureRequest,
61+
default_deployment_mode_in_dsc: DataScienceCluster,
62+
inferenceservice_config_cm: ConfigMap,
63+
) -> Generator[DataScienceCluster, Any, Any]:
64+
"""
65+
Fixture to set the default deployment service configuration in DSC.
66+
67+
Args:
68+
request: Fixture request object
69+
default_deployment_mode_in_dsc: DataScienceCluster resource with deployment mode set
70+
inferenceservice_config_cm: ConfigMap for inference service configuration
71+
72+
Yields:
73+
DataScienceCluster: The DSC resource with updated service configuration
74+
"""
75+
yield from patch_raw_default_deployment_config(
76+
dsc_resource=default_deployment_mode_in_dsc,
77+
inferenceservice_config_cm=inferenceservice_config_cm,
78+
request_default_deployment_config=request.param["default-deployment-config"],
79+
)
80+
81+
82+
@pytest.fixture(scope="class")
83+
def patched_default_deployment_serviceconfig_in_dsc(
84+
request: FixtureRequest,
85+
default_deployment_serviceconfig_in_dsc: DataScienceCluster,
86+
inferenceservice_config_cm: ConfigMap,
87+
) -> Generator[DataScienceCluster, Any, Any]:
88+
"""
89+
Fixture to patch the default deployment service configuration in DSC.
90+
91+
Args:
92+
request: Fixture request object
93+
default_deployment_serviceconfig_in_dsc: DSC resource with initial service configuration
94+
inferenceservice_config_cm: ConfigMap for inference service configuration
95+
96+
Yields:
97+
DataScienceCluster: The DSC resource with patched service configuration
98+
"""
99+
yield from patch_raw_default_deployment_config(
100+
dsc_resource=default_deployment_serviceconfig_in_dsc,
101+
inferenceservice_config_cm=inferenceservice_config_cm,
102+
request_default_deployment_config=request.param["updated-deployment-config"],
103+
)
104+
105+
57106
@pytest.fixture(scope="class")
58107
def ovms_inference_service(
59108
request: FixtureRequest,

tests/model_serving/model_server/components/kserve_dsc_deployment_mode/test_kserve_dsc_default_deployment_mode.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22

3+
from tests.model_serving.model_server.components.kserve_dsc_deployment_mode.utils import get_service_cluster_ip
34
from tests.model_serving.model_server.utils import verify_inference_response
45
from utilities.constants import (
56
Annotations,
@@ -170,3 +171,39 @@ def test_restarted_pod_is_raw(
170171
pod_containers = {container.name for container in restarted_inference_pod.instance.spec.containers}
171172

172173
assert pod_containers == {"kserve-container"}
174+
175+
def test_default_service_config_is_headless(
176+
self, admin_client, default_deployment_mode_in_dsc, ovms_inference_service
177+
):
178+
"""
179+
Verify that the default service configuration is set to Headless mode
180+
(serviceClusterIPNone=True).
181+
"""
182+
assert get_service_cluster_ip(admin_client) is True, (
183+
"Default service config should be Headless (serviceClusterIPNone=True)"
184+
)
185+
186+
@pytest.mark.parametrize(
187+
"patched_default_deployment_serviceconfig_in_dsc,default_deployment_serviceconfig_in_dsc",
188+
[
189+
pytest.param(
190+
{"updated-deployment-config": "Headed"},
191+
{"default-deployment-config": "Headless"},
192+
)
193+
],
194+
indirect=True,
195+
)
196+
def test_service_config_can_be_updated_to_headed(
197+
self,
198+
default_deployment_mode_in_dsc,
199+
default_deployment_serviceconfig_in_dsc,
200+
patched_default_deployment_serviceconfig_in_dsc,
201+
ovms_inference_service,
202+
admin_client,
203+
):
204+
"""
205+
Verify that the service configuration can be updated from Headless to Headed mode.
206+
"""
207+
assert get_service_cluster_ip(admin_client) is False, (
208+
"Service config should be Headed (serviceClusterIPNone=False) after update"
209+
)

tests/model_serving/model_server/components/kserve_dsc_deployment_mode/utils.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from simple_logger.logger import get_logger
88
from timeout_sampler import TimeoutSampler
99

10+
from kubernetes.dynamic import DynamicClient
1011
from utilities.constants import Timeout
1112

1213
LOGGER = get_logger(name=__name__)
@@ -67,3 +68,86 @@ def patch_dsc_default_deployment_mode(
6768
deployment_mode=request_default_deployment_mode,
6869
)
6970
yield dsc_resource
71+
72+
73+
def wait_for_service_config_in_cm(config_map: ConfigMap, service_config: str) -> None:
74+
"""
75+
Wait for service config to be set in inferenceservice-config configmap.
76+
77+
Args:
78+
config_map (ConfigMap): ConfigMap object
79+
service_config (str): Service configuration type ("Headless" or "Headed")
80+
81+
Raises:
82+
TimeoutExpiredError: If service config value is not set in configmap
83+
"""
84+
LOGGER.info(f"Waiting for {service_config} service config to be set in {config_map.name} configmap")
85+
expected_value = service_config == "Headless"
86+
for sample in TimeoutSampler(
87+
wait_timeout=Timeout.TIMEOUT_5MIN,
88+
sleep=5,
89+
func=lambda: config_map.instance.data,
90+
):
91+
if sample:
92+
try:
93+
cm_service_config = json.loads(sample.service)["serviceClusterIPNone"]
94+
if cm_service_config == expected_value:
95+
LOGGER.info(f"Service config successfully set to {service_config}")
96+
break
97+
except (KeyError, json.JSONDecodeError) as e:
98+
LOGGER.warning(f"Error reading service config: {e}")
99+
continue
100+
101+
102+
def patch_raw_default_deployment_config(
103+
dsc_resource: DataScienceCluster,
104+
inferenceservice_config_cm: ConfigMap,
105+
request_default_deployment_config: str,
106+
) -> Generator[DataScienceCluster, Any, Any]:
107+
"""
108+
Patch DataScienceCluster object with service configuration and wait for it to be set in configmap.
109+
110+
Args:
111+
dsc_resource (DataScienceCluster): DataScienceCluster object
112+
inferenceservice_config_cm (ConfigMap): ConfigMap object
113+
request_default_deployment_config (str): Service configuration type ("Headless" or "Headed")
114+
115+
Yields:
116+
DataScienceCluster: DataScienceCluster object with updated service configuration
117+
"""
118+
if request_default_deployment_config not in ["Headless", "Headed"]:
119+
raise ValueError("Service config must be either 'Headless' or 'Headed'")
120+
121+
with ResourceEditor(
122+
patches={
123+
dsc_resource: {
124+
"spec": {"components": {"kserve": {"rawDeploymentServiceConfig": request_default_deployment_config}}}
125+
}
126+
}
127+
):
128+
wait_for_service_config_in_cm(
129+
config_map=inferenceservice_config_cm,
130+
service_config=request_default_deployment_config,
131+
)
132+
yield dsc_resource
133+
134+
135+
def get_service_cluster_ip(admin_client: DynamicClient) -> bool:
136+
"""
137+
Get the service cluster IP configuration from the inferenceservice-config configmap.
138+
139+
Args:
140+
admin_client: Admin client for accessing the cluster
141+
142+
Returns:
143+
dict: Service configuration from the configmap
144+
145+
Raises:
146+
ValueError: If the configmap or service configuration cannot be read
147+
"""
148+
try:
149+
config_map = ConfigMap(client=admin_client, namespace="redhat-ods-applications", name="inferenceservice-config")
150+
config_map = json.loads(config_map.instance["data"]["service"])
151+
return config_map["serviceClusterIPNone"]
152+
except (KeyError, json.JSONDecodeError) as e:
153+
raise ValueError(f"Failed to read service configuration: {e}")

0 commit comments

Comments
 (0)