snapshot.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from flask import Blueprint
  4. from flask import request
  5. import json
  6. import jimit as ji
  7. from api.base import Base
  8. from models import Guest
  9. from models import Snapshot, SnapshotDiskMapping
  10. from models import Utils
  11. from models import Rules
  12. __author__ = 'James Iter'
  13. __date__ = '2018/4/10'
  14. __contact__ = 'james.iter.cn@gmail.com'
  15. __copyright__ = '(c) 2018 by James Iter.'
  16. blueprint = Blueprint(
  17. 'api_snapshot',
  18. __name__,
  19. url_prefix='/api/snapshot'
  20. )
  21. blueprints = Blueprint(
  22. 'api_snapshots',
  23. __name__,
  24. url_prefix='/api/snapshots'
  25. )
  26. snapshot_base = Base(the_class=Snapshot, the_blueprint=blueprint, the_blueprints=blueprints)
  27. @Utils.dumps2response
  28. def r_create():
  29. args_rules = [
  30. Rules.GUEST_UUID.value
  31. ]
  32. if 'label' in request.json:
  33. args_rules.append(
  34. Rules.LABEL.value,
  35. )
  36. try:
  37. ret = dict()
  38. ret['state'] = ji.Common.exchange_state(20000)
  39. ji.Check.previewing(args_rules, request.json)
  40. snapshot = Snapshot()
  41. guest = Guest()
  42. guest.uuid = request.json.get('guest_uuid')
  43. guest.get_by('uuid')
  44. snapshot.label = request.json.get('label', '')
  45. snapshot.status = guest.status
  46. snapshot.guest_uuid = guest.uuid
  47. snapshot.snapshot_id = '_'.join(['tmp', ji.Common.generate_random_code(length=8)])
  48. snapshot.parent_id = '-'
  49. snapshot.progress = 0
  50. snapshot.create()
  51. snapshot.get_by('snapshot_id')
  52. message = {
  53. '_object': 'snapshot',
  54. 'action': 'create',
  55. 'uuid': guest.uuid,
  56. 'node_id': guest.node_id,
  57. 'passback_parameters': {'id': snapshot.id}
  58. }
  59. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  60. ret['data'] = snapshot.__dict__
  61. return ret
  62. except ji.PreviewingError, e:
  63. return json.loads(e.message)
  64. @Utils.dumps2response
  65. def r_update(snapshot_id):
  66. snapshot = Snapshot()
  67. args_rules = [
  68. Rules.SNAPSHOT_ID.value
  69. ]
  70. if 'label' in request.json:
  71. args_rules.append(
  72. Rules.LABEL.value,
  73. )
  74. if args_rules.__len__() < 2:
  75. ret = dict()
  76. ret['state'] = ji.Common.exchange_state(20000)
  77. return ret
  78. request.json['snapshot_id'] = snapshot_id
  79. try:
  80. ji.Check.previewing(args_rules, request.json)
  81. snapshot.snapshot_id = request.json.get('snapshot_id')
  82. snapshot.get_by('snapshot_id')
  83. snapshot.label = request.json.get('label', snapshot.label)
  84. snapshot.update()
  85. snapshot.get()
  86. ret = dict()
  87. ret['state'] = ji.Common.exchange_state(20000)
  88. ret['data'] = snapshot.__dict__
  89. return ret
  90. except ji.PreviewingError, e:
  91. return json.loads(e.message)
  92. @Utils.dumps2response
  93. def r_get(snapshots_id):
  94. return snapshot_base.get(ids=snapshots_id, ids_rule=Rules.SNAPSHOTS_ID.value, by_field='snapshot_id')
  95. @Utils.dumps2response
  96. def r_get_by_filter():
  97. return snapshot_base.get_by_filter()
  98. @Utils.dumps2response
  99. def r_content_search():
  100. return snapshot_base.content_search()
  101. @Utils.dumps2response
  102. def r_delete(snapshots_id):
  103. args_rules = [
  104. Rules.SNAPSHOTS_ID.value
  105. ]
  106. try:
  107. ji.Check.previewing(args_rules, {'snapshots_id': snapshots_id})
  108. snapshot = Snapshot()
  109. guest = Guest()
  110. # 检测所指定的 快照 都存在
  111. for snapshot_id in snapshots_id.split(','):
  112. snapshot.snapshot_id = snapshot_id
  113. snapshot.get_by('snapshot_id')
  114. guest.uuid = snapshot.guest_uuid
  115. guest.get_by('uuid')
  116. # 执行删除操作
  117. for snapshot_id in snapshots_id.split(','):
  118. snapshot.snapshot_id = snapshot_id
  119. snapshot.get_by('snapshot_id')
  120. guest.uuid = snapshot.guest_uuid
  121. guest.get_by('uuid')
  122. message = {
  123. '_object': 'snapshot',
  124. 'action': 'delete',
  125. 'uuid': snapshot.guest_uuid,
  126. 'snapshot_id': snapshot.snapshot_id,
  127. 'node_id': guest.node_id,
  128. 'passback_parameters': {'id': snapshot.id}
  129. }
  130. Utils.emit_instruction(message=json.dumps(message))
  131. # 删除创建失败的 快照
  132. if snapshot.progress == 255:
  133. SnapshotDiskMapping.delete_by_filter(filter_str=':'.join(['snapshot_id', 'eq', snapshot.snapshot_id]))
  134. snapshot.delete()
  135. else:
  136. snapshot.progress = 254
  137. snapshot.update()
  138. ret = dict()
  139. ret['state'] = ji.Common.exchange_state(20000)
  140. return ret
  141. except ji.PreviewingError, e:
  142. return json.loads(e.message)
  143. @Utils.dumps2response
  144. def r_revert(snapshot_id):
  145. args_rules = [
  146. Rules.SNAPSHOT_ID.value
  147. ]
  148. try:
  149. ret = dict()
  150. ret['state'] = ji.Common.exchange_state(20000)
  151. ji.Check.previewing(args_rules, {'snapshot_id': snapshot_id})
  152. snapshot = Snapshot()
  153. guest = Guest()
  154. snapshot.snapshot_id = snapshot_id
  155. snapshot.get_by('snapshot_id')
  156. snapshot.progress = 253
  157. snapshot.update()
  158. snapshot.get()
  159. guest.uuid = snapshot.guest_uuid
  160. guest.get_by('uuid')
  161. message = {
  162. '_object': 'snapshot',
  163. 'action': 'revert',
  164. 'uuid': guest.uuid,
  165. 'snapshot_id': snapshot.snapshot_id,
  166. 'node_id': guest.node_id,
  167. 'passback_parameters': {'id': snapshot.id}
  168. }
  169. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  170. ret['data'] = snapshot.__dict__
  171. return ret
  172. except ji.PreviewingError, e:
  173. return json.loads(e.message)