disk.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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
  8. from models.initialize import app, dev_table
  9. from models import Database as db
  10. from models import Config
  11. from models import GuestDisk
  12. from models import Rules
  13. from models import Utils
  14. __author__ = 'James Iter'
  15. __date__ = '2017/4/24'
  16. __contact__ = 'james.iter.cn@gmail.com'
  17. __copyright__ = '(c) 2017 by James Iter.'
  18. blueprint = Blueprint(
  19. 'disk',
  20. __name__,
  21. url_prefix='/api/disk'
  22. )
  23. blueprints = Blueprint(
  24. 'disks',
  25. __name__,
  26. url_prefix='/api/disks'
  27. )
  28. @Utils.dumps2response
  29. def r_create():
  30. args_rules = [
  31. Rules.DISK_SIZE.value
  32. ]
  33. try:
  34. ji.Check.previewing(args_rules, request.json)
  35. ret = dict()
  36. ret['state'] = ji.Common.exchange_state(20000)
  37. size = request.json['size']
  38. if size < 1:
  39. ret['state'] = ji.Common.exchange_state(41255)
  40. return ret
  41. guest_disk = GuestDisk()
  42. guest_disk.guest_uuid = ''
  43. guest_disk.size = size
  44. guest_disk.uuid = uuid4().__str__()
  45. guest_disk.label = ji.Common.generate_random_code(length=8)
  46. guest_disk.sequence = -1
  47. guest_disk.format = 'qcow2'
  48. config = Config()
  49. config.id = 1
  50. config.get()
  51. image_path = '/'.join(['DiskPool', guest_disk.uuid + '.' + guest_disk.format])
  52. message = {'action': 'create_disk', 'glusterfs_volume': config.glusterfs_volume,
  53. 'image_path': image_path, 'size': guest_disk.size}
  54. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  55. guest_disk.create()
  56. return ret
  57. except ji.PreviewingError, e:
  58. return json.loads(e.message)
  59. @Utils.dumps2response
  60. def r_resize(uuid, size):
  61. args_rules = [
  62. Rules.UUID.value,
  63. Rules.DISK_SIZE.value
  64. ]
  65. try:
  66. ji.Check.previewing(args_rules, {'uuid': uuid, 'size': size})
  67. guest_disk = GuestDisk()
  68. guest_disk.uuid = uuid
  69. guest_disk.get_by('uuid')
  70. used = True
  71. if guest_disk.guest_uuid.__len__() != 36:
  72. used = False
  73. ret = dict()
  74. ret['state'] = ji.Common.exchange_state(20000)
  75. if guest_disk.size <= size:
  76. ret['state'] = ji.Common.exchange_state(41257)
  77. return ret
  78. guest_disk.size = size
  79. guest_disk.update()
  80. message = {'action': 'resize_disk', 'size': size}
  81. if used:
  82. message['uuid'] = guest_disk.guest_uuid
  83. message['device_node'] = dev_table[guest_disk.sequence]
  84. Guest.emit_instruction(message=json.dumps(message))
  85. else:
  86. config = Config()
  87. config.id = 1
  88. config.get()
  89. image_path = '/'.join(['DiskPool', guest_disk.uuid + '.' + guest_disk.format])
  90. message['glusterfs_volume'] = config.glusterfs_volume
  91. message['image_path'] = image_path
  92. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  93. return ret
  94. except ji.PreviewingError, e:
  95. return json.loads(e.message)
  96. @Utils.dumps2response
  97. def r_delete(uuid):
  98. args_rules = [
  99. Rules.UUID.value
  100. ]
  101. try:
  102. ji.Check.previewing(args_rules, {'uuid': uuid})
  103. guest_disk = GuestDisk()
  104. guest_disk.uuid = uuid
  105. guest_disk.get_by('uuid')
  106. ret = dict()
  107. ret['state'] = ji.Common.exchange_state(20000)
  108. if guest_disk.guest_uuid.__len__() > 0:
  109. ret['state'] = ji.Common.exchange_state(41256)
  110. return ret
  111. config = Config()
  112. config.id = 1
  113. config.get()
  114. image_path = '/'.join(['DiskPool', guest_disk.uuid + '.' + guest_disk.format])
  115. message = {'action': 'delete_disk', 'glusterfs_volume': config.glusterfs_volume, 'image_path': image_path}
  116. db.r.rpush(app.config['downstream_queue'], json.dumps(message, ensure_ascii=False))
  117. guest_disk.delete()
  118. return ret
  119. except ji.PreviewingError, e:
  120. return json.loads(e.message)