Skip to content

Commit c86e9f9

Browse files
committed
add mariadb tests for MR and reorganize some fixtures
1 parent 0856638 commit c86e9f9

File tree

19 files changed

+593
-172
lines changed

19 files changed

+593
-172
lines changed

tests/conftest.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@
1010
from _pytest._py.path import LocalPath
1111
from _pytest.legacypath import TempdirFactory
1212
from _pytest.tmpdir import TempPathFactory
13+
from kubernetes.dynamic.exceptions import ResourceNotFoundError
14+
15+
from ocp_resources.cluster_service_version import ClusterServiceVersion
1316
from ocp_resources.config_map import ConfigMap
17+
from ocp_resources.deployment import Deployment
1418
from ocp_resources.dsc_initialization import DSCInitialization
19+
from ocp_resources.mariadb_operator import MariadbOperator
1520
from ocp_resources.node import Node
1621
from ocp_resources.pod import Pod
1722
from ocp_resources.secret import Secret
1823
from ocp_resources.service import Service
24+
from ocp_resources.subscription import Subscription
1925
from ocp_utilities.monitoring import Prometheus
2026
from pyhelper_utils.shell import run_command
2127
from pytest import FixtureRequest, Config
@@ -26,6 +32,7 @@
2632
from pytest_testconfig import config as py_config
2733
from simple_logger.logger import get_logger
2834

35+
from ocp_utilities.operators import uninstall_operator, install_operator
2936
from utilities.certificates_utils import create_ca_bundle_file
3037
from utilities.data_science_cluster_utils import update_components_in_dsc
3138
from utilities.exceptions import ClusterLoginError
@@ -42,11 +49,14 @@
4249
Labels,
4350
MinIo,
4451
Protocols,
52+
Timeout,
53+
OPENSHIFT_OPERATORS,
4554
)
4655
from utilities.infra import update_configmap_data
4756
from utilities.logger import RedactedString
57+
from utilities.mariadb_utils import wait_for_mariadb_operator_deployments
4858
from utilities.minio import create_minio_data_connection_secret
49-
from utilities.operator_utils import get_csv_related_images
59+
from utilities.operator_utils import get_csv_related_images, get_cluster_service_version
5060

5161
LOGGER = get_logger(name=__name__)
5262

@@ -573,3 +583,60 @@ def autouse_fixtures(
573583
) -> None:
574584
"""Fixture to control the order of execution of some of the fixtures"""
575585
return
586+
587+
588+
@pytest.fixture(scope="session")
589+
def installed_mariadb_operator(admin_client: DynamicClient) -> Generator[None, Any, Any]:
590+
operator_ns = Namespace(name="openshift-operators", ensure_exists=True)
591+
operator_name = "mariadb-operator"
592+
593+
mariadb_operator_subscription = Subscription(client=admin_client, namespace=operator_ns.name, name=operator_name)
594+
595+
if not mariadb_operator_subscription.exists:
596+
install_operator(
597+
admin_client=admin_client,
598+
target_namespaces=["openshift-operators"],
599+
name=operator_name,
600+
channel="alpha",
601+
source="community-operators",
602+
operator_namespace=operator_ns.name,
603+
timeout=Timeout.TIMEOUT_15MIN,
604+
install_plan_approval="Manual",
605+
starting_csv=f"{operator_name}.v0.38.1",
606+
)
607+
608+
deployment = Deployment(
609+
client=admin_client,
610+
namespace=operator_ns.name,
611+
name=f"{operator_name}-helm-controller-manager",
612+
wait_for_resource=True,
613+
)
614+
deployment.wait_for_replicas()
615+
yield
616+
uninstall_operator(
617+
admin_client=admin_client, name=operator_name, operator_namespace=operator_ns.name, clean_up_namespace=False
618+
)
619+
620+
621+
@pytest.fixture(scope="class")
622+
def mariadb_operator_cr(
623+
admin_client: DynamicClient, installed_mariadb_operator: None
624+
) -> Generator[MariadbOperator, Any, Any]:
625+
mariadb_csv: ClusterServiceVersion = get_cluster_service_version(
626+
client=admin_client, prefix="mariadb", namespace=OPENSHIFT_OPERATORS
627+
)
628+
alm_examples: list[dict[str, Any]] = mariadb_csv.get_alm_examples()
629+
mariadb_operator_cr_dict: dict[str, Any] = next(
630+
example for example in alm_examples if example["kind"] == "MariadbOperator"
631+
)
632+
mariadb_operator_cr_dict["clusterName"] = "1ce302f6-e674-47fa-85be-875ae295c96c"
633+
if not mariadb_operator_cr_dict:
634+
raise ResourceNotFoundError(f"No MariadbOperator dict found in alm_examples for CSV {mariadb_csv.name}")
635+
636+
mariadb_operator_cr_dict["metadata"]["namespace"] = OPENSHIFT_OPERATORS
637+
with MariadbOperator(kind_dict=mariadb_operator_cr_dict) as mariadb_operator_cr:
638+
mariadb_operator_cr.wait_for_condition(
639+
condition="Deployed", status=mariadb_operator_cr.Condition.Status.TRUE, timeout=Timeout.TIMEOUT_10MIN
640+
)
641+
wait_for_mariadb_operator_deployments(mariadb_operator=mariadb_operator_cr)
642+
yield mariadb_operator_cr

tests/model_explainability/trustyai_service/conftest.py

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from kubernetes.dynamic.exceptions import ResourceNotFoundError
77
from ocp_resources.cluster_service_version import ClusterServiceVersion
88
from ocp_resources.config_map import ConfigMap
9-
from ocp_resources.deployment import Deployment
109
from ocp_resources.inference_service import InferenceService
1110
from ocp_resources.maria_db import MariaDB
1211
from ocp_resources.mariadb_operator import MariadbOperator
@@ -18,9 +17,7 @@
1817
from ocp_resources.service import Service
1918
from ocp_resources.service_account import ServiceAccount
2019
from ocp_resources.serving_runtime import ServingRuntime
21-
from ocp_resources.subscription import Subscription
2220
from ocp_resources.trustyai_service import TrustyAIService
23-
from ocp_utilities.operators import install_operator, uninstall_operator
2421

2522
from tests.model_explainability.trustyai_service.constants import (
2623
TAI_DATA_CONFIG,
@@ -41,7 +38,6 @@
4138
wait_for_isvc_deployment_registered_by_trustyai_service,
4239
)
4340
from tests.model_explainability.trustyai_service.utils import (
44-
wait_for_mariadb_operator_deployments,
4541
create_trustyai_service,
4642
wait_for_mariadb_pods,
4743
TRUSTYAI_SERVICE_NAME,
@@ -52,14 +48,10 @@
5248
)
5349
from utilities.logger import RedactedString
5450
from utilities.operator_utils import get_cluster_service_version
55-
56-
from utilities.constants import Timeout, KServeDeploymentType, Labels
51+
from utilities.constants import KServeDeploymentType, Labels, OPENSHIFT_OPERATORS, MARIADB
5752
from utilities.inference_utils import create_isvc
5853
from utilities.infra import update_configmap_data, create_inference_token
5954

60-
OPENSHIFT_OPERATORS: str = "openshift-operators"
61-
62-
MARIADB: str = "mariadb"
6355
DB_CREDENTIALS_SECRET_NAME: str = "db-credentials"
6456
DB_NAME: str = "trustyai_db"
6557
DB_USERNAME: str = "trustyai_user"
@@ -142,64 +134,6 @@ def db_credentials_secret(admin_client: DynamicClient, model_namespace: Namespac
142134
yield db_credentials
143135

144136

145-
@pytest.fixture(scope="session")
146-
def installed_mariadb_operator(admin_client: DynamicClient) -> Generator[None, Any, Any]:
147-
operator_ns = Namespace(name="openshift-operators", ensure_exists=True)
148-
operator_name = "mariadb-operator"
149-
150-
mariadb_operator_subscription = Subscription(client=admin_client, namespace=operator_ns.name, name=operator_name)
151-
152-
if not mariadb_operator_subscription.exists:
153-
install_operator(
154-
admin_client=admin_client,
155-
target_namespaces=[],
156-
name=operator_name,
157-
channel="alpha",
158-
source="community-operators",
159-
operator_namespace=operator_ns.name,
160-
timeout=Timeout.TIMEOUT_15MIN,
161-
install_plan_approval="Manual",
162-
starting_csv=f"{operator_name}.v0.37.1",
163-
)
164-
165-
deployment = Deployment(
166-
client=admin_client,
167-
namespace=operator_ns.name,
168-
name=f"{operator_name}-helm-controller-manager",
169-
wait_for_resource=True,
170-
)
171-
deployment.wait_for_replicas()
172-
173-
yield
174-
uninstall_operator(
175-
admin_client=admin_client, name=operator_name, operator_namespace=operator_ns.name, clean_up_namespace=False
176-
)
177-
178-
179-
@pytest.fixture(scope="class")
180-
def mariadb_operator_cr(
181-
admin_client: DynamicClient, installed_mariadb_operator: None
182-
) -> Generator[MariadbOperator, Any, Any]:
183-
mariadb_csv: ClusterServiceVersion = get_cluster_service_version(
184-
client=admin_client, prefix="mariadb", namespace=OPENSHIFT_OPERATORS
185-
)
186-
alm_examples: list[dict[str, Any]] = mariadb_csv.get_alm_examples()
187-
mariadb_operator_cr_dict: dict[str, Any] = next(
188-
example for example in alm_examples if example["kind"] == "MariadbOperator"
189-
)
190-
191-
if not mariadb_operator_cr_dict:
192-
raise ResourceNotFoundError(f"No MariadbOperator dict found in alm_examples for CSV {mariadb_csv.name}")
193-
194-
mariadb_operator_cr_dict["metadata"]["namespace"] = OPENSHIFT_OPERATORS
195-
with MariadbOperator(kind_dict=mariadb_operator_cr_dict) as mariadb_operator_cr:
196-
mariadb_operator_cr.wait_for_condition(
197-
condition="Deployed", status=mariadb_operator_cr.Condition.Status.TRUE, timeout=Timeout.TIMEOUT_10MIN
198-
)
199-
wait_for_mariadb_operator_deployments(mariadb_operator=mariadb_operator_cr)
200-
yield mariadb_operator_cr
201-
202-
203137
@pytest.fixture(scope="class")
204138
def mariadb(
205139
admin_client: DynamicClient,

tests/model_registry/conftest.py

Lines changed: 23 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,8 @@ def model_registry_db_secret(
154154
@pytest.fixture(scope="class")
155155
def model_registry_db_deployment(
156156
pytestconfig: Config,
157-
admin_client: DynamicClient,
158157
model_registry_namespace: str,
159158
model_registry_db_secret: Secret,
160-
model_registry_db_pvc: PersistentVolumeClaim,
161-
model_registry_db_service: Service,
162159
teardown_resources: bool,
163160
is_model_registry_oauth: bool,
164161
) -> Generator[Deployment, Any, Any]:
@@ -189,9 +186,18 @@ def model_registry_db_deployment(
189186

190187

191188
@pytest.fixture(scope="class")
192-
def model_registry_instance(
189+
def created_mysql_metadata_db(
190+
model_registry_db_secret: Secret,
191+
model_registry_db_pvc: PersistentVolumeClaim,
192+
model_registry_db_service: Service,
193+
model_registry_db_deployment: Deployment,
194+
) -> Deployment:
195+
return model_registry_db_deployment
196+
197+
198+
@pytest.fixture(scope="class")
199+
def model_registry_instance_mysql(
193200
pytestconfig: Config,
194-
admin_client: DynamicClient,
195201
model_registry_namespace: str,
196202
model_registry_mysql_config: dict[str, Any],
197203
teardown_resources: bool,
@@ -227,34 +233,16 @@ def model_registry_instance(
227233
) as mr:
228234
mr.wait_for_condition(condition="Available", status="True")
229235
mr.wait_for_condition(condition="OAuthProxyAvailable", status="True")
230-
231236
yield mr
232237

233238

234239
@pytest.fixture(scope="class")
235-
def model_registry_mysql_config(
236-
request: FixtureRequest,
237-
model_registry_db_deployment: Deployment,
238-
model_registry_db_secret: Secret,
239-
) -> dict[str, Any]:
240-
"""
241-
Fixture to build the MySQL config dictionary for Model Registry.
242-
Expects request.param to be a dict. If 'sslRootCertificateConfigMap' is not present, it defaults to None.
243-
If 'sslRootCertificateConfigMap' is present, it will be used to configure the MySQL connection.
244-
245-
Args:
246-
request: The pytest request object
247-
model_registry_db_deployment: The model registry db deployment
248-
model_registry_db_secret: The model registry db secret
249-
250-
Returns:
251-
dict[str, Any]: The MySQL config dictionary
252-
"""
240+
def model_registry_mysql_config(request: FixtureRequest, model_registry_namespace: str) -> dict[str, Any]:
253241
param = request.param if hasattr(request, "param") else {}
254242
config = {
255-
"host": f"{model_registry_db_deployment.name}.{model_registry_db_deployment.namespace}.svc.cluster.local",
243+
"host": f"{DB_RESOURCES_NAME}.{model_registry_namespace}.svc.cluster.local",
256244
"database": MODEL_REGISTRY_DB_SECRET_STR_DATA["database-name"],
257-
"passwordSecret": {"key": "database-password", "name": model_registry_db_deployment.name},
245+
"passwordSecret": {"key": "database-password", "name": DB_RESOURCES_NAME},
258246
"port": param.get("port", 3306),
259247
"skipDBCreation": False,
260248
"username": MODEL_REGISTRY_DB_SECRET_STR_DATA["database-user"],
@@ -266,39 +254,17 @@ def model_registry_mysql_config(
266254

267255

268256
@pytest.fixture(scope="class")
269-
def model_registry_instance_service(
270-
admin_client: DynamicClient,
271-
model_registry_namespace: str,
272-
model_registry_instance: ModelRegistry,
273-
) -> Service:
274-
"""
275-
Get the service for the regular model registry instance.
276-
Args:
277-
admin_client: The admin client
278-
model_registry_namespace: The namespace where the model registry is deployed
279-
model_registry_instance: The model registry instance to get the service for
280-
Returns:
281-
Service: The service for the model registry instance
282-
"""
283-
return get_mr_service_by_label(
284-
client=admin_client, namespace_name=model_registry_namespace, mr_instance=model_registry_instance
257+
def model_registry_instance_rest_endpoint(admin_client: DynamicClient, model_registry_namespace: str) -> str:
258+
return get_endpoint_from_mr_service(
259+
svc=get_mr_service_by_label(
260+
client=admin_client,
261+
namespace_name=model_registry_namespace,
262+
mr_instance=ModelRegistry(name=MR_INSTANCE_NAME, namespace=model_registry_namespace),
263+
),
264+
protocol=Protocols.REST,
285265
)
286266

287267

288-
@pytest.fixture(scope="class")
289-
def model_registry_instance_rest_endpoint(
290-
model_registry_instance_service: Service,
291-
) -> str:
292-
"""
293-
Get the REST endpoint for the model registry instance.
294-
Args:
295-
model_registry_instance_service: The service for the model registry instance
296-
Returns:
297-
str: The REST endpoint for the model registry instance
298-
"""
299-
return get_endpoint_from_mr_service(svc=model_registry_instance_service, protocol=Protocols.REST)
300-
301-
302268
@pytest.fixture(scope="class")
303269
def generated_schema(pytestconfig: Config, model_registry_instance_rest_endpoint: str) -> BaseOpenAPISchema:
304270
os.environ["API_HOST"] = model_registry_instance_rest_endpoint
@@ -339,9 +305,9 @@ def after_call(self, response: Response, case: Case) -> None:
339305
@pytest.fixture(scope="class")
340306
def updated_dsc_component_state_scope_class(
341307
pytestconfig: Config,
308+
admin_client: DynamicClient,
342309
request: FixtureRequest,
343310
dsc_resource: DataScienceCluster,
344-
admin_client: DynamicClient,
345311
teardown_resources: bool,
346312
is_model_registry_oauth: bool,
347313
) -> Generator[DataScienceCluster, Any, Any]:

tests/model_registry/image_validation/test_verify_rhoai_images.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@
2828
],
2929
indirect=True,
3030
)
31-
@pytest.mark.usefixtures("updated_dsc_component_state_scope_class")
31+
@pytest.mark.usefixtures(
32+
"updated_dsc_component_state_scope_class",
33+
"is_model_registry_oauth",
34+
"created_mysql_metadata_db",
35+
"model_registry_instance_mysql",
36+
)
3237
@pytest.mark.downstream_only
3338
class TestModelRegistryImages:
3439
"""
@@ -43,7 +48,7 @@ class TestModelRegistryImages:
4348
def test_verify_model_registry_images(
4449
self: Self,
4550
admin_client: DynamicClient,
46-
model_registry_instance: ModelRegistry,
51+
model_registry_instance_mysql: ModelRegistry,
4752
model_registry_operator_pod: Pod,
4853
model_registry_instance_pod: Pod,
4954
related_images_refs: Set[str],

tests/model_registry/negative_tests/test_model_registry_creation_negative.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
from tests.model_registry.constants import (
1313
MR_OPERATOR_NAME,
1414
MR_INSTANCE_NAME,
15-
ISTIO_CONFIG_DICT,
1615
DB_RESOURCES_NAME,
16+
OAUTH_PROXY_CONFIG_DICT,
1717
)
1818
from kubernetes.dynamic.exceptions import ForbiddenError
1919

@@ -51,6 +51,12 @@
5151
],
5252
indirect=["model_registry_namespace_for_negative_tests", "updated_dsc_component_state_scope_class"],
5353
)
54+
@pytest.mark.usefixtures(
55+
"model_registry_namespace_for_negative_tests",
56+
"updated_dsc_component_state_scope_class",
57+
"model_registry_db_secret_negative_test",
58+
"model_registry_db_deployment_negative_test",
59+
)
5460
class TestModelRegistryCreationNegative:
5561
def test_registering_model_negative(
5662
self: Self,
@@ -85,7 +91,7 @@ def test_registering_model_negative(
8591
},
8692
grpc={},
8793
rest={},
88-
istio=ISTIO_CONFIG_DICT,
94+
oauth_proxy=OAUTH_PROXY_CONFIG_DICT,
8995
mysql=my_sql_dict,
9096
wait_for_resource=True,
9197
):

0 commit comments

Comments
 (0)