Skip to content

Commit 000598c

Browse files
authored
Merge pull request ceph#59716 from rhcs-dashboard/fix-67897-main
mgr/rgwam: use realm/zonegroup/zone method arguments for period update Reviewed-by: Adam King <[email protected]>
2 parents d82984a + e4183b2 commit 000598c

File tree

2 files changed

+84
-42
lines changed

2 files changed

+84
-42
lines changed

src/pybind/mgr/dashboard/services/rgw_client.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,18 +234,27 @@ def _handle_response_status_code(status_code: int) -> int:
234234

235235
@staticmethod
236236
def _get_daemon_connection_info(daemon_name: str) -> dict:
237+
access_key = None
238+
secret_key = None
239+
237240
try:
241+
# Try to fetch realm-specific credentials first
238242
realm_name = RgwClient._daemons[daemon_name].realm_name
239243
access_key = Settings.RGW_API_ACCESS_KEY[realm_name]
240244
secret_key = Settings.RGW_API_SECRET_KEY[realm_name]
241245
except TypeError:
242-
# Legacy string values.
246+
# Handle legacy case where credentials are simple strings, not per-realm
243247
access_key = Settings.RGW_API_ACCESS_KEY
244248
secret_key = Settings.RGW_API_SECRET_KEY
245249
except KeyError as error:
246-
raise DashboardException(msg='Credentials not found for RGW Daemon: {}'.format(error),
247-
http_status_code=404,
248-
component='rgw')
250+
# If the realm-specific credentials are not found, try fetching dashboard user keys
251+
rgw_service_manager = RgwServiceManager()
252+
# pylint: disable=protected-access
253+
access_key, secret_key = rgw_service_manager._get_user_keys('dashboard')
254+
if not access_key:
255+
raise DashboardException(msg='Credentials not found for RGW Daemon: {}'.format(error), # noqa E501 # pylint: disable=line-too-long
256+
http_status_code=404,
257+
component='rgw')
249258

250259
return {'access_key': access_key, 'secret_key': secret_key}
251260

src/python-common/ceph/rgw/rgwam_core.py

Lines changed: 71 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ def list(self):
236236
return []
237237

238238
def get(self, zonegroup: EntityKey = None):
239-
ze = ZoneEnv(self.env)
239+
ze = ZoneEnv(self.env, zg=zonegroup)
240240
params = ['zonegroup', 'get']
241241
return RGWAdminJSONCmd(ze).run(params)
242242

@@ -323,30 +323,33 @@ def __init__(self, env):
323323
self.env = env
324324

325325
def update(self, realm: EntityKey, zonegroup: EntityKey, zone: EntityKey, commit=True):
326-
master_zone_info = self.get_master_zone(realm, zonegroup)
327-
master_zone = EntityName(master_zone_info['name']) if master_zone_info else zone
328-
master_zonegroup_info = self.get_master_zonegroup(realm)
329-
master_zonegroup = EntityName(master_zonegroup_info['name']) \
330-
if master_zonegroup_info else zonegroup
331-
ze = ZoneEnv(self.env, realm=realm, zg=master_zonegroup, zone=master_zone)
326+
ze = ZoneEnv(self.env, realm=realm, zg=zonegroup, zone=zone)
332327
params = ['period', 'update']
333328
opt_arg_bool(params, '--commit', commit)
334329
return RGWAdminJSONCmd(ze).run(params)
335330

336-
def get_master_zone(self, realm, zonegroup=None):
331+
def get_master_zone(self, realm, zonegroup):
337332
try:
338-
ze = ZoneEnv(self.env, realm=realm, zg=zonegroup)
339-
params = ['zone', 'get']
340-
return RGWAdminJSONCmd(ze).run(params)
341-
except RGWAMCmdRunException:
333+
# Fetch the realm period
334+
realm_period = self.get(realm)
335+
zonegroups = realm_period['period_map']['zonegroups']
336+
337+
# Find the master zone in the realm period data
338+
for zonegroup_inf in zonegroups:
339+
if zonegroup_inf['name'] == zonegroup.name:
340+
for zone in zonegroup_inf.get('zones', []):
341+
if zone['id'] == zonegroup_inf['master_zone']:
342+
return zone
342343
return None
343344

344-
def get_master_zone_ep(self, realm, zonegroup=None):
345+
except RGWAMCmdRunException as e:
346+
log.error(f"Failed to fetch master zone: {e}")
347+
return None
348+
349+
def get_master_zone_ep(self, realm):
345350
try:
346-
ze = ZoneEnv(self.env, realm=realm, zg=zonegroup)
347-
params = ['period', 'get']
348-
output = RGWAdminJSONCmd(ze).run(params)
349-
for zg in output['period_map']['zonegroups']:
351+
realm_period = self.get(realm)
352+
for zg in realm_period['period_map']['zonegroups']:
350353
if not bool(zg['is_master']):
351354
continue
352355
for zone in zg['zones']:
@@ -358,10 +361,19 @@ def get_master_zone_ep(self, realm, zonegroup=None):
358361

359362
def get_master_zonegroup(self, realm):
360363
try:
361-
ze = ZoneEnv(self.env, realm=realm)
362-
params = ['zonegroup', 'get']
363-
return RGWAdminJSONCmd(ze).run(params)
364-
except RGWAMCmdRunException:
364+
# Fetch the realm period
365+
realm_period = self.get(realm)
366+
master_zonegroup_id = realm_period['master_zonegroup']
367+
zonegroups = realm_period['period_map']['zonegroups']
368+
369+
# Find the master zonegroup in the realm period data
370+
for zonegroup in zonegroups:
371+
if zonegroup['id'] == master_zonegroup_id:
372+
return zonegroup
373+
return None
374+
375+
except RGWAMCmdRunException as e:
376+
log.error(f"Failed to fetch master zonegroup: {e}")
365377
return None
366378

367379
def get(self, realm=None):
@@ -539,7 +551,7 @@ def realm_bootstrap(self, rgw_spec, start_radosgw=True):
539551
realm = self.create_realm(realm_name)
540552
zonegroup = self.create_zonegroup(realm, zonegroup_name, zonegroup_is_master=True)
541553
zone = self.create_zone(realm, zonegroup, zone_name, zone_is_master=True)
542-
self.update_period(realm, zonegroup)
554+
self.update_period(realm, zonegroup, zone)
543555

544556
# Create system user, normal user and update the master zone
545557
sys_user = self.create_system_user(realm, zonegroup, zone)
@@ -548,7 +560,7 @@ def realm_bootstrap(self, rgw_spec, start_radosgw=True):
548560
secret = rgw_acces_key.secret_key if rgw_acces_key else ''
549561
self.zone_op().modify(zone, zonegroup, None,
550562
access_key, secret, endpoints=rgw_spec.zone_endpoints)
551-
self.update_period(realm, zonegroup)
563+
self.update_period(realm, zonegroup, zone)
552564

553565
if start_radosgw and rgw_spec.zone_endpoints is None:
554566
# Instruct the orchestrator to start RGW daemons, asynchronically, this will
@@ -770,22 +782,43 @@ def get_realms_info(self):
770782
realms_info = []
771783
for realm_name in self.realm_op().list():
772784
realm = self.get_realm(realm_name)
773-
master_zone_inf = self.period_op().get_master_zone(realm)
774-
zone_ep = self.period_op().get_master_zone_ep(realm)
775-
if master_zone_inf and 'system_key' in master_zone_inf:
776-
access_key = master_zone_inf['system_key']['access_key']
777-
secret = master_zone_inf['system_key']['secret_key']
778-
else:
779-
access_key = ''
780-
secret = ''
781-
realms_info.append({"realm_name": realm_name,
782-
"realm_id": realm.id,
783-
"master_zone_id": master_zone_inf['id'] if master_zone_inf else '',
784-
"endpoint": zone_ep[0] if zone_ep else None,
785-
"access_key": access_key,
786-
"secret": secret})
785+
realm_period = self.period_op().get(realm)
786+
master_zone_id = realm_period['master_zone']
787+
master_zone_name = self.get_master_zone_name(realm_period, master_zone_id)
788+
local_zone_list = self.zone_op().list()
789+
790+
# Only consider the realm if master_zone_name is in the local zone list
791+
if master_zone_name in local_zone_list:
792+
master_zone_inf = self.zone_op().get(EntityID(master_zone_id))
793+
zone_ep = self.period_op().get_master_zone_ep(realm)
794+
795+
if master_zone_inf and 'system_key' in master_zone_inf:
796+
access_key = master_zone_inf['system_key']['access_key']
797+
secret = master_zone_inf['system_key']['secret_key']
798+
else:
799+
access_key = ''
800+
secret = ''
801+
802+
realms_info.append({
803+
"realm_name": realm_name,
804+
"realm_id": realm.id,
805+
"master_zone_id": master_zone_inf['id'] if master_zone_inf else '',
806+
"endpoint": zone_ep[0] if zone_ep else None,
807+
"access_key": access_key,
808+
"secret": secret
809+
})
810+
787811
return realms_info
788812

813+
def get_master_zone_name(self, realm_data, master_zone_id):
814+
# Find the zonegroups in the period_map
815+
zonegroups = realm_data.get('period_map', {}).get('zonegroups', [])
816+
for zonegroup in zonegroups:
817+
for zone in zonegroup.get('zones', []):
818+
if zone.get('id') == master_zone_id:
819+
return zone.get('name')
820+
return None
821+
789822
def zone_create(self, rgw_spec, start_radosgw, secondary_zone_period_retry_limit=5):
790823

791824
if not rgw_spec.rgw_realm_token:
@@ -811,7 +844,7 @@ def zone_create(self, rgw_spec, start_radosgw, secondary_zone_period_retry_limit
811844
realm_name = realm_info['name']
812845
realm_id = realm_info['id']
813846

814-
realm = EntityID(realm_id)
847+
realm = EntityKey(realm_name, realm_id)
815848
period_info = self.period_op().get(realm)
816849
period = RGWPeriod(period_info)
817850
logging.info('Period: ' + period.id)

0 commit comments

Comments
 (0)