{{ desc | wordwrap(70) | indent(3) }}
{% endif %}
:type: ``{{opt.type}}``
+ :runtime updatable: ``{{ runtime_updatable | string | lower }}``
{%- if default is not none %}
{%- if opt.type == 'size' %}
:default: ``{{ default | eval_size | iec_size }}``
FieldValueT = Union[bool, float, int, str]
+RUNTIME_UPDATABLE_TYPES = {
+ 'bool',
+ 'float',
+ 'int',
+ 'millisecs',
+ 'secs',
+ 'size',
+ 'uint',
+}
+
+NON_RUNTIME_FLAGS = {
+ 'cluster_create',
+ 'create',
+ 'startup',
+}
+
class CephModule(SphinxDirective):
"""
label=_('Default'),
has_arg=False,
names=('default',)),
+ Field('runtime_updatable',
+ label=_('Runtime updatable'),
+ has_arg=False,
+ names=('runtime updatable',)),
Field('type',
label=_('Type'),
has_arg=False,
return self.options.get('module',
self.env.ref_context.get('ceph:module'))
+ @staticmethod
+ def _can_update_at_runtime(opt: Dict[str, FieldValueT],
+ cur_module: str = '') -> bool:
+ flags = set(opt.get('flags', []))
+ if opt.get('runtime') is True:
+ flags.add('runtime')
+ if cur_module:
+ flags.add('mgr')
+ # Keep this in sync with src/common/options.h: Option::can_update_at_runtime().
+ if flags & NON_RUNTIME_FLAGS:
+ return False
+ if 'runtime' in flags:
+ return True
+ if 'mgr' in flags:
+ return False
+ return opt.get('type') in RUNTIME_UPDATABLE_TYPES
+
def _render_option(self, name) -> str:
cur_module = self._current_module()
if cur_module:
desc = opt.get('fmt_desc') or opt.get('long_desc') or opt.get('desc')
opt_default = opt.get('default')
default = self.options.get('default', opt_default)
+ runtime_updatable = self._can_update_at_runtime(opt, cur_module)
try:
return self.template.render(opt=opt,
desc=desc,
- default=default)
+ default=default,
+ runtime_updatable=runtime_updatable)
except Exception as e:
message = (f'Unable to render option "{name}": {e}. ',
f'opt={opt}, desc={desc}, default={default}')