mirror of
https://github.com/outbackdingo/patroni.git
synced 2026-08-25 14:53:37 +00:00
Add support for additional parameters on custom bootstrap (#2927)
Previous to this commit, if a user would ever like to add parameters to the custom bootstrap script call, they would need to configure Patroni like this:
```
bootstrap:
method: custom_method_name
custom_method_name:
command: /path/to/my/custom_script --arg1=value1 --arg2=value2 ...
```
This commit extends that so we achieve a similar behavior that is seen when using `create_replica_methods`, i.e., we also allow the following syntax:
```
bootstrap:
method: custom_method_name
custom_method_name:
command: /path/to/my/custom_script
arg1: value1
arg2: value2
```
All keys in the mapping which are not recognized by Patroni, will be dealt with as if they were additional named arguments to be passed down to the `command` call.
References: PAT-218.
This commit is contained in:
@@ -151,9 +151,47 @@ class Bootstrap(object):
|
||||
os.unlink(trigger_file)
|
||||
|
||||
def _custom_bootstrap(self, config: Any) -> bool:
|
||||
"""Bootstrap a fresh Patroni cluster using a custom method provided by the user.
|
||||
|
||||
:param config: configuration used for running a custom bootstrap method. It comes from the Patroni YAML file,
|
||||
so it is expected to be a :class:`dict`.
|
||||
|
||||
.. note::
|
||||
*config* must contain a ``command`` key, which value is the command or script to perform the custom
|
||||
bootstrap procedure. The exit code of the ``command`` dictates if the bootstrap succeeded or failed.
|
||||
|
||||
When calling ``command``, Patroni will pass the following arguments to the ``command`` call:
|
||||
|
||||
* ``--scope``: contains the value of ``scope`` configuration;
|
||||
* ``--data_dir``: contains the value of the ``postgresql.data_dir`` configuration.
|
||||
|
||||
You can avoid that behavior by filling the optional key ``no_params`` with the value ``False`` in the
|
||||
configuration file, which will instruct Patroni to not pass these parameters to the ``command`` call.
|
||||
|
||||
Besides that, a couple more keys are supported in *config*, but optional:
|
||||
|
||||
* ``keep_existing_recovery_conf``: if ``True``, instruct Patroni to not remove the existing
|
||||
``recovery.conf`` (PostgreSQL <= 11), to not discard recovery parameters from the configuration
|
||||
(PostgreSQL >= 12), and to not remove the files ``recovery.signal`` or ``standby.signal``
|
||||
(PostgreSQL >= 12). This is specially useful when you are restoring backups through tools like
|
||||
pgBackRest and Barman, in which case they generated the appropriate recovery settings for you;
|
||||
* ``recovery_conf``: a section containing a map, where each key is the name of a recovery related
|
||||
setting, and the value is the value of the corresponding setting.
|
||||
|
||||
Any key/value other than the ones that were described above will be interpreted as additional arguments for
|
||||
the ``command`` call. They will all be added to the call in the format ``--key=value``.
|
||||
|
||||
:returns: ``True`` if the bootstrap was successful, i.e. the execution of the custom ``command`` from *config*
|
||||
exited with code ``0``, ``False`` otherwise.
|
||||
"""
|
||||
self._postgresql.set_state('running custom bootstrap script')
|
||||
params = [] if config.get('no_params') else ['--scope=' + self._postgresql.scope,
|
||||
'--datadir=' + self._postgresql.data_dir]
|
||||
# Add custom parameters specified by the user
|
||||
reserved_args = {'no_params', 'keep_existing_recovery_conf', 'recovery_conf', 'scope', 'datadir'}
|
||||
for arg, val in config.items():
|
||||
if arg not in reserved_args:
|
||||
params.append(f"--{arg}={val}")
|
||||
try:
|
||||
logger.info('Running custom bootstrap script: %s', config['command'])
|
||||
if self._postgresql.cancellable.call(shlex.split(config['command']) + params) != 0:
|
||||
|
||||
Reference in New Issue
Block a user