Skip to content

Commit 780ee13

Browse files
authored
Add model registry tests for default postgres db (#746)
* Add model registry tests for default postgres db * fix typos * simplify get_model_registry_objects()
1 parent c588832 commit 780ee13

File tree

4 files changed

+132
-23
lines changed

4 files changed

+132
-23
lines changed

tests/model_registry/conftest.py

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -135,24 +135,27 @@ def model_registry_metadata_db_resources(
135135
resource.delete(wait=True)
136136
else:
137137
resources_instances = {}
138-
resources = get_model_registry_metadata_resources(
139-
base_name=DB_BASE_RESOURCES_NAME,
140-
namespace=model_registry_namespace,
141-
num_resources=num_resources,
142-
db_backend=db_backend,
143-
teardown_resources=teardown_resources,
144-
client=admin_client,
145-
)
146-
with ExitStack() as stack:
147-
for kind_name in [Secret, PersistentVolumeClaim, Service, ConfigMap, Deployment]:
148-
if resources[kind_name]:
149-
LOGGER.info(f"Creating {num_resources} {kind_name} resources")
150-
resources_instances[kind_name] = [
151-
stack.enter_context(resource_obj) for resource_obj in resources[kind_name]
152-
]
153-
for deployment in resources_instances[Deployment]:
154-
deployment.wait_for_replicas(deployed=True)
138+
if db_backend == "default":
155139
yield resources_instances
140+
else:
141+
resources = get_model_registry_metadata_resources(
142+
base_name=DB_BASE_RESOURCES_NAME,
143+
namespace=model_registry_namespace,
144+
num_resources=num_resources,
145+
db_backend=db_backend,
146+
teardown_resources=teardown_resources,
147+
client=admin_client,
148+
)
149+
with ExitStack() as stack:
150+
for kind_name in [Secret, PersistentVolumeClaim, Service, ConfigMap, Deployment]:
151+
if resources[kind_name]:
152+
LOGGER.info(f"Creating {num_resources} {kind_name} resources")
153+
resources_instances[kind_name] = [
154+
stack.enter_context(resource_obj) for resource_obj in resources[kind_name]
155+
]
156+
for deployment in resources_instances[Deployment]:
157+
deployment.wait_for_replicas(deployed=True)
158+
yield resources_instances
156159

157160

158161
@pytest.fixture(scope="class")

tests/model_registry/rest_api/conftest.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,3 +346,27 @@ def model_data_for_test() -> Generator[dict[str, Any], None, None]:
346346
model_data = copy.deepcopy(MODEL_REGISTER_DATA)
347347
model_data["register_model_data"]["name"] = model_name
348348
yield model_data
349+
350+
351+
@pytest.fixture()
352+
def skip_if_not_default_db(request):
353+
"""
354+
Fixture that skips the test if not using default postgres database
355+
"""
356+
default_db = request.node.callspec.params.get("model_registry_metadata_db_resources", {}).get("db_name")
357+
LOGGER.info(f"default_db: {default_db}")
358+
if not default_db or default_db != "default":
359+
pytest.skip(reason="This test is only relevant for default postgres db")
360+
361+
362+
@pytest.fixture()
363+
def model_registry_default_postgres_deployment_match_label(
364+
model_registry_namespace: str, model_registry_instance: list[ModelRegistry]
365+
) -> dict[str, str]:
366+
"""
367+
Returns the matchLabels from the default postgres deployment for filtering pods.
368+
"""
369+
deployment = Deployment(
370+
namespace=model_registry_namespace, name=f"{model_registry_instance[0].name}-postgres", ensure_exists=True
371+
)
372+
return deployment.instance.spec.selector.matchLabels

tests/model_registry/rest_api/test_model_registry_rest_api.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
from typing import Self, Any
22
import pytest
3+
from kubernetes.dynamic import DynamicClient
4+
from ocp_resources.deployment import Deployment
35
from ocp_resources.model_registry_modelregistry_opendatahub_io import ModelRegistry
6+
from ocp_resources.persistent_volume_claim import PersistentVolumeClaim
7+
from ocp_resources.pod import Pod
8+
from ocp_resources.secret import Secret
9+
from ocp_resources.service import Service
410

511
from tests.model_registry.rest_api.constants import (
612
MODEL_REGISTER,
@@ -21,6 +27,7 @@
2127

2228

2329
LOGGER = get_logger(name=__name__)
30+
CONNECTION_STRING: str = "/var/run/postgresql:5432 - accepting connections"
2431

2532

2633
@pytest.mark.parametrize(
@@ -38,6 +45,11 @@
3845
MODEL_REGISTER_DATA,
3946
marks=(pytest.mark.sanity),
4047
),
48+
pytest.param(
49+
{"db_name": "default"},
50+
{"db_name": "default"},
51+
MODEL_REGISTER_DATA,
52+
),
4153
],
4254
indirect=True,
4355
)
@@ -87,6 +99,73 @@ def test_validate_model_registry_resource(
8799
resource_name=data_key,
88100
)
89101

102+
@pytest.mark.parametrize(
103+
"kind, name_suffix",
104+
[
105+
pytest.param(
106+
Secret,
107+
"postgres-credentials",
108+
id="test_secret_default_db_exists",
109+
),
110+
pytest.param(
111+
Deployment,
112+
"postgres",
113+
id="test_deployment_default_db_exists",
114+
),
115+
pytest.param(
116+
Service,
117+
"postgres",
118+
id="test_service_default_db_exists",
119+
),
120+
pytest.param(
121+
PersistentVolumeClaim,
122+
"postgres-storage",
123+
id="test_pvc_default_db_exists",
124+
),
125+
],
126+
)
127+
def test_default_postgres_db_resource_exists(
128+
self: Self,
129+
skip_if_not_default_db: None,
130+
kind: Any,
131+
name_suffix: str,
132+
model_registry_instance: list[ModelRegistry],
133+
model_registry_namespace: str,
134+
) -> None:
135+
"""
136+
Check resources created for default postgres database
137+
"""
138+
model_registry = model_registry_instance[0]
139+
resource_name = f"{model_registry.name}-{name_suffix}"
140+
resource = kind(name=resource_name, namespace=model_registry_namespace)
141+
if not resource.exists:
142+
pytest.fail(f"Resource: {resource_name} is not created, in {model_registry_namespace}")
143+
owner_reference = resource.instance.metadata.ownerReferences
144+
assert owner_reference, f"Owner reference not found for resource: {resource_name}"
145+
assert owner_reference[0].kind == model_registry.kind
146+
assert owner_reference[0].name == model_registry.name
147+
for field in ["controller", "blockOwnerDeletion"]:
148+
assert owner_reference[0][field] is True
149+
150+
def test_default_postgres_db_pod_log(
151+
self: Self,
152+
skip_if_not_default_db: None,
153+
admin_client: DynamicClient,
154+
model_registry_namespace: str,
155+
model_registry_default_postgres_deployment_match_label: dict[str, str],
156+
):
157+
label_selector = ",".join([
158+
f"{k}={v}" for k, v in model_registry_default_postgres_deployment_match_label.items()
159+
])
160+
LOGGER.info(label_selector)
161+
pods = list(Pod.get(dyn_client=admin_client, namespace=model_registry_namespace, label_selector=label_selector))
162+
assert pods, (
163+
"No pods found for default postgres deployment with "
164+
f"label: {model_registry_default_postgres_deployment_match_label}"
165+
)
166+
postgres_pod_log = pods[0].log(container="postgres")
167+
assert CONNECTION_STRING in postgres_pod_log
168+
90169
def test_model_registry_validate_api_version(
91170
self: Self,
92171
model_registry_instance,

tests/model_registry/utils.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -544,11 +544,13 @@ def get_model_registry_objects(
544544
model_registry_objects = []
545545
for num_mr in range(0, num):
546546
name = f"{base_name}{num_mr}"
547-
mysql = get_mysql_config(
548-
base_name=f"{DB_BASE_RESOURCES_NAME}{num_mr}", namespace=namespace, db_backend=db_backend
549-
)
550-
if "sslRootCertificateConfigMap" in params:
551-
mysql["sslRootCertificateConfigMap"] = params["sslRootCertificateConfigMap"]
547+
mysql = None
548+
if db_backend != "default":
549+
mysql = get_mysql_config(
550+
base_name=f"{DB_BASE_RESOURCES_NAME}{num_mr}", namespace=namespace, db_backend=db_backend
551+
)
552+
if "sslRootCertificateConfigMap" in params:
553+
mysql["sslRootCertificateConfigMap"] = params["sslRootCertificateConfigMap"]
552554
model_registry_objects.append(
553555
ModelRegistry(
554556
client=client,
@@ -558,7 +560,8 @@ def get_model_registry_objects(
558560
grpc={},
559561
rest={},
560562
oauth_proxy=OAUTH_PROXY_CONFIG_DICT,
561-
mysql=mysql,
563+
mysql=mysql if mysql else None,
564+
postgres={"generateDeployment": True} if db_backend == "default" else None,
562565
wait_for_resource=True,
563566
teardown=teardown_resources,
564567
)

0 commit comments

Comments
 (0)