disk.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. 'disk',
  21. __name__,
  22. url_prefix='/api/disk'
  23. )
  24. blueprints = Blueprint(
  25. '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. ]
  35. try:
  36. ji.Check.previewing(args_rules, request.json)
  37. ret = dict()
  38. ret['state'] = ji.Common.exchange_state(20000)
  39. size = request.json['size']
  40. if size < 1:
  41. ret['state'] = ji.Common.exchange_state(41255)
  42. return ret
  43. disk = Disk()
  44. disk.guest_uuid = ''
  45. disk.size = size
  46. disk.uuid = uuid4().__str__()
  47. disk.label = ji.Common.generate_random_code(length=8)
  48. disk.sequence = -1
  49. disk.format = 'qcow2'
  50. config = Config()
  51. config.id = 1
  52. config.get()
  53. disk.path = config.storage_path + '/' + disk.uuid + '.' + disk.format
  54. message = {'action': 'create_disk', 'glusterfs_volume': config.glusterfs_volume,
  55. 'image_path': disk.path, 'size': disk.size, 'uuid': disk.uuid}
  56. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  57. disk.create()
  58. return ret
  59. except ji.PreviewingError, e:
  60. return json.loads(e.message)
  61. @Utils.dumps2response
  62. def r_resize(uuid, size):
  63. args_rules = [
  64. Rules.UUID.value,
  65. Rules.DISK_SIZE_STR.value
  66. ]
  67. try:
  68. ji.Check.previewing(args_rules, {'uuid': uuid, 'size': size})
  69. disk = Disk()
  70. disk.uuid = uuid
  71. disk.get_by('uuid')
  72. used = True
  73. if disk.guest_uuid.__len__() != 36:
  74. used = False
  75. ret = dict()
  76. ret['state'] = ji.Common.exchange_state(20000)
  77. if disk.size >= size:
  78. ret['state'] = ji.Common.exchange_state(41257)
  79. return ret
  80. message = {'action': 'resize_disk', 'size': size, 'guest_uuid': disk.guest_uuid,
  81. 'disk_uuid': disk.uuid, 'passback_parameters': {'size': size}}
  82. if used:
  83. message['device_node'] = dev_table[disk.sequence]
  84. Guest.emit_instruction(message=json.dumps(message))
  85. else:
  86. config = Config()
  87. config.id = 1
  88. config.get()
  89. message['glusterfs_volume'] = config.glusterfs_volume
  90. message['image_path'] = disk.path
  91. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  92. return ret
  93. except ji.PreviewingError, e:
  94. return json.loads(e.message)
  95. @Utils.dumps2response
  96. def r_delete(uuids):
  97. args_rules = [
  98. Rules.UUIDS.value
  99. ]
  100. try:
  101. ji.Check.previewing(args_rules, {'uuids': uuids})
  102. ret = dict()
  103. ret['state'] = ji.Common.exchange_state(20000)
  104. disk = Disk()
  105. # 检测所指定的 UUDIs 磁盘都存在
  106. for uuid in uuids.split(','):
  107. disk.uuid = uuid
  108. disk.get_by('uuid')
  109. if disk.state != DiskState.idle.value:
  110. ret['state'] = ji.Common.exchange_state(41256)
  111. return ret
  112. config = Config()
  113. config.id = 1
  114. config.get()
  115. # 执行删除操作
  116. for uuid in uuids.split(','):
  117. disk.uuid = uuid
  118. disk.get_by('uuid')
  119. message = {'action': 'delete_disk', 'uuid': disk.uuid,
  120. 'glusterfs_volume': config.glusterfs_volume, 'image_path': disk.path}
  121. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  122. return ret
  123. except ji.PreviewingError, e:
  124. return json.loads(e.message)
  125. @Utils.dumps2response
  126. def r_get(uuid):
  127. disk = Disk()
  128. args_rules = [
  129. Rules.UUID.value
  130. ]
  131. disk.uuid = uuid
  132. try:
  133. ji.Check.previewing(args_rules, disk.__dict__)
  134. disk.get_by('uuid')
  135. ret = dict()
  136. ret['state'] = ji.Common.exchange_state(20000)
  137. ret['data'] = disk.__dict__
  138. return ret
  139. except ji.PreviewingError, e:
  140. return json.loads(e.message)
  141. @Utils.dumps2response
  142. def r_get_by_filter():
  143. return disk_base.get_by_filter()
  144. @Utils.dumps2response
  145. def r_content_search():
  146. return disk_base.content_search()
  147. @Utils.dumps2response
  148. def r_update(uuid):
  149. args_rules = [
  150. Rules.UUID.value
  151. ]
  152. if 'label' in request.json:
  153. args_rules.append(
  154. Rules.LABEL.value,
  155. )
  156. if args_rules.__len__() < 2:
  157. ret = dict()
  158. ret['state'] = ji.Common.exchange_state(20000)
  159. return ret
  160. request.json['uuid'] = uuid
  161. try:
  162. ji.Check.previewing(args_rules, request.json)
  163. disk = Disk()
  164. disk.uuid = uuid
  165. disk.get_by('uuid')
  166. disk.label = request.json.get('label', disk.label)
  167. disk.update()
  168. disk.get()
  169. ret = dict()
  170. ret['state'] = ji.Common.exchange_state(20000)
  171. ret['data'] = disk.__dict__
  172. return ret
  173. except ji.PreviewingError, e:
  174. return json.loads(e.message)