vlan.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from flask import Blueprint, request
  4. import json
  5. import jimit as ji
  6. from jimvc.models import Utils, Guest
  7. from jimvc.models import Rules
  8. from jimvc.models import VLAN
  9. from jimvc.models import Host
  10. from base import Base
  11. __author__ = 'James Iter'
  12. __date__ = '2019-03-12'
  13. __contact__ = 'james.iter.cn@gmail.com'
  14. __copyright__ = '(c) 2019 by James Iter.'
  15. blueprint = Blueprint(
  16. 'api_vlan',
  17. __name__,
  18. url_prefix='/api/vlan'
  19. )
  20. blueprints = Blueprint(
  21. 'api_vlans',
  22. __name__,
  23. url_prefix='/api/vlans'
  24. )
  25. vlan_base = Base(the_class=VLAN, the_blueprint=blueprint, the_blueprints=blueprints)
  26. @Utils.dumps2response
  27. def r_create():
  28. args_rules = [
  29. Rules.VLAN_ID.value,
  30. Rules.LABEL.value,
  31. Rules.DESCRIPTION.value
  32. ]
  33. vlan = VLAN()
  34. vlan.vlan_id = request.json.get('vlan_id')
  35. vlan.label = request.json.get('label')
  36. vlan.description = request.json.get('description', '')
  37. try:
  38. ji.Check.previewing(args_rules, vlan.__dict__)
  39. ret = dict()
  40. ret['state'] = ji.Common.exchange_state(20000)
  41. vlan.create()
  42. vlan.get()
  43. # 取全部活着的 hosts
  44. available_hosts = Host.get_available_hosts(nonrandom=None)
  45. for host in available_hosts:
  46. message = {
  47. '_object': 'vlan',
  48. 'action': 'create',
  49. 'uuid': None,
  50. 'node_id': host['node_id'],
  51. 'vlan_id': vlan.vlan_id,
  52. 'passback_parameters': {'vlan_id': vlan.vlan_id}
  53. }
  54. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  55. ret['data'] = vlan.__dict__
  56. return ret
  57. except ji.PreviewingError, e:
  58. return json.loads(e.message)
  59. @Utils.dumps2response
  60. def r_update(ids):
  61. ret = dict()
  62. ret['state'] = ji.Common.exchange_state(20000)
  63. ret['data'] = list()
  64. args_rules = [
  65. Rules.IDS.value
  66. ]
  67. if 'label' in request.json:
  68. args_rules.append(
  69. Rules.LABEL.value,
  70. )
  71. if 'description' in request.json:
  72. args_rules.append(
  73. Rules.DESCRIPTION.value,
  74. )
  75. if args_rules.__len__() < 2:
  76. return ret
  77. request.json['ids'] = ids
  78. try:
  79. ji.Check.previewing(args_rules, request.json)
  80. vlan = VLAN()
  81. # 检测所指定的 vlan 都存在
  82. for _id in ids.split(','):
  83. vlan.id = _id
  84. vlan.get()
  85. for _id in ids.split(','):
  86. vlan.id = _id
  87. vlan.get()
  88. vlan.label = request.json.get('label', vlan.label)
  89. vlan.description = request.json.get('description', vlan.description)
  90. vlan.update()
  91. vlan.get()
  92. ret['data'].append(vlan.__dict__)
  93. return ret
  94. except ji.PreviewingError, e:
  95. return json.loads(e.message)
  96. @Utils.dumps2response
  97. def r_get(ids):
  98. return vlan_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
  99. @Utils.dumps2response
  100. def r_get_by_filter():
  101. return vlan_base.get_by_filter()
  102. @Utils.dumps2response
  103. def r_content_search():
  104. return vlan_base.content_search()
  105. @Utils.dumps2response
  106. def r_delete(ids):
  107. args_rules = [
  108. Rules.IDS.value
  109. ]
  110. request.json['ids'] = ids
  111. try:
  112. ji.Check.previewing(args_rules, request.json)
  113. vlan = VLAN()
  114. # 检测所指定的 vlan 都存在
  115. for _id in ids.split(','):
  116. vlan.id = _id
  117. vlan.get()
  118. guests, _ = Guest.get_by_filter(filter_str=':'.join(['vlan_id', 'eq', vlan.vlan_id]))
  119. if guests.__len__() > 0:
  120. guests_info = ''
  121. for guest in guests:
  122. guests_info += guest['label'] + ',' + guest['uuid'] + '.'
  123. ret = dict()
  124. ret['state'] = ji.Common.exchange_state(41262)
  125. ret['state']['sub']['zh-cn'] = ''.join([
  126. ret['state']['sub']['zh-cn'], u': Vlan ID: ', vlan.vlan_id, u': Guests: ', guests_info])
  127. return ret
  128. for _id in ids.split(','):
  129. vlan.id = _id
  130. vlan.get()
  131. # 取全部活着的 hosts
  132. available_hosts = Host.get_available_hosts(nonrandom=None)
  133. for host in available_hosts:
  134. message = {
  135. '_object': 'vlan',
  136. 'action': 'delete',
  137. 'uuid': None,
  138. 'node_id': host['node_id'],
  139. 'vlan_id': vlan.vlan_id,
  140. 'passback_parameters': {'vlan_id': vlan.vlan_id}
  141. }
  142. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  143. except ji.PreviewingError, e:
  144. return json.loads(e.message)
  145. return vlan_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')