Skip to content

Commit d78ffd1

Browse files
committed
Merge PR ceph#59435 into main
* refs/pull/59435/head: mgr/volumes: Fix json.loads for test on mon caps mgr/volumes: Add test for mon caps if auth key has remaining mds/osd caps mgr/volumes: Keep mon caps if auth key has remaining mds/osd caps Reviewed-by: Milind Changire <[email protected]> Reviewed-by: Venky Shankar <[email protected]>
2 parents 983134d + b008ef9 commit d78ffd1

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

qa/tasks/cephfs/test_volumes.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3119,6 +3119,64 @@ def test_authorize_deauthorize_subvolume(self):
31193119
self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--group_name", group)
31203120
self._fs_cmd("subvolumegroup", "rm", self.volname, group)
31213121

3122+
def test_subvolume_deauthorize_with_shared_key(self):
3123+
"""
3124+
That mon caps are preserved when one cephx key authorized on multiple
3125+
subvolumes is deauthorized on any of those.
3126+
"""
3127+
subvolume1 = self._gen_subvol_name()
3128+
subvolume2 = self._gen_subvol_name()
3129+
group = self._gen_subvol_grp_name()
3130+
authid = "alice"
3131+
3132+
# create group
3133+
self._fs_cmd("subvolumegroup", "create", self.volname, group)
3134+
3135+
# create subvolumes
3136+
self._fs_cmd("subvolume", "create", self.volname, subvolume1, "--group_name", group)
3137+
self._fs_cmd("subvolume", "create", self.volname, subvolume2, "--group_name", group)
3138+
3139+
# authorize alice authID read-write access to both subvolumes
3140+
self._fs_cmd("subvolume", "authorize", self.volname, subvolume1, authid,
3141+
"--group_name", group)
3142+
self._fs_cmd("subvolume", "authorize", self.volname, subvolume2, authid,
3143+
"--group_name", group)
3144+
3145+
# verify autorized-id has access to both subvolumes
3146+
expected_auth_list = [{'alice': 'rw'}]
3147+
auth_list1 = json.loads(self._fs_cmd('subvolume', 'authorized_list', self.volname, subvolume1, "--group_name", group))
3148+
self.assertEqual(expected_auth_list, auth_list1)
3149+
auth_list2 = json.loads(self._fs_cmd('subvolume', 'authorized_list', self.volname, subvolume2, "--group_name", group))
3150+
self.assertEqual(expected_auth_list, auth_list2)
3151+
3152+
# check mon caps for authid
3153+
expected_mon_caps = 'allow r'
3154+
full_caps = json.loads(self._raw_cmd("auth", "get", "client.alice", "--format=json-pretty"))
3155+
self.assertEqual(expected_mon_caps, full_caps[0]['caps']['mon'])
3156+
3157+
# deauthorize guest1 authID
3158+
self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume2, authid,
3159+
"--group_name", group)
3160+
3161+
# verify autorized-id has access to subvolume1 only
3162+
expected_auth_list = [{'alice': 'rw'}]
3163+
auth_list1 = json.loads(self._fs_cmd('subvolume', 'authorized_list', self.volname, subvolume1, "--group_name", group))
3164+
self.assertEqual(expected_auth_list, auth_list1)
3165+
auth_list2 = json.loads(self._fs_cmd('subvolume', 'authorized_list', self.volname, subvolume2, "--group_name", group))
3166+
self.assertEqual([], auth_list2)
3167+
3168+
# check mon caps still hold for authid
3169+
expected_mon_caps = 'allow r'
3170+
full_caps = json.loads(self._raw_cmd("auth", "get", "client.alice", "--format=json-pretty"))
3171+
self.assertEqual(expected_mon_caps, full_caps[0]['caps']['mon'])
3172+
3173+
# cleanup
3174+
self._fs_cmd("subvolume", "deauthorize", self.volname, subvolume1, authid,
3175+
"--group_name", group)
3176+
self._fs_cmd("subvolume", "rm", self.volname, subvolume1, "--group_name", group)
3177+
self._fs_cmd("subvolume", "rm", self.volname, subvolume2, "--group_name", group)
3178+
self._fs_cmd("subvolumegroup", "rm", self.volname, group)
3179+
31223180
def test_multitenant_subvolumes(self):
31233181
"""
31243182
That subvolume access can be restricted to a tenant.

src/pybind/mgr/volumes/fs/operations/access.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,12 @@ def cap_remove(orig_mds_caps, orig_osd_caps, want_mds_caps, want_osd_caps):
125125
mds_cap_str, osd_cap_str = cap_remove(orig_mds_caps, orig_osd_caps,
126126
want_mds_caps, want_osd_caps)
127127

128-
caps_list = prepare_updated_caps_list(cap, mds_cap_str, osd_cap_str, authorize=False)
128+
# The same auth key may be used for multiple subvolumes
129+
# If upon cap_remove the key still has mds or osd caps, it must also keep
130+
# mon caps so that the client is allowed to check in with the mons.
131+
auth = True if mds_cap_str or osd_cap_str else False
132+
133+
caps_list = prepare_updated_caps_list(cap, mds_cap_str, osd_cap_str, authorize=auth)
129134
if not caps_list:
130135
mgr.mon_command(
131136
{

0 commit comments

Comments
 (0)