From 296f4a7ff86bc8427dfa84e884e32f3a9c14e814 Mon Sep 17 00:00:00 2001 From: Murat Kabilov Date: Thu, 18 Aug 2016 17:40:16 +0200 Subject: [PATCH] Introduce disable/resume commands --- patroni/ctl.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- patroni/ha.py | 2 ++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/patroni/ctl.py b/patroni/ctl.py index b272d5ca..18301618 100644 --- a/patroni/ctl.py +++ b/patroni/ctl.py @@ -747,8 +747,13 @@ def touch_member(config, dcs): return dcs.touch_member(json.dumps(data, separators=(',', ':')), permanent=True) +def is_paused(cluster): + """Check if cluster management is paused""" + return 'pause' in cluster.config.data and cluster.config.data['pause'] + + def set_defaults(config, cluster_name): - ''' fill-in some basic configuration parameters if config file is not set ''' + """fill-in some basic configuration parameters if config file is not set """ config['postgresql'].setdefault('name', cluster_name) config['postgresql'].setdefault('scope', cluster_name) config['postgresql'].setdefault('listen', '127.0.0.1') @@ -800,3 +805,42 @@ def flush(cluster_name, member_names, config_file, dcs, force, role, target): check_response(r, member.name, 'flush scheduled restart') else: click.echo('No scheduled restart for member {0}'.format(member.name)) + + +@ctl.command('disable', help='Disable auto failover') +@click.argument('cluster_name') +@option_config_file +@option_dcs +def disable(config_file, cluster_name, dcs): + config, dcs, cluster = ctl_load_config(cluster_name, config_file, dcs) + + if is_paused(cluster): + raise PatroniCtlException("Cluster is already paused") + + r = request_patroni(cluster.leader.member, 'patch', 'config', {'pause': True}, auth_header(config)) + if r.status_code == 200: + click.echo('Success: cluster management is paused.') + else: + click.echo('Failed: pause cluster management status code={0}, ({1})'.format(r.status_code, r.text)) + + return + + +@ctl.command('resume', help='Resume auto failover') +@click.argument('cluster_name') +@option_config_file +@option_dcs +def resume(config_file, cluster_name, dcs): + config, dcs, cluster = ctl_load_config(cluster_name, config_file, dcs) + + if not is_paused(cluster): + raise PatroniCtlException("Cluster is not paused") + + r = request_patroni(cluster.leader.member, 'patch', 'config', {'pause': False}, auth_header(config)) + if r.status_code == 200: + click.echo('Success: cluster management is resumed') + else: + click.echo('Failed: resume cluster management, status code={0}, ({1})'.format(r.status_code, r.text)) + + return + diff --git a/patroni/ha.py b/patroni/ha.py index 3367572f..de8f976e 100644 --- a/patroni/ha.py +++ b/patroni/ha.py @@ -150,6 +150,8 @@ class Ha(object): if self.state_handler.is_leader() or self.state_handler.role == 'master': return message else: + if 'pause' in self.cluster.config.data and self.cluster.config.data['pause']: + return "Not promoted due to paused state." self.state_handler.promote() self.touch_member() return promote_message