guest.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import jimit as ji
  4. from filter import FilterFieldType
  5. from orm import ORM
  6. from status import GuestState, DiskState
  7. from database import Database as db
  8. from initialize import app
  9. __author__ = 'James Iter'
  10. __date__ = '2017/3/22'
  11. __contact__ = 'james.iter.cn@gmail.com'
  12. __copyright__ = '(c) 2017 by James Iter.'
  13. class Guest(ORM):
  14. _table_name = 'guest'
  15. _primary_key = 'id'
  16. def __init__(self):
  17. super(Guest, self).__init__()
  18. self.id = 0
  19. self.uuid = None
  20. self.label = None
  21. self.password = None
  22. self.remark = ''
  23. self.os_template_id = None
  24. self.create_time = ji.Common.tus()
  25. self.status = GuestState.no_state.value
  26. self.on_host = ''
  27. self.cpu = None
  28. self.memory = None
  29. self.ip = None
  30. self.network = None
  31. self.manage_network = None
  32. self.vnc_port = None
  33. self.vnc_password = None
  34. self.xml = None
  35. @staticmethod
  36. def get_filter_keywords():
  37. return {
  38. 'id': FilterFieldType.INT.value,
  39. 'uuid': FilterFieldType.STR.value,
  40. 'label': FilterFieldType.STR.value,
  41. 'remark': FilterFieldType.STR.value,
  42. 'on_host': FilterFieldType.STR.value,
  43. 'ip': FilterFieldType.STR.value
  44. }
  45. @staticmethod
  46. def get_allow_update_keywords():
  47. return ['remark', 'cpu', 'memory', 'network', 'manage_network', 'vnc_password']
  48. @staticmethod
  49. def get_allow_content_search_keywords():
  50. return ['label', 'remark', 'on_host', 'ip']
  51. @staticmethod
  52. def emit_instruction(message):
  53. db.r.publish(app.config['instruction_channel'], message=message)
  54. def get_boot_jobs_key(self):
  55. return ':'.join([app.config['guest_boot_jobs'], self.uuid])
  56. def add_boot_jobs(self, boot_jobs_id):
  57. if not isinstance(boot_jobs_id, list):
  58. raise
  59. key = self.get_boot_jobs_key()
  60. db.r.sadd(key, *boot_jobs_id)
  61. db.r.expire(key, app.config['guest_boot_jobs_wait_time'])
  62. def get_boot_jobs(self):
  63. return db.r.ttl(self.get_boot_jobs_key()), list(db.r.smembers(self.get_boot_jobs_key()))
  64. def delete_boot_jobs(self, boot_jobs_id):
  65. if not isinstance(boot_jobs_id, list):
  66. raise
  67. key = self.get_boot_jobs_key()
  68. db.r.srem(key, *boot_jobs_id)
  69. # 如果集合下还有值,则更新启动作业有效时间
  70. if db.r.exists(key):
  71. db.r.expire(key, app.config['guest_boot_jobs_wait_time'])
  72. @staticmethod
  73. def get_uuids_of_all_had_boot_job():
  74. boot_job_keys = db.r.keys(pattern=app.config['guest_boot_jobs'] + '*')
  75. uuids = list()
  76. for boot_job_key in boot_job_keys:
  77. uuids.append(boot_job_key.split(':')[-1])
  78. return uuids
  79. class Disk(ORM):
  80. _table_name = 'disk'
  81. _primary_key = 'id'
  82. def __init__(self):
  83. super(Disk, self).__init__()
  84. self.id = 0
  85. self.uuid = None
  86. self.remark = None
  87. self.path = None
  88. self.size = None
  89. self.sequence = None
  90. self.state = DiskState.pending.value
  91. self.on_host = ''
  92. self.format = 'qcow2'
  93. self.create_time = ji.Common.tus()
  94. self.guest_uuid = None
  95. @staticmethod
  96. def get_filter_keywords():
  97. return {
  98. 'id': FilterFieldType.INT.value,
  99. 'uuid': FilterFieldType.STR.value,
  100. 'remark': FilterFieldType.STR.value,
  101. 'size': FilterFieldType.INT.value,
  102. 'state': FilterFieldType.INT.value,
  103. 'sequence': FilterFieldType.INT.value,
  104. 'on_host': FilterFieldType.STR.value,
  105. 'guest_uuid': FilterFieldType.STR.value
  106. }
  107. @staticmethod
  108. def get_allow_update_keywords():
  109. return ['on_host']
  110. @staticmethod
  111. def get_allow_content_search_keywords():
  112. return ['remark', 'size', 'guest_uuid', 'uuid', 'on_host']
  113. class GuestMigrateInfo(ORM):
  114. _table_name = 'guest_migrate_info'
  115. _primary_key = 'id'
  116. def __init__(self):
  117. super(GuestMigrateInfo, self).__init__()
  118. self.id = 0
  119. self.uuid = None
  120. self.type = None
  121. self.time_elapsed = None
  122. self.time_remaining = None
  123. self.data_total = None
  124. self.data_processed = None
  125. self.data_remaining = None
  126. self.mem_total = None
  127. self.mem_processed = None
  128. self.mem_remaining = None
  129. self.file_total = None
  130. self.file_processed = None
  131. self.file_remaining = None
  132. @staticmethod
  133. def get_filter_keywords():
  134. return {
  135. 'id': FilterFieldType.INT.value,
  136. 'uuid': FilterFieldType.STR.value
  137. }
  138. @staticmethod
  139. def get_allow_update_keywords():
  140. return []
  141. @staticmethod
  142. def get_allow_content_search_keywords():
  143. return []