guest.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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. __author__ = 'James Iter'
  8. __date__ = '2017/3/22'
  9. __contact__ = 'james.iter.cn@gmail.com'
  10. __copyright__ = '(c) 2017 by James Iter.'
  11. class Guest(ORM):
  12. _table_name = 'guest'
  13. _primary_key = 'id'
  14. def __init__(self):
  15. super(Guest, self).__init__()
  16. self.id = 0
  17. self.uuid = None
  18. self.label = None
  19. self.autostart = False
  20. self.password = None
  21. self.remark = ''
  22. self.os_template_image_id = None
  23. self.create_time = ji.Common.tus()
  24. self.status = GuestState.no_state.value
  25. self.progress = 0
  26. self.node_id = None
  27. self.service_id = 1
  28. self.cpu = None
  29. self.memory = None
  30. self.bandwidth = 0
  31. self.ip = None
  32. self.network = None
  33. self.manage_network = None
  34. self.vnc_port = None
  35. self.vnc_password = None
  36. self.vlan_id = -1
  37. self.xml = None
  38. @staticmethod
  39. def get_filter_keywords():
  40. return {
  41. 'id': FilterFieldType.INT.value,
  42. 'uuid': FilterFieldType.STR.value,
  43. 'label': FilterFieldType.STR.value,
  44. 'autostart': FilterFieldType.BOOL.value,
  45. 'status': FilterFieldType.INT.value,
  46. 'remark': FilterFieldType.STR.value,
  47. 'node_id': FilterFieldType.INT.value,
  48. 'service_id': FilterFieldType.INT.value,
  49. 'ip': FilterFieldType.STR.value,
  50. 'bandwidth': FilterFieldType.INT.value,
  51. 'vlan_id': FilterFieldType.INT.value
  52. }
  53. @staticmethod
  54. def get_allow_update_keywords():
  55. return ['autostart', 'remark', 'cpu', 'memory', 'bandwidth', 'network', 'manage_network', 'vnc_password',
  56. 'service_id', 'vlan_id']
  57. @staticmethod
  58. def get_allow_content_search_keywords():
  59. return ['label', 'autostart', 'remark', 'node_id', 'ip', 'vlan_id']
  60. class Disk(ORM):
  61. _table_name = 'disk'
  62. _primary_key = 'id'
  63. def __init__(self):
  64. super(Disk, self).__init__()
  65. self.id = 0
  66. self.uuid = None
  67. self.remark = None
  68. self.path = None
  69. self.size = None
  70. self.sequence = None
  71. self.state = DiskState.pending.value
  72. self.node_id = None
  73. self.format = 'qcow2'
  74. self.create_time = ji.Common.tus()
  75. self.guest_uuid = None
  76. self.iops = 0
  77. self.iops_rd = 0
  78. self.iops_wr = 0
  79. self.iops_max = 0
  80. self.iops_max_length = 0
  81. self.bps = 0
  82. self.bps_rd = 0
  83. self.bps_wr = 0
  84. self.bps_max = 0
  85. self.bps_max_length = 0
  86. def quota(self, config=None):
  87. from jimvc.models import Config
  88. assert isinstance(config, Config)
  89. # 系统盘 IOPS 默认不计算增益
  90. if self.sequence != 0:
  91. self.iops = config.iops_base + config.iops_pre_unit * self.size
  92. else:
  93. self.iops = config.iops_base
  94. if self.iops > config.iops_cap:
  95. self.iops = config.iops_cap
  96. self.iops_max = config.iops_max
  97. self.iops_max_length = config.iops_max_length
  98. self.iops_rd = 0
  99. self.iops_wr = 0
  100. # 系统盘 BPS 默认不计算增益
  101. if self.sequence != 0:
  102. self.bps = config.bps_base + config.bps_pre_unit * self.size
  103. else:
  104. self.bps = config.bps_base
  105. if self.bps > config.bps_cap:
  106. self.bps = config.bps_cap
  107. self.bps_max = config.bps_max
  108. self.bps_max_length = config.bps_max_length
  109. self.bps_rd = 0
  110. self.bps_wr = 0
  111. def wrap_device(self, dev_table):
  112. self.device = None
  113. if self.sequence >= 0:
  114. self.device = u'/dev/' + dev_table[self.sequence]
  115. @staticmethod
  116. def get_filter_keywords():
  117. return {
  118. 'id': FilterFieldType.INT.value,
  119. 'uuid': FilterFieldType.STR.value,
  120. 'remark': FilterFieldType.STR.value,
  121. 'size': FilterFieldType.INT.value,
  122. 'state': FilterFieldType.INT.value,
  123. 'sequence': FilterFieldType.INT.value,
  124. 'node_id': FilterFieldType.INT.value,
  125. 'guest_uuid': FilterFieldType.STR.value
  126. }
  127. @staticmethod
  128. def get_allow_update_keywords():
  129. return ['node_id', 'sequence', 'state', 'guest_uuid']
  130. @staticmethod
  131. def get_allow_content_search_keywords():
  132. return ['remark', 'size', 'guest_uuid', 'uuid', 'node_id']
  133. class GuestMigrateInfo(ORM):
  134. _table_name = 'guest_migrate_info'
  135. _primary_key = 'id'
  136. def __init__(self):
  137. super(GuestMigrateInfo, self).__init__()
  138. self.id = 0
  139. self.uuid = None
  140. self.type = None
  141. self.time_elapsed = None
  142. self.time_remaining = None
  143. self.data_total = None
  144. self.data_processed = None
  145. self.data_remaining = None
  146. self.mem_total = None
  147. self.mem_processed = None
  148. self.mem_remaining = None
  149. self.file_total = None
  150. self.file_processed = None
  151. self.file_remaining = None
  152. @staticmethod
  153. def get_filter_keywords():
  154. return {
  155. 'id': FilterFieldType.INT.value,
  156. 'uuid': FilterFieldType.STR.value
  157. }
  158. @staticmethod
  159. def get_allow_update_keywords():
  160. return []
  161. @staticmethod
  162. def get_allow_content_search_keywords():
  163. return []