IAM: Add the implementation of the Update User API (#112054)

* wip

* Add validate, wire mutate, add tests

* Address copilot's feedback

* Address feedback
This commit is contained in:
Misi
2025-10-13 10:00:18 +02:00
committed by GitHub
parent 85174e3313
commit bd1dbb68ba
21 changed files with 820 additions and 22 deletions
+11
View File
@@ -0,0 +1,11 @@
apiVersion: iam.grafana.app/v0alpha1
kind: User
metadata:
namespace: default
name: user2
spec:
email: testuser2@example.com
login: testuser2
name: Test User 2
provisioned: false
role: Viewer
+1 -1
View File
@@ -8,4 +8,4 @@ spec:
login: testuser1
name: Test User 1
provisioned: false
role: None
+58 -12
View File
@@ -91,14 +91,60 @@ func doUserCRUDTestsUsingTheNewAPIs(t *testing.T, helper *apis.K8sTestHelper) {
require.Equal(t, createdUID, fetched.GetName())
require.Equal(t, "default", fetched.GetNamespace())
// TODO: Uncomment when we know how to handle global scope (global.users:)
// err = userClient.Resource.Delete(ctx, createdUID, metav1.DeleteOptions{})
// require.NoError(t, err)
err = userClient.Resource.Delete(ctx, createdUID, metav1.DeleteOptions{})
require.NoError(t, err)
// Verify deletion
// _, err = userClient.Resource.Get(ctx, createdUID, metav1.GetOptions{})
// require.Error(t, err)
// require.Contains(t, err.Error(), "not found")
_, err = userClient.Resource.Get(ctx, createdUID, metav1.GetOptions{})
require.Error(t, err)
require.Contains(t, err.Error(), "not found")
})
t.Run("should update user using the new APIs as a GrafanaAdmin", func(t *testing.T) {
ctx := context.Background()
userClient := helper.GetResourceClient(apis.ResourceClientArgs{
User: helper.Org1.Admin,
Namespace: helper.Namespacer(helper.Org1.Admin.Identity.GetOrgID()),
GVR: gvrUsers,
})
// Create the user
created, err := userClient.Resource.Create(ctx, helper.LoadYAMLOrJSONFile("testdata/user-test-create-2-v0.yaml"), metav1.CreateOptions{})
require.NoError(t, err)
require.NotNil(t, created)
// Get the user to update
createdUID := created.GetName()
userToUpdate, err := userClient.Resource.Get(ctx, createdUID, metav1.GetOptions{})
require.NoError(t, err)
// Modify the user spec
spec := userToUpdate.Object["spec"].(map[string]interface{})
spec["name"] = "Updated Test User"
spec["email"] = "updated.test.user@example.com"
userToUpdate.Object["spec"] = spec
// Update the user
updated, err := userClient.Resource.Update(ctx, userToUpdate, metav1.UpdateOptions{})
require.NoError(t, err)
require.NotNil(t, updated)
// Verify the update response
updatedSpec := updated.Object["spec"].(map[string]interface{})
require.Equal(t, "Updated Test User", updatedSpec["name"])
require.Equal(t, "updated.test.user@example.com", updatedSpec["email"])
// Fetch again to confirm
fetched, err := userClient.Resource.Get(ctx, createdUID, metav1.GetOptions{})
require.NoError(t, err)
fetchedSpec := fetched.Object["spec"].(map[string]interface{})
require.Equal(t, "Updated Test User", fetchedSpec["name"])
require.Equal(t, "updated.test.user@example.com", fetchedSpec["email"])
// Cleanup
err = userClient.Resource.Delete(ctx, fetched.GetName(), metav1.DeleteOptions{})
require.NoError(t, err)
})
t.Run("should not be able to create user when using a user with insufficient permissions", func(t *testing.T) {
@@ -135,9 +181,9 @@ func doUserCRUDTestsUsingTheLegacyAPIs(t *testing.T, helper *apis.K8sTestHelper)
})
legacyUserPayload := `{
"name": "Test User 2",
"email": "testuser2@example.com",
"login": "testuser2",
"name": "Legacy User 3",
"email": "legacyuser3@example.com",
"login": "legacyuser3",
"password": "password123"
}`
@@ -159,9 +205,9 @@ func doUserCRUDTestsUsingTheLegacyAPIs(t *testing.T, helper *apis.K8sTestHelper)
// Verify fetched user matches created user
userSpec := user.Object["spec"].(map[string]interface{})
require.Equal(t, "testuser2@example.com", userSpec["email"])
require.Equal(t, "testuser2", userSpec["login"])
require.Equal(t, "Test User 2", userSpec["name"])
require.Equal(t, "legacyuser3@example.com", userSpec["email"])
require.Equal(t, "legacyuser3", userSpec["login"])
require.Equal(t, "Legacy User 3", userSpec["name"])
require.Equal(t, false, userSpec["provisioned"])
// Verify metadata