Pārlūkot izejas kodu

实现宿主机是否在线的判断

James Iter 9 gadi atpakaļ
vecāks
revīzija
5e258e6594
4 mainītis faili ar 44 papildinājumiem un 6 dzēšanām
  1. 26 4
      api/host.py
  2. 1 1
      docs/todo.md
  3. 15 0
      main.py
  4. 2 1
      models/event_processor.py

+ 26 - 4
api/host.py

@@ -3,7 +3,7 @@
 
 
 import json
-from flask import Blueprint, request
+from flask import Blueprint, request, g
 import jimit as ji
 
 from models import Database as db
@@ -30,6 +30,21 @@ blueprints = Blueprint(
 )
 
 
+def alive_check(v):
+    """
+    JimV-C 2 秒更新一次宿主机信息,这里以 5 秒内没收到更新,作为判断宿主机是否在线的标准
+    """
+
+    if 'timestamp' not in v:
+        return v
+
+    v['alive'] = False
+    if v['timestamp'] + 5 >= g.ts:
+        v['alive'] = True
+
+    return v
+
+
 @Utils.dumps2response
 def r_get(ids):
 
@@ -47,12 +62,16 @@ def r_get(ids):
         if -1 == ids.find(','):
             _id = ids
             if db.r.hexists(app.config['hosts_info'], _id):
-                ret['data'] = {_id: json.loads(db.r.hget(app.config['hosts_info'], _id))}
+                v = json.loads(db.r.hget(app.config['hosts_info'], _id))
+                v = alive_check(v)
+                ret['data'] = {_id: v}
 
         else:
             for _id in ids.split(','):
                 if db.r.hexists(app.config['hosts_info'], _id):
-                    ret['data'].append({_id: json.loads(db.r.hget(app.config['hosts_info'], _id))})
+                    v = json.loads(db.r.hget(app.config['hosts_info'], _id))
+                    v = alive_check(v)
+                    ret['data'].append({_id: v})
 
         return ret
 
@@ -68,7 +87,9 @@ def r_get_by_filter():
         ret['state'] = ji.Common.exchange_state(20000)
         ret['data'] = list()
         for k, v in db.r.hgetall(app.config['hosts_info']).items():
-            ret['data'].append({k: json.loads(v)})
+            v = json.loads(v)
+            v = alive_check(v)
+            ret['data'].append({k: v})
 
         return ret
 
@@ -94,6 +115,7 @@ def r_content_search():
         for k, v in db.r.hgetall(app.config['hosts_info']).items():
             v = json.loads(v)
             if -1 != v['hostname'].find(keyword):
+                v = alive_check(v)
                 ret['data'].append({k: v})
 
         return ret

+ 1 - 1
docs/todo.md

@@ -8,7 +8,7 @@
 - [x] 将 Guest 的系统镜像合并到单独的磁盘镜像目录中。即不再为 Guest 的系统镜像单独分配目录
 - [x] os_template 表中 name 改为 path 字段。用 path 指明完整路径
 - [x] 统一 guest_disk 称谓为 disk
-- [ ] 统计活着的宿主机,并提供获取列表的接口,供迁移时选择
+- [x] 统计活着的宿主机,并提供获取列表的接口,供迁移时选择
 - [ ] 加入被动更新 Guest xml 的功能,由宿主机主动推送。具体时机待定
 - [ ] 分离出 API 与 views 出入口,涉及 add_rule 与 route_table
 - [ ] 增加模板镜像上传功能

+ 15 - 0
main.py

@@ -8,6 +8,10 @@ import thread
 import signal
 
 import time
+import jimit as ji
+import json
+
+from flask import g
 
 from models import Utils
 from models.event_processor import EventProcessor
@@ -37,6 +41,17 @@ __contact__ = 'james.iter.cn@gmail.com'
 __copyright__ = '(c) 2017 by James Iter.'
 
 
+@app.before_request
+@Utils.dumps2response
+def r_before_request():
+    try:
+        g.ts = ji.Common.ts()
+
+    except ji.JITError, e:
+        ret = json.loads(e.message)
+        return ret
+
+
 # noinspection PyBroadException
 try:
     db.init_conn_mysql()

+ 2 - 1
models/event_processor.py

@@ -5,6 +5,7 @@
 import json
 import time
 from IPy import IP
+import jimit as ji
 
 from models import Database as db, Config
 from models import Guest
@@ -49,7 +50,7 @@ class EventProcessor(object):
         key = cls.message['message']['node_id']
         value = {
             'hostname': cls.message['host'],
-            'timestamp': cls.message['timestamp']
+            'timestamp': ji.Common.ts()
         }
 
         db.r.hset(app.config['hosts_info'], key=key, value=json.dumps(value, ensure_ascii=False))