James Iter 9 лет назад
Родитель
Сommit
87ef7571d4
3 измененных файлов с 46 добавлено и 19 удалено
  1. 37 0
      models/event_processor.py
  2. 1 4
      views/disk.py
  3. 8 15
      views/guest.py

+ 37 - 0
models/event_processor.py

@@ -55,6 +55,15 @@ class EventProcessor(object):
                 cls.guest.status = GuestState.dirty.value
                 cls.guest.update()
 
+        elif action == 'migrate':
+            pass
+
+        elif action == 'delete':
+            if state == ResponseState.success.value:
+                cls.guest.uuid = uuid
+                cls.guest.get_by('uuid')
+                cls.guest.delete()
+
         elif action == 'create_disk':
             cls.disk.uuid = uuid
             cls.disk.get_by('uuid')
@@ -66,6 +75,34 @@ class EventProcessor(object):
 
             cls.disk.update()
 
+        elif action == 'resize_disk':
+            if state == ResponseState.success.value:
+                cls.disk.uuid = uuid
+                cls.disk.get_by('uuid')
+                cls.disk.size = cls.message['message']['passback_parameters']['size']
+                cls.disk.update()
+
+        elif action == 'attach_disk':
+            cls.disk.uuid = cls.message['message']['passback_parameters']['disk_uuid']
+            cls.disk.get_by('uuid')
+            if state == ResponseState.success.value:
+                cls.disk.guest_uuid = uuid
+                cls.disk.sequence = cls.message['message']['passback_parameters']['sequence']
+                cls.disk.state = DiskState.mounted.value
+                cls.disk.update()
+
+        elif action == 'detach_disk':
+            cls.disk.uuid = cls.message['message']['passback_parameters']['disk_uuid']
+            cls.disk.get_by('uuid')
+            if state == ResponseState.success.value:
+                cls.disk.guest_uuid = ''
+                cls.disk.sequence = -1
+                cls.disk.state = DiskState.idle.value
+                cls.disk.update()
+
+        elif action == 'delete_disk':
+            pass
+
         else:
             pass
 

+ 1 - 4
views/disk.py

@@ -108,11 +108,8 @@ def r_resize(uuid, size):
             ret['state'] = ji.Common.exchange_state(41257)
             return ret
 
-        guest_disk.size = size
-        guest_disk.update()
-
         message = {'action': 'resize_disk', 'size': size, 'guest_uuid': guest_disk.guest_uuid,
-                   'disk_uuid': guest_disk.uuid}
+                   'disk_uuid': guest_disk.uuid, 'passback_parameters': {'size': size}}
 
         if used:
             message['device_node'] = dev_table[guest_disk.sequence]

+ 8 - 15
views/guest.py

@@ -9,6 +9,7 @@ import json
 from uuid import uuid4
 import jimit as ji
 
+from models import DiskState
 from models import OSInitWrite
 from models.initialize import app, dev_table
 from models import Database as db
@@ -353,10 +354,6 @@ def r_delete(uuids):
 
         # 执行删除操作
         for uuid in uuids.split(','):
-            guest.uuid = uuid
-            guest.get_by('uuid')
-            # TODO: 删除数据库记录,考虑由 JimV-N 通知执行成功之后再删除
-            guest.delete()
             message = {'action': 'delete', 'uuid': uuid}
             Guest.emit_instruction(message=json.dumps(message))
 
@@ -409,8 +406,6 @@ def r_attach_disk(uuid, disk_uuid):
         config.id = 1
         config.get()
 
-        guest_disk.update()
-
         xml = """
             <disk type='network' device='disk'>
                 <driver name='qemu' type='qcow2' cache='none'/>
@@ -422,7 +417,8 @@ def r_attach_disk(uuid, disk_uuid):
         """.format(config.glusterfs_volume, guest_disk.uuid, guest_disk.format,
                    dev_table[guest_disk.sequence])
 
-        message = {'action': 'attach_disk', 'uuid': uuid, 'xml': xml}
+        message = {'action': 'attach_disk', 'uuid': uuid, 'xml': xml,
+                   'passback_parameters': {'disk_uuid': guest_disk.uuid, 'sequence': guest_disk.sequence}}
         Guest.emit_instruction(message=json.dumps(message))
 
         return ret
@@ -448,20 +444,18 @@ def r_detach_disk(disk_uuid):
         ret = dict()
         ret['state'] = ji.Common.exchange_state(20000)
 
-        if guest_disk.guest_uuid.__len__() != 36 and guest_disk.sequence < 1:
+        if guest_disk.state != DiskState.mounted.value or guest_disk.sequence == 0:
             # 表示未被任何实例使用,已被分离
             # 序列为 0 的表示实例系统盘,系统盘不可以被分离
+            # TODO: 系统盘单独范围其它状态
             return ret
 
-        guest_disk.guest_uuid = ''
-        guest_disk.sequence = -1
-
         guest = Guest()
         guest.uuid = guest_disk.guest_uuid
         guest.get_by('uuid')
 
         # 判断 Guest 是否处于可用状态
-        if guest.status == status.GuestState.no_state.value:
+        if guest.status in (status.GuestState.no_state.value, status.GuestState.dirty.value):
             ret['state'] = ji.Common.exchange_state(41259)
             return ret
 
@@ -469,8 +463,6 @@ def r_detach_disk(disk_uuid):
         config.id = 1
         config.get()
 
-        guest_disk.update()
-
         xml = """
             <disk type='network' device='disk'>
                 <driver name='qemu' type='qcow2' cache='none'/>
@@ -482,7 +474,8 @@ def r_detach_disk(disk_uuid):
         """.format(config.glusterfs_volume, guest_disk.uuid, guest_disk.format,
                    dev_table[guest_disk.sequence])
 
-        message = {'action': 'detach_disk', 'uuid': guest_disk.guest_uuid, 'xml': xml}
+        message = {'action': 'detach_disk', 'uuid': guest_disk.guest_uuid, 'xml': xml,
+                   'passback_parameters': {'disk_uuid': guest_disk.uuid}}
         Guest.emit_instruction(message=json.dumps(message))
 
         return ret