~ajkavanagh/openstack-mojo-specs/remove-cinder-from-vrrp-ha

« back to all changes in this revision

Viewing changes to helper/setup/leader_chaos.py

  • Committer: Liam Young
  • Date: 2015-02-10 07:40:20 UTC
  • mto: This revision was merged to the branch mainline in revision 205.
  • Revision ID: liam.young@canonical.com-20150210074020-iorzsdum2q817wfy
More detail to readme

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
import sys
3
 
import utils.mojo_utils as mojo_utils
4
 
import utils.mojo_os_utils as mojo_os_utils
5
 
import logging
6
 
import argparse
7
 
import xml.dom.minidom
8
 
import re
9
 
import ast
10
 
 
11
 
 
12
 
def rabbit_unit_status(unit):
13
 
    cmd = 'rabbitmqctl -q cluster_status'
14
 
    output = mojo_utils.remote_run(unit, remote_cmd=cmd)[0]
15
 
    output = output.replace('\n', '')
16
 
    matchObj = re.search(r'running_nodes,(.*)}, {partitions', output)
17
 
    machine_numbers = []
18
 
    for machine in ast.literal_eval(matchObj.group(1)):
19
 
        machine_numbers.append(int(machine.split('-')[-1]))
20
 
    return machine_numbers
21
 
 
22
 
 
23
 
def rabbit_status():
24
 
    juju_units = mojo_utils.get_juju_units(service='rabbitmq-server')
25
 
    machine_numbers = get_machine_numbers('rabbitmq-server')
26
 
    for unit in juju_units:
27
 
        units = rabbit_unit_status(unit)
28
 
        units.sort()
29
 
        if machine_numbers == units:
30
 
            logging.info('Rabbit status on %s look good' % (unit))
31
 
        else:
32
 
            msg = 'Mismatch on rabbit status for on unit {}'.format(unit)
33
 
            raise Exception(msg)
34
 
 
35
 
 
36
 
def unit_crm_online(unit):
37
 
    output = mojo_utils.remote_run(unit, remote_cmd='crm_mon -X')
38
 
    xml_out = output[0]
39
 
    tree = xml.dom.minidom.parseString(xml_out)
40
 
    itemlist = tree.getElementsByTagName('node')
41
 
    online_units = []
42
 
    for s in itemlist:
43
 
        if 'online' in s.attributes.keys() \
44
 
                and s.attributes['online'].value == 'true':
45
 
            online_units.append(int(s.attributes['name'].value.split('-')[-1]))
46
 
    online_units.sort()
47
 
    return online_units
48
 
 
49
 
 
50
 
def get_machine_numbers(service):
51
 
    juju_units = mojo_utils.get_juju_units(service=service)
52
 
    machine_numbers = []
53
 
    for unit in juju_units:
54
 
        machine_numbers.append(mojo_utils.convert_unit_to_machinename(unit))
55
 
    machine_numbers.sort()
56
 
    return machine_numbers
57
 
 
58
 
 
59
 
def check_crm_status(service):
60
 
    juju_units = mojo_utils.get_juju_units(service=service)
61
 
    if not juju_units:
62
 
        return
63
 
    cmd = 'which crm_mon || echo "Not Found"'
64
 
    output = mojo_utils.remote_run(juju_units[0], remote_cmd=cmd)
65
 
    if output[0].rstrip() == "Not Found":
66
 
        return
67
 
    for unit in juju_units:
68
 
        mach_nums = get_machine_numbers(service)
69
 
        crm_online = unit_crm_online(unit)
70
 
        if mach_nums == crm_online:
71
 
            logging.info('Service %s status on %s look good' % (service, unit))
72
 
        else:
73
 
            logging.info('%s != %s' % (str(mach_nums), str(crm_online)))
74
 
            msg = ('Mismatch on crm status for service {} '
75
 
                   'on unit {}'.format(service, unit))
76
 
            raise Exception(msg)
77
 
 
78
 
 
79
 
def check_cluster_status(service):
80
 
    if service == 'rabbitmq-service':
81
 
        rabbit_status()
82
 
    else:
83
 
        check_crm_status(service)
84
 
 
85
 
 
86
 
def main(argv):
87
 
    logging.basicConfig(level=logging.INFO)
88
 
    parser = argparse.ArgumentParser()
89
 
    parser.add_argument("term_method", default='juju', nargs='?')
90
 
    skip_services = ['neutron-gateway', 'mongodb', 'heat', 'rabbitmq-server']
91
 
    princ_services = mojo_utils.get_principle_services()
92
 
    services = [item for item in princ_services if item not in skip_services]
93
 
    for svc in services:
94
 
        doomed_service = services.pop(0)
95
 
        mojo_os_utils.delete_juju_leader(doomed_service)
96
 
        mojo_utils.juju_check_hooks_complete()
97
 
        mojo_utils.juju_status_check_and_wait()
98
 
        check_cluster_status(doomed_service)
99
 
        mojo_utils.add_unit(doomed_service, unit_num=1)
100
 
        mojo_utils.juju_status_check_and_wait()
101
 
        mojo_utils.juju_check_hooks_complete()
102
 
        check_crm_status(doomed_service)
103
 
 
104
 
 
105
 
if __name__ == "__main__":
106
 
    sys.exit(main(sys.argv))