/
main.py
executable file
·178 lines (165 loc) · 6.68 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#
# Copyright (c) 2015 Juniper Networks, Inc. All rights reserved.
#
#!/usr/bin/python
doc = """\
Node manager listens to process state change events and
other flag value change events to provide advanced service
management functionality.
Rules files looks like following:
====================
{ "Rules": [
{"process_name": "contrail-query-engine",
"process_state": "PROCESS_STATE_FATAL",
"action": "supervisorctl -s http://localhost:9002 """ + \
"""\stop contrail-analytics-api"},
{"process_name": "contrail-query-engine",
"process_state": "PROCESS_STATE_STOPPED",
"action": "supervisorctl -s http://localhost:9002 """ + \
"""\stop contrail-analytics-api"},
{"processname": "contrail-collector",
"process_state": "PROCESS_STATE_RUNNING",
"action": "/usr/bin/echo collector is starting >> /tmp/log"},
{"flag_name": "test", "flag_value":"true",
"action": "/usr/bin/echo flag test is set true >> /tmp/log.1"}
]
}
====================
"""
from gevent import monkey
monkey.patch_all()
import os
import sys
import argparse
import socket
import gevent
import ConfigParser
from nodemgr.analytics_event_manager import AnalyticsEventManager
from nodemgr.control_event_manager import ControlEventManager
from nodemgr.config_event_manager import ConfigEventManager
from nodemgr.vrouter_event_manager import VrouterEventManager
from nodemgr.database_event_manager import DatabaseEventManager
def usage():
print doc
sys.exit(255)
def main(args_str=' '.join(sys.argv[1:])):
# Parse Arguments
node_parser = argparse.ArgumentParser(add_help=False)
node_parser.add_argument("--nodetype",
default='contrail-analytics',
help='Type of node which nodemgr is managing')
try:
args, remaining_argv = node_parser.parse_known_args(args_str.split())
except:
usage()
disc_options = {'server': socket.gethostname(), 'port': 5998}
default = {'rules': '',
'collectors': [],
'hostip': '127.0.0.1',
'minimum_diskgb': 256,
'cassandra_repair_interval': 24,
}
node_type = args.nodetype
if (node_type == 'contrail-analytics'):
config_file = '/etc/contrail/contrail-analytics-nodemgr.conf'
default['collectors'] = ['127.0.0.1:8086']
elif (node_type == 'contrail-config'):
config_file = '/etc/contrail/contrail-config-nodemgr.conf'
elif (node_type == 'contrail-control'):
config_file = '/etc/contrail/contrail-control-nodemgr.conf'
elif (node_type == 'contrail-vrouter'):
config_file = '/etc/contrail/contrail-vrouter-nodemgr.conf'
elif (node_type == 'contrail-database'):
config_file = '/etc/contrail/contrail-database-nodemgr.conf'
else:
sys.stderr.write("Node type" + str(node_type) + "is incorrect" + "\n")
return
config = ConfigParser.SafeConfigParser()
config.read([config_file])
if 'DEFAULT' in config.sections():
default.update(dict(config.items('DEFAULT')))
if 'DISCOVERY' in config.sections():
disc_options.update(dict(config.items('DISCOVERY')))
disc_options['discovery_server'] = disc_options.pop('server')
disc_options['discovery_port'] = disc_options.pop('port')
if 'COLLECTOR' in config.sections():
try:
collector = config.get('COLLECTOR', 'server_list')
default['collectors'] = collector.split()
except ConfigParser.NoOptionError as e:
pass
parser = argparse.ArgumentParser(parents=[node_parser],
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
default.update(disc_options)
parser.set_defaults(**default)
parser.add_argument("--rules",
help='Rules file to use for processing events')
parser.add_argument("--discovery_server",
help='IP address of Discovery Server')
parser.add_argument("--discovery_port",
type=int,
help='Port of Discovery Server')
parser.add_argument("--collectors",
nargs='+',
help='Collector addresses in format' +
'ip1:port1 ip2:port2')
if (node_type == 'contrail-database'):
parser.add_argument("--minimum_diskgb",
type=int,
help="Minimum disk space in GB's")
parser.add_argument("--hostip",
help="IP address of host")
parser.add_argument("--cassandra_repair_interval", type=int,
help="Time in hours to periodically run "
"nodetool repair for cassandra maintenance")
try:
_args = parser.parse_args(remaining_argv)
except:
usage()
rule_file = _args.rules
discovery_server = _args.discovery_server
sys.stderr.write("Discovery server: " + discovery_server + "\n")
discovery_port = _args.discovery_port
sys.stderr.write("Discovery port: " + str(discovery_port) + "\n")
collector_addr = _args.collectors
sys.stderr.write("Collector address: " + str(collector_addr) + "\n")
# done parsing arguments
if not 'SUPERVISOR_SERVER_URL' in os.environ:
sys.stderr.write('Node manager must be run as a supervisor event '
'listener\n')
sys.stderr.flush()
return
prog = None
if (node_type == 'contrail-analytics'):
prog = AnalyticsEventManager(
rule_file, discovery_server,
discovery_port, collector_addr)
elif (node_type == 'contrail-config'):
prog = ConfigEventManager(
rule_file, discovery_server,
discovery_port, collector_addr)
elif (node_type == 'contrail-control'):
prog = ControlEventManager(
rule_file, discovery_server,
discovery_port, collector_addr)
elif (node_type == 'contrail-vrouter'):
prog = VrouterEventManager(
rule_file, discovery_server,
discovery_port, collector_addr)
elif (node_type == 'contrail-database'):
hostip = _args.hostip
minimum_diskgb = _args.minimum_diskgb
cassandra_repair_interval = _args.cassandra_repair_interval
prog = DatabaseEventManager(
rule_file, discovery_server,
discovery_port, collector_addr,
hostip, minimum_diskgb, cassandra_repair_interval)
else:
sys.stderr.write("Node type" + str(node_type) + "is incorrect" + "\n")
return
prog.process()
prog.send_nodemgr_process_status()
prog.send_process_state_db(prog.group_names)
gevent.joinall([gevent.spawn(prog.runforever)])
if __name__ == '__main__':
main()