guest.py 5.3 KB

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