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

初步实现,依照计算节点CPU指令集,来判断分配给虚拟机 VMM 类型

James Iter 8 лет назад
Родитель
Сommit
d5362537df
5 измененных файлов с 30 добавлено и 13 удалено
  1. 1 1
      README.md
  2. 4 3
      api/guest.py
  3. 2 1
      docs/todo.md
  4. 1 0
      models/event_processor.py
  5. 22 8
      models/guest_xml.py

+ 1 - 1
README.md

@@ -65,6 +65,7 @@ JimV 是一个,结构清晰简单,易于部署、维护、使用的,低门
 |SSH 公钥管理、在线注入功能|✓|
 |SSH 公钥管理、在线注入功能|✓|
 |基于 Guest 实例的快照|✓|
 |基于 Guest 实例的快照|✓|
 |从快照磁盘创建模板镜像|✓|
 |从快照磁盘创建模板镜像|✓|
+|网络流量限额|✓|
 
 
 
 
 ## 未来计划
 ## 未来计划
@@ -73,7 +74,6 @@ JimV 是一个,结构清晰简单,易于部署、维护、使用的,低门
 >* 增加 Guest 变配功能
 >* 增加 Guest 变配功能
 >* 增加过期 Guest 自动回收机制
 >* 增加过期 Guest 自动回收机制
 >* 增加模板上传功能
 >* 增加模板上传功能
->* 增加网络流量限额管理功能
 >* 增加 tag 功能
 >* 增加 tag 功能
 >* 增加替换 IP 功能
 >* 增加替换 IP 功能
 >* 增加对 Ceph 的支持
 >* 增加对 Ceph 的支持

+ 4 - 3
api/guest.py

@@ -194,13 +194,14 @@ def r_create():
             disk.quota(config=config)
             disk.quota(config=config)
             disk.create()
             disk.create()
 
 
-            guest_xml = GuestXML(guest=guest, disk=disk, config=config, os_type=os_template_profile.os_type)
-            guest.xml = guest_xml.get_domain()
-
             # 在可用计算节点中平均分配任务
             # 在可用计算节点中平均分配任务
             chosen_host = available_hosts[quantity % available_hosts.__len__()]
             chosen_host = available_hosts[quantity % available_hosts.__len__()]
             guest.node_id = chosen_host['node_id']
             guest.node_id = chosen_host['node_id']
 
 
+            guest_xml = GuestXML(host=chosen_host, guest=guest, disk=disk, config=config,
+                                 os_type=os_template_profile.os_type)
+            guest.xml = guest_xml.get_domain()
+
             if node_id is not None:
             if node_id is not None:
                 guest.node_id = node_id
                 guest.node_id = node_id
 
 

+ 2 - 1
docs/todo.md

@@ -53,6 +53,7 @@
 - [x] 计算机节点加入是否接受自动分配虚拟机开关
 - [x] 计算机节点加入是否接受自动分配虚拟机开关
 - [x] 取消单独的初始化密码操作,合并入具体的操作系统初始化操作中
 - [x] 取消单独的初始化密码操作,合并入具体的操作系统初始化操作中
 - [x] 修复 Guest 对模板对象的依赖。bug 表现为,当依赖的模板项被删除后,虚拟机实例列表会出现 500 错误
 - [x] 修复 Guest 对模板对象的依赖。bug 表现为,当依赖的模板项被删除后,虚拟机实例列表会出现 500 错误
+- [x] 实现网络流量限速
 - [ ] 考虑开辟一个单独的消息处理线程。所有业务消息都塞到进程中的队列内,由该线程统一处理。这样可以更好的处理数据库重连问题。
 - [ ] 考虑开辟一个单独的消息处理线程。所有业务消息都塞到进程中的队列内,由该线程统一处理。这样可以更好的处理数据库重连问题。
 - [ ] 实现 CentOS 7 单机版一建安装脚本(包括全新的数据库安装、配置、部署)
 - [ ] 实现 CentOS 7 单机版一建安装脚本(包括全新的数据库安装、配置、部署)
 - [ ] 实现磁盘联动机制。即当删除宿主机时,相随的所有磁盘一并删除
 - [ ] 实现磁盘联动机制。即当删除宿主机时,相随的所有磁盘一并删除
@@ -76,7 +77,6 @@
 - [ ] 忽略 guestfs- 为首的日志
 - [ ] 忽略 guestfs- 为首的日志
 - [ ] 周期轮询试的同步虚拟机状态
 - [ ] 周期轮询试的同步虚拟机状态
 - [ ] 实现类似于VMware的故障转移功能
 - [ ] 实现类似于VMware的故障转移功能
-- [x] 实现网络流量限速
 - [ ] 实现变配功能
 - [ ] 实现变配功能
 - [ ] 迁移中的虚拟机,不允许做任何操作
 - [ ] 迁移中的虚拟机,不允许做任何操作
 - [ ] 通过 QemuGuestAgent 实现 Guest 的内存使用率监控
 - [ ] 通过 QemuGuestAgent 实现 Guest 的内存使用率监控
@@ -84,4 +84,5 @@
 - [ ] 修正创建虚拟机时,VNC 端口不够用时的 bug。创建失败时,需要返还对应的 IP 与 VNC 端口资源
 - [ ] 修正创建虚拟机时,VNC 端口不够用时的 bug。创建失败时,需要返还对应的 IP 与 VNC 端口资源
 - [ ] 根据计算节点 CPU 是否支持 VT-X,来确定虚拟机是使用 KVM 还是 QEMU
 - [ ] 根据计算节点 CPU 是否支持 VT-X,来确定虚拟机是使用 KVM 还是 QEMU
 - [ ] 修复在大磁盘虚拟机创建快照时,等待时间过长的问题
 - [ ] 修复在大磁盘虚拟机创建快照时,等待时间过长的问题
+- [ ] IP 地址池管理功能。对 IP 池中的 IP 有查看、添加、禁用、解禁等功能
 
 

+ 1 - 0
models/event_processor.py

@@ -134,6 +134,7 @@ class EventProcessor(object):
         value = {
         value = {
             'hostname': cls.message['host'],
             'hostname': cls.message['host'],
             'cpu': cls.message['message']['cpu'],
             'cpu': cls.message['message']['cpu'],
+            'cpuinfo': cls.message['message'].get('cpuinfo'),
             'system_load': cls.message['message']['system_load'],
             'system_load': cls.message['message']['system_load'],
             'memory': cls.message['message']['memory'],
             'memory': cls.message['message']['memory'],
             'memory_available': cls.message['message']['memory_available'],
             'memory_available': cls.message['message']['memory_available'],

+ 22 - 8
models/guest_xml.py

@@ -15,11 +15,12 @@ __copyright__ = '(c) 2017 by James Iter.'
 
 
 class GuestXML(object):
 class GuestXML(object):
 
 
-    def __init__(self, guest=None, disk=None, config=None, os_type=None):
+    def __init__(self, host=None, guest=None, disk=None, config=None, os_type=None):
         assert isinstance(guest, Guest)
         assert isinstance(guest, Guest)
         assert isinstance(disk, Disk)
         assert isinstance(disk, Disk)
         assert isinstance(config, Config)
         assert isinstance(config, Config)
 
 
+        self.host = host
         self.guest = guest
         self.guest = guest
         self.disk = disk
         self.disk = disk
         self.config = config
         self.config = config
@@ -27,8 +28,7 @@ class GuestXML(object):
 
 
     def get_domain(self):
     def get_domain(self):
         return """<?xml version="1.0" encoding="utf-8"?>
         return """<?xml version="1.0" encoding="utf-8"?>
-            <domain type="kvm">
-            {0}
+            <domain type="{0}">
             {1}
             {1}
             {2}
             {2}
             {3}
             {3}
@@ -37,9 +37,19 @@ class GuestXML(object):
             {6}
             {6}
             {7}
             {7}
             {8}
             {8}
+            {9}
             </domain>
             </domain>
-        """.format(self.get_features(), self.get_cpu_mode(), self.get_clock(), self.get_name(), self.get_uuid(),
-                   self.get_vcpu(), self.get_memory(), self.get_os(), self.get_devices())
+        """.format(self.get_hypervisor(), self.get_features(), self.get_cpu_mode(), self.get_clock(), self.get_name(),
+                   self.get_uuid(), self.get_vcpu(), self.get_memory(), self.get_os(), self.get_devices())
+
+    def get_hypervisor(self):
+        hypervisor = 'qemu'
+
+        if self.host.cpuinfo is not None and 'flags' in self.host.cpuinfo:
+            if 'vmx' in self.host.cpuinfo['flags'] or 'svm' in self.host.cpuinfo['flags']:
+                hypervisor = 'kvm'
+
+        return hypervisor
 
 
     @staticmethod
     @staticmethod
     def get_features():
     def get_features():
@@ -50,9 +60,13 @@ class GuestXML(object):
             </features>
             </features>
         """
         """
 
 
-    @staticmethod
-    def get_cpu_mode():
-        return """<cpu mode='host-passthrough'/>"""
+    def get_cpu_mode(self):
+        cpu_mode = """"""
+
+        if 'kvm' == self.get_hypervisor():
+            cpu_mode = """<cpu mode='host-passthrough'/>"""
+
+        return cpu_mode
 
 
     def get_clock(self):
     def get_clock(self):
         # clock 参考链接:https://libvirt.org/formatdomain.html#elementsTime
         # clock 参考链接:https://libvirt.org/formatdomain.html#elementsTime