Skip to content

Commit ae6d67e

Browse files
authored
Merge pull request ceph#56458 from adk3798/rgw-bootstrap-hostnames
mgr/cephadm: update rgw zonegroup w/ zonegroup_hostnames from rgw spec Reviewed-by: Ali Maredia <[email protected]>
2 parents 17a4fdb + 3ba8724 commit ae6d67e

File tree

4 files changed

+76
-9
lines changed

4 files changed

+76
-9
lines changed

src/pybind/mgr/cephadm/services/cephadmservice.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,17 @@ def config(self, spec: RGWSpec) -> None: # type: ignore
968968
'val': cert_data,
969969
})
970970

971+
if spec.zonegroup_hostnames:
972+
zg_update_cmd = {
973+
'prefix': 'rgw zonegroup modify',
974+
'realm_name': spec.rgw_realm,
975+
'zonegroup_name': spec.rgw_zonegroup,
976+
'zone_name': spec.rgw_zone,
977+
'hostnames': spec.zonegroup_hostnames,
978+
}
979+
logger.debug(f'rgw cmd: {zg_update_cmd}')
980+
ret, out, err = self.mgr.check_mon_command(zg_update_cmd)
981+
971982
# TODO: fail, if we don't have a spec
972983
logger.info('Saving service %s spec with placement %s' % (
973984
spec.service_name(), spec.placement.pretty_str()))

src/pybind/mgr/rgw/module.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from typing_extensions import Protocol
2929

3030
class MgrModuleProtocol(Protocol):
31-
def tool_exec(self, args: List[str]) -> Tuple[int, str, str]:
31+
def tool_exec(self, args: List[str], timeout: int = 10, stdin: Optional[bytes] = None) -> Tuple[int, str, str]:
3232
...
3333

3434
def apply_rgw(self, spec: RGWSpec) -> OrchResult[str]:
@@ -66,9 +66,9 @@ class RGWAMOrchMgr(RGWAMEnvMgr):
6666
def __init__(self, mgr: MgrModuleProtocol):
6767
self.mgr = mgr
6868

69-
def tool_exec(self, prog: str, args: List[str]) -> Tuple[List[str], int, str, str]:
69+
def tool_exec(self, prog: str, args: List[str], stdin: Optional[bytes] = None) -> Tuple[List[str], int, str, str]:
7070
cmd = [prog] + args
71-
rc, stdout, stderr = self.mgr.tool_exec(args=cmd)
71+
rc, stdout, stderr = self.mgr.tool_exec(args=cmd, stdin=stdin)
7272
return cmd, rc, stdout, stderr
7373

7474
def apply_rgw(self, spec: RGWSpec) -> None:
@@ -286,6 +286,18 @@ def update_zone_info(self, realm_name: str, zonegroup_name: str, zone_name: str,
286286
self.log.error('cmd run exception: (%d) %s' % (e.retcode, e.message))
287287
return HandleCommandResult(retval=e.retcode, stdout=e.stdout, stderr=e.stderr)
288288

289+
@CLICommand('rgw zonegroup modify', perm='rw')
290+
def update_zonegroup_info(self, realm_name: str, zonegroup_name: str, zone_name: str, hostnames: List[str]) -> HandleCommandResult:
291+
try:
292+
retval, out, err = RGWAM(self.env).zonegroup_modify(realm_name,
293+
zonegroup_name,
294+
zone_name,
295+
hostnames)
296+
return HandleCommandResult(retval, 'Zonegroup updated successfully', '')
297+
except RGWAMException as e:
298+
self.log.error('cmd run exception: (%d) %s' % (e.retcode, e.message))
299+
return HandleCommandResult(retval=e.retcode, stdout=e.stdout, stderr=e.stderr)
300+
289301
@CLICommand('rgw zone create', perm='rw')
290302
@check_orchestrator
291303
def _cmd_rgw_zone_create(self,

src/python-common/ceph/deployment/service_spec.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1217,10 +1217,11 @@ def __init__(self,
12171217
rgw_realm_token: Optional[str] = None,
12181218
update_endpoints: Optional[bool] = False,
12191219
zone_endpoints: Optional[str] = None, # comma separated endpoints list
1220+
zonegroup_hostnames: Optional[str] = None,
12201221
rgw_user_counters_cache: Optional[bool] = False,
12211222
rgw_user_counters_cache_size: Optional[int] = None,
12221223
rgw_bucket_counters_cache: Optional[bool] = False,
1223-
rgw_bucket_counters_cache_size: Optional[int] = None
1224+
rgw_bucket_counters_cache_size: Optional[int] = None,
12241225
):
12251226
assert service_type == 'rgw', service_type
12261227

@@ -1260,6 +1261,7 @@ def __init__(self,
12601261
self.rgw_realm_token = rgw_realm_token
12611262
self.update_endpoints = update_endpoints
12621263
self.zone_endpoints = zone_endpoints
1264+
self.zonegroup_hostnames = zonegroup_hostnames
12631265

12641266
#: To track op metrics by user config value rgw_user_counters_cache must be set to true
12651267
self.rgw_user_counters_cache = rgw_user_counters_cache

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

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,12 @@ def __init__(self, prog, zone_env: ZoneEnv):
149149
opt_arg(self.cmd_suffix, '--rgw-zone', zone_env.zone.name)
150150
opt_arg(self.cmd_suffix, '--zone-id', zone_env.zone.id)
151151

152-
def run(self, cmd):
152+
def run(self, cmd, stdin=None):
153153
args = cmd + self.cmd_suffix
154-
cmd, returncode, stdout, stderr = self.mgr.tool_exec(self.prog, args)
154+
cmd, returncode, stdout, stderr = self.mgr.tool_exec(self.prog, args, stdin)
155155

156156
log.debug('cmd=%s' % str(cmd))
157+
log.debug(f'stdin={stdin}')
157158
log.debug('stdout=%s' % stdout)
158159

159160
if returncode != 0:
@@ -174,8 +175,8 @@ class RGWAdminJSONCmd(RGWAdminCmd):
174175
def __init__(self, zone_env: ZoneEnv):
175176
super().__init__(zone_env)
176177

177-
def run(self, cmd):
178-
stdout, _ = RGWAdminCmd.run(self, cmd)
178+
def run(self, cmd, stdin=None):
179+
stdout, _ = RGWAdminCmd.run(self, cmd, stdin)
179180

180181
return json.loads(stdout)
181182

@@ -237,9 +238,13 @@ def list(self):
237238
def get(self, zonegroup: EntityKey = None):
238239
ze = ZoneEnv(self.env)
239240
params = ['zonegroup', 'get']
240-
opt_arg(params, '--rgw-zonegroup', zonegroup)
241241
return RGWAdminJSONCmd(ze).run(params)
242242

243+
def set(self, zonegroup: EntityKey, zg_json: str):
244+
ze = ZoneEnv(self.env)
245+
params = ['zonegroup', 'set']
246+
return RGWAdminJSONCmd(ze).run(params, stdin=zg_json.encode('utf-8'))
247+
243248
def create(self, realm: EntityKey, zg: EntityKey = None, endpoints=None, is_master=True):
244249
ze = ZoneEnv(self.env, realm=realm).init_zg(zg, gen=True)
245250

@@ -724,6 +729,43 @@ def zone_modify(self, realm_name, zonegroup_name, zone_name, endpoints, realm_to
724729

725730
return (0, success_message, '')
726731

732+
def zonegroup_modify(self, realm_name, zonegroup_name, zone_name, hostnames):
733+
if realm_name is None:
734+
raise RGWAMException('Realm name is a mandatory parameter')
735+
if zone_name is None:
736+
raise RGWAMException('Zone name is a mandatory parameter')
737+
if zonegroup_name is None:
738+
raise RGWAMException('Zonegroup name is a mandatory parameter')
739+
740+
realm = EntityName(realm_name)
741+
zone = EntityName(zone_name)
742+
period_info = self.period_op().get(realm)
743+
period = RGWPeriod(period_info)
744+
logging.info('Period: ' + period.id)
745+
zonegroup = period.find_zonegroup_by_name(zonegroup_name)
746+
if not zonegroup:
747+
raise RGWAMException(f'zonegroup {zonegroup_name} not found')
748+
zg = EntityName(zonegroup.name)
749+
zg_json = self.zonegroup_op().get(zg)
750+
751+
if hostnames:
752+
zg_json['hostnames'] = hostnames
753+
754+
try:
755+
self.zonegroup_op().set(zg, json.dumps(zg_json))
756+
except RGWAMException as e:
757+
raise RGWAMException('failed to set zonegroup', e)
758+
759+
try:
760+
period_info = self.period_op().update(realm, zg, zone, True)
761+
except RGWAMException as e:
762+
raise RGWAMException('failed to update period', e)
763+
764+
period = RGWPeriod(period_info)
765+
logging.debug(period.to_json())
766+
767+
return (0, f'Modified zonegroup {zonegroup_name} of realm {realm_name}', '')
768+
727769
def get_realms_info(self):
728770
realms_info = []
729771
for realm_name in self.realm_op().list():

0 commit comments

Comments
 (0)