Преглед изворни кода

虚拟机操作基本流程打通

James Iter пре 9 година
родитељ
комит
ec8b9e4171
4 измењених фајлова са 320 додато и 0 уклоњено
  1. 6 0
      models/guest.py
  2. 1 0
      models/rules.py
  3. 12 0
      route_table.py
  4. 301 0
      views/guest.py

+ 6 - 0
models/guest.py

@@ -7,6 +7,8 @@ import jimit as ji
 from filter import FilterFieldType
 from filter import FilterFieldType
 from orm import ORM
 from orm import ORM
 from status import GuestState
 from status import GuestState
+from database import Database as db
+from initialize import app
 
 
 
 
 __author__ = 'James Iter'
 __author__ = 'James Iter'
@@ -57,6 +59,10 @@ class Guest(ORM):
     def get_allow_content_search_keywords():
     def get_allow_content_search_keywords():
         return ['name', 'remark', 'on_host', 'ip']
         return ['name', 'remark', 'on_host', 'ip']
 
 
+    @staticmethod
+    def emit_instruction(message):
+        db.r.publish(app.config['instruction_channel'], message=message)
+
 
 
 class GuestDisk(ORM):
 class GuestDisk(ORM):
 
 

+ 1 - 0
models/rules.py

@@ -39,6 +39,7 @@ class Rules(Enum):
     RSA_PRIVATE = (basestring, 'rsa_private')
     RSA_PRIVATE = (basestring, 'rsa_private')
     RSA_PUBLIC = (basestring, 'rsa_public')
     RSA_PUBLIC = (basestring, 'rsa_public')
 
 
+    UUID = (basestring, 'uuid', (36, 36))
     CPU = (int, 'cpu')
     CPU = (int, 'cpu')
     MEMORY = (int, 'memory')
     MEMORY = (int, 'memory')
     OS_TEMPLATE_ID = (int, 'os_template_id')
     OS_TEMPLATE_ID = (int, 'os_template_id')

+ 12 - 0
route_table.py

@@ -43,6 +43,18 @@ add_rule(os_template.blueprints, '', view_func='os_template.r_get_by_filter', me
 # Guest操作
 # Guest操作
 # 创建虚拟机
 # 创建虚拟机
 add_rule(guest.blueprint, '', view_func='guest.r_create', methods=['POST'])
 add_rule(guest.blueprint, '', view_func='guest.r_create', methods=['POST'])
+add_rule(guest.blueprint, '/_reboot/<uuid>', view_func='guest.r_reboot', methods=['PUT'])
+add_rule(guest.blueprint, '/_force_reboot/<uuid>', view_func='guest.r_force_reboot', methods=['PUT'])
+add_rule(guest.blueprint, '/_shutdown/<uuid>', view_func='guest.r_shutdown', methods=['PUT'])
+add_rule(guest.blueprint, '/_force_shutdown/<uuid>', view_func='guest.r_force_shutdown', methods=['PUT'])
+add_rule(guest.blueprint, '/_boot/<uuid>', view_func='guest.r_boot', methods=['PUT'])
+add_rule(guest.blueprint, '/_suspend/<uuid>', view_func='guest.r_suspend', methods=['PUT'])
+add_rule(guest.blueprint, '/_resume/<uuid>', view_func='guest.r_resume', methods=['PUT'])
+add_rule(guest.blueprint, '/_delete/<uuid>', view_func='guest.r_delete', methods=['PUT'])
+add_rule(guest.blueprint, '/_disk_resize/<uuid>', view_func='guest.r_disk_resize', methods=['PUT'])
+add_rule(guest.blueprint, '/_attach_disk/<uuid>', view_func='guest.r_attach_disk', methods=['PUT'])
+add_rule(guest.blueprint, '/_detach_disk/<uuid>', view_func='guest.r_detach_disk', methods=['PUT'])
+add_rule(guest.blueprint, '/_migrate/<uuid>', view_func='guest.r_migrate', methods=['PUT'])
 
 
 # 日志查询
 # 日志查询
 # 系统模板操作
 # 系统模板操作

+ 301 - 0
views/guest.py

@@ -154,3 +154,304 @@ def r_create():
     except ji.PreviewingError, e:
     except ji.PreviewingError, e:
         return json.loads(e.message)
         return json.loads(e.message)
 
 
+
+@Utils.dumps2response
+def r_reboot(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'reboot', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_force_reboot(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'force_reboot', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_shutdown(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'shutdown', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_force_shutdown(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'force_shutdown', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_boot(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'boot', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_suspend(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'suspend', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_resume(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'resume', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_delete(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'delete', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_disk_resize(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'disk-resize', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_attach_disk(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'attach-disk', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_detach_disk(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'detach-disk', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+
+@Utils.dumps2response
+def r_migrate(uuid):
+
+    args_rules = [
+        Rules.UUID.value
+    ]
+
+    try:
+        ji.Check.previewing(args_rules, {'uuid': uuid})
+
+        guest = Guest()
+        guest.uuid = uuid
+        guest.get_by('uuid')
+
+        message = {'action': 'migrate', 'uuid': uuid}
+        Guest.emit_instruction(message=json.dumps(message))
+
+        ret = dict()
+        ret['state'] = ji.Common.exchange_state(20000)
+        return ret
+
+    except ji.PreviewingError, e:
+        return json.loads(e.message)
+
+