Source code for django_fabfile.switchdb

from fabric.api import env, sudo, settings, task
from fabric.state import output

from django_fabfile.utils import config


master = config.get('RDBMS', 'MASTER')
backup = config.get('RDBMS', 'BACKUP')
username = config.get('DEFAULT', 'USERNAME')
pcp_password = config.get('RDBMS', 'PCP_PASSWORD')

env.update({'disable_known_hosts': True, 'user': username, 'warn_only': True})
output.update({'running': False})


def return_(master, backup, node_id):
    with settings(host_string=master):
        sudo('su postgres -c "pcp_attach_node 60 127.0.0.1 9898 postgres'
          ' {pcp_password} {node_id}"'.format(node_id=node_id,
                                                    pcp_password=pcp_password))
    with settings(host_string=backup):
        sudo('su postgres -c "pcp_attach_node 60 127.0.0.1 9898 postgres'
          ' {pcp_password} {node_id}"'.format(node_id=node_id,
                                                    pcp_password=pcp_password))


[docs]def failover(new_primary_host, old_primary_host, failed_node_id, master_node_id): trigger = '/var/log/pgpool/trigger/trigger_file1' with settings(host_string=new_primary_host): sudo('su postgres -c "touch {trigger}"'.format(trigger=trigger)) sudo('su postgres -c "/usr/local/etc/dnsmadeeasy-update.sh' ' {new_master}"'.format(new_master=new_primary_host)) sudo('su postgres -c "pcp_detach_node 60 127.0.0.1 9898 postgres' ' {pcp_password} {node_id}"'.format(node_id=failed_node_id, pcp_password=pcp_password)) sudo('su postgres -c "pcp_attach_node 60 127.0.0.1 9898 postgres' ' {pcp_password} {node_id}"'.format(node_id=master_node_id, pcp_password=pcp_password)) with settings(host_string=old_primary_host): sudo('su postgres -c "pcp_detach_node 60 127.0.0.1 9898 postgres' ' {pcp_password} {node_id}"'.format(node_id=failed_node_id, pcp_password=pcp_password)) sudo('su postgres -c "pcp_attach_node 60 127.0.0.1 9898 postgres' ' {pcp_password} {node_id}"'.format(node_id=master_node_id, pcp_password=pcp_password))
[docs]def recover(primary, standby, recover_node_id): with settings(host_string=primary): out = sudo('/etc/init.d/postgresql status | grep -c Running') if out == '1': sudo('/etc/init.d/postgresql stop') with settings(host_string=standby): sudo('su postgres -c "pcp_recovery_node 60 127.0.0.1 9898 postgres' ' {pcp_password} {node_id}"'.format(node_id=recover_node_id, pcp_password=pcp_password)) with settings(host_string=primary): sudo('su postgres -c "pcp_attach_node 60 127.0.0.1 9898 postgres' ' {pcp_password} {node_id}"'.format(node_id=recover_node_id, pcp_password=pcp_password))
@task
[docs]def switch_to_backup(): """ If master server failed, run this to promote backup server from slave to master-role and detach failed node from pgpool """ failover(backup, master, 0, 1)
@task
[docs]def recover_master(): """ Run this to start recovery of failing master node (run this strictly after switching_to_backup) """ recover(master, backup, 0)
@task
[docs]def return_master(): """ Run this after temporary network issues in us-east-1 It will reattach master node to pgpool server """ return_(master, backup, 0)
@task
[docs]def switch_to_master(): """ If backup server failed, run this to promote master server from slave to master-role and detach failed node from pgpool """ failover(master, backup, 1, 0)
@task
[docs]def recover_backup(): """ Run this to start recovery of failing backup node (run this strictly after switching_to_master) """ recover(backup, master, 1)
@task
[docs]def return_backup(): """ Run this after temporary network issues in eu-west-1 It will reattach backup node to pgpool server """ return_(master, backup, 1)