cache host-vm list when inspect start to run
[doctor.git] / tests / inspector.py
1 ##############################################################################
2 # Copyright (c) 2016 NEC Corporation and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 import argparse
11 import collections
12 from flask import Flask
13 from flask import request
14 import json
15 import os
16 import time
17
18 import novaclient.client as novaclient
19
20 import nova_force_down
21
22
23 class DoctorInspectorSample(object):
24
25     nova_api_version = '2.11'
26
27     def __init__(self):
28         self.servers = collections.defaultdict(list)
29         self.nova = novaclient.Client(self.nova_api_version,
30                                       os.environ['OS_USERNAME'],
31                                       os.environ['OS_PASSWORD'],
32                                       os.environ['OS_TENANT_NAME'],
33                                       os.environ['OS_AUTH_URL'],
34                                       connection_pool=True)
35         # check nova is available
36         self.nova.servers.list(detailed=False)
37         self.init_servers_list()
38
39     def init_servers_list(self):
40         opts = {'all_tenants': True}
41         servers=self.nova.servers.list(search_opts=opts)
42         self.servers.clear()
43         for server in servers:
44             try:
45                 host=server.__dict__.get('OS-EXT-SRV-ATTR:host')
46                 self.servers[host].append(server)
47                 app.logger.debug('get hostname=%s from server=%s' % (host, server))
48             except Exception as e:
49                 app.logger.debug('can not get hostname from server=%s' % server)
50
51     def disable_compute_host(self, hostname):
52         for server in self.servers[hostname]:
53             self.nova.servers.reset_state(server, 'error')
54
55         # NOTE: We use our own client here instead of this novaclient for a
56         #       workaround.  Once keystone provides v2.1 nova api endpoint
57         #       in the service catalog which is configured by OpenStack
58         #       installer, we can use this:
59         #
60         # self.nova.services.force_down(hostname, 'nova-compute', True)
61         #
62         nova_force_down.force_down(hostname)
63
64
65 app = Flask(__name__)
66 app.debug = True
67 inspector = DoctorInspectorSample()
68
69
70 @app.route('/events', methods=['POST'])
71 def event_posted():
72     app.logger.debug('event posted at %s' % time.time())
73     app.logger.debug('inspector = %s' % inspector)
74     app.logger.debug('received data = %s' % request.data)
75     d = json.loads(request.data)
76     hostname = d['hostname']
77     event_type = d['type']
78     if event_type == 'compute.host.down':
79         inspector.disable_compute_host(hostname)
80     return "OK"
81
82
83 def get_args():
84     parser = argparse.ArgumentParser(description='Doctor Sample Inspector')
85     parser.add_argument('port', metavar='PORT', type=int, nargs='?',
86                         help='a port for inspector')
87     return parser.parse_args()
88
89
90 def main():
91     args = get_args()
92     app.run(port=args.port)
93
94 if __name__ == '__main__':
95     main()