snapshot.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. ret = dict()
  136. ret['state'] = ji.Common.exchange_state(20000)
  137. return ret
  138. except ji.PreviewingError, e:
  139. return json.loads(e.message)