Sfoglia il codice sorgente

实现刷新 虚拟机 状态的接口

James Iter 8 anni fa
parent
commit
d7566ac8f3
8 ha cambiato i file con 68 aggiunte e 28 eliminazioni
  1. 25 0
      api/guest.py
  2. 1 0
      api_route_table.py
  3. 4 4
      docs/todo.md
  4. 1 0
      misc/init.sql
  5. 7 0
      models/event_processor.py
  6. 12 11
      models/status.py
  7. 6 1
      models/utils.py
  8. 12 12
      templates/guests_show.html

+ 25 - 0
api/guest.py

@@ -1261,3 +1261,28 @@ def r_adjust_ability(uuids, cpu, memory):
     except ji.PreviewingError, e:
         return json.loads(e.message)
 
+
+@Utils.dumps2response
+def r_refresh_guest_state():
+    try:
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+
+        # 取全部活着的 hosts
+        available_hosts = Host.get_available_hosts(nonrandom=None)
+
+        if available_hosts.__len__() == 0:
+            ret['state'] = ji.Common.exchange_state(50351)
+            return ret
+
+        for host in available_hosts:
+            message = {
+                '_object': 'global',
+                'action': 'refresh_guest_state',
+                'node_id': host['node_id']
+            }
+
+            Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)

+ 1 - 0
api_route_table.py

@@ -113,6 +113,7 @@ add_rule_api(guest.blueprints, '/_adjust_ability/<uuids>/<cpu>/<memory>', api_fu
              methods=['PUT'])
 
 add_rule_api(guest.blueprints, '/_distribute_count', api_func='guest.r_distribute_count', methods=['GET'])
+add_rule_api(guest.blueprints, '/_refresh_guest_state', api_func='guest.r_refresh_guest_state', methods=['PATCH'])
 
 # Disk操作
 add_rule_api(disk.blueprint, '', api_func='disk.r_create', methods=['POST'])

+ 4 - 4
docs/todo.md

@@ -78,16 +78,16 @@
 - [ ] 忽略 guestfs- 为首的日志
 - [ ] 周期轮询试的同步虚拟机状态
 - [ ] 实现类似于VMware的故障转移功能
-- [ ] 实现变配功能
+- [x] 实现变配功能
 - [ ] 迁移中的虚拟机,不允许做任何操作
-- [ ] 通过 QemuGuestAgent 实现 Guest 的内存使用率监控
+- [x] 通过 QemuGuestAgent 实现 Guest 的内存使用率监控
 - [ ] 实现通过 JimV-C 修改主机名(当前为备注的地方),同步到具体 Guest 上
 - [ ] 修正创建虚拟机时,VNC 端口不够用时的 bug。创建失败时,需要返还对应的 IP 与 VNC 端口资源
 - [ ] 修复在大磁盘虚拟机创建快照时,等待时间过长的问题
 - [ ] IP 地址池管理功能。对 IP 池中的 IP 有查看、添加、禁用、解禁等功能
 - [x] 安装脚本加入中国本土仓库
 - [ ] 对某个 Guest 进行快照操作时,禁止对该镜像做其它快照方面的操作
-- [ ] 修复宿主机重启后,jimvc 快速 lpop 异常的问题
-- [ ] 计算节点以 JimV-C 为第一 NTP 服务器
+- [x] 修复JimV-C 先 Redis 启动后,JimV-C event_processor Redis lpop 异常的问题
+- [x] 计算节点以 JimV-C 为第一 NTP 服务器
 - [ ] 数据库时间戳,采用 JimV-N 的时间。避免 JimV-C 挂掉后,监控数据批量集中在同一个时间点上
 

+ 1 - 0
misc/init.sql

@@ -35,6 +35,7 @@ CREATE TABLE IF NOT EXISTS guest(
     os_template_image_id BIGINT UNSIGNED NOT NULL,
     create_time BIGINT UNSIGNED NOT NULL,
     -- 运行时的状态用 status;
+    -- state倾向于condition,是一种延续性的状态。status常用于描述一个过程中的某阶段
     status TINYINT UNSIGNED NOT NULL DEFAULT 0,
     progress TINYINT UNSIGNED NOT NULL DEFAULT 0,
     node_id BIGINT UNSIGNED NOT NULL,

+ 7 - 0
models/event_processor.py

@@ -484,6 +484,13 @@ class EventProcessor(object):
                 else:
                     pass
 
+            except AttributeError as e:
+                logger.error(traceback.format_exc())
+                time.sleep(1)
+
+                if db.r is None:
+                    db.init_conn_redis()
+
             except Exception as e:
                 logger.error(traceback.format_exc())
                 time.sleep(1)

+ 12 - 11
models/status.py

@@ -37,17 +37,18 @@ class GuestState(IntEnum):
     # http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/libvirt_application_development_guide_using_python-Guest_Domains-Information-State.html
 
     no_state = 0
-    running = 1
-    blocked = 2
-    paused = 3
-    shutdown = 4
-    shutoff = 5
-    crashed = 6
-    pm_suspended = 7
-    migrating = 8
-    update = 9
-    creating = 10
-    snapshot_converting = 11
+    booting = 1
+    running = 2
+    blocked = 3
+    paused = 4
+    shutdown = 5
+    shutoff = 6
+    crashed = 7
+    pm_suspended = 8
+    migrating = 9
+    update = 10
+    creating = 11
+    snapshot_converting = 12
     dirty = 255
 
 

+ 6 - 1
models/utils.py

@@ -167,7 +167,12 @@ def utility_processor():
         icon = 'glyph-icon icon-bolt'
         desc = '未知状态'
 
-        if _status == GuestState.running.value:
+        if _status == GuestState.booting.value:
+            color = '00BBBB'
+            icon = 'glyph-icon icon-circle'
+            desc = '启动中'
+
+        elif _status == GuestState.running.value:
             color = '00BB00'
             icon = 'glyph-icon icon-circle'
             desc = '运行中'

+ 12 - 12
templates/guests_show.html

@@ -900,35 +900,35 @@
                                 更多
                             </a>
                             <ul class="dropdown-menu">
-                                <li class="{% if item.status not in [4, 5, 6] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [5, 6, 7] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#boot_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#boot_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
                                        启动
                                     </a>
                                 </li>
-                                <li class="{% if item.status not in [1] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [2] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#reboot_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#reboot_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
                                        重启
                                     </a>
                                 </li>
-                                <li class="{% if item.status not in [1] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [2] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#force_reboot_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#force_reboot_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
                                        强制重启
                                     </a>
                                 </li>
-                                <li class="{% if item.status not in [1] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [2] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#shutdown_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#shutdown_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
                                        停止
                                     </a>
                                 </li>
-                                <li class="{% if item.status not in [1] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [2] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#force_shutdown_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#force_shutdown_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
@@ -945,14 +945,14 @@
                                     </a>
                                 </li>
                                 <li class="divider"></li>
-                                <li class="{% if item.status not in [1] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [2] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#suspend_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#suspend_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
                                        暂停
                                     </a>
                                 </li>
-                                <li class="{% if item.status not in [3] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [4] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#resume_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#resume_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
@@ -960,7 +960,7 @@
                                     </a>
                                 </li>
                                 <li class="divider"></li>
-                                <li class="{% if item.status not in [1] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [1, 2] %} disabled {% endif %}">
                                     <a href="/guest/vnc/{{ item.uuid }}" target="_blank">远程连接</a>
                                 </li>
                                 <li class="divider"></li>
@@ -971,27 +971,27 @@
                                        分配带宽
                                     </a>
                                 </li>
-                                <li class="{% if item.status not in [5] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [6] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#adjust_ability_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#adjust_ability_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
                                        变更配置
                                     </a>
                                 <li class="divider"></li>
-                                <li class="{% if item.status not in [1] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [2] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#reset_password_modal"
                                        onclick="$('#reset_password_type').val('single')">
                                         密码重置
                                     </a>
                                 </li>
-                                <li class="{% if item.status not in [1, 3, 4, 5, 6] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [2, 4, 5, 6, 7] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#migrate_modal"
                                        onclick="$('#migrate_type').val('single')">
                                         迁移到
                                     </a>
                                 </li>
                                 <li class="divider"></li>
-                                <li class="{% if item.status not in [4, 5, 6, 255] %} disabled {% endif %}">
+                                <li class="{% if item.status not in [5, 6, 7, 255] %} disabled {% endif %}">
                                     <a href="javascript:;" data-toggle="modal" data-target="#delete_modal"
                                        onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
                                                 $('#delete_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">