disk.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from flask import Blueprint, request
  4. import json
  5. from uuid import uuid4
  6. import jimit as ji
  7. from models import Guest, DiskState
  8. from models.initialize import app, dev_table
  9. from models import Database as db
  10. from models import Config
  11. from models import Disk
  12. from models import Rules
  13. from models import Utils
  14. from base import Base
  15. __author__ = 'James Iter'
  16. __date__ = '2017/4/24'
  17. __contact__ = 'james.iter.cn@gmail.com'
  18. __copyright__ = '(c) 2017 by James Iter.'
  19. blueprint = Blueprint(
  20. 'api_disk',
  21. __name__,
  22. url_prefix='/api/disk'
  23. )
  24. blueprints = Blueprint(
  25. 'api_disks',
  26. __name__,
  27. url_prefix='/api/disks'
  28. )
  29. disk_base = Base(the_class=Disk, the_blueprint=blueprint, the_blueprints=blueprints)
  30. @Utils.dumps2response
  31. def r_create():
  32. args_rules = [
  33. Rules.DISK_SIZE.value,
  34. Rules.REMARK.value,
  35. Rules.QUANTITY.value
  36. ]
  37. try:
  38. ji.Check.previewing(args_rules, request.json)
  39. ret = dict()
  40. ret['state'] = ji.Common.exchange_state(20000)
  41. size = request.json['size']
  42. quantity = request.json.get('quantity')
  43. if size < 1:
  44. ret['state'] = ji.Common.exchange_state(41255)
  45. return ret
  46. while quantity:
  47. quantity -= 1
  48. disk = Disk()
  49. disk.guest_uuid = ''
  50. disk.size = size
  51. disk.uuid = uuid4().__str__()
  52. disk.remark = request.json.get('remark', '')
  53. disk.sequence = -1
  54. disk.format = 'qcow2'
  55. config = Config()
  56. config.id = 1
  57. config.get()
  58. disk.path = config.storage_path + '/' + disk.uuid + '.' + disk.format
  59. message = {'action': 'create_disk', 'glusterfs_volume': config.glusterfs_volume,
  60. 'image_path': disk.path, 'size': disk.size, 'uuid': disk.uuid}
  61. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  62. disk.create()
  63. return ret
  64. except ji.PreviewingError, e:
  65. return json.loads(e.message)
  66. @Utils.dumps2response
  67. def r_resize(uuid, size):
  68. args_rules = [
  69. Rules.UUID.value,
  70. Rules.DISK_SIZE_STR.value
  71. ]
  72. try:
  73. ji.Check.previewing(args_rules, {'uuid': uuid, 'size': size})
  74. disk = Disk()
  75. disk.uuid = uuid
  76. disk.get_by('uuid')
  77. used = True
  78. if disk.guest_uuid.__len__() != 36:
  79. used = False
  80. ret = dict()
  81. ret['state'] = ji.Common.exchange_state(20000)
  82. if disk.size >= size:
  83. ret['state'] = ji.Common.exchange_state(41257)
  84. return ret
  85. message = {'action': 'resize_disk', 'size': int(size), 'guest_uuid': disk.guest_uuid,
  86. 'disk_uuid': disk.uuid, 'passback_parameters': {'size': size}}
  87. if used:
  88. message['device_node'] = dev_table[disk.sequence]
  89. Guest.emit_instruction(message=json.dumps(message))
  90. else:
  91. config = Config()
  92. config.id = 1
  93. config.get()
  94. message['glusterfs_volume'] = config.glusterfs_volume
  95. message['image_path'] = disk.path
  96. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  97. return ret
  98. except ji.PreviewingError, e:
  99. return json.loads(e.message)
  100. @Utils.dumps2response
  101. def r_delete(uuids):
  102. args_rules = [
  103. Rules.UUIDS.value
  104. ]
  105. try:
  106. ji.Check.previewing(args_rules, {'uuids': uuids})
  107. ret = dict()
  108. ret['state'] = ji.Common.exchange_state(20000)
  109. disk = Disk()
  110. # 检测所指定的 UUDIs 磁盘都存在
  111. for uuid in uuids.split(','):
  112. disk.uuid = uuid
  113. disk.get_by('uuid')
  114. if disk.state != DiskState.idle.value:
  115. ret['state'] = ji.Common.exchange_state(41256)
  116. return ret
  117. config = Config()
  118. config.id = 1
  119. config.get()
  120. # 执行删除操作
  121. for uuid in uuids.split(','):
  122. disk.uuid = uuid
  123. disk.get_by('uuid')
  124. message = {'action': 'delete_disk', 'uuid': disk.uuid,
  125. 'glusterfs_volume': config.glusterfs_volume, 'image_path': disk.path}
  126. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  127. return ret
  128. except ji.PreviewingError, e:
  129. return json.loads(e.message)
  130. @Utils.dumps2response
  131. def r_get(uuids):
  132. return disk_base.get(ids=uuids, ids_rule=Rules.UUIDS.value, by_field='uuid')
  133. @Utils.dumps2response
  134. def r_get_by_filter():
  135. return disk_base.get_by_filter()
  136. @Utils.dumps2response
  137. def r_content_search():
  138. return disk_base.content_search()
  139. @Utils.dumps2response
  140. def r_update(uuid):
  141. args_rules = [
  142. Rules.UUID.value
  143. ]
  144. if 'remark' in request.json:
  145. args_rules.append(
  146. Rules.REMARK.value
  147. )
  148. if args_rules.__len__() < 2:
  149. ret = dict()
  150. ret['state'] = ji.Common.exchange_state(20000)
  151. return ret
  152. request.json['uuid'] = uuid
  153. try:
  154. ji.Check.previewing(args_rules, request.json)
  155. disk = Disk()
  156. disk.uuid = uuid
  157. disk.get_by('uuid')
  158. disk.remark = request.json.get('remark', disk.remark)
  159. disk.update()
  160. disk.get()
  161. ret = dict()
  162. ret['state'] = ji.Common.exchange_state(20000)
  163. ret['data'] = disk.__dict__
  164. return ret
  165. except ji.PreviewingError, e:
  166. return json.loads(e.message)
  167. @Utils.dumps2response
  168. def r_distribute_count():
  169. from models import Disk
  170. rows, count = Disk.get_all()
  171. ret = dict()
  172. ret['state'] = ji.Common.exchange_state(20000)
  173. ret['data'] = {
  174. 'kind': {'system': 0, 'data_mounted': 0, 'data_idle': 0},
  175. 'total_size': 0,
  176. 'disks': rows.__len__()
  177. }
  178. for disk in rows:
  179. if disk['sequence'] == 0:
  180. ret['data']['kind']['system'] += 1
  181. elif disk['sequence'] < 0:
  182. ret['data']['kind']['data_idle'] += 1
  183. else:
  184. ret['data']['kind']['data_mounted'] += 1
  185. ret['data']['total_size'] += disk['size']
  186. return ret