vlan.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. if vlan.exist_by('vlan_id'):
  42. ret['state'] = ji.Common.exchange_state(40901)
  43. ret['state']['sub']['zh-cn'] = ''.join([ret['state']['sub']['zh-cn'], u': Vlan ID: ', vlan.vlan_id])
  44. return ret
  45. vlan.create()
  46. vlan.get()
  47. # 取全部活着的 hosts
  48. available_hosts = Host.get_available_hosts(nonrandom=None)
  49. for host in available_hosts:
  50. message = {
  51. '_object': 'vlan',
  52. 'action': 'create',
  53. 'uuid': None,
  54. 'node_id': host['node_id'],
  55. 'vlan_id': vlan.vlan_id,
  56. 'passback_parameters': {'vlan_id': vlan.vlan_id}
  57. }
  58. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  59. ret['data'] = vlan.__dict__
  60. return ret
  61. except ji.PreviewingError, e:
  62. return json.loads(e.message)
  63. @Utils.dumps2response
  64. def r_update(ids):
  65. ret = dict()
  66. ret['state'] = ji.Common.exchange_state(20000)
  67. ret['data'] = list()
  68. args_rules = [
  69. Rules.IDS.value
  70. ]
  71. if 'label' in request.json:
  72. args_rules.append(
  73. Rules.LABEL.value,
  74. )
  75. if 'description' in request.json:
  76. args_rules.append(
  77. Rules.DESCRIPTION.value,
  78. )
  79. if args_rules.__len__() < 2:
  80. return ret
  81. request.json['ids'] = ids
  82. try:
  83. ji.Check.previewing(args_rules, request.json)
  84. vlan = VLAN()
  85. # 检测所指定的 vlan 都存在
  86. for _id in ids.split(','):
  87. vlan.id = _id
  88. vlan.get()
  89. for _id in ids.split(','):
  90. vlan.id = _id
  91. vlan.get()
  92. vlan.label = request.json.get('label', vlan.label)
  93. vlan.description = request.json.get('description', vlan.description)
  94. vlan.update()
  95. vlan.get()
  96. ret['data'].append(vlan.__dict__)
  97. return ret
  98. except ji.PreviewingError, e:
  99. return json.loads(e.message)
  100. @Utils.dumps2response
  101. def r_get(ids):
  102. return vlan_base.get(ids=ids, ids_rule=Rules.IDS.value, by_field='id')
  103. @Utils.dumps2response
  104. def r_get_by_filter():
  105. return vlan_base.get_by_filter()
  106. @Utils.dumps2response
  107. def r_content_search():
  108. return vlan_base.content_search()
  109. @Utils.dumps2response
  110. def r_delete(ids):
  111. args_rules = [
  112. Rules.IDS.value
  113. ]
  114. request.json['ids'] = ids
  115. try:
  116. ji.Check.previewing(args_rules, request.json)
  117. vlan = VLAN()
  118. # 检测所指定的 vlan 都存在
  119. for _id in ids.split(','):
  120. vlan.id = _id
  121. vlan.get()
  122. guests, _ = Guest.get_by_filter(filter_str=':'.join(['vlan_id', 'eq', vlan.vlan_id]))
  123. if guests.__len__() > 0:
  124. guests_info = ''
  125. for guest in guests:
  126. guests_info += guest['label'] + ',' + guest['uuid'] + '.'
  127. ret = dict()
  128. ret['state'] = ji.Common.exchange_state(41262)
  129. ret['state']['sub']['zh-cn'] = ''.join([
  130. ret['state']['sub']['zh-cn'], u': Vlan ID: ', vlan.vlan_id, u': Guests: ', guests_info])
  131. return ret
  132. for _id in ids.split(','):
  133. vlan.id = _id
  134. vlan.get()
  135. # 取全部活着的 hosts
  136. available_hosts = Host.get_available_hosts(nonrandom=None)
  137. for host in available_hosts:
  138. message = {
  139. '_object': 'vlan',
  140. 'action': 'delete',
  141. 'uuid': None,
  142. 'node_id': host['node_id'],
  143. 'vlan_id': vlan.vlan_id,
  144. 'passback_parameters': {'vlan_id': vlan.vlan_id}
  145. }
  146. Utils.emit_instruction(message=json.dumps(message, ensure_ascii=False))
  147. except ji.PreviewingError, e:
  148. return json.loads(e.message)
  149. return vlan_base.delete(ids=ids, ids_rule=Rules.IDS.value, by_field='id')