Skip to content

Commit

Permalink
fix labels
Browse files Browse the repository at this point in the history
  • Loading branch information
rnetser committed Jan 19, 2025
1 parent 350e60a commit 644627d
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 90 deletions.
26 changes: 1 addition & 25 deletions tests/model_serving/model_server/private_endpoint/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from tests.model_serving.model_server.private_endpoint.utils import create_sidecar_pod
from tests.model_serving.model_server.utils import create_isvc
from utilities.constants import KServeDeploymentType, ModelFormat, ModelStoragePath
from utilities.infra import create_ns, create_storage_config_secret
from utilities.infra import create_ns

LOGGER = get_logger(name=__name__)

Expand All @@ -28,7 +28,6 @@ def endpoint_isvc(
admin_client: DynamicClient,
serving_runtime_from_template: ServingRuntime,
models_endpoint_s3_secret: Secret,
storage_config_secret: Secret,
) -> Generator[InferenceService, None, None]:
with create_isvc(
client=admin_client,
Expand All @@ -44,29 +43,6 @@ def endpoint_isvc(
yield isvc


@pytest.fixture(scope="class")
def storage_config_secret(
admin_client: DynamicClient,
models_endpoint_s3_secret: Secret,
aws_access_key_id: str,
aws_secret_access_key: str,
models_s3_bucket_name: str,
models_s3_bucket_region: str,
models_s3_bucket_endpoint: str,
) -> Generator[Secret, None, None]:
with create_storage_config_secret(
admin_client=admin_client,
endpoint_secret_name=models_endpoint_s3_secret.name,
namespace=models_endpoint_s3_secret.namespace,
aws_access_key=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
aws_s3_bucket=models_s3_bucket_name,
aws_s3_region=models_s3_bucket_region,
aws_s3_endpoint=models_s3_bucket_endpoint,
) as storage_config:
yield storage_config


@pytest.fixture()
def endpoint_pod_with_istio_sidecar(
admin_client: DynamicClient, model_namespace: Namespace
Expand Down
4 changes: 2 additions & 2 deletions tests/model_serving/model_server/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from simple_logger.logger import get_logger
from timeout_sampler import TimeoutSampler

from utilities.constants import KServeDeploymentType
from utilities.constants import KServeDeploymentType, KubernetesAnnotations
from utilities.exceptions import FailedPodsError, InferenceResponseError, InvalidStorageArgumentError
from utilities.inference_utils import UserInference
from utilities.infra import (
Expand Down Expand Up @@ -110,7 +110,7 @@ def create_isvc(
if volumes:
predictor_dict["volumes"] = volumes

annotations = {"serving.kserve.io/deploymentMode": deployment_mode}
annotations = {KubernetesAnnotations.DEPLOYMENT_MODE: deployment_mode}

if deployment_mode == KServeDeploymentType.SERVERLESS:
annotations.update({
Expand Down
1 change: 1 addition & 0 deletions utilities/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ class KubernetesAnnotations:
INSTANCE: str = f"{Resource.ApiGroup.APP_KUBERNETES_IO}/instance"
PART_OF: str = f"{Resource.ApiGroup.APP_KUBERNETES_IO}/part-of"
CREATED_BY: str = f"{Resource.ApiGroup.APP_KUBERNETES_IO}/created-by"
DEPLOYMENT_MODE: str = "serving.kserve.io/deploymentMode"


class StorageClassName:
Expand Down
16 changes: 16 additions & 0 deletions utilities/general.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
from __future__ import annotations

import base64
from typing import Dict

from kubernetes.dynamic import DynamicClient
from ocp_resources.inference_service import InferenceService
from ocp_resources.pod import Pod
from simple_logger.logger import get_logger

import utilities.infra
from utilities.constants import KServeDeploymentType, KubernetesAnnotations, MODELMESH_SERVING

LOGGER = get_logger(name=__name__)

Expand Down Expand Up @@ -104,3 +108,15 @@ def download_model_data(
pod.wait_for_status(status=Pod.Status.SUCCEEDED, timeout=25 * 60)

return model_path


def create_isvc_label_selector_str(isvc: InferenceService) -> str:
if isvc.instance.metadata.annotations.get(KubernetesAnnotations.DEPLOYMENT_MODE) in (
KServeDeploymentType.SERVERLESS,
KServeDeploymentType.RAW_DEPLOYMENT,
):
label_selector = f"{isvc.ApiGroup.SERVING_KSERVE_IO}/inferenceservice={isvc.name}"

else:
label_selector = f"modelmesh-service={MODELMESH_SERVING}"
return label_selector
20 changes: 1 addition & 19 deletions utilities/inference_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
from utilities.certificates_utils import get_ca_bundle
from utilities.constants import (
KServeDeploymentType,
MODELMESH_SERVING,
ModelInferenceRuntime,
Protocols,
HTTPRequest,
Expand Down Expand Up @@ -235,7 +234,7 @@ def run_inference(

# For internal inference, we need to use port forwarding to the service
if not self.visibility_exposed:
svc = self.get_isvc_service()
svc = get_services_by_isvc_label(client=self.inference_service.client, isvc=self.inference_service)[0]
port = self.get_target_port(svc=svc)
cmd = cmd.replace("localhost", f"localhost:{port}")

Expand Down Expand Up @@ -281,23 +280,6 @@ def run_inference(
except JSONDecodeError:
return {"output": out}

def get_isvc_service(self) -> Service:
if self.deployment_mode == KServeDeploymentType.MODEL_MESH:
if svc := list(
Service.get(
dyn_client=self.inference_service.client,
name=MODELMESH_SERVING,
namespace=self.inference_service.namespace,
)
):
svc = svc[0]
else:
raise ValueError(f"Service {MODELMESH_SERVING} not found")

else:
svc = get_services_by_isvc_label(client=self.inference_service.client, isvc=self.inference_service)[0]
return svc

def get_target_port(self, svc: Service) -> int:
if self.protocol in Protocols.ALL_SUPPORTED_PROTOCOLS:
svc_protocol = "TCP"
Expand Down
51 changes: 7 additions & 44 deletions utilities/infra.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,8 @@
from pytest_testconfig import config as py_config
from simple_logger.logger import get_logger

from utilities.constants import KServeDeploymentType, MODELMESH_SERVING
import utilities.general

from utilities.general import create_isvc_label_selector_str

LOGGER = get_logger(name=__name__)
TIMEOUT_2MIN = 2 * 60
Expand Down Expand Up @@ -69,15 +68,7 @@ def wait_for_inference_deployment_replicas(
client: DynamicClient, isvc: InferenceService, deployment_mode: str, expected_num_deployments: int = 1
) -> List[Deployment]:
ns = isvc.namespace

if deployment_mode in (
KServeDeploymentType.SERVERLESS,
KServeDeploymentType.RAW_DEPLOYMENT,
):
label_selector = f"{isvc.ApiGroup.SERVING_KSERVE_IO}/inferenceservice={isvc.name}"

else:
label_selector = f"modelmesh-service={MODELMESH_SERVING}"
label_selector = create_isvc_label_selector_str(isvc=isvc)

deployments = list(
Deployment.get(
Expand Down Expand Up @@ -131,37 +122,6 @@ def s3_endpoint_secret(
yield secret


@contextmanager
def create_storage_config_secret(
admin_client: DynamicClient,
endpoint_secret_name: str,
namespace: str,
aws_access_key: str,
aws_secret_access_key: str,
aws_s3_bucket: str,
aws_s3_region: str,
aws_s3_endpoint: str,
) -> Generator[Secret, None, None]:
secret = {
"access_key_id": aws_access_key,
"bucket": aws_s3_bucket,
"default_bucket": aws_s3_bucket,
"endpoint_url": aws_s3_endpoint,
"region": aws_s3_region,
"secret_access_key": aws_secret_access_key,
"type": "s3",
}
data = {endpoint_secret_name: utilities.general.b64_encoded_string(string_to_encode=json.dumps(secret))}
with Secret(
client=admin_client,
namespace=namespace,
data_dict=data,
wait_for_resource=True,
name="storage-config",
) as storage_config:
yield storage_config


@contextmanager
def create_isvc_view_role(
client: DynamicClient,
Expand Down Expand Up @@ -261,12 +221,14 @@ def get_services_by_isvc_label(client: DynamicClient, isvc: InferenceService) ->
Raises:
ResourceNotFoundError: if no pods are found.
"""
label_selector = create_isvc_label_selector_str(isvc=isvc)

if svcs := [
svc
for svc in Service.get(
dyn_client=client,
namespace=isvc.namespace,
label_selector=f"{isvc.ApiGroup.SERVING_KSERVE_IO}/inferenceservice={isvc.name}",
label_selector=label_selector,
)
]:
return svcs
Expand All @@ -286,12 +248,13 @@ def get_pods_by_isvc_label(client: DynamicClient, isvc: InferenceService) -> Lis
Raises:
ResourceNotFoundError: if no pods are found.
"""
label_selector = create_isvc_label_selector_str(isvc=isvc)
if pods := [
pod
for pod in Pod.get(
dyn_client=client,
namespace=isvc.namespace,
label_selector=f"{isvc.ApiGroup.SERVING_KSERVE_IO}/inferenceservice={isvc.name}",
label_selector=label_selector,
)
]:
return pods
Expand Down

0 comments on commit 644627d

Please sign in to comment.