cache host-vm list when inspect start to run 77/20877/8
authordongwenjuan <dong.wenjuan@zte.com.cn>
Mon, 12 Sep 2016 08:57:57 +0000 (16:57 +0800)
committerdongwenjuan <dong.wenjuan@zte.com.cn>
Tue, 20 Sep 2016 05:43:50 +0000 (13:43 +0800)
As getting servers list under all tenants in specify host takes most
of the time when inspector handling the host failure event, cache the
host-vms list when inspector start run to improve the performance.

add receive event time in inspector

Change-Id: I5fca2816ae9a176be4791bf5dbe26b1c30e743c5
Signed-off-by: dongwenjuan <dong.wenjuan@zte.com.cn>
tests/inspector.py

index c8fb00f..6261415 100644 (file)
@@ -8,10 +8,12 @@
 ##############################################################################
 
 import argparse
+import collections
 from flask import Flask
 from flask import request
 import json
 import os
+import time
 
 import novaclient.client as novaclient
 
@@ -23,6 +25,7 @@ class DoctorInspectorSample(object):
     nova_api_version = '2.11'
 
     def __init__(self):
+        self.servers = collections.defaultdict(list)
         self.nova = novaclient.Client(self.nova_api_version,
                                       os.environ['OS_USERNAME'],
                                       os.environ['OS_PASSWORD'],
@@ -31,10 +34,22 @@ class DoctorInspectorSample(object):
                                       connection_pool=True)
         # check nova is available
         self.nova.servers.list(detailed=False)
+        self.init_servers_list()
+
+    def init_servers_list(self):
+        opts = {'all_tenants': True}
+        servers=self.nova.servers.list(search_opts=opts)
+        self.servers.clear()
+        for server in servers:
+            try:
+                host=server.__dict__.get('OS-EXT-SRV-ATTR:host')
+                self.servers[host].append(server)
+                app.logger.debug('get hostname=%s from server=%s' % (host, server))
+            except Exception as e:
+                app.logger.debug('can not get hostname from server=%s' % server)
 
     def disable_compute_host(self, hostname):
-        opts = {'all_tenants': True, 'host': hostname}
-        for server in self.nova.servers.list(detailed=False, search_opts=opts):
+        for server in self.servers[hostname]:
             self.nova.servers.reset_state(server, 'error')
 
         # NOTE: We use our own client here instead of this novaclient for a
@@ -48,12 +63,13 @@ class DoctorInspectorSample(object):
 
 
 app = Flask(__name__)
+app.debug = True
 inspector = DoctorInspectorSample()
 
 
 @app.route('/events', methods=['POST'])
 def event_posted():
-    app.logger.debug('event posted')
+    app.logger.debug('event posted at %s' % time.time())
     app.logger.debug('inspector = %s' % inspector)
     app.logger.debug('received data = %s' % request.data)
     d = json.loads(request.data)
@@ -73,8 +89,7 @@ def get_args():
 
 def main():
     args = get_args()
-    app.run(port=args.port, debug=True)
-
+    app.run(port=args.port)
 
 if __name__ == '__main__':
     main()