Skip to content

Commit dba1f64

Browse files
committed
tests: Add RBAC test for VM.other_config
This verifies that RBAC key checking works for VM.set_other_config Signed-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>
1 parent 8dc7a46 commit dba1f64

4 files changed

Lines changed: 93 additions & 5 deletions

File tree

ocaml/tests/dune

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
test_cluster_host test_cluster test_pusb test_network_sriov
88
test_client test_valid_ref_list suite_alcotest_server
99
test_vm_placement test_vm_helpers test_repository test_repository_helpers
10-
test_ref test_xapi_helpers test_vm_group
10+
test_ref test_xapi_helpers test_vm_group test_vm_rbac
1111
test_livepatch test_rpm test_updateinfo test_storage_smapiv1_wrapper test_storage_quicktest test_observer
1212
test_pool_periodic_update_sync test_pkg_mgr test_tar_ext test_pool_repository))
1313
(libraries
@@ -62,7 +62,8 @@
6262
(test
6363
(name suite_alcotest_server)
6464
(package xapi)
65-
(modules suite_alcotest_server test_client test_valid_ref_list test_vm_group)
65+
(modules suite_alcotest_server test_client test_valid_ref_list test_vm_group
66+
test_vm_rbac)
6667
(libraries
6768
alcotest
6869
xapi_database

ocaml/tests/suite_alcotest_server.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ let () =
88
("Test_valid_ref_list", Test_valid_ref_list.test)
99
; ("Test_client", Test_client.test)
1010
; ("Test_vm_group", Test_vm_group.test)
11+
; ("Test_vm_rbac", Test_vm_rbac.test)
1112
]

ocaml/tests/test_client.ml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
calls can only succeed if they get forwarded to the local host
99
by the message forwarding layer. Forwarding to slaves does not
1010
work in unit tests. *)
11-
let make_client_params ~__context =
11+
let make_client_params_aux ~rbac_permissions ~is_local_superuser ~__context =
1212
let req = Xmlrpc_client.xmlrpc ~version:"1.1" "/" in
1313
let rpc = Api_server.Server.dispatch_call req None in
1414
let session_id =
@@ -17,13 +17,18 @@ let make_client_params ~__context =
1717
let (_ : _ API.Ref.t) =
1818
Test_common.make_session ~__context ~ref:session_id
1919
~this_host:(Helpers.get_localhost ~__context)
20-
~last_active:now ~is_local_superuser:true ~validation_time:now
21-
~auth_user_name:"root" ~originator:"test" ()
20+
~rbac_permissions ~last_active:now ~is_local_superuser
21+
~validation_time:now ~auth_user_name:"root" ~originator:"test" ()
2222
in
2323
session_id
2424
in
2525
(rpc, session_id)
2626

27+
let make_role_client_params = make_client_params_aux
28+
29+
let make_client_params =
30+
make_client_params_aux ~is_local_superuser:true ~rbac_permissions:[]
31+
2732
let setup_test () =
2833
Xapi.register_callback_fns () ;
2934
let __context = Test_common.make_test_database () in

ocaml/tests/test_vm_rbac.ml

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
module T = Test_common
2+
3+
let setup () =
4+
let __context = T.make_test_database () in
5+
let vm = T.make_vm ~__context () in
6+
let rpc, session_id =
7+
Test_client.make_role_client_params ~__context ~is_local_superuser:false
8+
~rbac_permissions:["vm-admin"]
9+
in
10+
(rpc, session_id, vm)
11+
12+
let check_rbac ?(roles = "vm-power-admin, vm-admin, pool-admin, pool-operator")
13+
s x =
14+
Alcotest.check_raises "should fail"
15+
(Api_errors.Server_error
16+
( Api_errors.rbac_permission_denied
17+
, [
18+
s
19+
; Printf.sprintf
20+
"No permission in user session. (Roles with this permission: %s)"
21+
roles
22+
]
23+
)
24+
)
25+
x
26+
27+
let test_add_other_config_rbac_check () =
28+
let rpc, session_id, vm = setup () in
29+
check_rbac ~roles:"pool-admin" "vm.add_to_other_config/key:pci" (fun () ->
30+
Client.Client.VM.add_to_other_config ~rpc ~session_id ~self:vm ~key:"pci"
31+
~value:"test"
32+
)
33+
34+
let test_set_other_config_rbac_check () =
35+
let __context = T.make_test_database () in
36+
let vm = T.make_vm ~__context () in
37+
let rpc, session_id =
38+
Test_client.make_role_client_params ~__context ~is_local_superuser:false
39+
~rbac_permissions:["vm-admin"]
40+
in
41+
let root_rpc, root_session_id = Test_client.make_client_params ~__context in
42+
check_rbac ~roles:"pool-admin" "vm.add_to_other_config/key:pci" (fun () ->
43+
Client.Client.VM.add_to_other_config ~rpc ~session_id ~self:vm ~key:"pci"
44+
~value:"test"
45+
) ;
46+
check_rbac "vm.set_other_config" (fun () ->
47+
Client.Client.VM.set_other_config ~rpc ~session_id ~self:vm
48+
~value:[("pci", "test")]
49+
) ;
50+
Client.Client.VM.set_other_config ~rpc:root_rpc ~session_id:root_session_id
51+
~self:vm
52+
~value:[("pci", "test")] ;
53+
Client.Client.VM.remove_from_other_config ~rpc:root_rpc
54+
~session_id:root_session_id ~self:vm ~key:"pci" ;
55+
Client.Client.VM.add_to_other_config ~rpc:root_rpc ~session_id:root_session_id
56+
~self:vm ~key:"pci" ~value:"test2" ;
57+
check_rbac ~roles:"pool-admin" "vm.remove_from_other_config/key:pci"
58+
(fun () ->
59+
Client.Client.VM.remove_from_other_config ~rpc ~session_id ~self:vm
60+
~key:"pci"
61+
) ;
62+
check_rbac ~roles:"pool-admin" "vm.add_to_other_config/key:pci" (fun () ->
63+
Client.Client.VM.add_to_other_config ~rpc ~session_id ~self:vm ~key:"pci"
64+
~value:"test"
65+
) ;
66+
check_rbac "vm.set_other_config" (fun () ->
67+
Client.Client.VM.set_other_config ~rpc ~session_id ~self:vm
68+
~value:[("pci", "test")]
69+
)
70+
71+
let test =
72+
[
73+
( "test_add_other_config_rbac_check"
74+
, `Quick
75+
, test_add_other_config_rbac_check
76+
)
77+
; ( "test_set_other_config_rbac_check"
78+
, `Quick
79+
, test_set_other_config_rbac_check
80+
)
81+
]

0 commit comments

Comments
 (0)