Skip to content

Commit 1d0d469

Browse files
committed
fix: address comment
1 parent 2099d45 commit 1d0d469

File tree

4 files changed

+88
-82
lines changed

4 files changed

+88
-82
lines changed

tests/model_registry/rbac/conftest.py

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
from ocp_resources.role_binding import RoleBinding
1111
from ocp_resources.role import Role
1212
from ocp_resources.group import Group
13+
from ocp_resources.resource import ResourceEditor
1314
from kubernetes.dynamic import DynamicClient
1415
from pyhelper_utils.shell import run_command
1516
from tests.model_registry.utils import generate_random_name, generate_namespace_name
1617
from utilities.user_utils import create_test_idp, UserTestSession
18+
from tests.model_registry.rbac.group_utils import create_group
1719
from tests.model_registry.constants import MR_INSTANCE_NAME
1820

1921

@@ -93,63 +95,60 @@ def sa_token(service_account: ServiceAccount) -> str:
9395

9496

9597
@pytest.fixture(scope="function")
96-
def new_group(
98+
def add_user_to_group(
9799
request: pytest.FixtureRequest,
98100
admin_client: DynamicClient,
99101
test_idp_user_session: UserTestSession,
100102
) -> Generator[str, None, None]:
101-
"""
102-
Fixture to create a new OpenShift group and add a user, then delete the group after the test.
103-
The group name is passed as a parameter to the fixture and the user is taken from test_idp_user_session.
104-
"""
105-
106103
group_name = request.param
107-
with Group(
108-
client=admin_client,
109-
name=group_name,
104+
with create_group(
105+
admin_client=admin_client,
106+
group_name=group_name,
110107
users=[test_idp_user_session.username],
111-
wait_for_resource=True,
112-
) as _:
113-
LOGGER.info(f"Group {group_name} created successfully.")
108+
) as group_name:
114109
yield group_name
115-
LOGGER.info(f"Group {group_name} deletion initiated by context manager.")
116110

117111

118112
@pytest.fixture(scope="function")
119113
def model_registry_group_with_user(
114+
request: pytest.FixtureRequest,
120115
admin_client: DynamicClient,
121116
test_idp_user_session: UserTestSession,
122117
) -> Generator[Group, None, None]:
123118
"""
124-
Fixture to manage a test user in the Model Registry group.
119+
Fixture to manage a test user in a specified group.
125120
Adds the user to the group before the test, then removes them after.
126121
127122
Args:
123+
request: The pytest request object containing the group name parameter
128124
admin_client: The admin client for accessing the cluster
129125
test_idp_user_session: The test user session containing user information
130126
131127
Yields:
132-
Group: The Model Registry group with the test user added
128+
Group: The group with the test user added
129+
130+
Note:
131+
The group name should be passed as a parameter to the fixture using pytest.mark.parametrize
133132
"""
134-
model_registry_users_group = f"{MR_INSTANCE_NAME}-users"
133+
group_name = request.param
135134
group = Group(
136135
client=admin_client,
137-
name=model_registry_users_group,
136+
name=group_name,
138137
wait_for_resource=True,
139138
)
140139

141140
# Add user to group
142-
group.update(
143-
resource_dict={"metadata": {"name": model_registry_users_group}, "users": [test_idp_user_session.username]}
144-
)
145-
LOGGER.info(f"Added user {test_idp_user_session.username} to {model_registry_users_group} group")
146-
147-
try:
141+
with ResourceEditor(
142+
patches={
143+
group: {
144+
"metadata": {"name": group_name},
145+
"users": [test_idp_user_session.username],
146+
}
147+
}
148+
) as _:
149+
LOGGER.info(f"Added user {test_idp_user_session.username} to {group_name} group")
148150
yield group
149-
finally:
150-
# Remove user from group
151-
group.update(resource_dict={"metadata": {"name": model_registry_users_group}, "users": []})
152-
LOGGER.info(f"Removed user {test_idp_user_session.username} from {model_registry_users_group} group")
151+
LOGGER.info(f"Removed user {test_idp_user_session.username} from {group_name} group")
153152

154153

155154
@pytest.fixture(scope="session")
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
Example:
31+
with create_group(admin_client, "my-group", users=["user1", "user2"]) as group_name:
32+
# Use the group
33+
pass
34+
# Group is automatically deleted
35+
"""
36+
with Group(
37+
client=admin_client,
38+
name=group_name,
39+
users=users or [],
40+
wait_for_resource=wait_for_resource,
41+
) as _:
42+
LOGGER.info(f"Group {group_name} created successfully.")
43+
yield group_name
44+
LOGGER.info(f"Group {group_name} deletion initiated by context manager.")

tests/model_registry/rbac/test_mr_rbac.py

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
from simple_logger.logger import get_logger
44

55
from model_registry import ModelRegistry as ModelRegistryClient
6-
from tests.model_registry.constants import MR_NAMESPACE
7-
from tests.model_registry.rbac.utils import (
8-
assert_positive_mr_registry,
9-
get_mr_client_args,
10-
verify_group_membership,
11-
)
6+
from tests.model_registry.constants import MR_NAMESPACE, MR_INSTANCE_NAME
7+
from tests.model_registry.rbac.utils import assert_positive_mr_registry, get_mr_client_args
128
from utilities.infra import switch_user_context
139
from kubernetes.dynamic import DynamicClient
1410
from ocp_resources.group import Group
@@ -37,7 +33,6 @@
3733
})
3834
],
3935
indirect=True,
40-
scope="class",
4136
)
4237
@pytest.mark.usefixtures("updated_dsc_component_state_scope_class")
4338
class TestUserPermission:
@@ -89,10 +84,7 @@ def test_user_permission(
8984
context_to_use = (
9085
test_idp_user_session.original_context if use_admin_context else test_idp_user_session.user_context
9186
)
92-
LOGGER.info(
93-
f"-----Testing Model Registry access for user '{test_idp_user_session.username}' "
94-
f"- Expected Access: {'Granted' if use_admin_context else 'Denied'}-----"
95-
)
87+
9688
with switch_user_context(context_to_use):
9789
_, client_args = get_mr_client_args(
9890
model_registry_instance=model_registry_instance,
@@ -111,7 +103,16 @@ def test_user_permission(
111103
LOGGER.info("Successfully received expected HTTP 403 status code")
112104

113105
@pytest.mark.sanity
114-
@pytest.mark.usefixtures("model_registry_group_with_user")
106+
@pytest.mark.parametrize(
107+
"model_registry_group_with_user",
108+
[
109+
pytest.param(
110+
f"{MR_INSTANCE_NAME}-users",
111+
id="model_registry_users",
112+
),
113+
],
114+
indirect=["model_registry_group_with_user"],
115+
)
115116
def test_user_added_to_group(
116117
self: Self,
117118
model_registry_instance: ModelRegistry,
@@ -139,15 +140,6 @@ def test_user_added_to_group(
139140
AssertionError: If access permissions don't match expectations
140141
ForbiddenException: Expected before group addition, unexpected after
141142
"""
142-
LOGGER.info(
143-
"-----Test that a user can access to the Model Registry once added to a "
144-
"group that has the permissions to access it-----"
145-
)
146-
# Verify group membership
147-
verify_group_membership(
148-
group=model_registry_group_with_user,
149-
username=test_idp_user_session.username,
150-
)
151143

152144
# Wait for access to be granted
153145
with switch_user_context(test_idp_user_session.user_context):
@@ -165,16 +157,16 @@ def test_user_added_to_group(
165157

166158
@pytest.mark.sanity
167159
@pytest.mark.parametrize(
168-
"new_group",
160+
"add_user_to_group",
169161
[
170162
pytest.param(
171163
NEW_GROUP_NAME,
172164
id="new_group",
173165
),
174166
],
175-
indirect=["new_group"],
167+
indirect=["add_user_to_group"],
176168
)
177-
@pytest.mark.usefixtures("mr_access_role", "new_group")
169+
@pytest.mark.usefixtures("mr_access_role", "add_user_to_group")
178170
def test_create_group(
179171
self: Self,
180172
model_registry_instance: ModelRegistry,
@@ -187,7 +179,7 @@ def test_create_group(
187179
Test creating a new group and granting it Model Registry access.
188180
189181
This test verifies that:
190-
1. A new group can be created
182+
1. A new group can be created and user added to it
191183
2. The group can be granted Model Registry access via RoleBinding
192184
3. Users in the group can access the Model Registry
193185
@@ -201,10 +193,6 @@ def test_create_group(
201193
Raises:
202194
AssertionError: If group creation or access permissions don't match expectations
203195
"""
204-
LOGGER.info(
205-
"-----Test that a new group can be granted access to Model Registry and user added to it can access MR-----"
206-
)
207-
LOGGER.info(f"Group {NEW_GROUP_NAME} created and user {test_idp_user_session.username} added to it")
208196

209197
with RoleBinding(
210198
client=admin_client,
@@ -250,10 +238,7 @@ def test_add_single_user(
250238
Raises:
251239
AssertionError: If access permissions don't match expectations
252240
"""
253-
LOGGER.info(
254-
"-----Test that adding a single user to the Model Registry's permitted list allows "
255-
"that user to access the MR-----"
256-
)
241+
257242
with RoleBinding(
258243
client=admin_client,
259244
namespace=model_registry_namespace,

tests/model_registry/rbac/utils.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from ocp_resources.model_registry import ModelRegistry
88
from utilities.infra import get_openshift_token
99
from kubernetes.dynamic import DynamicClient
10-
from ocp_resources.group import Group
1110

1211
LOGGER = logging.getLogger(__name__)
1312

@@ -94,24 +93,3 @@ def get_mr_client_args(
9493
svc = get_mr_service_by_label(client=admin_client, ns=namespace_instance, mr_instance=model_registry_instance)
9594
endpoint = get_endpoint_from_mr_service(svc=svc, protocol=Protocols.REST)
9695
return token, build_mr_client_args(rest_endpoint=endpoint, token=token, author=author)
97-
98-
99-
def verify_group_membership(
100-
group: Group,
101-
username: str,
102-
) -> None:
103-
"""
104-
Verify that a user is a member of a group.
105-
106-
Args:
107-
group: The Group object to check membership in
108-
username: The username to verify membership for
109-
110-
Raises:
111-
AssertionError: If the user is not a member of the group
112-
"""
113-
group_name = group.instance.get("metadata", {}).get("name")
114-
LOGGER.info(f"Verifying user {username} is in group {group_name}")
115-
users = group.instance.get("users", []) or []
116-
assert username in users, f"User {username} not in group {group_name}. Current users: {users}"
117-
LOGGER.info(f"Verified user {username} is in {group_name} group")

0 commit comments

Comments
 (0)