Skip to content

Commit 80acc07

Browse files
authored
test: [3.3] New tests to validate postgres password autogeneration (#1239)
* test: [3.3] New tests to validate postgres password autogeneration Signed-off-by: Debarati Basu-Nag <dbasunag@redhat.com> * fix: update calls Signed-off-by: Debarati Basu-Nag <dbasunag@redhat.com> --------- Signed-off-by: Debarati Basu-Nag <dbasunag@redhat.com>
1 parent 319ec2c commit 80acc07

File tree

13 files changed

+379
-21
lines changed

13 files changed

+379
-21
lines changed

tests/model_registry/model_catalog/catalog_config/test_default_source_inclusion_exclusion_cleanup.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def test_include_models_by_pattern(
6666

6767
# Ensure baseline model state is restored for subsequent tests
6868
ensure_baseline_model_state(
69+
admin_client=admin_client,
6970
model_catalog_rest_url=model_catalog_rest_url,
7071
model_registry_rest_headers=model_registry_rest_headers,
7172
model_registry_namespace=model_registry_namespace,
@@ -110,6 +111,7 @@ def test_exclude_models_by_pattern(
110111

111112
# Ensure baseline model state is restored for subsequent tests
112113
ensure_baseline_model_state(
114+
admin_client=admin_client,
113115
model_catalog_rest_url=model_catalog_rest_url,
114116
model_registry_rest_headers=model_registry_rest_headers,
115117
model_registry_namespace=model_registry_namespace,
@@ -190,7 +192,7 @@ def test_combined_include_exclude_filtering(
190192
)
191193

192194
db_models = get_models_from_database_by_source(
193-
source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
195+
admin_client=admin_client, source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
194196
)
195197

196198
is_valid, error_msg = validate_model_filtering_consistency(api_models=api_models, db_models=db_models)
@@ -206,6 +208,7 @@ def test_combined_include_exclude_filtering(
206208

207209
# Ensure baseline model state is restored for subsequent tests
208210
ensure_baseline_model_state(
211+
admin_client=admin_client,
209212
model_catalog_rest_url=model_catalog_rest_url,
210213
model_registry_rest_headers=model_registry_rest_headers,
211214
model_registry_namespace=model_registry_namespace,
@@ -255,7 +258,7 @@ def test_model_cleanup_on_exclusion_change(
255258
pytest.fail(f"Phase 1: Timeout waiting for granite models {granite_models}: {e}")
256259

257260
phase1_db_models = get_models_from_database_by_source(
258-
source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
261+
admin_client=admin_client, source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
259262
)
260263

261264
assert phase1_api_models == granite_models, (
@@ -292,7 +295,7 @@ def test_model_cleanup_on_exclusion_change(
292295
pytest.fail(f"Phase 2: Timeout waiting for prometheus models {prometheus_models}: {e}")
293296

294297
phase2_db_models = get_models_from_database_by_source(
295-
source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
298+
admin_client=admin_client, source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
296299
)
297300

298301
# Should only have prometheus models now
@@ -307,6 +310,7 @@ def test_model_cleanup_on_exclusion_change(
307310

308311
# Ensure baseline model state is restored for subsequent tests
309312
ensure_baseline_model_state(
313+
admin_client=admin_client,
310314
model_catalog_rest_url=model_catalog_rest_url,
311315
model_registry_rest_headers=model_registry_rest_headers,
312316
model_registry_namespace=model_registry_namespace,
@@ -351,14 +355,15 @@ def test_source_disabling_removes_models(
351355

352356
# Verify database is also cleaned
353357
db_models = get_models_from_database_by_source(
354-
source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
358+
admin_client=admin_client, source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
355359
)
356360
assert len(db_models) == 0, f"Database should be clean when source disabled, found: {db_models}"
357361

358362
LOGGER.info("SUCCESS: Source disabling removed all models")
359363

360364
# Ensure baseline model state is restored for subsequent tests
361365
ensure_baseline_model_state(
366+
admin_client=admin_client,
362367
model_catalog_rest_url=model_catalog_rest_url,
363368
model_registry_rest_headers=model_registry_rest_headers,
364369
model_registry_namespace=model_registry_namespace,
@@ -416,6 +421,7 @@ def test_model_removal_logging(
416421

417422
# Ensure baseline model state is restored for subsequent tests
418423
ensure_baseline_model_state(
424+
admin_client=admin_client,
419425
model_catalog_rest_url=model_catalog_rest_url,
420426
model_registry_rest_headers=model_registry_rest_headers,
421427
model_registry_namespace=model_registry_namespace,
@@ -467,6 +473,7 @@ def test_source_disabling_logging(
467473

468474
# Ensure baseline model state is restored for subsequent tests
469475
ensure_baseline_model_state(
476+
admin_client=admin_client,
470477
model_catalog_rest_url=model_catalog_rest_url,
471478
model_registry_rest_headers=model_registry_rest_headers,
472479
model_registry_namespace=model_registry_namespace,

tests/model_registry/model_catalog/catalog_config/utils.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,12 @@ def validate_model_catalog_configmap_data(configmap: ConfigMap, num_catalogs: in
132132
validate_default_catalog(catalogs=catalogs)
133133

134134

135-
def get_models_from_database_by_source(source_id: str, namespace: str) -> set[str]:
135+
def get_models_from_database_by_source(admin_client: DynamicClient, source_id: str, namespace: str) -> set[str]:
136136
"""
137137
Query database directly to get all model names for a specific source.
138138
139139
Args:
140+
admin_client: DynamicClient for Kubernetes API access
140141
source_id: Catalog source ID to filter by
141142
namespace: OpenShift namespace for database access
142143
@@ -145,7 +146,7 @@ def get_models_from_database_by_source(source_id: str, namespace: str) -> set[st
145146
"""
146147

147148
query = GET_MODELS_BY_SOURCE_ID_DB_QUERY.format(source_id=source_id)
148-
result = execute_database_query(query=query, namespace=namespace)
149+
result = execute_database_query(admin_client=admin_client, query=query, namespace=namespace)
149150
parsed = parse_psql_output(psql_output=result)
150151
return set(parsed.get("values", []))
151152

@@ -478,7 +479,7 @@ def execute_inclusion_exclusion_filter_test(
478479
pytest.fail(f"Timeout waiting for {pattern} models to appear. Expected: {expected_models}, {e}")
479480

480481
db_models = get_models_from_database_by_source(
481-
source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
482+
admin_client=admin_client, source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
482483
)
483484

484485
# Validate consistency
@@ -493,6 +494,7 @@ def execute_inclusion_exclusion_filter_test(
493494

494495
@retry(wait_timeout=300, sleep=10, exceptions_dict={Exception: []}, print_log=False)
495496
def _validate_baseline_models(
497+
admin_client: DynamicClient,
496498
model_catalog_rest_url: list[str],
497499
model_registry_rest_headers: dict[str, str],
498500
model_registry_namespace: str,
@@ -513,7 +515,9 @@ def _validate_baseline_models(
513515
api_models = {model["name"] for model in api_response.get("items", [])}
514516

515517
# Fetch current models from database
516-
db_models = get_models_from_database_by_source(source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace)
518+
db_models = get_models_from_database_by_source(
519+
admin_client=admin_client, source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
520+
)
517521

518522
count = len(api_models)
519523

@@ -542,6 +546,7 @@ def _validate_baseline_models(
542546

543547

544548
def ensure_baseline_model_state(
549+
admin_client: DynamicClient,
545550
model_catalog_rest_url: list[str],
546551
model_registry_rest_headers: dict[str, str],
547552
model_registry_namespace: str,
@@ -574,6 +579,7 @@ def ensure_baseline_model_state(
574579
# Use retry decorator for automatic polling and eventual reconciliation
575580
try:
576581
_validate_baseline_models(
582+
admin_client=admin_client,
577583
model_catalog_rest_url=model_catalog_rest_url,
578584
model_registry_rest_headers=model_registry_rest_headers,
579585
model_registry_namespace=model_registry_namespace,

tests/model_registry/model_catalog/conftest.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,10 @@ def model_catalog_rest_url(model_registry_namespace: str, model_catalog_routes:
447447

448448
@pytest.fixture(scope="function")
449449
def baseline_redhat_ai_models(
450-
model_catalog_rest_url: list[str], model_registry_rest_headers: dict[str, str], model_registry_namespace: str
450+
admin_client: DynamicClient,
451+
model_catalog_rest_url: list[str],
452+
model_registry_rest_headers: dict[str, str],
453+
model_registry_namespace: str,
451454
) -> dict[str, set[str] | int]:
452455
"""
453456
fixture providing baseline model data for redhat_ai_models source.
@@ -463,6 +466,8 @@ def baseline_redhat_ai_models(
463466
)
464467
api_models = {model["name"] for model in api_response.get("items", [])}
465468

466-
db_models = get_models_from_database_by_source(source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace)
469+
db_models = get_models_from_database_by_source(
470+
admin_client=admin_client, source_id=REDHAT_AI_CATALOG_ID, namespace=model_registry_namespace
471+
)
467472

468473
return {"api_models": api_models, "db_models": db_models, "count": len(api_models)}

tests/model_registry/model_catalog/db_check/__init__.py

Whitespace-only changes.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import pytest
2+
from kubernetes.dynamic import DynamicClient
3+
from ocp_resources.network_policy import NetworkPolicy
4+
from ocp_resources.secret import Secret
5+
from pytest_testconfig import config as py_config
6+
from simple_logger.logger import get_logger
7+
from timeout_sampler import TimeoutSampler
8+
9+
from .utils import extract_secret_values
10+
11+
LOGGER = get_logger(name=__name__)
12+
13+
14+
@pytest.fixture(scope="class")
15+
def model_catalog_postgres_secret(admin_client: DynamicClient, model_registry_namespace: str) -> Secret:
16+
"""Get the model-catalog-postgres secret from model registry namespace"""
17+
return Secret(
18+
client=admin_client,
19+
name="model-catalog-postgres",
20+
namespace=model_registry_namespace,
21+
ensure_exists=True,
22+
)
23+
24+
25+
@pytest.fixture(scope="class")
26+
def model_catalog_postgres_secret_values(model_catalog_postgres_secret: Secret) -> dict[str, str]:
27+
"""Capture current values of model-catalog-postgres secret in model registry namespace"""
28+
return extract_secret_values(secret=model_catalog_postgres_secret)
29+
30+
31+
@pytest.fixture(scope="class")
32+
def recreated_model_catalog_postgres_secret(
33+
admin_client: DynamicClient, model_catalog_postgres_secret: Secret
34+
) -> dict[str, str]:
35+
"""Delete model-catalog-postgres secret and wait for it to be recreated"""
36+
model_registry_namespace = py_config["model_registry_namespace"]
37+
resource_name = "model-catalog-postgres"
38+
39+
LOGGER.info(f"Deleting secret {resource_name} in namespace {model_registry_namespace}")
40+
model_catalog_postgres_secret.delete()
41+
42+
# Wait for the secret to be recreated by the operator
43+
LOGGER.info(f"Waiting for secret {resource_name} to be recreated...")
44+
45+
recreated_secret = None
46+
for secret in TimeoutSampler(
47+
wait_timeout=120,
48+
sleep=10,
49+
func=Secret,
50+
client=admin_client,
51+
name=resource_name,
52+
namespace=model_registry_namespace,
53+
):
54+
if secret.exists:
55+
LOGGER.info(f"Secret {resource_name} has been recreated")
56+
recreated_secret = secret
57+
break
58+
59+
return extract_secret_values(secret=recreated_secret)
60+
61+
62+
@pytest.fixture(scope="class")
63+
def model_catalog_postgres_network_policy(admin_client: DynamicClient, model_registry_namespace: str) -> NetworkPolicy:
64+
"""Get the model-catalog-postgres NetworkPolicy from model registry namespace"""
65+
return NetworkPolicy(
66+
client=admin_client,
67+
name="model-catalog-postgres",
68+
namespace=model_registry_namespace,
69+
ensure_exists=True,
70+
)

0 commit comments

Comments
 (0)