Skip to content

Commit d4c5252

Browse files
authored
test: Add test to verify model registry access for different users created from the run (#283)
Test to verify RBAC bug Create user for the test
1 parent a9f41aa commit d4c5252

File tree

8 files changed

+757
-18
lines changed

8 files changed

+757
-18
lines changed

tests/model_registry/rbac/__init__.py

Whitespace-only changes.

tests/model_registry/rbac/conftest.py

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@
33
import subprocess
44
import os
55
from typing import Generator, List, Dict, Any
6+
from simple_logger.logger import get_logger
7+
68
from ocp_resources.namespace import Namespace
79
from ocp_resources.service_account import ServiceAccount
810
from ocp_resources.role_binding import RoleBinding
911
from ocp_resources.role import Role
12+
from ocp_resources.group import Group
13+
from ocp_resources.resource import ResourceEditor
1014
from kubernetes.dynamic import DynamicClient
1115
from pyhelper_utils.shell import run_command
1216
from tests.model_registry.utils import generate_random_name, generate_namespace_name
13-
from simple_logger.logger import get_logger
17+
from utilities.user_utils import create_test_idp, UserTestSession
18+
from tests.model_registry.rbac.group_utils import create_group
1419
from tests.model_registry.constants import MR_INSTANCE_NAME
1520

1621

@@ -89,6 +94,82 @@ def sa_token(service_account: ServiceAccount) -> str:
8994
raise
9095

9196

97+
@pytest.fixture(scope="function")
98+
def add_user_to_group(
99+
request: pytest.FixtureRequest,
100+
admin_client: DynamicClient,
101+
test_idp_user_session: UserTestSession,
102+
) -> Generator[str, None, None]:
103+
"""
104+
Fixture to create a group and add a test user to it.
105+
Uses create_group context manager to ensure proper cleanup.
106+
107+
Args:
108+
request: The pytest request object containing the group name parameter
109+
admin_client: The admin client for accessing the cluster
110+
test_idp_user_session: The test user session containing user information
111+
112+
Yields:
113+
str: The name of the created group
114+
"""
115+
group_name = request.param
116+
with create_group(
117+
admin_client=admin_client,
118+
group_name=group_name,
119+
users=[test_idp_user_session.username],
120+
) as group_name:
121+
yield group_name
122+
123+
124+
@pytest.fixture(scope="function")
125+
def model_registry_group_with_user(
126+
request: pytest.FixtureRequest,
127+
admin_client: DynamicClient,
128+
test_idp_user_session: UserTestSession,
129+
) -> Generator[Group, None, None]:
130+
"""
131+
Fixture to manage a test user in a specified group.
132+
Adds the user to the group before the test, then removes them after.
133+
134+
Args:
135+
request: The pytest request object containing the group name parameter
136+
admin_client: The admin client for accessing the cluster
137+
test_idp_user_session: The test user session containing user information
138+
139+
Yields:
140+
Group: The group with the test user added
141+
"""
142+
group_name = request.param
143+
group = Group(
144+
client=admin_client,
145+
name=group_name,
146+
wait_for_resource=True,
147+
)
148+
149+
# Add user to group
150+
with ResourceEditor(
151+
patches={
152+
group: {
153+
"metadata": {"name": group_name},
154+
"users": [test_idp_user_session.username],
155+
}
156+
}
157+
) as _:
158+
LOGGER.info(f"Added user {test_idp_user_session.username} to {group_name} group")
159+
yield group
160+
161+
162+
@pytest.fixture(scope="session")
163+
def test_idp_user_session() -> Generator[UserTestSession, None, None]:
164+
"""
165+
Session-scoped fixture that creates a test IDP user and cleans it up after all tests.
166+
Returns a UserTestSession object that contains all necessary credentials and contexts.
167+
"""
168+
with create_test_idp() as idp_session:
169+
LOGGER.info(f"Created session test IDP user: {idp_session.username}")
170+
yield idp_session
171+
172+
92173
# --- RBAC Fixtures ---
93174

94175

@@ -128,7 +209,6 @@ def mr_access_role(
128209
) as role:
129210
LOGGER.info(f"Role {role.name} created successfully.")
130211
yield role
131-
LOGGER.info(f"Role {role.name} deletion initiated by context manager.")
132212

133213

134214
@pytest.fixture(scope="function")
@@ -162,7 +242,7 @@ def mr_access_role_binding(
162242
subjects_name=f"system:serviceaccounts:{sa_namespace.name}",
163243
subjects_api_group="rbac.authorization.k8s.io", # This is the default apiGroup for Group kind
164244
# Role reference parameters
165-
role_ref_kind="Role",
245+
role_ref_kind=mr_access_role.kind,
166246
role_ref_name=mr_access_role.name,
167247
label=binding_labels,
168248
wait_for_resource=True,
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from contextlib import contextmanager
2+
from typing import Generator
3+
from simple_logger.logger import get_logger
4+
from kubernetes.dynamic import DynamicClient
5+
from ocp_resources.group import Group
6+
7+
LOGGER = get_logger(name=__name__)
8+
9+
10+
@contextmanager
11+
def create_group(
12+
admin_client: DynamicClient,
13+
group_name: str,
14+
users: list[str] | None = None,
15+
wait_for_resource: bool = True,
16+
) -> Generator[str, None, None]:
17+
"""
18+
Factory function to create an OpenShift group with optional users.
19+
Uses context manager to ensure proper cleanup.
20+
21+
Args:
22+
admin_client: The admin client to use for group operations
23+
group_name: Name of the group to create
24+
users: Optional list of usernames to add to the group
25+
wait_for_resource: Whether to wait for the group to be ready
26+
27+
Yields:
28+
The group name
29+
"""
30+
with Group(
31+
client=admin_client,
32+
name=group_name,
33+
users=users or [],
34+
wait_for_resource=wait_for_resource,
35+
) as _:
36+
LOGGER.info(f"Group {group_name} created successfully.")
37+
yield group_name

0 commit comments

Comments
 (0)