Skip to content

Commit 3602bd9

Browse files
committed
Implementing ExperimentPermission operations
1 parent 1333338 commit 3602bd9

File tree

9 files changed

+295
-4
lines changed

9 files changed

+295
-4
lines changed

docs/make.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ makedocs(;
1212
"Miscellaneous operations" => "reference/misc.md",
1313
"Run operations" => "reference/run.md",
1414
"Registered model operations" => "reference/registered_model.md",
15-
"Model version operations" => "reference/model_version.md",]])
15+
"Model version operations" => "reference/model_version.md",
16+
"User operations" => "reference/user.md",]])
1617

1718
deploydocs(; repo="github.com/JuliaAI/MLFlowClient.jl", devbranch="main")

docs/src/reference/experiment.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ restoreexperiment
88
updateexperiment
99
searchexperiments
1010
setexperimenttag
11+
createexperimentpermission
12+
getexperimentpermission
13+
updateexperimentpermission
14+
deleteexperimentpermission
1115
```

docs/src/reference/user.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# User operations
2+
```@docs
3+
createuser
4+
getuser
5+
updateuserpassword
6+
updateuseradmin
7+
deleteuser
8+
```

src/MLFlowClient.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ include("utils.jl")
5454

5555
include("services/experiment.jl")
5656
export getexperiment, createexperiment, deleteexperiment, setexperimenttag,
57-
updateexperiment, restoreexperiment, searchexperiments, getexperimentbyname
57+
updateexperiment, restoreexperiment, searchexperiments, getexperimentbyname,
58+
createexperimentpermission, getexperimentpermission, updateexperimentpermission,
59+
deleteexperimentpermission
5860

5961
include("services/run.jl")
6062
export getrun, createrun, deleterun, setruntag, updaterun, restorerun, searchruns,

src/services/experiment.jl

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,3 +207,115 @@ setexperimenttag(instance::MLFlow, experiment_id::Integer, key::String,
207207
setexperimenttag(instance::MLFlow, experiment::Experiment, key::String,
208208
value::String)::Bool =
209209
setexperimenttag(instance, experiment.experiment_id, key, value)
210+
211+
"""
212+
createexperimentpermission(instance::MLFlow, experiment_id::String, username::String,
213+
permission::Permission)
214+
createexperimentpermission(instance::MLFlow, experiment_id::Integer, username::String,
215+
permission::Permission)
216+
createexperimentpermission(instance::MLFlow, experiment::Experiment, username::String,
217+
permission::Permission)
218+
219+
# Arguments
220+
- `instance`: [`MLFlow`](@ref) configuration.
221+
- `experiment_id`: [`Experiment`](@ref) id.
222+
- `username`: [`User`](@ref) username.
223+
- `permission`: [`Permission`](@ref) to grant.
224+
225+
# Returns
226+
An instance of type [`ExperimentPermission`](@ref).
227+
"""
228+
function createexperimentpermission(instance::MLFlow, experiment_id::String,
229+
username::String, permission::Permission)::ExperimentPermission
230+
result = mlfpost(instance, "experiments/permissions/create";
231+
experiment_id=experiment_id, username=username, permission=permission)
232+
return result["experiment_permission"] |> ExperimentPermission
233+
end
234+
createexperimentpermission(instance::MLFlow, experiment_id::Integer,
235+
username::String, permission::Permission)::ExperimentPermission =
236+
createexperimentpermission(instance, experiment_id |> string, username, permission)
237+
createexperimentpermission(instance::MLFlow, experiment::Experiment,
238+
username::String, permission::Permission)::ExperimentPermission =
239+
createexperimentpermission(instance, experiment.experiment_id, username, permission)
240+
241+
"""
242+
getexperimentpermission(instance::MLFlow, experiment_id::String, username::String)
243+
getexperimentpermission(instance::MLFlow, experiment_id::Integer, username::String)
244+
getexperimentpermission(instance::MLFlow, experiment::Experiment, username::String)
245+
246+
# Arguments
247+
- `instance`: [`MLFlow`](@ref) configuration.
248+
- `experiment_id`: [`Experiment`](@ref) id.
249+
- `username`: [`User`](@ref) username.
250+
251+
# Returns
252+
An instance of type [`ExperimentPermission`](@ref).
253+
"""
254+
function getexperimentpermission(instance::MLFlow, experiment_id::String,
255+
username::String)::ExperimentPermission
256+
result = mlfget(instance, "experiments/permissions/get"; experiment_id=experiment_id,
257+
username=username)
258+
return result["experiment_permission"] |> ExperimentPermission
259+
end
260+
getexperimentpermission(instance::MLFlow, experiment_id::Integer,
261+
username::String)::ExperimentPermission =
262+
getexperimentpermission(instance, experiment_id |> string, username)
263+
getexperimentpermission(instance::MLFlow, experiment::Experiment,
264+
username::String)::ExperimentPermission =
265+
getexperimentpermission(instance, experiment.experiment_id, username)
266+
267+
"""
268+
updateexperimentpermission(instance::MLFlow, experiment_id::String, username::String,
269+
permission::Permission)
270+
updateexperimentpermission(instance::MLFlow, experiment_id::Integer, username::String,
271+
permission::Permission)
272+
updateexperimentpermission(instance::MLFlow, experiment::Experiment, username::String,
273+
permission::Permission)
274+
275+
# Arguments
276+
- `instance`: [`MLFlow`](@ref) configuration.
277+
- `experiment_id`: [`Experiment`](@ref) id.
278+
- `username`: [`User`](@ref) username.
279+
- `permission`: [`Permission`](@ref) to grant.
280+
281+
# Returns
282+
`true` if successful. Otherwise, raises exception.
283+
"""
284+
function updateexperimentpermission(instance::MLFlow, experiment_id::String,
285+
username::String, permission::Permission)::Bool
286+
mlfpatch(instance, "experiments/permissions/update"; experiment_id=experiment_id,
287+
username=username, permission=permission)
288+
return true
289+
end
290+
updateexperimentpermission(instance::MLFlow, experiment_id::Integer,
291+
username::String, permission::Permission)::Bool =
292+
updateexperimentpermission(instance, experiment_id |> string, username, permission)
293+
updateexperimentpermission(instance::MLFlow, experiment::Experiment,
294+
username::String, permission::Permission)::Bool =
295+
updateexperimentpermission(instance, experiment.experiment_id, username, permission)
296+
297+
"""
298+
deleteexperimentpermission(instance::MLFlow, experiment_id::String, username::String)
299+
deleteexperimentpermission(instance::MLFlow, experiment_id::Integer, username::String)
300+
deleteexperimentpermission(instance::MLFlow, experiment::Experiment, username::String)
301+
302+
# Arguments
303+
- `instance`: [`MLFlow`](@ref) configuration.
304+
- `experiment_id`: [`Experiment`](@ref) id.
305+
- `username`: [`User`](@ref) username.
306+
307+
# Returns
308+
`true` if successful. Otherwise, raises exception.
309+
"""
310+
function deleteexperimentpermission(instance::MLFlow, experiment_id::String,
311+
username::String)::Bool
312+
mlfdelete(instance, "experiments/permissions/delete"; experiment_id=experiment_id,
313+
username=username)
314+
return true
315+
end
316+
deleteexperimentpermission(instance::MLFlow, experiment_id::Integer,
317+
username::String)::Bool =
318+
deleteexperimentpermission(instance, experiment_id |> string, username)
319+
deleteexperimentpermission(instance::MLFlow, experiment::Experiment,
320+
username::String)::Bool =
321+
deleteexperimentpermission(instance, experiment.experiment_id, username)

src/services/user.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ function getuser(instance::MLFlow, username::String)::User
3030
end
3131

3232
"""
33-
deleteuser(instance::MLFlow, username::String, password::String)
33+
updateuserpassword(instance::MLFlow, username::String, password::String)
3434
3535
# Arguments
3636
- `instance`: [`MLFlow`](@ref) configuration.

src/types/enums.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,4 @@ Permission of a user to an experiment or a registered model.
6868
MANAGE = 3
6969
NO_PERMISSIONS = 4
7070
end
71+
Permission(permission::String) = Dict(value => key for (key, value) in Permission |> Base.Enums.namemap)[permission|>Symbol] |> Permission

src/types/experiment.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,5 @@ struct ExperimentPermission
3939
permission::Permission
4040
end
4141
ExperimentPermission(data::Dict{String,Any}) = ExperimentPermission(data["experiment_id"],
42-
data["user_id"], Permission(data["permission"]))
42+
data["user_id"] |> string, Permission(data["permission"]))
4343
Base.show(io::IO, t::ExperimentPermission) = show(io, ShowCase(t, new_lines=true))

test/services/experiment.jl

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,166 @@ end
214214
deleteexperiment(mlf, experiment_id)
215215
end
216216
end
217+
218+
@testset verbose = true "create experiment permission" begin
219+
@ensuremlf
220+
221+
experiment_id = createexperiment(mlf, UUIDs.uuid4() |> string)
222+
permission = Permission("READ")
223+
224+
@testset "with string experiment id" begin
225+
user = createuser(mlf, "missy", "gala")
226+
experiment_permission =
227+
createexperimentpermission(mlf, experiment_id, user.username, permission)
228+
229+
@test experiment_permission isa ExperimentPermission
230+
@test experiment_permission.experiment_id == experiment_id
231+
@test experiment_permission.user_id == user.id
232+
@test experiment_permission.permission == permission
233+
deleteexperimentpermission(mlf, experiment_id, user.username)
234+
deleteuser(mlf, user.username)
235+
end
236+
237+
@testset "with integer experiment id" begin
238+
user = createuser(mlf, "missy", "gala")
239+
experiment_permission =
240+
createexperimentpermission(mlf, parse(Int, experiment_id), user.username, permission)
241+
242+
@test experiment_permission isa ExperimentPermission
243+
@test experiment_permission.experiment_id == experiment_id
244+
@test experiment_permission.user_id == user.id
245+
@test experiment_permission.permission == permission
246+
deleteexperimentpermission(mlf, experiment_id, user.username)
247+
deleteuser(mlf, user.username)
248+
end
249+
250+
@testset "with Experiment" begin
251+
experiment = getexperiment(mlf, experiment_id)
252+
user = createuser(mlf, "missy", "gala")
253+
experiment_permission =
254+
createexperimentpermission(mlf, experiment, user.username, permission)
255+
256+
@test experiment_permission isa ExperimentPermission
257+
@test experiment_permission.experiment_id == experiment_id
258+
@test experiment_permission.user_id == user.id
259+
@test experiment_permission.permission == permission
260+
deleteexperimentpermission(mlf, experiment_id, user.username)
261+
deleteuser(mlf, user.username)
262+
end
263+
264+
deleteexperiment(mlf, experiment_id)
265+
end
266+
267+
@testset verbose = true "get experiment permission" begin
268+
@ensuremlf
269+
270+
experiment_id = createexperiment(mlf, UUIDs.uuid4() |> string)
271+
permission = Permission("READ")
272+
user = createuser(mlf, "missy", "gala")
273+
274+
@testset "with string experiment id" begin
275+
createexperimentpermission(mlf, experiment_id, user.username, permission)
276+
experiment_permission = getexperimentpermission(mlf, experiment_id, user.username)
277+
278+
@test experiment_permission isa ExperimentPermission
279+
@test experiment_permission.experiment_id == experiment_id
280+
@test experiment_permission.user_id == user.id
281+
@test experiment_permission.permission == permission
282+
deleteexperimentpermission(mlf, experiment_id, user.username)
283+
end
284+
285+
@testset "with integer experiment id" begin
286+
createexperimentpermission(mlf, parse(Int, experiment_id), user.username, permission)
287+
experiment_permission = getexperimentpermission(mlf, parse(Int, experiment_id), user.username)
288+
289+
@test experiment_permission isa ExperimentPermission
290+
@test experiment_permission.experiment_id == experiment_id
291+
@test experiment_permission.user_id == user.id
292+
@test experiment_permission.permission == permission
293+
deleteexperimentpermission(mlf, experiment_id, user.username)
294+
end
295+
296+
@testset "with Experiment" begin
297+
experiment = getexperiment(mlf, experiment_id)
298+
createexperimentpermission(mlf, experiment, user.username, permission)
299+
experiment_permission = getexperimentpermission(mlf, experiment, user.username)
300+
301+
@test experiment_permission isa ExperimentPermission
302+
@test experiment_permission.experiment_id == experiment_id
303+
@test experiment_permission.user_id == user.id
304+
@test experiment_permission.permission == permission
305+
deleteexperimentpermission(mlf, experiment_id, user.username)
306+
end
307+
308+
deleteuser(mlf, user.username)
309+
deleteexperiment(mlf, experiment_id)
310+
end
311+
312+
@testset verbose = true "update experiment permission" begin
313+
@ensuremlf
314+
315+
experiment_id = createexperiment(mlf, UUIDs.uuid4() |> string)
316+
permission = Permission("READ")
317+
user = createuser(mlf, "missy", "gala")
318+
319+
@testset "with string experiment id" begin
320+
createexperimentpermission(mlf, experiment_id, user.username, permission)
321+
updateexperimentpermission(mlf, experiment_id, user.username, Permission("EDIT"))
322+
experiment_permission = getexperimentpermission(mlf, experiment_id, user.username)
323+
324+
@test experiment_permission.permission == Permission("EDIT")
325+
deleteexperimentpermission(mlf, experiment_id, user.username)
326+
end
327+
328+
@testset "with integer experiment id" begin
329+
createexperimentpermission(mlf, parse(Int, experiment_id), user.username, permission)
330+
updateexperimentpermission(mlf, parse(Int, experiment_id), user.username, Permission("EDIT"))
331+
experiment_permission = getexperimentpermission(mlf, parse(Int, experiment_id), user.username)
332+
333+
@test experiment_permission.permission == Permission("EDIT")
334+
deleteexperimentpermission(mlf, experiment_id, user.username)
335+
end
336+
337+
@testset "with Experiment" begin
338+
experiment = getexperiment(mlf, experiment_id)
339+
createexperimentpermission(mlf, experiment, user.username, permission)
340+
updateexperimentpermission(mlf, experiment, user.username, Permission("EDIT"))
341+
experiment_permission = getexperimentpermission(mlf, experiment, user.username)
342+
343+
@test experiment_permission.permission == Permission("EDIT")
344+
deleteexperimentpermission(mlf, experiment_id, user.username)
345+
end
346+
347+
deleteuser(mlf, user.username)
348+
deleteexperiment(mlf, experiment_id)
349+
end
350+
351+
@testset verbose = true "delete experiment permission" begin
352+
@ensuremlf
353+
354+
experiment_id = createexperiment(mlf, UUIDs.uuid4() |> string)
355+
permission = Permission("READ")
356+
user = createuser(mlf, "missy", "gala")
357+
358+
@testset "with string experiment id" begin
359+
createexperimentpermission(mlf, experiment_id, user.username, permission)
360+
deleteexperimentpermission(mlf, experiment_id, user.username)
361+
@test_throws ErrorException getexperimentpermission(mlf, experiment_id, user.username)
362+
end
363+
364+
@testset "with integer experiment id" begin
365+
createexperimentpermission(mlf, parse(Int, experiment_id), user.username, permission)
366+
deleteexperimentpermission(mlf, parse(Int, experiment_id), user.username)
367+
@test_throws ErrorException getexperimentpermission(mlf, parse(Int, experiment_id), user.username)
368+
end
369+
370+
@testset "with Experiment" begin
371+
experiment = getexperiment(mlf, experiment_id)
372+
createexperimentpermission(mlf, experiment, user.username, permission)
373+
deleteexperimentpermission(mlf, experiment, user.username)
374+
@test_throws ErrorException getexperimentpermission(mlf, experiment, user.username)
375+
end
376+
377+
deleteuser(mlf, user.username)
378+
deleteexperiment(mlf, experiment_id)
379+
end

0 commit comments

Comments
 (0)