Skip to content

Commit 6e7d502

Browse files
committed
Allow direct communication to Openshift Users API
1 parent d776019 commit 6e7d502

File tree

2 files changed

+93
-9
lines changed

2 files changed

+93
-9
lines changed

src/coldfront_plugin_cloud/openshift.py

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

230230
def create_federated_user(self, unique_id):
231-
url = f"{self.auth_url}/users/{unique_id}"
232-
try:
233-
r = self.session.put(url)
234-
self.check_response(r)
235-
except Conflict:
236-
pass
231+
user_def = {
232+
"metadata": {"name": unique_id},
233+
"fullName": unique_id,
234+
}
235+
236+
identity_def = {
237+
"providerName": self.id_provider,
238+
"providerUserName": unique_id,
239+
}
240+
241+
identity_mapping_def = {
242+
"user": {"name": unique_id},
243+
"identity": {"name": self.qualified_id_user(unique_id)},
244+
}
245+
246+
self._openshift_create_user(user_def)
247+
self._openshift_create_identity(identity_def)
248+
self._openshift_create_useridentitymapping(identity_mapping_def)
249+
logger.info(f"User {unique_id} successfully created")
237250

238251
def assign_role_on_user(self, username, project_id):
239252
# /users/<user_name>/projects/<project>/roles/<role>
@@ -287,9 +300,9 @@ def _get_project(self, project_id):
287300
return self.check_response(r)
288301

289302
def _delete_user(self, username):
290-
url = f"{self.auth_url}/users/{username}"
291-
r = self.session.delete(url)
292-
return self.check_response(r)
303+
self._openshift_delete_user(username)
304+
self._openshift_delete_identity(username)
305+
logger.info(f"User {username} successfully deleted")
293306

294307
def get_users(self, project_id):
295308
url = f"{self.auth_url}/projects/{project_id}/users"
@@ -300,12 +313,38 @@ def _openshift_get_user(self, username):
300313
api = self.get_resource_api(API_USER, "User")
301314
return clean_openshift_metadata(api.get(name=username).to_dict())
302315

316+
def _openshift_create_user(self, user_def):
317+
api = self.get_resource_api(API_USER, "User")
318+
return clean_openshift_metadata(api.create(body=user_def).to_dict())
319+
320+
def _openshift_delete_user(self, username):
321+
api = self.get_resource_api(API_USER, "User")
322+
return clean_openshift_metadata(api.delete(name=username).to_dict())
323+
303324
def _openshift_get_identity(self, id_user):
304325
api = self.get_resource_api(API_USER, "Identity")
305326
return clean_openshift_metadata(
306327
api.get(name=self.qualified_id_user(id_user)).to_dict()
307328
)
308329

330+
def _openshift_create_identity(self, identity_def):
331+
api = self.get_resource_api(API_USER, "Identity")
332+
return clean_openshift_metadata(api.create(body=identity_def).to_dict())
333+
334+
def _openshift_delete_identity(self, username):
335+
api = self.get_resource_api(API_USER, "Identity")
336+
return api.delete(name=self.qualified_id_user(username)).to_dict()
337+
338+
def _openshift_create_useridentitymapping(self, identity_mapping_def):
339+
api = self.get_resource_api(API_USER, "UserIdentityMapping")
340+
return clean_openshift_metadata(api.create(body=identity_mapping_def).to_dict())
341+
342+
def _openshift_create_rolebinding(self, project_name, role_binding_def):
343+
api = self.get_resource_api(API_RBAC, "RoleBinding")
344+
return clean_openshift_metadata(
345+
api.create(body=role_binding_def, namespace=project_name).to_dict()
346+
)
347+
309348
def _openshift_user_exists(self, user_name):
310349
try:
311350
self._openshift_get_user(user_name)

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

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

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

0 commit comments

Comments
 (0)