Эх сурвалжийг харах

当所在计算节点离线时,变更虚拟机的状态为未知状态。

James Iter 7 жил өмнө
parent
commit
f85ee37301

+ 1 - 0
docs/todo.md

@@ -98,5 +98,6 @@
 - [ ] 大于 内存、负载 百分比后,禁止创建虚拟机
 - [x] 考虑用 /etc/machine-id 替换 node_id
 - [ ] 邮局设置从配置文件提取到JimV系统配置中
+- [ ] 当计算节点失联后,相应的虚拟机状态标识为"未知"状态
 
 

+ 40 - 1
jimvc/api/guest.py

@@ -16,7 +16,7 @@ from flask import Blueprint, url_for, request
 
 from jimvc.api.base import Base
 from jimvc.models.initialize import dev_table
-from jimvc.models import app_config
+from jimvc.models import app_config, GuestState
 from jimvc.models import DiskState, Host
 from jimvc.models import Database as db
 from jimvc.models import Config
@@ -833,6 +833,14 @@ def r_get(uuids):
         row['url'] = url_for('v_ssh_keys.show')
         ssh_key_id_mapping[row['id']] = row
 
+    hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
+    hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
+    hosts_ret = json.loads(hosts_ret.content)
+
+    hosts_mapping_by_node_id = dict()
+    for host in hosts_ret['data']:
+        hosts_mapping_by_node_id[int(host['node_id'])] = host
+
     if -1 == uuids.find(','):
         if 'ssh_keys' not in ret['data']:
             ret['data']['ssh_keys'] = list()
@@ -845,6 +853,9 @@ def r_get(uuids):
 
                 ret['data']['ssh_keys'].append(ssh_key_id_mapping[ssh_key_id])
 
+            if not hosts_mapping_by_node_id[ret['data']['node_id']]['alive']:
+                ret['data']['status'] = GuestState.no_state.value
+
     else:
         for i, guest in enumerate(ret['data']):
             if 'ssh_keys' not in ret['data'][i]:
@@ -858,6 +869,9 @@ def r_get(uuids):
 
                     ret['data'][i]['ssh_keys'].append(ssh_key_id_mapping[ssh_key_id])
 
+            if not hosts_mapping_by_node_id[ret['data'][i]['node_id']]['alive']:
+                ret['data'][i]['status'] = GuestState.no_state.value
+
     return ret
 
 
@@ -902,6 +916,14 @@ def r_get_by_filter():
 
         snapshots_guest_uuid_mapping[guest_uuid].append(row)
 
+    hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
+    hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
+    hosts_ret = json.loads(hosts_ret.content)
+
+    hosts_mapping_by_node_id = dict()
+    for host in hosts_ret['data']:
+        hosts_mapping_by_node_id[int(host['node_id'])] = host
+
     for i, guest in enumerate(ret['data']):
 
         guest_uuid = ret['data'][i]['uuid']
@@ -933,6 +955,9 @@ def r_get_by_filter():
                 else:
                     ret['data'][i]['snapshot']['creatable'] = False
 
+        if not hosts_mapping_by_node_id[ret['data'][i]['node_id']]['alive']:
+            ret['data'][i]['status'] = GuestState.no_state.value
+
     return ret
 
 
@@ -977,6 +1002,14 @@ def r_content_search():
 
         snapshots_guest_uuid_mapping[guest_uuid].append(row)
 
+    hosts_url = url_for('api_hosts.r_get_by_filter', _external=True)
+    hosts_ret = requests.get(url=hosts_url, cookies=request.cookies)
+    hosts_ret = json.loads(hosts_ret.content)
+
+    hosts_mapping_by_node_id = dict()
+    for host in hosts_ret['data']:
+        hosts_mapping_by_node_id[int(host['node_id'])] = host
+
     for i, guest in enumerate(ret['data']):
 
         guest_uuid = ret['data'][i]['uuid']
@@ -1008,6 +1041,9 @@ def r_content_search():
                 else:
                     ret['data'][i]['snapshot']['creatable'] = False
 
+        if not hosts_mapping_by_node_id[ret['data'][i]['node_id']]['alive']:
+            ret['data'][i]['status'] = GuestState.no_state.value
+
     return ret
 
 
@@ -1471,6 +1507,9 @@ def r_detail(uuid):
     disks_ret = requests.get(url=disks_url, cookies=request.cookies)
     disks = json.loads(disks_ret.content)['data']
 
+    if not hosts_mapping_by_node_id[guest.node_id]['alive']:
+        guest.status = GuestState.no_state.value
+
     config = Config()
     config.id = 1
     config.get()

+ 1 - 1
jimvc/models/utils.py

@@ -190,7 +190,7 @@ def utility_processor():
             icon = 'glyph-icon icon-circle'
             desc = '运行中'
 
-        elif _status in [GuestState.no_state.value, GuestState.creating.value]:
+        elif _status == GuestState.creating.value:
             color = 'FFC543'
             icon = 'glyph-icon icon-spinner'
             desc = ' '.join(['创建中', str(progress) + '%'])

+ 36 - 0
misc/v0.6_to_v0.7/upgrade.sh

@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+export PYPI='https://mirrors.aliyun.com/pypi/simple/'
+export JIMVC_PATH='/usr/local/JimV-C'
+export JIMVC_DOWNLOAD_URL='https://github.com/jamesiter/JimV-C/archive/master.tar.gz'
+
+mkdir -p ${JIMVC_PATH}
+curl -sL ${JIMVC_DOWNLOAD_URL} | tar -zxf - --strip-components 1 -C ${JIMVC_PATH}
+
+mkdir -p ~/.pip
+cat > ~/.pip/pip.conf << EOF
+[global]
+index-url = ${PYPI}
+EOF
+
+# 创建 python 虚拟环境
+virtualenv --system-site-packages /usr/local/venv-jimv
+
+# 导入 python 虚拟环境
+source /usr/local/venv-jimv/bin/activate
+
+# 自动导入 python 虚拟环境
+echo '. /usr/local/venv-jimv/bin/activate' >> .bashrc
+
+# 安装 JimV-C 所需扩展库
+grep -v "^#" ${JIMVC_PATH}/requirements.txt | xargs -n 1 pip install -i ${PYPI}
+
+cp -v /usr/local/JimV-C/misc/jimvc.service /etc/systemd/system/jimvc.service
+systemctl daemon-reload
+
+systemctl start jimvc.service
+systemctl enable jimvc.service
+
+systemctl status jimvc.service -l
+
+