Skip to content

Commit e950e83

Browse files
authored
Merge pull request #224 from QuanMPhm/184/openshift_users
Allow communication to Openshift Users API
2 parents 8958d10 + df704e8 commit e950e83

File tree

3 files changed

+128
-9
lines changed

3 files changed

+128
-9
lines changed

src/coldfront_plugin_cloud/openshift.py

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -241,12 +241,25 @@ def get_federated_user(self, username):
241241
logger.info(f"User ({username}) does not exist")
242242

243243
def create_federated_user(self, unique_id):
244-
url = f"{self.auth_url}/users/{unique_id}"
245-
try:
246-
r = self.session.put(url)
247-
self.check_response(r)
248-
except Conflict:
249-
pass
244+
user_def = {
245+
"metadata": {"name": unique_id},
246+
"fullName": unique_id,
247+
}
248+
249+
identity_def = {
250+
"providerName": self.id_provider,
251+
"providerUserName": unique_id,
252+
}
253+
254+
identity_mapping_def = {
255+
"user": {"name": unique_id},
256+
"identity": {"name": self.qualified_id_user(unique_id)},
257+
}
258+
259+
self._openshift_create_user(user_def)
260+
self._openshift_create_identity(identity_def)
261+
self._openshift_create_useridentitymapping(identity_mapping_def)
262+
logger.info(f"User {unique_id} successfully created")
250263

251264
def assign_role_on_user(self, username, project_id):
252265
# /users/<user_name>/projects/<project>/roles/<role>
@@ -305,9 +318,9 @@ def _get_project(self, project_id):
305318
return self._openshift_get_project(project_id)
306319

307320
def _delete_user(self, username):
308-
url = f"{self.auth_url}/users/{username}"
309-
r = self.session.delete(url)
310-
return self.check_response(r)
321+
self._openshift_delete_user(username)
322+
self._openshift_delete_identity(username)
323+
logger.info(f"User {username} successfully deleted")
311324

312325
def get_users(self, project_id):
313326
url = f"{self.auth_url}/projects/{project_id}/users"
@@ -318,12 +331,43 @@ def _openshift_get_user(self, username):
318331
api = self.get_resource_api(API_USER, "User")
319332
return clean_openshift_metadata(api.get(name=username).to_dict())
320333

334+
def _openshift_create_user(self, user_def):
335+
api = self.get_resource_api(API_USER, "User")
336+
try:
337+
return clean_openshift_metadata(api.create(body=user_def).to_dict())
338+
except kexc.ConflictError:
339+
pass
340+
341+
def _openshift_delete_user(self, username):
342+
api = self.get_resource_api(API_USER, "User")
343+
return clean_openshift_metadata(api.delete(name=username).to_dict())
344+
321345
def _openshift_get_identity(self, id_user):
322346
api = self.get_resource_api(API_USER, "Identity")
323347
return clean_openshift_metadata(
324348
api.get(name=self.qualified_id_user(id_user)).to_dict()
325349
)
326350

351+
def _openshift_create_identity(self, identity_def):
352+
api = self.get_resource_api(API_USER, "Identity")
353+
try:
354+
return clean_openshift_metadata(api.create(body=identity_def).to_dict())
355+
except kexc.ConflictError:
356+
pass
357+
358+
def _openshift_delete_identity(self, username):
359+
api = self.get_resource_api(API_USER, "Identity")
360+
return api.delete(name=self.qualified_id_user(username)).to_dict()
361+
362+
def _openshift_create_useridentitymapping(self, identity_mapping_def):
363+
api = self.get_resource_api(API_USER, "UserIdentityMapping")
364+
try:
365+
return clean_openshift_metadata(
366+
api.create(body=identity_mapping_def).to_dict()
367+
)
368+
except kexc.ConflictError:
369+
pass
370+
327371
def _openshift_user_exists(self, user_name):
328372
try:
329373
self._openshift_get_user(user_name)

src/coldfront_plugin_cloud/tests/functional/openshift/test_allocation.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,33 @@ def test_project_default_labels(self):
294294
self.assertTrue(
295295
namespace_dict_labels.items() > openshift.PROJECT_DEFAULT_LABELS.items()
296296
)
297+
298+
def test_create_incomplete(self):
299+
"""Creating a user that only has user, but no identity or mapping should not raise an error."""
300+
user = self.new_user()
301+
project = self.new_project(pi=user)
302+
allocation = self.new_allocation(project, self.resource, 1)
303+
allocator = openshift.OpenShiftResourceAllocator(self.resource, allocation)
304+
user_def = {
305+
"metadata": {"name": user.username},
306+
"fullName": user.username,
307+
}
308+
309+
allocator._openshift_create_user(user_def)
310+
self.assertTrue(allocator._openshift_user_exists(user.username))
311+
self.assertFalse(allocator._openshift_identity_exists(user.username))
312+
self.assertFalse(
313+
allocator._openshift_useridentitymapping_exists(
314+
user.username, user.username
315+
)
316+
)
317+
318+
# Now create identity and mapping, no errors should be raised
319+
allocator.get_or_create_federated_user(user.username)
320+
self.assertTrue(allocator._openshift_user_exists(user.username))
321+
self.assertTrue(allocator._openshift_identity_exists(user.username))
322+
self.assertTrue(
323+
allocator._openshift_useridentitymapping_exists(
324+
user.username, user.username
325+
)
326+
)

src/coldfront_plugin_cloud/tests/unit/openshift/test_user.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,48 @@ def test_get_federated_user_not_exist(self):
2929

3030
output = self.allocator.get_federated_user("fake_user_2")
3131
self.assertEqual(output, None)
32+
33+
def test_create_federated_user(self):
34+
fake_client_output = mock.Mock(spec=["to_dict"])
35+
fake_client_output.to_dict.return_value = {}
36+
self.allocator.k8_client.resources.get.return_value.create.return_value = (
37+
fake_client_output
38+
)
39+
40+
self.allocator.create_federated_user("fake_user_name")
41+
42+
# Assert called to create user
43+
self.allocator.k8_client.resources.get.return_value.create.assert_any_call(
44+
body={"metadata": {"name": "fake_user_name"}, "fullName": "fake_user_name"}
45+
)
46+
47+
# Assert called to add identity
48+
self.allocator.k8_client.resources.get.return_value.create.assert_any_call(
49+
body={
50+
"providerName": "fake_idp",
51+
"providerUserName": "fake_user_name",
52+
}
53+
)
54+
55+
# Assert called to add identity mapping
56+
self.allocator.k8_client.resources.get.return_value.create.assert_any_call(
57+
body={
58+
"user": {"name": "fake_user_name"},
59+
"identity": {"name": "fake_idp:fake_user_name"},
60+
}
61+
)
62+
63+
def test_delete_user(self):
64+
fake_client_output = mock.Mock(spec=["to_dict"])
65+
fake_client_output.to_dict.return_value = {}
66+
self.allocator.k8_client.resources.get.return_value.delete.return_value = (
67+
fake_client_output
68+
)
69+
70+
self.allocator._delete_user("fake_user_name")
71+
self.allocator.k8_client.resources.get.return_value.delete.assert_any_call(
72+
name="fake_user_name"
73+
)
74+
self.allocator.k8_client.resources.get.return_value.delete.assert_any_call(
75+
name="fake_idp:fake_user_name"
76+
)

0 commit comments

Comments
 (0)