Sfoglia il codice sorgente

实现创建、强制重启、启动虚拟机,及挂载磁盘等时刻,传递磁盘性能限额信息到 JimV-N。

James Iter 8 anni fa
parent
commit
b012854386
3 ha cambiato i file con 38 aggiunte e 24 eliminazioni
  1. 1 21
      api/disk.py
  2. 12 3
      api/guest.py
  3. 25 0
      models/guest.py

+ 1 - 21
api/disk.py

@@ -82,28 +82,8 @@ def r_create():
             disk.on_host = on_host
             disk.sequence = -1
             disk.format = 'qcow2'
-
-            disk.iops = config.iops_base + config.iops_pre_unit * disk.size
-
-            if disk.iops > config.iops_cap:
-                disk.iops = config.iops_cap
-
-            disk.iops_max = config.iops_max
-            disk.iops_max_length = config.iops_max_length
-            disk.iops_rd = 0
-            disk.iops_wr = 0
-
-            disk.bps = config.bps_base + config.bps_pre_unit * disk.size
-
-            if disk.bps > config.bps_cap:
-                disk.bps = config.bps_cap
-
-            disk.bps_max = config.bps_max
-            disk.bps_max_length = config.bps_max_length
-            disk.bps_rd = 0
-            disk.bps_wr = 0
-
             disk.path = config.storage_path + '/' + disk.uuid + '.' + disk.format
+            disk.quota(config=config)
 
             message = {
                 '_object': 'disk',

+ 12 - 3
api/guest.py

@@ -130,6 +130,7 @@ def r_create():
             disk.size = 0
             disk.path = config.storage_path + '/' + disk.uuid + '.' + disk.format
             disk.guest_uuid = ''
+            disk.quota(config=config)
             disk.create()
 
             guest_xml = GuestXML(guest=guest, disk=disk, config=config, os_type=os_template.os_type)
@@ -171,6 +172,8 @@ def r_create():
                 'template_path': os_template.path,
                 'os_type': os_template.os_type,
                 'disk': disk.__dict__,
+                # disk 将被废弃,由 disks 代替,暂时保留它的目的,是为了保持与 JimV-N 的兼容性
+                'disks': [disk.__dict__],
                 'xml': guest_xml.get_domain(),
                 'boot_jobs': _boot_jobs,
                 'passback_parameters': {'boot_jobs_id': boot_jobs_id}
@@ -238,12 +241,14 @@ def r_force_reboot(uuids):
         for uuid in uuids.split(','):
             guest.uuid = uuid
             guest.get_by('uuid')
+            disks = Disk.get_by_filter(filter_str=':'.join(['guest_uuid', 'eq', guest.uuid]))
 
             message = {
                 '_object': 'guest',
                 'action': 'force_reboot',
                 'uuid': uuid,
-                'hostname': guest.on_host
+                'hostname': guest.on_host,
+                'disks': disks
             }
 
             Guest.emit_instruction(message=json.dumps(message))
@@ -377,13 +382,16 @@ def r_boot(uuids):
                     replace('{DNS1}', config.dns1). \
                     replace('{DNS2}', config.dns2)
 
+            disks = Disk.get_by_filter(filter_str=':'.join(['guest_uuid', 'eq', guest.uuid]))
+
             message = {
                 '_object': 'guest',
                 'action': 'boot',
                 'uuid': uuid,
                 'boot_jobs': boot_jobs,
                 'hostname': guest.on_host,
-                'passback_parameters': {'boot_jobs_id': boot_jobs_id}
+                'passback_parameters': {'boot_jobs_id': boot_jobs_id},
+                'disks': disks
             }
 
             Guest.emit_instruction(message=json.dumps(message))
@@ -589,7 +597,8 @@ def r_attach_disk(uuid, disk_uuid):
             'uuid': uuid,
             'hostname': guest.on_host,
             'xml': guest_xml.get_disk(),
-            'passback_parameters': {'disk_uuid': disk.uuid, 'sequence': disk.sequence}
+            'passback_parameters': {'disk_uuid': disk.uuid, 'sequence': disk.sequence},
+            'disks': [disk.__dict__]
         }
 
         Guest.emit_instruction(message=json.dumps(message))

+ 25 - 0
models/guest.py

@@ -169,6 +169,31 @@ class Disk(ORM):
         self.bps_max = 0
         self.bps_max_length = 0
 
+    def quota(self, config=None):
+
+        from models import Config
+        assert isinstance(config, Config)
+
+        self.iops = config.iops_base + config.iops_pre_unit * self.size
+
+        if self.iops > config.iops_cap:
+            self.iops = config.iops_cap
+
+        self.iops_max = config.iops_max
+        self.iops_max_length = config.iops_max_length
+        self.iops_rd = 0
+        self.iops_wr = 0
+
+        self.bps = config.bps_base + config.bps_pre_unit * self.size
+
+        if self.bps > config.bps_cap:
+            self.bps = config.bps_cap
+
+        self.bps_max = config.bps_max
+        self.bps_max_length = config.bps_max_length
+        self.bps_rd = 0
+        self.bps_wr = 0
+
     @staticmethod
     def get_filter_keywords():
         return {