Просмотр исходного кода

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

James Iter 7 лет назад
Родитель
Сommit
f85ee37301
4 измененных файлов с 78 добавлено и 2 удалено
  1. 1 0
      docs/todo.md
  2. 40 1
      jimvc/api/guest.py
  3. 1 1
      jimvc/models/utils.py
  4. 36 0
      misc/v0.6_to_v0.7/upgrade.sh

+ 1 - 0
docs/todo.md

@@ -98,5 +98,6 @@
 - [ ] 大于 内存、负载 百分比后,禁止创建虚拟机
 - [ ] 大于 内存、负载 百分比后,禁止创建虚拟机
 - [x] 考虑用 /etc/machine-id 替换 node_id
 - [x] 考虑用 /etc/machine-id 替换 node_id
 - [ ] 邮局设置从配置文件提取到JimV系统配置中
 - [ ] 邮局设置从配置文件提取到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.api.base import Base
 from jimvc.models.initialize import dev_table
 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 DiskState, Host
 from jimvc.models import Database as db
 from jimvc.models import Database as db
 from jimvc.models import Config
 from jimvc.models import Config
@@ -833,6 +833,14 @@ def r_get(uuids):
         row['url'] = url_for('v_ssh_keys.show')
         row['url'] = url_for('v_ssh_keys.show')
         ssh_key_id_mapping[row['id']] = row
         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 -1 == uuids.find(','):
         if 'ssh_keys' not in ret['data']:
         if 'ssh_keys' not in ret['data']:
             ret['data']['ssh_keys'] = list()
             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])
                 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:
     else:
         for i, guest in enumerate(ret['data']):
         for i, guest in enumerate(ret['data']):
             if 'ssh_keys' not in ret['data'][i]:
             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])
                     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
     return ret
 
 
 
 
@@ -902,6 +916,14 @@ def r_get_by_filter():
 
 
         snapshots_guest_uuid_mapping[guest_uuid].append(row)
         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']):
     for i, guest in enumerate(ret['data']):
 
 
         guest_uuid = ret['data'][i]['uuid']
         guest_uuid = ret['data'][i]['uuid']
@@ -933,6 +955,9 @@ def r_get_by_filter():
                 else:
                 else:
                     ret['data'][i]['snapshot']['creatable'] = False
                     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
     return ret
 
 
 
 
@@ -977,6 +1002,14 @@ def r_content_search():
 
 
         snapshots_guest_uuid_mapping[guest_uuid].append(row)
         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']):
     for i, guest in enumerate(ret['data']):
 
 
         guest_uuid = ret['data'][i]['uuid']
         guest_uuid = ret['data'][i]['uuid']
@@ -1008,6 +1041,9 @@ def r_content_search():
                 else:
                 else:
                     ret['data'][i]['snapshot']['creatable'] = False
                     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
     return ret
 
 
 
 
@@ -1471,6 +1507,9 @@ def r_detail(uuid):
     disks_ret = requests.get(url=disks_url, cookies=request.cookies)
     disks_ret = requests.get(url=disks_url, cookies=request.cookies)
     disks = json.loads(disks_ret.content)['data']
     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 = Config()
     config.id = 1
     config.id = 1
     config.get()
     config.get()

+ 1 - 1
jimvc/models/utils.py

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