@@ -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